Refines the hardware shortcut landing dialog behavior

Let user can re-show if user click "turn off shortcut" when long press volume key.

Bug: 142529032
Test: Manuel test
Change-Id: I6fbcabcde07706999459c90318d2237b781431e8
This commit is contained in:
menghanli
2020-02-11 16:47:18 +08:00
parent d84283174a
commit e83358b71b
2 changed files with 34 additions and 19 deletions

View File

@@ -22,6 +22,7 @@ import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHOR
import static com.android.internal.util.ArrayUtils.convertToLongArray;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.IntDef;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.AlertDialog;
@@ -53,6 +54,8 @@ import android.widget.Toast;
import com.android.internal.R;
import com.android.internal.util.function.pooled.PooledLambda;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
@@ -85,6 +88,17 @@ public class AccessibilityShortcutController {
private boolean mEnabledOnLockScreen;
private int mUserId;
@Retention(RetentionPolicy.SOURCE)
@IntDef({
DialogStaus.NOT_SHOWN,
DialogStaus.SHOWN,
})
/** Denotes the user shortcut type. */
private @interface DialogStaus {
int NOT_SHOWN = 0;
int SHOWN = 1;
}
// Visible for testing
public FrameworkObjectProvider mFrameworkObjectProvider = new FrameworkObjectProvider();
@@ -163,7 +177,8 @@ public class AccessibilityShortcutController {
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, 1, mUserId) == 1;
// Enable the shortcut from the lockscreen by default if the dialog has been shown
final int dialogAlreadyShown = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 0, mUserId);
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, DialogStaus.NOT_SHOWN,
mUserId);
mEnabledOnLockScreen = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN,
dialogAlreadyShown, mUserId) == 1;
@@ -178,7 +193,8 @@ public class AccessibilityShortcutController {
final ContentResolver cr = mContext.getContentResolver();
final int userId = ActivityManager.getCurrentUser();
final int dialogAlreadyShown = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 0, userId);
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, DialogStaus.NOT_SHOWN,
userId);
// Play a notification vibration
Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
if ((vibrator != null) && vibrator.hasVibrator()) {
@@ -205,7 +221,8 @@ public class AccessibilityShortcutController {
w.setAttributes(attr);
mAlertDialog.show();
Settings.Secure.putIntForUser(
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 1, userId);
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, DialogStaus.SHOWN,
userId);
} else {
playNotificationTone();
if (mAlertDialog != null) {
@@ -245,21 +262,16 @@ public class AccessibilityShortcutController {
String toastMessage = String.format(toastMessageFormatString, serviceName);
Toast warningToast = mFrameworkObjectProvider.makeToastFromText(
mContext, toastMessage, Toast.LENGTH_LONG);
warningToast.getWindowParams().privateFlags |=
WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
if (warningToast.getWindowParams() != null) {
warningToast.getWindowParams().privateFlags |=
WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
}
warningToast.show();
}
private AlertDialog createShortcutWarningDialog(int userId) {
final String serviceDescription = getShortcutFeatureDescription(true /* Include summary */);
if (serviceDescription == null) {
return null;
}
final String warningMessage = String.format(
mContext.getString(R.string.accessibility_shortcut_toogle_warning),
serviceDescription);
final String warningMessage = mContext.getString(
R.string.accessibility_shortcut_toogle_warning);
final AlertDialog alertDialog = mFrameworkObjectProvider.getAlertDialogBuilder(
// Use SystemUI context so we pick up any theme set in a vendor overlay
mFrameworkObjectProvider.getSystemUiContext())
@@ -272,11 +284,17 @@ public class AccessibilityShortcutController {
Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, "",
userId);
// If canceled, treat as if the dialog has never been shown
Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
DialogStaus.NOT_SHOWN, userId);
})
.setOnCancelListener((DialogInterface d) -> {
// If canceled, treat as if the dialog has never been shown
Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 0, userId);
Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
DialogStaus.NOT_SHOWN, userId);
})
.create();
return alertDialog;

View File

@@ -4372,10 +4372,7 @@
service via the volume buttons shortcut for the first time. [CHAR LIMIT=none] -->
<string name="accessibility_shortcut_toogle_warning">
When the shortcut is on, pressing both volume buttons for 3 seconds will start an
accessibility feature.\n\n
Current accessibility feature:\n
<xliff:g id="service_name" example="TalkBack">%1$s</xliff:g>\n\n
You can change the feature in Settings > Accessibility.
accessibility feature.
</string>
<!-- Text in button that edit the accessibility shortcut menu, user can delete