1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.accessibility; 18 19 import android.accessibilityservice.AccessibilityServiceInfo; 20 import android.content.ComponentName; 21 import android.content.Context; 22 import android.content.res.Resources; 23 import android.os.Bundle; 24 import android.provider.SearchIndexableResource; 25 import android.provider.Settings; 26 import android.support.v7.preference.Preference; 27 import android.text.TextUtils; 28 import android.view.View; 29 import android.view.accessibility.AccessibilityManager; 30 31 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 32 import com.android.settings.R; 33 import com.android.settings.SettingsPreferenceFragment; 34 import com.android.settings.core.PreferenceController; 35 import com.android.settings.search.BaseSearchIndexProvider; 36 import com.android.settings.search.Indexable; 37 38 import java.util.ArrayList; 39 import java.util.Arrays; 40 import java.util.Collections; 41 import java.util.List; 42 43 public final class MagnificationPreferenceFragment extends SettingsPreferenceFragment implements 44 Indexable { 45 46 // Settings App preference keys 47 private static final String PREFERENCE_TITLE_KEY = "magnification_preference_screen_title"; 48 private static final String MAGNIFICATION_GESTURES_PREFERENCE_SCREEN_KEY = 49 "screen_magnification_gestures_preference_screen"; 50 private static final String MAGNIFICATION_NAVBAR_PREFERENCE_SCREEN_KEY = 51 "screen_magnification_navbar_preference_screen"; 52 53 // Pseudo ComponentName used to represent navbar magnification in Settings.Secure. 54 private static final String MAGNIFICATION_COMPONENT_ID = 55 "com.android.server.accessibility.MagnificationController"; 56 57 private Preference mMagnificationGesturesPreference; 58 private Preference mMagnificationNavbarPreference; 59 60 private boolean mLaunchedFromSuw = false; 61 62 @Override onCreatePreferences(Bundle bundle, String s)63 public void onCreatePreferences(Bundle bundle, String s) { 64 addPreferencesFromResource(R.xml.accessibility_magnification_settings); 65 mMagnificationGesturesPreference = findPreference( 66 MAGNIFICATION_GESTURES_PREFERENCE_SCREEN_KEY); 67 mMagnificationNavbarPreference = findPreference(MAGNIFICATION_NAVBAR_PREFERENCE_SCREEN_KEY); 68 } 69 70 @Override onViewCreated(View view, Bundle savedInstanceState)71 public void onViewCreated(View view, Bundle savedInstanceState) { 72 super.onViewCreated(view, savedInstanceState); 73 74 final Bundle args = getArguments(); 75 if ((args != null) && args.containsKey(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW)) { 76 mLaunchedFromSuw = args.getBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW); 77 } 78 } 79 80 @Override onResume()81 public void onResume() { 82 super.onResume(); 83 getActivity().setTitle(R.string.accessibility_screen_magnification_title); 84 updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 85 mMagnificationGesturesPreference); 86 updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED, 87 mMagnificationNavbarPreference); 88 } 89 90 @Override getMetricsCategory()91 public int getMetricsCategory() { 92 return MetricsEvent.ACCESSIBILITY_SCREEN_MAGNIFICATION_SETTINGS; 93 } 94 95 @Override onPreferenceTreeClick(Preference preference)96 public boolean onPreferenceTreeClick(Preference preference) { 97 if (mLaunchedFromSuw) { 98 // If invoked from SUW, redirect to fragment instrumented for Vision Settings metrics 99 preference.setFragment( 100 ToggleScreenMagnificationPreferenceFragmentForSetupWizard.class.getName()); 101 } 102 if (mMagnificationGesturesPreference == preference) { 103 handleMagnificationGesturesPreferenceScreenClick(); 104 super.onPreferenceTreeClick(mMagnificationGesturesPreference); 105 return true; 106 } else if (mMagnificationNavbarPreference == preference) { 107 handleMagnificationNavbarPreferenceScreenClick(); 108 super.onPreferenceTreeClick(mMagnificationNavbarPreference); 109 return true; 110 } 111 return super.onPreferenceTreeClick(preference); 112 } 113 updateFeatureSummary(String prefKey, Preference pref)114 private void updateFeatureSummary(String prefKey, Preference pref) { 115 if (!mLaunchedFromSuw) { 116 final boolean enabled = Settings.Secure.getInt(getContentResolver(), prefKey, 0) == 1; 117 pref.setSummary(enabled ? R.string.accessibility_feature_state_on 118 : R.string.accessibility_feature_state_off); 119 } else { 120 if (Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED.equals(prefKey)) { 121 pref.setSummary(R.string.accessibility_screen_magnification_short_summary); 122 } else if (Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED.equals( 123 prefKey)) { 124 pref.setSummary(R.string.accessibility_screen_magnification_navbar_short_summary); 125 } 126 } 127 } 128 handleMagnificationGesturesPreferenceScreenClick()129 private void handleMagnificationGesturesPreferenceScreenClick() { 130 Bundle extras = mMagnificationGesturesPreference.getExtras(); 131 populateMagnificationGesturesPreferenceExtras(extras, getContext()); 132 extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mLaunchedFromSuw); 133 } 134 handleMagnificationNavbarPreferenceScreenClick()135 private void handleMagnificationNavbarPreferenceScreenClick() { 136 Bundle extras = mMagnificationNavbarPreference.getExtras(); 137 extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY, 138 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED); 139 extras.putString(AccessibilitySettings.EXTRA_TITLE, getString( 140 R.string.accessibility_screen_magnification_navbar_title)); 141 extras.putCharSequence(AccessibilitySettings.EXTRA_SUMMARY, 142 getActivity().getResources().getText( 143 R.string.accessibility_screen_magnification_navbar_summary)); 144 extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, 145 Settings.Secure.getInt(getContentResolver(), 146 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED, 0) 147 == 1); 148 extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mLaunchedFromSuw); 149 } 150 getConfigurationWarningStringForSecureSettingsKey(String key, Context context)151 static CharSequence getConfigurationWarningStringForSecureSettingsKey(String key, 152 Context context) { 153 if (!Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED.equals(key)) { 154 return null; 155 } 156 if (Settings.Secure.getInt(context.getContentResolver(), 157 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED, 0) == 0) { 158 return null; 159 } 160 final AccessibilityManager am = (AccessibilityManager) context.getSystemService( 161 Context.ACCESSIBILITY_SERVICE); 162 final String assignedId = Settings.Secure.getString(context.getContentResolver(), 163 Settings.Secure.ACCESSIBILITY_BUTTON_TARGET_COMPONENT); 164 if (!TextUtils.isEmpty(assignedId) && !MAGNIFICATION_COMPONENT_ID.equals(assignedId)) { 165 final ComponentName assignedComponentName = ComponentName.unflattenFromString( 166 assignedId); 167 final List<AccessibilityServiceInfo> activeServices = 168 am.getEnabledAccessibilityServiceList( 169 AccessibilityServiceInfo.FEEDBACK_ALL_MASK); 170 final int serviceCount = activeServices.size(); 171 for (int i = 0; i < serviceCount; i++) { 172 final AccessibilityServiceInfo info = activeServices.get(i); 173 if (info.getComponentName().equals(assignedComponentName)) { 174 final CharSequence assignedServiceName = info.getResolveInfo().loadLabel( 175 context.getPackageManager()); 176 return context.getString( 177 R.string.accessibility_screen_magnification_navbar_configuration_warning, 178 assignedServiceName); 179 } 180 } 181 } 182 return null; 183 } 184 populateMagnificationGesturesPreferenceExtras(Bundle extras, Context context)185 static void populateMagnificationGesturesPreferenceExtras(Bundle extras, Context context) { 186 extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY, 187 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED); 188 extras.putString(AccessibilitySettings.EXTRA_TITLE, context.getString( 189 R.string.accessibility_screen_magnification_gestures_title)); 190 extras.putCharSequence(AccessibilitySettings.EXTRA_SUMMARY, context.getResources().getText( 191 R.string.accessibility_screen_magnification_summary)); 192 extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, 193 Settings.Secure.getInt(context.getContentResolver(), 194 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0) == 1); 195 extras.putInt(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID, 196 R.raw.accessibility_screen_magnification); 197 } 198 199 /** 200 * @return {@code true} if this fragment should be shown, {@code false} otherwise. This 201 * fragment is shown in the case that more than one magnification mode is available. 202 */ isApplicable(Resources res)203 static boolean isApplicable(Resources res) { 204 return res.getBoolean(com.android.internal.R.bool.config_showNavigationBar); 205 } 206 207 public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 208 new BaseSearchIndexProvider() { 209 @Override 210 public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, 211 boolean enabled) { 212 if (isApplicable(context.getResources())) { 213 final SearchIndexableResource sir = new SearchIndexableResource(context); 214 sir.xmlResId = R.xml.accessibility_magnification_settings; 215 return Arrays.asList(sir); 216 } else { 217 return Collections.emptyList(); 218 } 219 } 220 221 @Override 222 public List<String> getNonIndexableKeys(Context context) { 223 List<String> keys = super.getNonIndexableKeys(context); 224 keys.add(PREFERENCE_TITLE_KEY); 225 return keys; 226 } 227 }; 228 } 229