Merge "[Material Next] Accessibility gesture tutorial dialog" into sc-v2-dev

This commit is contained in:
Menghan Li
2021-08-20 21:05:44 +00:00
committed by Android (Google) Code Review
13 changed files with 344 additions and 102 deletions

View File

@@ -1,42 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.settings;
import android.app.Activity;
import android.os.Bundle;
import com.android.settings.accessibility.AccessibilityGestureNavigationTutorial;
import com.android.settings.R;
/**
* This activity is to create the tutorial dialog in gesture navigation settings since we couldn't
* use the dialog utils because SystemNavigationGestureSettings extends RadioButtonPickerFragment,
* not SettingsPreferenceFragment.
*/
public class SettingsTutorialDialogWrapperActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showDialog();
}
private void showDialog() {
AccessibilityGestureNavigationTutorial
.showGestureNavigationSettingsTutorialDialog(this, dialog -> finish());
}
}

View File

@@ -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))

View File

@@ -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);

View File

@@ -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<String> targets = ams.getAccessibilityShortcutTargets(