From 97635f53e6f51250372fd66672d277d3d56eb010 Mon Sep 17 00:00:00 2001 From: Wilson Wu Date: Mon, 8 Nov 2021 18:10:39 +0800 Subject: [PATCH] Make on-screen keyboard settings support tab layout Introduces following fragments for work flow. - Add ProfileSelectKeyboardFragment which used to display personal/work fragment when user has work profile. - Introduce UserAwareContext in AvailableVirtualKeyboardFragment to support personal/work user installed input methods handling. Bug: 174360557 Bug: 197707782 Test: Manual test as bug video Change-Id: I1019e375c5d42de7bc7c048d5d66e8e2f58acce8 --- res/xml/language_and_input.xml | 7 -- .../ProfileFragmentBridge.java | 3 + .../ProfileSelectKeyboardFragment.java | 57 +++++++++++++++ .../AvailableVirtualKeyboardFragment.java | 72 ++++++++++++++----- 4 files changed, 114 insertions(+), 25 deletions(-) create mode 100644 src/com/android/settings/dashboard/profileselector/ProfileSelectKeyboardFragment.java diff --git a/res/xml/language_and_input.xml b/res/xml/language_and_input.xml index 2055ab70809..f33ef5cb444 100644 --- a/res/xml/language_and_input.xml +++ b/res/xml/language_and_input.xml @@ -90,13 +90,6 @@ android:title="@string/language_and_input_for_work_category_title" settings:searchable="false"> - - {@link AvailableVirtualKeyboardFragment} used to show both of personal/work user installed + * IMEs.

+ */ +public final class ProfileSelectKeyboardFragment extends ProfileSelectFragment { + + @Override + protected int getPreferenceScreenResId() { + return R.xml.available_virtual_keyboard; + } + + @Override + public Fragment[] getFragments() { + final Bundle personalOnly = new Bundle(); + personalOnly.putInt(EXTRA_PROFILE, ProfileType.PERSONAL); + final Fragment personalFragment = new AvailableVirtualKeyboardFragment(); + personalFragment.setArguments(personalOnly); + + final Bundle workOnly = new Bundle(); + workOnly.putInt(EXTRA_PROFILE, ProfileType.WORK); + final Fragment workFragment = new AvailableVirtualKeyboardFragment(); + workFragment.setArguments(workOnly); + + return new Fragment[]{ + personalFragment, + workFragment + }; + } +} diff --git a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java index 7523ae4d466..b083aefee0b 100644 --- a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java @@ -16,18 +16,21 @@ package com.android.settings.inputmethod; -import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.SearchIndexableResource; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.Utils; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.dashboard.profileselector.ProfileSelectFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.inputmethod.InputMethodAndSubtypeUtilCompat; import com.android.settingslib.inputmethod.InputMethodPreference; @@ -38,23 +41,41 @@ import java.text.Collator; import java.util.ArrayList; import java.util.List; +/** + * The fragment for on-screen keyboard settings which used to display user installed IMEs. + * + * TODO(b/207452897): Add test for AvailableVirtualKeyboardFragment + */ @SearchIndexable -public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFragment +public final class AvailableVirtualKeyboardFragment extends DashboardFragment implements InputMethodPreference.OnSavePreferenceListener { + private static final String TAG = "AvailableVirtualKeyboardFragment"; private final ArrayList mInputMethodPreferenceList = new ArrayList<>(); private InputMethodSettingValuesWrapper mInputMethodSettingValues; - private InputMethodManager mImm; - private DevicePolicyManager mDpm; + private Context mUserAwareContext; + private int mUserId; @Override public void onCreatePreferences(Bundle bundle, String s) { addPreferencesFromResource(R.xml.available_virtual_keyboard); - Activity activity = getActivity(); + mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(mUserAwareContext); + } - mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(activity); - mImm = activity.getSystemService(InputMethodManager.class); - mDpm = activity.getSystemService(DevicePolicyManager.class); + @Override + public void onAttach(Context context) { + super.onAttach(context); + final int profileType = getArguments().getInt(ProfileSelectFragment.EXTRA_PROFILE); + if (profileType == ProfileSelectFragment.ProfileType.WORK) { + final UserManager userManager = UserManager.get(context); + final UserHandle workUser = Utils.getManagedProfile(userManager); + // get work userId + mUserId = Utils.getManagedProfileId(userManager, UserHandle.myUserId()); + mUserAwareContext = context.createContextAsUser(workUser, 0); + } else { + mUserId = UserHandle.myUserId(); + mUserAwareContext = context; + } } @Override @@ -66,12 +87,25 @@ public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFr updateInputMethodPreferenceViews(); } + @Override + protected int getPreferenceScreenResId() { + return R.xml.available_virtual_keyboard; + } + + @Override + protected String getLogTag() { + return TAG; + } + @Override public void onSaveInputMethodPreference(final InputMethodPreference pref) { final boolean hasHardwareKeyboard = getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY; - InputMethodAndSubtypeUtilCompat.saveInputMethodSubtypeList(this, getContentResolver(), - mImm.getInputMethodList(), hasHardwareKeyboard); + InputMethodAndSubtypeUtilCompat.saveInputMethodSubtypeListForUser(this, + mUserAwareContext.getContentResolver(), + getContext().getSystemService( + InputMethodManager.class).getInputMethodListAsUser(mUserId), + hasHardwareKeyboard, mUserId); // Update input method settings and preference list. mInputMethodSettingValues.refreshAllInputMethodAndSubtypes(); for (final InputMethodPreference p : mInputMethodPreferenceList) { @@ -88,10 +122,12 @@ public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFr mInputMethodSettingValues.refreshAllInputMethodAndSubtypes(); // Clear existing "InputMethodPreference"s mInputMethodPreferenceList.clear(); - List permittedList = mDpm.getPermittedInputMethodsForCurrentUser(); - final Context context = getPrefContext(); + final List permittedList = mUserAwareContext.getSystemService( + DevicePolicyManager.class).getPermittedInputMethods(); + final Context prefContext = getPrefContext(); final List imis = mInputMethodSettingValues.getInputMethodList(); - final List enabledImis = mImm.getEnabledInputMethodList(); + final List enabledImis = getContext().getSystemService( + InputMethodManager.class).getEnabledInputMethodListAsUser(mUserId); final int numImis = (imis == null ? 0 : imis.size()); for (int i = 0; i < numImis; ++i) { final InputMethodInfo imi = imis.get(i); @@ -101,12 +137,12 @@ public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFr // allowed by organization. Doing so will allow the user to disable the input method and // remain complaint with the organization's policy. Once disabled, the input method // cannot be re-enabled because it is not in the permitted list. - final boolean isAllowedByOrganization = permittedList == null + final boolean isAllowedByOrganization = permittedList.isEmpty() || permittedList.contains(imi.getPackageName()) || enabledImis.contains(imi); - final InputMethodPreference pref = new InputMethodPreference( - context, imi, isAllowedByOrganization, this); - pref.setIcon(imi.loadIcon(context.getPackageManager())); + final InputMethodPreference pref = new InputMethodPreference(prefContext, imi, + isAllowedByOrganization, this, mUserId); + pref.setIcon(imi.loadIcon(mUserAwareContext.getPackageManager())); mInputMethodPreferenceList.add(pref); } final Collator collator = Collator.getInstance();