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

Commit 7c4f0428 authored by Joanne Chung's avatar Joanne Chung Committed by Automerger Merge Worker
Browse files

Set interaction boost for voice sessions. am: 02ccd62d am: eafe88a0

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15837927

Change-Id: Ie46db0533709b14246a2ade286503a66fb314df3
parents 748f7adf eafe88a0
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -18,5 +18,9 @@ java_library_static {
    name: "services.voiceinteraction",
    name: "services.voiceinteraction",
    defaults: ["platform_service_defaults"],
    defaults: ["platform_service_defaults"],
    srcs: [":services.voiceinteraction-sources"],
    srcs: [":services.voiceinteraction-sources"],
    libs: ["services.core"],
    libs: [
        "services.core",
        "android.hardware.power-V1-java",
        "android.hardware.power-V1.0-java",
    ],
}
}
+65 −1
Original line number Original line Diff line number Diff line
@@ -43,11 +43,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.ServiceConnection;
import android.graphics.Bitmap;
import android.graphics.Bitmap;
import android.hardware.power.Boost;
import android.net.Uri;
import android.net.Uri;
import android.os.Binder;
import android.os.Binder;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.os.PowerManagerInternal;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserHandle;
@@ -62,6 +64,7 @@ import android.view.IWindowManager;
import com.android.internal.app.AssistUtils;
import com.android.internal.app.AssistUtils;
import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.app.IVoiceInteractor;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.LocalServices;
import com.android.server.am.AssistDataRequester;
import com.android.server.am.AssistDataRequester;
import com.android.server.am.AssistDataRequester.AssistDataRequesterCallbacks;
import com.android.server.am.AssistDataRequester.AssistDataRequesterCallbacks;
@@ -70,13 +73,20 @@ import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.wm.ActivityAssistInfo;
import com.android.server.wm.ActivityAssistInfo;


import java.io.PrintWriter;
import java.io.PrintWriter;
import java.time.Instant;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;
import java.util.List;


final class VoiceInteractionSessionConnection implements ServiceConnection,
final class VoiceInteractionSessionConnection implements ServiceConnection,
        AssistDataRequesterCallbacks {
        AssistDataRequesterCallbacks {


    final static String TAG = "VoiceInteractionServiceManager";
    static final String TAG = "VoiceInteractionServiceManager";
    static final int POWER_BOOST_TIMEOUT_MS = Integer.parseInt(
            System.getProperty("vendor.powerhal.interaction.max", "200"));
    static final int BOOST_TIMEOUT_MS = 300;
    // TODO: To avoid ap doesn't call hide, only 10 secs for now, need a better way to manage it
    //  in the future.
    static final int MAX_POWER_BOOST_TIMEOUT = 10_000;


    final IBinder mToken = new Binder();
    final IBinder mToken = new Binder();
    final Object mLock;
    final Object mLock;
@@ -104,6 +114,45 @@ final class VoiceInteractionSessionConnection implements ServiceConnection,
    ArrayList<IVoiceInteractionSessionShowCallback> mPendingShowCallbacks = new ArrayList<>();
    ArrayList<IVoiceInteractionSessionShowCallback> mPendingShowCallbacks = new ArrayList<>();
    private List<ActivityAssistInfo> mPendingHandleAssistWithoutData = new ArrayList<>();
    private List<ActivityAssistInfo> mPendingHandleAssistWithoutData = new ArrayList<>();
    AssistDataRequester mAssistDataRequester;
    AssistDataRequester mAssistDataRequester;
    private final PowerManagerInternal mPowerManagerInternal;
    private PowerBoostSetter mSetPowerBoostRunnable;
    private final Handler mFgHandler;

    class PowerBoostSetter implements Runnable {

        private boolean mCanceled;
        private final Instant mExpiryTime;

        PowerBoostSetter(Instant expiryTime) {
            mExpiryTime = expiryTime;
        }

        @Override
        public void run() {
            synchronized (mLock) {
                if (mCanceled) {
                    return;
                }
                // To avoid voice interaction service does not call hide to cancel setting
                // power boost. We will cancel set boost when reaching the max timeout.
                if (Instant.now().isBefore(mExpiryTime)) {
                    mPowerManagerInternal.setPowerBoost(Boost.INTERACTION, BOOST_TIMEOUT_MS);
                    if (mSetPowerBoostRunnable != null) {
                        mFgHandler.postDelayed(mSetPowerBoostRunnable, POWER_BOOST_TIMEOUT_MS);
                    }
                } else {
                    Slog.w(TAG, "Reset power boost INTERACTION because reaching max timeout.");
                    mPowerManagerInternal.setPowerBoost(Boost.INTERACTION, /* durationMs */ -1);
                }
            }
        }

        void cancel() {
            synchronized (mLock) {
                mCanceled =  true;
            }
        }
    }


    IVoiceInteractionSessionShowCallback mShowCallback =
    IVoiceInteractionSessionShowCallback mShowCallback =
            new IVoiceInteractionSessionShowCallback.Stub() {
            new IVoiceInteractionSessionShowCallback.Stub() {
@@ -152,7 +201,9 @@ final class VoiceInteractionSessionConnection implements ServiceConnection,
        mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
        mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
        mIWindowManager = IWindowManager.Stub.asInterface(
        mIWindowManager = IWindowManager.Stub.asInterface(
                ServiceManager.getService(Context.WINDOW_SERVICE));
                ServiceManager.getService(Context.WINDOW_SERVICE));
        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
        mAppOps = context.getSystemService(AppOpsManager.class);
        mAppOps = context.getSystemService(AppOpsManager.class);
        mFgHandler = FgThread.getHandler();
        mAssistDataRequester = new AssistDataRequester(mContext, mIWindowManager,
        mAssistDataRequester = new AssistDataRequester(mContext, mIWindowManager,
                (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE),
                (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE),
                this, mLock, OP_ASSIST_STRUCTURE, OP_ASSIST_SCREENSHOT);
                this, mLock, OP_ASSIST_STRUCTURE, OP_ASSIST_SCREENSHOT);
@@ -255,6 +306,13 @@ final class VoiceInteractionSessionConnection implements ServiceConnection,
                    mPendingHandleAssistWithoutData = topActivities;
                    mPendingHandleAssistWithoutData = topActivities;
                }
                }
            }
            }
            // remove if already existing one.
            if (mSetPowerBoostRunnable != null) {
                mSetPowerBoostRunnable.cancel();
            }
            mSetPowerBoostRunnable = new PowerBoostSetter(
                    Instant.now().plusMillis(MAX_POWER_BOOST_TIMEOUT));
            mFgHandler.post(mSetPowerBoostRunnable);
            mCallback.onSessionShown(this);
            mCallback.onSessionShown(this);
            return true;
            return true;
        }
        }
@@ -420,6 +478,12 @@ final class VoiceInteractionSessionConnection implements ServiceConnection,
                    } catch (RemoteException e) {
                    } catch (RemoteException e) {
                    }
                    }
                }
                }
                if (mSetPowerBoostRunnable != null) {
                    mSetPowerBoostRunnable.cancel();
                    mSetPowerBoostRunnable = null;
                }
                // A negative value indicates canceling previous boost.
                mPowerManagerInternal.setPowerBoost(Boost.INTERACTION, /* durationMs */ -1);
                mCallback.onSessionHidden(this);
                mCallback.onSessionHidden(this);
            }
            }
            if (mFullyBound) {
            if (mFullyBound) {