diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9b2cf2412a2..ea4f6ffb2ee 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1694,11 +1694,6 @@ android:value="true" /> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/drawable-night/illustration_accessibility_gesture_two_finger.xml b/res/drawable-night/illustration_accessibility_gesture_two_finger.xml new file mode 100644 index 00000000000..c95523b1655 --- /dev/null +++ b/res/drawable-night/illustration_accessibility_gesture_two_finger.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/drawable/illustration_accessibility_gesture_three_finger.xml b/res/drawable/illustration_accessibility_gesture_three_finger.xml new file mode 100644 index 00000000000..c14d7443110 --- /dev/null +++ b/res/drawable/illustration_accessibility_gesture_three_finger.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/drawable/illustration_accessibility_gesture_two_finger.xml b/res/drawable/illustration_accessibility_gesture_two_finger.xml new file mode 100644 index 00000000000..3ef4fd1db4b --- /dev/null +++ b/res/drawable/illustration_accessibility_gesture_two_finger.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/tutorial_dialog_launch_by_gesture_navigation_settings.xml b/res/layout/tutorial_dialog_launch_by_gesture_navigation_settings.xml index 524f7c9b7e4..b494e9367b2 100644 --- a/res/layout/tutorial_dialog_launch_by_gesture_navigation_settings.xml +++ b/res/layout/tutorial_dialog_launch_by_gesture_navigation_settings.xml @@ -29,11 +29,15 @@ android:orientation="vertical" android:paddingTop="24dp"> - + - + finish()); - } -} diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java index 09f28d72c9b..0ca16cb99b0 100644 --- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java +++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java @@ -32,7 +32,6 @@ import android.text.style.ImageSpan; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; -import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import android.view.Window; @@ -77,13 +76,13 @@ public final class AccessibilityGestureNavigationTutorial { @Retention(RetentionPolicy.SOURCE) @IntDef({ DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_BUTTON, - DialogType.LAUNCH_SERVICE_BY_GESTURE_NAVIGATION, + DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE, DialogType.GESTURE_NAVIGATION_SETTINGS, }) private @interface DialogType { int LAUNCH_SERVICE_BY_ACCESSIBILITY_BUTTON = 0; - int LAUNCH_SERVICE_BY_GESTURE_NAVIGATION = 1; + int LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE = 1; int GESTURE_NAVIGATION_SETTINGS = 2; } @@ -92,13 +91,17 @@ public final class AccessibilityGestureNavigationTutorial { private static final DialogInterface.OnClickListener mOnClickListener = (DialogInterface dialog, int which) -> dialog.dismiss(); - public static void showGestureNavigationSettingsTutorialDialog(Context context, - DialogInterface.OnDismissListener dismissListener) { + /** + * Displays a dialog that guides users to use accessibility features with accessibility + * gestures under system gesture navigation mode. + */ + public static void showGestureNavigationTutorialDialog(Context context, + DialogInterface.OnDismissListener onDismissListener) { final AlertDialog alertDialog = new AlertDialog.Builder(context) .setView(createTutorialDialogContentView(context, DialogType.GESTURE_NAVIGATION_SETTINGS)) .setNegativeButton(R.string.accessibility_tutorial_dialog_button, mOnClickListener) - .setOnDismissListener(dismissListener) + .setOnDismissListener(onDismissListener) .create(); alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); @@ -117,8 +120,8 @@ public final class AccessibilityGestureNavigationTutorial { return alertDialog; } - static AlertDialog showGestureNavigationTutorialDialog(Context context) { - return createDialog(context, DialogType.LAUNCH_SERVICE_BY_GESTURE_NAVIGATION); + static AlertDialog showAccessibilityGestureTutorialDialog(Context context) { + return createDialog(context, DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE); } static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes) { @@ -129,7 +132,7 @@ public final class AccessibilityGestureNavigationTutorial { } /** - * Get a content View for a dialog to confirm that they want to enable a service. + * Gets a content View for a dialog to confirm that they want to enable a service. * * @param context A valid context * @param dialogType The type of tutorial dialog @@ -146,42 +149,36 @@ public final class AccessibilityGestureNavigationTutorial { content = inflater.inflate( R.layout.tutorial_dialog_launch_service_by_accessibility_button, null); break; - case DialogType.LAUNCH_SERVICE_BY_GESTURE_NAVIGATION: + case DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE: content = inflater.inflate( R.layout.tutorial_dialog_launch_service_by_gesture_navigation, null); - final TextureView gestureTutorialVideo = content.findViewById( - R.id.gesture_tutorial_video); - final TextView gestureTutorialMessage = content.findViewById( - R.id.gesture_tutorial_message); - VideoPlayer.create(context, AccessibilityUtil.isTouchExploreEnabled(context) - ? R.raw.illustration_accessibility_gesture_three_finger - : R.raw.illustration_accessibility_gesture_two_finger, - gestureTutorialVideo); - gestureTutorialMessage.setText(AccessibilityUtil.isTouchExploreEnabled(context) - ? R.string.accessibility_tutorial_dialog_message_gesture_talkback - : R.string.accessibility_tutorial_dialog_message_gesture); + setupGestureNavigationTextWithImage(context, content); break; case DialogType.GESTURE_NAVIGATION_SETTINGS: content = inflater.inflate( R.layout.tutorial_dialog_launch_by_gesture_navigation_settings, null); - final TextureView gestureSettingsTutorialVideo = content.findViewById( - R.id.gesture_tutorial_video); - final TextView gestureSettingsTutorialMessage = content.findViewById( - R.id.gesture_tutorial_message); - VideoPlayer.create(context, AccessibilityUtil.isTouchExploreEnabled(context) - ? R.raw.illustration_accessibility_gesture_three_finger - : R.raw.illustration_accessibility_gesture_two_finger, - gestureSettingsTutorialVideo); - final int stringResId = AccessibilityUtil.isTouchExploreEnabled(context) - ? R.string.accessibility_tutorial_dialog_message_gesture_settings_talkback - : R.string.accessibility_tutorial_dialog_message_gesture_settings; - gestureSettingsTutorialMessage.setText(stringResId); + setupGestureNavigationTextWithImage(context, content); break; } return content; } + private static void setupGestureNavigationTextWithImage(Context context, View view) { + final boolean isTouchExploreEnabled = AccessibilityUtil.isTouchExploreEnabled(context); + + final ImageView imageView = view.findViewById(R.id.image); + final int gestureSettingsImageResId = + isTouchExploreEnabled ? R.drawable.illustration_accessibility_gesture_three_finger + : R.drawable.illustration_accessibility_gesture_two_finger; + imageView.setImageResource(gestureSettingsImageResId); + + final TextView textView = view.findViewById(R.id.gesture_tutorial_message); + textView.setText(isTouchExploreEnabled + ? R.string.accessibility_tutorial_dialog_message_gesture_settings_talkback + : R.string.accessibility_tutorial_dialog_message_gesture_settings); + } + private static AlertDialog createDialog(Context context, int dialogType) { final AlertDialog alertDialog = new AlertDialog.Builder(context) .setView(createTutorialDialogContentView(context, dialogType)) diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 1c7ce39bab9..c15217490c6 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -141,7 +141,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends switch (dialogId) { case DialogEnums.GESTURE_NAVIGATION_TUTORIAL: return AccessibilityGestureNavigationTutorial - .showGestureNavigationTutorialDialog(getPrefContext()); + .showAccessibilityGestureTutorialDialog(getPrefContext()); case DialogEnums.MAGNIFICATION_EDIT_SHORTCUT: final CharSequence dialogTitle = getPrefContext().getString( R.string.accessibility_shortcut_title, mPackageName); diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java index 4b9cfa36f2f..1a116da91ab 100644 --- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java +++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java @@ -28,17 +28,19 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.om.IOverlayManager; import android.content.om.OverlayInfo; +import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; import android.provider.Settings; import android.text.TextUtils; import android.view.accessibility.AccessibilityManager; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; import com.android.settings.R; -import com.android.settings.SettingsTutorialDialogWrapperActivity; +import com.android.settings.accessibility.AccessibilityGestureNavigationTutorial; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; @@ -57,8 +59,6 @@ import java.util.List; public class SystemNavigationGestureSettings extends RadioButtonPickerFragment implements HelpResourceProvider { - private static final String TAG = "SystemNavigationGesture"; - @VisibleForTesting static final String KEY_SYSTEM_NAV_3BUTTONS = "system_nav_3buttons"; @VisibleForTesting @@ -69,10 +69,33 @@ public class SystemNavigationGestureSettings extends RadioButtonPickerFragment i public static final String PREF_KEY_SUGGESTION_COMPLETE = "pref_system_navigation_suggestion_complete"; + private static final String KEY_SHOW_A11Y_TUTORIAL_DIALOG = "show_a11y_tutorial_dialog_bool"; + + private boolean mA11yTutorialDialogShown = false; + private IOverlayManager mOverlayManager; private IllustrationPreference mVideoPreference; + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + mA11yTutorialDialogShown = + savedInstanceState.getBoolean(KEY_SHOW_A11Y_TUTORIAL_DIALOG, false); + if (mA11yTutorialDialogShown) { + AccessibilityGestureNavigationTutorial.showGestureNavigationTutorialDialog( + getContext(), dialog -> mA11yTutorialDialogShown = false); + } + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + outState.putBoolean(KEY_SHOW_A11Y_TUTORIAL_DIALOG, mA11yTutorialDialogShown); + super.onSaveInstanceState(outState); + } + @Override public void onAttach(Context context) { super.onAttach(context); @@ -177,14 +200,7 @@ public class SystemNavigationGestureSettings extends RadioButtonPickerFragment i protected boolean setDefaultKey(String key) { setCurrentSystemNavigationMode(mOverlayManager, key); setIllustrationVideo(mVideoPreference, key); - if (TextUtils.equals(KEY_SYSTEM_NAV_GESTURAL, key) - && !isAccessibilityFloatingMenuEnabled() - && (isAnyServiceSupportAccessibilityButton() || isNavBarMagnificationEnabled())) { - final Intent intent = new Intent(getActivity(), - SettingsTutorialDialogWrapperActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - } + setGestureNavigationTutorialDialog(key); return true; } @@ -257,6 +273,18 @@ public class SystemNavigationGestureSettings extends RadioButtonPickerFragment i } } + private void setGestureNavigationTutorialDialog(String systemNavKey) { + if (TextUtils.equals(KEY_SYSTEM_NAV_GESTURAL, systemNavKey) + && !isAccessibilityFloatingMenuEnabled() + && (isAnyServiceSupportAccessibilityButton() || isNavBarMagnificationEnabled())) { + mA11yTutorialDialogShown = true; + AccessibilityGestureNavigationTutorial.showGestureNavigationTutorialDialog(getContext(), + dialog -> mA11yTutorialDialogShown = false); + } else { + mA11yTutorialDialogShown = false; + } + } + private boolean isAnyServiceSupportAccessibilityButton() { final AccessibilityManager ams = getContext().getSystemService(AccessibilityManager.class); final List targets = ams.getAccessibilityShortcutTargets(