Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a882fd26 authored by Aleksandar Kiridzic's avatar Aleksandar Kiridzic
Browse files

speech: On-device recognition settings profile selector

`Settings > System > Languages > On-device speech recognition`
entry is currently proceeding to the settings page for the personal
profile by default. If a work profile exists,
a profile selector should be shown first.

Bug: 269575714
Test: Manual, already existing robotests
Change-Id: Id95a9716358ec3a813c77275bd65f0cbdfc9aefc
parent bbf55caf
Loading
Loading
Loading
Loading
+53 −0
Original line number Diff line number Diff line
@@ -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<Intent> mIntent;

    private WeakReference<Dialog> 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<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.