Merge "speech: On-device recognition settings profile selector" into udc-dev am: b5b15a6689

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/23517421

Change-Id: I9ead6c07f3f8c8b901301a7eed9de148490b4bda
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/settings/language/OnDeviceRecognitionPreferenceController.java b/src/com/android/settings/language/OnDeviceRecognitionPreferenceController.java
index 01f37b1..cd9f266 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 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 @@
 
     private Optional<Intent> mIntent;
 
+    private WeakReference<Dialog> mProfileSelectDialog = new WeakReference<>(null);
+
     public OnDeviceRecognitionPreferenceController(Context context, String preferenceKey) {
         super(context, preferenceKey);
     }
@@ -59,6 +70,48 @@
         }
     }
 
+    @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<UserHandle> 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<UserHandle> userHandles) {
+        return (int position) -> {
+            mContext.startActivityAsUser(intent, userHandles.get(position));
+            if (mProfileSelectDialog.get() != null) {
+                mProfileSelectDialog.get().dismiss();
+            }
+        };
+    }
+
+    private void createAndShowProfileSelectDialog(Intent intent, List<UserHandle> 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.