<string name="accessibility_feature_state_on">On</string>
<!-- Summary for the disabled state of an accessibility feature. [CHAR LIMIT=10] -->
<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] -->
<string name="captioning_preview_title">Preview</string>
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.ActivityManagerNative;
+import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
private int mLongPressTimeoutDefault;
+ private DevicePolicyManager mDpm;
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.accessibility_settings);
initializeAllPreferences();
+ mDpm = (DevicePolicyManager) (getActivity()
+ .getSystemService(Context.DEVICE_POLICY_SERVICE));
}
@Override
accessibilityManager.getInstalledAccessibilityServiceList();
Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
getActivity());
-
+ List<String> permittedServices = mDpm.getPermittedAccessibilityServices(
+ UserHandle.myUserId());
final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
preference.setTitle(title);
final boolean serviceEnabled = accessibilityEnabled
&& enabledServices.contains(componentName);
+ String serviceEnabledString;
if (serviceEnabled) {
- preference.setSummary(getString(R.string.accessibility_feature_state_on));
+ serviceEnabledString = getString(R.string.accessibility_feature_state_on);
} 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.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
import android.app.Activity;
import android.app.Fragment;
+import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.hardware.input.KeyboardLayout;
import android.os.Bundle;
import android.os.Handler;
+import android.os.UserHandle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
private SettingsObserver mSettingsObserver;
private Intent mIntentWaitingForResult;
private InputMethodSettingValuesWrapper mInputMethodSettingValues;
+ private DevicePolicyManager mDpm;
@Override
public void onCreate(Bundle icicle) {
mHandler = new Handler();
mSettingsObserver = new SettingsObserver(mHandler, activity);
+ mDpm = (DevicePolicyManager) (getActivity().
+ getSystemService(Context.DEVICE_POLICY_SERVICE));
}
private void updateInputMethodSelectorSummary(int value) {
mKeyboardSettingsCategory.removePreference(pref);
}
mInputMethodPreferenceList.clear();
+ List<String> permittedList = mDpm.getPermittedInputMethodsForCurrentUser();
final Context context = getActivity();
final List<InputMethodInfo> imis = mShowsOnlyFullImeAndKeyboardList
? mInputMethodSettingValues.getInputMethodList()
final int N = (imis == null ? 0 : imis.size());
for (int i = 0; i < N; ++i) {
final InputMethodInfo imi = imis.get(i);
+ final boolean isAllowedByOrganization = permittedList == null
+ || permittedList.contains(imi.getPackageName());
final InputMethodPreference pref = new InputMethodPreference(
- context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */, this);
+ context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */,
+ isAllowedByOrganization, this);
mInputMethodPreferenceList.add(pref);
}
final Collator collator = Collator.getInstance();
private final boolean mHasPriorityInSorting;
private final OnSavePreferenceListener mOnSaveListener;
private final InputMethodSettingValuesWrapper mInputMethodSettingValues;
+ private final boolean mIsAllowedByOrganization;
private AlertDialog mDialog = null;
* @param imi The {@link InputMethodInfo} of this preference.
* @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.
+ * @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
* to save the state to shared preference.
*/
InputMethodPreference(final Context context, final InputMethodInfo imi,
- final boolean isImeEnabler, final OnSavePreferenceListener onSaveListener) {
+ final boolean isImeEnabler, final boolean isAllowedByOrganization,
+ final OnSavePreferenceListener onSaveListener) {
super(context);
setPersistent(false);
mImi = imi;
+ mIsAllowedByOrganization = isAllowedByOrganization;
mOnSaveListener = onSaveListener;
if (!isImeEnabler) {
// Hide switch widget.
mImi, getContext());
// 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.
- setEnabled(!(isAlwaysChecked && isImeEnabler()));
+ setEnabled(!((isAlwaysChecked && isImeEnabler()) || (!mIsAllowedByOrganization)));
setChecked(mInputMethodSettingValues.isEnabledImi(mImi));
setSummary(getSummaryString());
}
private String getSummaryString() {
final Context context = getContext();
+ if (!mIsAllowedByOrganization) {
+ return context.getString(R.string.accessibility_feature_or_input_method_not_allowed);
+ }
final InputMethodManager imm = getInputMethodManager();
final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(mImi, true);
final ArrayList<CharSequence> subtypeLabels = new ArrayList<>();