diff --git a/src/com/android/settings/language/OnDeviceRecognitionPreferenceController.java b/src/com/android/settings/language/OnDeviceRecognitionPreferenceController.java index 01f37b1f933..cd9f266cf90 100644 --- a/src/com/android/settings/language/OnDeviceRecognitionPreferenceController.java +++ b/src/com/android/settings/language/OnDeviceRecognitionPreferenceController.java @@ -16,9 +16,14 @@ package com.android.settings.language; +import android.app.Dialog; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.UserInfo; +import android.os.UserHandle; +import android.os.UserManager; +import android.text.TextUtils; import android.util.Log; import androidx.annotation.Nullable; @@ -26,8 +31,12 @@ import androidx.preference.Preference; import com.android.internal.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.dashboard.profileselector.ProfileSelectDialog; +import com.android.settings.dashboard.profileselector.UserAdapter; +import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.List; import java.util.Optional; /** Controller of the On-device recognition preference. */ @@ -37,6 +46,8 @@ public class OnDeviceRecognitionPreferenceController extends BasePreferenceContr private Optional mIntent; + private WeakReference mProfileSelectDialog = new WeakReference<>(null); + public OnDeviceRecognitionPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); } @@ -59,6 +70,48 @@ public class OnDeviceRecognitionPreferenceController extends BasePreferenceContr } } + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { + return super.handlePreferenceTreeClick(preference); + } + show(preference); + return true; + } + + private void show(Preference preference) { + final List userHandles = new ArrayList<>(); + for (UserInfo userInfo : UserManager.get(mContext).getUsers()) { + userHandles.add(userInfo.getUserHandle()); + } + + // Only a single profile is installed. Proceed with its settings. + if (userHandles.size() == 1) { + mContext.startActivityAsUser(preference.getIntent(), userHandles.get(0)); + return; + } + + // Multiple profiles are installed. Show a dialog to the user to pick one to proceed with. + createAndShowProfileSelectDialog(preference.getIntent(), userHandles); + } + + private UserAdapter.OnClickListener createProfileDialogClickCallback( + Intent intent, List userHandles) { + return (int position) -> { + mContext.startActivityAsUser(intent, userHandles.get(position)); + if (mProfileSelectDialog.get() != null) { + mProfileSelectDialog.get().dismiss(); + } + }; + } + + private void createAndShowProfileSelectDialog(Intent intent, List userHandles) { + Dialog profileSelectDialog = ProfileSelectDialog.createDialog( + mContext, userHandles, createProfileDialogClickCallback(intent, userHandles)); + mProfileSelectDialog = new WeakReference<>(profileSelectDialog); + profileSelectDialog.show(); + } + /** * Create an {@link Intent} for the activity in the default on-device recognizer service if * there is a properly defined speech recognition xml meta-data for that service.