diff --git a/res/values/strings.xml b/res/values/strings.xml index 63fb3a99a95..fe15258addd 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4456,6 +4456,10 @@ Keyboard shortcuts helper Display available shortcuts + + Work profile + + Virtual keyboard for work Default @@ -4487,6 +4491,8 @@ Personal dictionary + + Personal dictionary for work "" @@ -6380,6 +6386,8 @@ Spell checker + + Spell checker for work Type your current full backup password here diff --git a/res/xml/language_and_input.xml b/res/xml/language_and_input.xml index 8b63e329c59..b04bdf8ab58 100644 --- a/res/xml/language_and_input.xml +++ b/res/xml/language_and_input.xml @@ -92,4 +92,27 @@ android:summary="@string/vibrate_input_devices_summary" settings:controller="com.android.settings.inputmethod.GameControllerPreferenceController" /> + + + + + + + + + diff --git a/src/com/android/settings/core/WorkProfilePreferenceController.java b/src/com/android/settings/core/WorkProfilePreferenceController.java new file mode 100644 index 00000000000..603af20a870 --- /dev/null +++ b/src/com/android/settings/core/WorkProfilePreferenceController.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.settings.core; + +import android.content.Context; +import android.os.UserHandle; +import android.os.UserManager; +import android.text.TextUtils; + +import androidx.annotation.Nullable; +import androidx.preference.Preference; + +import com.android.settings.Utils; + +/** + * Abstract class to provide additional logic to deal with optional {@link Preference} entries that + * are used only when work profile is enabled. + * + *

TODO(b/123376083): Consider merging this into {@link BasePreferenceController}.

+ */ +public abstract class WorkProfilePreferenceController extends BasePreferenceController { + @Nullable + private final UserHandle mWorkProfileUser; + + /** + * Constructor of {@link WorkProfilePreferenceController}. Called by + * {@link BasePreferenceController#createInstance(Context, String)} through reflection. + * + * @param context {@link Context} to instantiate this controller. + * @param preferenceKey Preference key to be associated with the {@link Preference}. + */ + public WorkProfilePreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + mWorkProfileUser = Utils.getManagedProfile(UserManager.get(context)); + } + + /** + * @return Non-{@code null} {@link UserHandle} when a work profile is enabled. + * Otherwise {@code null}. + */ + @Nullable + protected UserHandle getWorkProfileUser() { + return mWorkProfileUser; + } + + /** + * Called back from {@link #handlePreferenceTreeClick(Preference)} to associate source metrics + * category. + * + * @return One of {@link android.app.settings.SettingsEnums}. + */ + protected abstract int getSourceMetricsCategory(); + + /** + * {@inheritDoc} + * + *

When you override this method, do not forget to check {@link #getWorkProfileUser()} to + * see if work profile user actually exists or not.

+ */ + @AvailabilityStatus + @Override + public int getAvailabilityStatus() { + return mWorkProfileUser != null ? AVAILABLE : DISABLED_FOR_USER; + } + + /** + * Launches the specified fragment for the work profile user if the associated + * {@link Preference} is clicked. Otherwise just forward it to the super class. + * + * @param preference the preference being clicked. + * @return {@code true} if handled. + */ + public boolean handlePreferenceTreeClick(Preference preference) { + if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { + return super.handlePreferenceTreeClick(preference); + } + new SubSettingLauncher(preference.getContext()) + .setDestination(preference.getFragment()) + .setSourceMetricsCategory(getSourceMetricsCategory()) + .setArguments(preference.getExtras()) + .setUserHandle(mWorkProfileUser) + .launch(); + return true; + } +} diff --git a/src/com/android/settings/inputmethod/SpellCheckerForWorkPreferenceController.java b/src/com/android/settings/inputmethod/SpellCheckerForWorkPreferenceController.java new file mode 100644 index 00000000000..327af5b2bbc --- /dev/null +++ b/src/com/android/settings/inputmethod/SpellCheckerForWorkPreferenceController.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.inputmethod; + +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.view.inputmethod.InputMethodSystemProperty; + +import com.android.settings.R; +import com.android.settings.core.WorkProfilePreferenceController; + +/** + * Preference controller for "Spell checker for work". + * + * @see SpellCheckerPreferenceController + */ +public final class SpellCheckerForWorkPreferenceController extends WorkProfilePreferenceController { + + public SpellCheckerForWorkPreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + } + + @Override + protected int getSourceMetricsCategory() { + return SettingsEnums.SETTINGS_LANGUAGE_CATEGORY; + } + + @AvailabilityStatus + @Override + public int getAvailabilityStatus() { + if (!mContext.getResources().getBoolean(R.bool.config_show_spellcheckers_settings) + || !InputMethodSystemProperty.PER_PROFILE_IME_ENABLED) { + return UNSUPPORTED_ON_DEVICE; + } + return super.getAvailabilityStatus(); + } +} diff --git a/src/com/android/settings/inputmethod/VirtualKeyboardForWorkPreferenceController.java b/src/com/android/settings/inputmethod/VirtualKeyboardForWorkPreferenceController.java new file mode 100644 index 00000000000..6cdd386bb4a --- /dev/null +++ b/src/com/android/settings/inputmethod/VirtualKeyboardForWorkPreferenceController.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.inputmethod; + +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.view.inputmethod.InputMethodSystemProperty; + +import com.android.settings.R; +import com.android.settings.core.WorkProfilePreferenceController; + +public final class VirtualKeyboardForWorkPreferenceController + extends WorkProfilePreferenceController { + + public VirtualKeyboardForWorkPreferenceController(Context context, + String preferenceKey) { + super(context, preferenceKey); + } + + @Override + protected int getSourceMetricsCategory() { + return SettingsEnums.SETTINGS_LANGUAGE_CATEGORY; + } + + @AvailabilityStatus + @Override + public int getAvailabilityStatus() { + if (!mContext.getResources().getBoolean(R.bool.config_show_virtual_keyboard_pref) + || !InputMethodSystemProperty.PER_PROFILE_IME_ENABLED) { + return UNSUPPORTED_ON_DEVICE; + } + return super.getAvailabilityStatus(); + } +} diff --git a/src/com/android/settings/language/UserDictionaryForWorkPreferenceController.java b/src/com/android/settings/language/UserDictionaryForWorkPreferenceController.java new file mode 100644 index 00000000000..7ff8aec36e4 --- /dev/null +++ b/src/com/android/settings/language/UserDictionaryForWorkPreferenceController.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.language; + +import android.app.settings.SettingsEnums; +import android.content.Context; +import android.view.inputmethod.InputMethodSystemProperty; + +import com.android.settings.R; +import com.android.settings.core.WorkProfilePreferenceController; + +/** + * Preference controller for "UserDictionary for work". + * + * @see UserDictionaryPreferenceController + */ +public final class UserDictionaryForWorkPreferenceController + extends WorkProfilePreferenceController { + + public UserDictionaryForWorkPreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + } + + @Override + protected int getSourceMetricsCategory() { + return SettingsEnums.SETTINGS_LANGUAGE_CATEGORY; + } + + @AvailabilityStatus + @Override + public int getAvailabilityStatus() { + if (!InputMethodSystemProperty.PER_PROFILE_IME_ENABLED) { + return UNSUPPORTED_ON_DEVICE; + } + return super.getAvailabilityStatus(); + } +}