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

Commit 90f58b44 authored by Dianne Hackborn's avatar Dianne Hackborn Committed by Android (Google) Code Review
Browse files

Merge "Make sure we initialize to enable the default voice interaction service." into lmp-dev

parents 7911c512 16ec0808
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -2331,7 +2331,7 @@ public final class Settings {
         * preference, this rotation value will be used. Must be one of the
         * {@link android.view.Surface#ROTATION_0 Surface rotation constants}.
         *
         * @see Display#getRotation
         * @see android.view.Display#getRotation
         */
        public static final String USER_ROTATION = "user_rotation";

@@ -2439,7 +2439,8 @@ public final class Settings {
        public static final String SHOW_TOUCHES = "show_touches";

        /**
         * Log raw orientation data from {@link WindowOrientationListener} for use with the
         * Log raw orientation data from
         * {@link com.android.internal.policy.impl.WindowOrientationListener} for use with the
         * orientationplot.py tool.
         * 0 = no
         * 1 = yes
+64 −32
Original line number Diff line number Diff line
@@ -132,14 +132,33 @@ public class VoiceInteractionManagerService extends SystemService {

        public void initForUser(int userHandle) {
            if (DEBUG) Slog.i(TAG, "initForUser user=" + userHandle);
            ComponentName curInteractor = getCurInteractor(userHandle);
            String curInteractorStr = Settings.Secure.getStringForUser(
                    mContext.getContentResolver(),
                    Settings.Secure.VOICE_INTERACTION_SERVICE, userHandle);
            ComponentName curRecognizer = getCurRecognizer(userHandle);
            VoiceInteractionServiceInfo curInteractorInfo = null;
            if (curInteractorStr == null && curRecognizer != null) {
                // If there is no interactor setting, that means we are upgrading
                // from an older platform version.  If the current recognizer is not
                // set or matches the preferred recognizer, then we want to upgrade
                // the user to have the default voice interaction service enabled.
                curInteractorInfo = findAvailInteractor(userHandle, curRecognizer);
                if (curInteractorInfo != null) {
                    // Looks good!  We'll apply this one.  To make it happen, we clear the
                    // recognizer so that we don't think we have anything set and will
                    // re-apply the settings.
                    curRecognizer = null;
                }
            }

            if (curRecognizer != null) {
                // If we already have at least a recognizer, then we probably want to
                // leave things as they are...  unless something has disappeared.
                IPackageManager pm = AppGlobals.getPackageManager();
                ServiceInfo interactorInfo = null;
                ServiceInfo recognizerInfo = null;
                ComponentName curInteractor = !TextUtils.isEmpty(curInteractorStr)
                        ? ComponentName.unflattenFromString(curInteractorStr) : null;
                try {
                    recognizerInfo = pm.getServiceInfo(curRecognizer, 0, userHandle);
                    if (curInteractor != null) {
@@ -154,32 +173,27 @@ public class VoiceInteractionManagerService extends SystemService {
            }

            // Initializing settings, look for an interactor first.
            curInteractor = findAvailInteractor(userHandle);
            if (curInteractor != null) {
                try {
                    VoiceInteractionServiceInfo info = new VoiceInteractionServiceInfo(
                            mContext.getPackageManager(), curInteractor, userHandle);
                    if (info.getParseError() == null) {
                        setCurInteractor(curInteractor, userHandle);
                        if (info.getRecognitionService() != null) {
            if (curInteractorInfo == null) {
                curInteractorInfo = findAvailInteractor(userHandle, null);
            }
            if (curInteractorInfo != null) {
                // Eventually it will be an error to not specify this.
                            curRecognizer = new ComponentName(info.getServiceInfo().packageName,
                                    info.getRecognitionService());
                            setCurRecognizer(curRecognizer, userHandle);
                setCurInteractor(new ComponentName(curInteractorInfo.getServiceInfo().packageName,
                        curInteractorInfo.getServiceInfo().name), userHandle);
                if (curInteractorInfo.getRecognitionService() != null) {
                    setCurRecognizer(
                            new ComponentName(curInteractorInfo.getServiceInfo().packageName,
                                    curInteractorInfo.getRecognitionService()), userHandle);
                    return;
                }
                    } else {
                        Slog.w(TAG, "Bad interaction service " + curInteractor + ": "
                                + info.getParseError());
                    }
                } catch (PackageManager.NameNotFoundException e) {
                } catch (RemoteException e) {
                }
            }

            // No voice interactor, we'll just set up a simple recognizer.
            curRecognizer = findAvailRecognizer(null, userHandle);
            if (curRecognizer != null) {
                if (curInteractorInfo == null) {
                    setCurInteractor(null, userHandle);
                }
                setCurRecognizer(curRecognizer, userHandle);
            }
        }
@@ -234,7 +248,7 @@ public class VoiceInteractionManagerService extends SystemService {
            }
        }

        ComponentName findAvailInteractor(int userHandle) {
        VoiceInteractionServiceInfo findAvailInteractor(int userHandle, ComponentName recognizer) {
            List<ResolveInfo> available =
                    mContext.getPackageManager().queryIntentServicesAsUser(
                            new Intent(VoiceInteractionService.SERVICE_INTERFACE), 0, userHandle);
@@ -246,23 +260,41 @@ public class VoiceInteractionManagerService extends SystemService {
            } else {
                // Find first system package.  We never want to allow third party services to
                // be automatically selected, because those require approval of the user.
                ServiceInfo serviceInfo = null;
                VoiceInteractionServiceInfo foundInfo = null;
                for (int i=0; i<numAvailable; i++) {
                    ServiceInfo cur = available.get(i).serviceInfo;
                    if ((cur.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
                        if (serviceInfo == null) {
                            serviceInfo = cur;
                        ComponentName comp = new ComponentName(cur.packageName, cur.name);
                        try {
                            VoiceInteractionServiceInfo info = new VoiceInteractionServiceInfo(
                                    mContext.getPackageManager(), comp, userHandle);
                            if (info.getParseError() == null) {
                                if (recognizer == null || info.getServiceInfo().packageName.equals(
                                        recognizer.getPackageName())) {
                                    if (foundInfo == null) {
                                        foundInfo = info;
                                    } else {
                            Slog.w(TAG, "more than one voice interaction service, picking first "
                                    + new ComponentName(serviceInfo.packageName, serviceInfo.name)
                                        Slog.w(TAG, "More than one voice interaction service, "
                                                + "picking first "
                                                + new ComponentName(
                                                        foundInfo.getServiceInfo().packageName,
                                                        foundInfo.getServiceInfo().name)
                                                + " over "
                                                + new ComponentName(cur.packageName, cur.name));
                                    }
                                }
                            } else {
                                Slog.w(TAG, "Bad interaction service " + comp + ": "
                                        + info.getParseError());
                            }
                        } catch (PackageManager.NameNotFoundException e) {
                            Slog.w(TAG, "Failure looking up interaction service " + comp);
                        } catch (RemoteException e) {
                        }
                    }
                }

                return serviceInfo != null ?
                        new ComponentName(serviceInfo.packageName, serviceInfo.name) : null;
                return foundInfo;
            }
        }