Disable non-permitted accessibility services and IMEs
Bug: 14469005 Change-Id: I4986f035318854c27ecb92bbe2f0c977d53b6361
This commit is contained in:
@@ -3602,6 +3602,8 @@
|
|||||||
<string name="accessibility_feature_state_on">On</string>
|
<string name="accessibility_feature_state_on">On</string>
|
||||||
<!-- Summary for the disabled state of an accessibility feature. [CHAR LIMIT=10] -->
|
<!-- Summary for the disabled state of an accessibility feature. [CHAR LIMIT=10] -->
|
||||||
<string name="accessibility_feature_state_off">Off</string>
|
<string name="accessibility_feature_state_off">Off</string>
|
||||||
|
<!-- Summary when an accessibility feature or ime is not permitted. [CHAR LIMIT=40] -->
|
||||||
|
<string name="accessibility_feature_or_input_method_not_allowed">Not allowed by your organization</string>
|
||||||
|
|
||||||
<!-- Title for the preference category containing the video caption preview. [CHAR LIMIT=35] -->
|
<!-- Title for the preference category containing the video caption preview. [CHAR LIMIT=35] -->
|
||||||
<string name="captioning_preview_title">Preview</string>
|
<string name="captioning_preview_title">Preview</string>
|
||||||
|
@@ -18,6 +18,7 @@ package com.android.settings.accessibility;
|
|||||||
|
|
||||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||||
import android.app.ActivityManagerNative;
|
import android.app.ActivityManagerNative;
|
||||||
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@@ -28,6 +29,7 @@ import android.net.Uri;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.preference.CheckBoxPreference;
|
import android.preference.CheckBoxPreference;
|
||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
@@ -197,11 +199,15 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
|||||||
|
|
||||||
private int mLongPressTimeoutDefault;
|
private int mLongPressTimeoutDefault;
|
||||||
|
|
||||||
|
private DevicePolicyManager mDpm;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
addPreferencesFromResource(R.xml.accessibility_settings);
|
addPreferencesFromResource(R.xml.accessibility_settings);
|
||||||
initializeAllPreferences();
|
initializeAllPreferences();
|
||||||
|
mDpm = (DevicePolicyManager) (getActivity()
|
||||||
|
.getSystemService(Context.DEVICE_POLICY_SERVICE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -434,7 +440,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
|||||||
accessibilityManager.getInstalledAccessibilityServiceList();
|
accessibilityManager.getInstalledAccessibilityServiceList();
|
||||||
Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
|
Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
|
||||||
getActivity());
|
getActivity());
|
||||||
|
List<String> permittedServices = mDpm.getPermittedAccessibilityServices(
|
||||||
|
UserHandle.myUserId());
|
||||||
final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
|
final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
|
||||||
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
|
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
|
||||||
|
|
||||||
@@ -454,12 +461,27 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
|||||||
preference.setTitle(title);
|
preference.setTitle(title);
|
||||||
final boolean serviceEnabled = accessibilityEnabled
|
final boolean serviceEnabled = accessibilityEnabled
|
||||||
&& enabledServices.contains(componentName);
|
&& enabledServices.contains(componentName);
|
||||||
|
String serviceEnabledString;
|
||||||
if (serviceEnabled) {
|
if (serviceEnabled) {
|
||||||
preference.setSummary(getString(R.string.accessibility_feature_state_on));
|
serviceEnabledString = getString(R.string.accessibility_feature_state_on);
|
||||||
} else {
|
} else {
|
||||||
preference.setSummary(getString(R.string.accessibility_feature_state_off));
|
serviceEnabledString = getString(R.string.accessibility_feature_state_off);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Disable all accessibility services that are not permitted.
|
||||||
|
String packageName = serviceInfo.packageName;
|
||||||
|
boolean serviceAllowed =
|
||||||
|
permittedServices == null || permittedServices.contains(packageName);
|
||||||
|
preference.setEnabled(serviceAllowed || serviceEnabled);
|
||||||
|
|
||||||
|
String summaryString;
|
||||||
|
if (serviceAllowed) {
|
||||||
|
summaryString = serviceEnabledString;
|
||||||
|
} else {
|
||||||
|
summaryString = getString(R.string.accessibility_feature_or_input_method_not_allowed);
|
||||||
|
}
|
||||||
|
preference.setSummary(summaryString);
|
||||||
|
|
||||||
preference.setOrder(i);
|
preference.setOrder(i);
|
||||||
preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
|
preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
|
||||||
preference.setPersistent(true);
|
preference.setPersistent(true);
|
||||||
|
@@ -18,6 +18,7 @@ package com.android.settings.inputmethod;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -34,6 +35,7 @@ import android.hardware.input.InputManager;
|
|||||||
import android.hardware.input.KeyboardLayout;
|
import android.hardware.input.KeyboardLayout;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.preference.CheckBoxPreference;
|
import android.preference.CheckBoxPreference;
|
||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
@@ -102,6 +104,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
|
|||||||
private SettingsObserver mSettingsObserver;
|
private SettingsObserver mSettingsObserver;
|
||||||
private Intent mIntentWaitingForResult;
|
private Intent mIntentWaitingForResult;
|
||||||
private InputMethodSettingValuesWrapper mInputMethodSettingValues;
|
private InputMethodSettingValuesWrapper mInputMethodSettingValues;
|
||||||
|
private DevicePolicyManager mDpm;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
@@ -175,6 +178,8 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
mHandler = new Handler();
|
mHandler = new Handler();
|
||||||
mSettingsObserver = new SettingsObserver(mHandler, activity);
|
mSettingsObserver = new SettingsObserver(mHandler, activity);
|
||||||
|
mDpm = (DevicePolicyManager) (getActivity().
|
||||||
|
getSystemService(Context.DEVICE_POLICY_SERVICE));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateInputMethodSelectorSummary(int value) {
|
private void updateInputMethodSelectorSummary(int value) {
|
||||||
@@ -403,6 +408,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
|
|||||||
mKeyboardSettingsCategory.removePreference(pref);
|
mKeyboardSettingsCategory.removePreference(pref);
|
||||||
}
|
}
|
||||||
mInputMethodPreferenceList.clear();
|
mInputMethodPreferenceList.clear();
|
||||||
|
List<String> permittedList = mDpm.getPermittedInputMethodsForCurrentUser();
|
||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
final List<InputMethodInfo> imis = mShowsOnlyFullImeAndKeyboardList
|
final List<InputMethodInfo> imis = mShowsOnlyFullImeAndKeyboardList
|
||||||
? mInputMethodSettingValues.getInputMethodList()
|
? mInputMethodSettingValues.getInputMethodList()
|
||||||
@@ -410,8 +416,11 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
|
|||||||
final int N = (imis == null ? 0 : imis.size());
|
final int N = (imis == null ? 0 : imis.size());
|
||||||
for (int i = 0; i < N; ++i) {
|
for (int i = 0; i < N; ++i) {
|
||||||
final InputMethodInfo imi = imis.get(i);
|
final InputMethodInfo imi = imis.get(i);
|
||||||
|
final boolean isAllowedByOrganization = permittedList == null
|
||||||
|
|| permittedList.contains(imi.getPackageName());
|
||||||
final InputMethodPreference pref = new InputMethodPreference(
|
final InputMethodPreference pref = new InputMethodPreference(
|
||||||
context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */, this);
|
context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */,
|
||||||
|
isAllowedByOrganization, this);
|
||||||
mInputMethodPreferenceList.add(pref);
|
mInputMethodPreferenceList.add(pref);
|
||||||
}
|
}
|
||||||
final Collator collator = Collator.getInstance();
|
final Collator collator = Collator.getInstance();
|
||||||
|
@@ -68,6 +68,7 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
|
|||||||
private final boolean mHasPriorityInSorting;
|
private final boolean mHasPriorityInSorting;
|
||||||
private final OnSavePreferenceListener mOnSaveListener;
|
private final OnSavePreferenceListener mOnSaveListener;
|
||||||
private final InputMethodSettingValuesWrapper mInputMethodSettingValues;
|
private final InputMethodSettingValuesWrapper mInputMethodSettingValues;
|
||||||
|
private final boolean mIsAllowedByOrganization;
|
||||||
|
|
||||||
private AlertDialog mDialog = null;
|
private AlertDialog mDialog = null;
|
||||||
|
|
||||||
@@ -78,14 +79,18 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
|
|||||||
* @param imi The {@link InputMethodInfo} of this preference.
|
* @param imi The {@link InputMethodInfo} of this preference.
|
||||||
* @param isImeEnabler true if this preference is the IME enabler that has enable/disable
|
* @param isImeEnabler true if this preference is the IME enabler that has enable/disable
|
||||||
* switches for all available IMEs, not the list of enabled IMEs.
|
* switches for all available IMEs, not the list of enabled IMEs.
|
||||||
|
* @param isAllowedByOrganization false if the IME has been disabled by a device or profile
|
||||||
|
owner.
|
||||||
* @param onSaveListener The listener called when this preference has been changed and needs
|
* @param onSaveListener The listener called when this preference has been changed and needs
|
||||||
* to save the state to shared preference.
|
* to save the state to shared preference.
|
||||||
*/
|
*/
|
||||||
InputMethodPreference(final Context context, final InputMethodInfo imi,
|
InputMethodPreference(final Context context, final InputMethodInfo imi,
|
||||||
final boolean isImeEnabler, final OnSavePreferenceListener onSaveListener) {
|
final boolean isImeEnabler, final boolean isAllowedByOrganization,
|
||||||
|
final OnSavePreferenceListener onSaveListener) {
|
||||||
super(context);
|
super(context);
|
||||||
setPersistent(false);
|
setPersistent(false);
|
||||||
mImi = imi;
|
mImi = imi;
|
||||||
|
mIsAllowedByOrganization = isAllowedByOrganization;
|
||||||
mOnSaveListener = onSaveListener;
|
mOnSaveListener = onSaveListener;
|
||||||
if (!isImeEnabler) {
|
if (!isImeEnabler) {
|
||||||
// Hide switch widget.
|
// Hide switch widget.
|
||||||
@@ -178,7 +183,7 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
|
|||||||
mImi, getContext());
|
mImi, getContext());
|
||||||
// Only when this preference has a switch and an input method should be always enabled,
|
// Only when this preference has a switch and an input method should be always enabled,
|
||||||
// this preference should be disabled to prevent accidentally disabling an input method.
|
// this preference should be disabled to prevent accidentally disabling an input method.
|
||||||
setEnabled(!(isAlwaysChecked && isImeEnabler()));
|
setEnabled(!((isAlwaysChecked && isImeEnabler()) || (!mIsAllowedByOrganization)));
|
||||||
setChecked(mInputMethodSettingValues.isEnabledImi(mImi));
|
setChecked(mInputMethodSettingValues.isEnabledImi(mImi));
|
||||||
setSummary(getSummaryString());
|
setSummary(getSummaryString());
|
||||||
}
|
}
|
||||||
@@ -189,6 +194,9 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
|
|||||||
|
|
||||||
private String getSummaryString() {
|
private String getSummaryString() {
|
||||||
final Context context = getContext();
|
final Context context = getContext();
|
||||||
|
if (!mIsAllowedByOrganization) {
|
||||||
|
return context.getString(R.string.accessibility_feature_or_input_method_not_allowed);
|
||||||
|
}
|
||||||
final InputMethodManager imm = getInputMethodManager();
|
final InputMethodManager imm = getInputMethodManager();
|
||||||
final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(mImi, true);
|
final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(mImi, true);
|
||||||
final ArrayList<CharSequence> subtypeLabels = new ArrayList<>();
|
final ArrayList<CharSequence> subtypeLabels = new ArrayList<>();
|
||||||
|
Reference in New Issue
Block a user