From db883712c3e4d1a8228e0c55ad7bca876d13fc4e Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Tue, 18 Feb 2020 02:37:10 +0800 Subject: [PATCH] Accessibility shortcut primary action - implement launched type fragment. Bug: 142531433 Test: make RunSettingsRoboTests Change-Id: I444bcc921b2a05483e508934c6f0b90b2cc53421 --- res/values/strings.xml | 2 + .../DividerSwitchPreference.java | 30 ++++- ...cessibilityActivityPreferenceFragment.java | 109 +++++++++++++++++- ...ccessibilityServicePreferenceFragment.java | 16 +-- 4 files changed, 144 insertions(+), 13 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index f5b19318e04..169e6f4f90e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4994,6 +4994,8 @@ Touch feedback Use %1$s + + Open %1$s Use color correction diff --git a/src/com/android/settings/accessibility/DividerSwitchPreference.java b/src/com/android/settings/accessibility/DividerSwitchPreference.java index 34b0429570c..2c44789384a 100644 --- a/src/com/android/settings/accessibility/DividerSwitchPreference.java +++ b/src/com/android/settings/accessibility/DividerSwitchPreference.java @@ -17,6 +17,7 @@ package com.android.settings.accessibility; import android.content.Context; +import android.view.View; import androidx.preference.PreferenceViewHolder; import androidx.preference.SwitchPreference; @@ -29,11 +30,25 @@ public final class DividerSwitchPreference extends SwitchPreference { private Boolean mDividerAllowedAbove; private Boolean mDividerAllowBelow; + private int mSwitchVisibility; public DividerSwitchPreference(Context context) { super(context); mDividerAllowedAbove = true; mDividerAllowBelow = true; + mSwitchVisibility = View.VISIBLE; + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + holder.setDividerAllowedAbove(mDividerAllowedAbove); + holder.setDividerAllowedBelow(mDividerAllowBelow); + + final View switchView = holder.itemView.findViewById(android.R.id.widget_frame); + if (switchView != null) { + switchView.setVisibility(mSwitchVisibility); + } } /** @@ -60,10 +75,15 @@ public final class DividerSwitchPreference extends SwitchPreference { } } - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - holder.setDividerAllowedAbove(mDividerAllowedAbove); - holder.setDividerAllowedBelow(mDividerAllowBelow); + /** + * Sets the visibility state of Settings view. + * + * @param visibility one of {@link View#VISIBLE}, {@link View#INVISIBLE}, or {@link View#GONE}. + */ + public void setSwitchVisibility(@View.Visibility int visibility) { + if (mSwitchVisibility != visibility) { + mSwitchVisibility = visibility; + notifyChanged(); + } } } diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java index f443d5fb6cb..08e66198d27 100644 --- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java +++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java @@ -16,12 +16,119 @@ package com.android.settings.accessibility; +import android.accessibilityservice.AccessibilityShortcutInfo; +import android.app.ActivityOptions; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.net.Uri; +import android.os.Bundle; +import android.os.UserHandle; +import android.util.Log; +import android.view.View; +import android.view.accessibility.AccessibilityManager; + +import androidx.preference.SwitchPreference; + +import com.android.settings.R; + +import java.util.List; + /** Fragment for providing open activity button. */ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeaturePreferenceFragment { + private static final String TAG = "LaunchA11yActivity"; + private static final String EMPTY_STRING = ""; + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + mToggleServiceDividerSwitchPreference.setSwitchVisibility(View.GONE); + } @Override protected void onPreferenceToggled(String preferenceKey, boolean enabled) { - // TODO(b/142531433): Added in next CL. + launchShortcutTargetActivity(getPrefContext().getDisplayId(), mComponentName); + } + + @Override + protected void onInstallSwitchPreferenceToggleSwitch() { + super.onInstallSwitchPreferenceToggleSwitch(); + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener((preference) -> { + final boolean checked = ((DividerSwitchPreference) preference).isChecked(); + onPreferenceToggled(mPreferenceKey, checked); + return false; + }); + } + + @Override + protected void onProcessArguments(Bundle arguments) { + super.onProcessArguments(arguments); + + mComponentName = arguments.getParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME); + final ActivityInfo info = getAccessibilityShortcutInfo().getActivityInfo(); + mPackageName = info.loadLabel(getPackageManager()).toString(); + + // Settings animated image. + final int animatedImageRes = arguments.getInt( + AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES); + mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) + .authority(mComponentName.getPackageName()) + .appendPath(String.valueOf(animatedImageRes)) + .build(); + + // Settings html description. + mHtmlDescription = arguments.getCharSequence(AccessibilitySettings.EXTRA_HTML_DESCRIPTION); + } + + @Override + public void onSettingsClicked(ShortcutPreference preference) { + super.onSettingsClicked(preference); + showDialog(DialogEnums.EDIT_SHORTCUT); + } + + @Override + protected void updateToggleServiceTitle(SwitchPreference switchPreference) { + final AccessibilityShortcutInfo info = getAccessibilityShortcutInfo(); + final String switchBarText = (info == null) ? EMPTY_STRING : getString( + R.string.accessibility_service_master_open_title, + info.getActivityInfo().loadLabel(getPackageManager())); + + switchPreference.setTitle(switchBarText); + } + + // IMPORTANT: Refresh the info since there are dynamically changing capabilities. + private AccessibilityShortcutInfo getAccessibilityShortcutInfo() { + final List infos = AccessibilityManager.getInstance( + getPrefContext()).getInstalledAccessibilityShortcutListAsUser(getPrefContext(), + UserHandle.myUserId()); + + for (int i = 0, count = infos.size(); i < count; i++) { + AccessibilityShortcutInfo shortcutInfo = infos.get(i); + ActivityInfo activityInfo = shortcutInfo.getActivityInfo(); + if (mComponentName.getPackageName().equals(activityInfo.packageName) + && mComponentName.getClassName().equals(activityInfo.name)) { + return shortcutInfo; + } + } + return null; + } + + private void launchShortcutTargetActivity(int displayId, ComponentName name) { + final Intent intent = new Intent(); + final Bundle bundle = ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle(); + + intent.setComponent(name); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + try { + final int userId = UserHandle.myUserId(); + getPrefContext().startActivityAsUser(intent, bundle, UserHandle.of(userId)); + } catch (ActivityNotFoundException ignore) { + // ignore the exception + Log.w(TAG, "Target activity not found."); + } } } diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index 17ca93915ee..9a64f775b76 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -59,6 +59,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends private LockPatternUtils mLockPatternUtils; private AtomicBoolean mIsDialogShown = new AtomicBoolean(/* initialValue= */ false); + private static final String EMPTY_STRING = ""; + private final SettingsContentObserver mSettingsContentObserver = new SettingsContentObserver(new Handler()) { @Override @@ -84,7 +86,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mLockPatternUtils = new LockPatternUtils(getActivity()); + mLockPatternUtils = new LockPatternUtils(getPrefContext()); } @Override @@ -105,11 +107,11 @@ public class ToggleAccessibilityServicePreferenceFragment extends // example, before JellyBean MR2 the user was granting the explore by touch // one. private AccessibilityServiceInfo getAccessibilityServiceInfo() { - List serviceInfos = AccessibilityManager.getInstance( - getActivity()).getInstalledAccessibilityServiceList(); - final int serviceInfoCount = serviceInfos.size(); - for (int i = 0; i < serviceInfoCount; i++) { - AccessibilityServiceInfo serviceInfo = serviceInfos.get(i); + final List infos = AccessibilityManager.getInstance( + getPrefContext()).getInstalledAccessibilityServiceList(); + + for (int i = 0, count = infos.size(); i < count; i++) { + AccessibilityServiceInfo serviceInfo = infos.get(i); ResolveInfo resolveInfo = serviceInfo.getResolveInfo(); if (mComponentName.getPackageName().equals(resolveInfo.serviceInfo.packageName) && mComponentName.getClassName().equals(resolveInfo.serviceInfo.name)) { @@ -191,7 +193,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); final String switchBarText = (info == null) ? "" : getString(R.string.accessibility_service_master_switch_title, - info.getResolveInfo().loadLabel(getPackageManager())); + info.getResolveInfo().loadLabel(getPackageManager())); switchPreference.setTitle(switchBarText); }