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

Commit 11b10146 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 13450015 from 8a978f76 to 25Q3-release

Change-Id: I8294c75887c485a31f089c0dcbcb59fe00934e55
parents 8d6e3b08 8a978f76
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -260,6 +260,12 @@ public final class CompanionDeviceManager {
     * @hide
     */
    public static final int MESSAGE_REQUEST_CONTEXT_SYNC = 0x63678883; // ?CXS
    /**
     * Message header assigned to task continuity messages.
     *
     * @hide
     */
    public static final int MESSAGE_TASK_CONTINUITY = 0x63678884; // ?TSK
    /**
     * Message header assigned to the permission restore request.
     *
+1 −1
Original line number Diff line number Diff line
@@ -648,7 +648,7 @@ public final class Parcel {
                + Log.getStackTraceString(new Throwable())
                + " Original recycle call (if DEBUG_RECYCLE): ", mStack;
        Log.wtf(TAG, error);
        // TODO(b/381155347): harder error
        throw new BadParcelableException(error);
    }

    // TODO: call in more places, it costs a _lot_ to use this in many
+1 −1
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ public final class ApplicationConfig {
    public boolean isCertificateTransparencyVerificationRequired(@NonNull String hostname) {
        return certificateTransparencyConfiguration()
                ? getConfigForHostname(hostname).isCertificateTransparencyVerificationRequired()
                : NetworkSecurityConfig.certificateTransparencyVerificationRequiredDefault();
                : NetworkSecurityConfig.DEFAULT_CERTIFICATE_TRANSPARENCY_VERIFICATION_REQUIRED;
    }

    public void handleTrustStorageUpdate() {
+8 −14
Original line number Diff line number Diff line
@@ -56,6 +56,12 @@ public final class NetworkSecurityConfig {
    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.BAKLAVA)
    static final long DEFAULT_ENABLE_CERTIFICATE_TRANSPARENCY = 407952621L;

    /** @hide */
    public static final boolean DEFAULT_CERTIFICATE_TRANSPARENCY_VERIFICATION_REQUIRED =
            certificateTransparencyDefaultEnabled()
                    && majorMinorVersioningScheme()
                    && CompatChanges.isChangeEnabled(DEFAULT_ENABLE_CERTIFICATE_TRANSPARENCY);

    private final boolean mCleartextTrafficPermitted;
    private final boolean mHstsEnforced;
    private final boolean mCertificateTransparencyVerificationRequired;
@@ -185,18 +191,6 @@ public final class NetworkSecurityConfig {
        getTrustManager().handleTrustStorageUpdate();
    }

    /**
     * Returns the default value for SCT verification. The value depends on the platform version and
     * on the app target sdk level.
     *
     * @hide
     */
    public static boolean certificateTransparencyVerificationRequiredDefault() {
        return certificateTransparencyDefaultEnabled()
                && majorMinorVersioningScheme()
                && CompatChanges.isChangeEnabled(DEFAULT_ENABLE_CERTIFICATE_TRANSPARENCY);
    }

    /**
     * Return a {@link Builder} for the default {@code NetworkSecurityConfig}.
     *
@@ -249,7 +243,7 @@ public final class NetworkSecurityConfig {
        private boolean mCleartextTrafficPermittedSet = false;
        private boolean mHstsEnforcedSet = false;
        private boolean mCertificateTransparencyVerificationRequired =
                certificateTransparencyVerificationRequiredDefault();
                DEFAULT_CERTIFICATE_TRANSPARENCY_VERIFICATION_REQUIRED;
        private boolean mCertificateTransparencyVerificationRequiredSet = false;
        private Builder mParentBuilder;

@@ -379,7 +373,7 @@ public final class NetworkSecurityConfig {
            if (mParentBuilder != null) {
                return mParentBuilder.getCertificateTransparencyVerificationRequired();
            }
            return certificateTransparencyVerificationRequiredDefault();
            return DEFAULT_CERTIFICATE_TRANSPARENCY_VERIFICATION_REQUIRED;
        }

        public NetworkSecurityConfig build() {
+68 −154
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import static android.service.dreams.Flags.dreamHandlesBeingObscured;
import static android.service.dreams.Flags.dreamHandlesConfirmKeys;
import static android.service.dreams.Flags.startAndStopDozingInBackground;

import android.Manifest;
import android.annotation.FlaggedApi;
import android.annotation.IdRes;
import android.annotation.IntDef;
@@ -255,6 +254,7 @@ public class DreamService extends Service implements Window.Callback {
            "android.service.dream.DreamService.dream_overlay_component";

    private final IDreamManager mDreamManager;
    private final Handler mHandler;
    private IBinder mDreamToken;
    private Window mWindow;
    private Activity mActivity;
@@ -323,89 +323,19 @@ public class DreamService extends Service implements Window.Callback {
        /** Returns the associated service info */
        ServiceInfo getServiceInfo();

        /** Returns the handler to be used for any posted operation */
        Handler getHandler();

        /** Returns the package manager */
        PackageManager getPackageManager();

        /** Returns the resources */
        Resources getResources();

        /** Returns a specialized handler to ensure Runnables are not suspended */
        WakefulHandler getWakefulHandler();
    }

    /**
     * {@link WakefulHandler} is an interface for defining an object that helps post work without
     * being interrupted by doze state.
     *
     * @hide
     */
    public interface WakefulHandler {
        /** Posts a {@link Runnable} to be ran on the underlying {@link Handler}. */
        void postIfNeeded(Runnable r);

        /**
         * Returns the underlying {@link Handler}. Should only be used for passing the handler into
         * a function and not for directly calling methods on it.
         */
        Handler getHandler();
    }

    /**
     * {@link WakefulHandlerImpl} ensures work on a handler is not suspended by wrapping the call
     * with a partial wakelock. Note that this is only needed for Doze DreamService implementations.
     * In this case, the component should have wake lock permissions. When such permission is not
     * available, this class behaves like an ordinary handler.
     */
    private static final class WakefulHandlerImpl implements WakefulHandler {
        private static final String SERVICE_HANDLER_WAKE_LOCK_TAG = "dream:service:handler";
        private Context mContext;
        private Handler mHandler;

        private PowerManager.WakeLock mWakeLock;

        private PowerManager.WakeLock getWakeLock() {
            if (mContext.checkCallingOrSelfPermission(Manifest.permission.WAKE_LOCK)
                    != PERMISSION_GRANTED) {
                return null;
            }

            final PowerManager powerManager = mContext.getSystemService(PowerManager.class);

            if (powerManager == null) {
                return null;
            }

            return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    SERVICE_HANDLER_WAKE_LOCK_TAG);
        }

        WakefulHandlerImpl(Context context) {
            mContext = context;
            mHandler = new Handler(Looper.getMainLooper());
            mWakeLock = getWakeLock();
        }

        @Override
        public void postIfNeeded(Runnable r) {
            if (mHandler.getLooper().isCurrentThread()) {
                r.run();
            } else if (mWakeLock != null) {
                mHandler.post(mWakeLock.wrap(r));
            } else {
                mHandler.post(r);
            }
        }

        @Override
        public Handler getHandler() {
            return mHandler;
        }
    }

    private static final class DefaultInjector implements Injector {
        private Context mContext;
        private Class<?> mClassName;
        private WakefulHandler mWakefulHandler;

        public void init(Context context) {
            mContext = context;
@@ -449,14 +379,8 @@ public class DreamService extends Service implements Window.Callback {
        }

        @Override
        public WakefulHandler getWakefulHandler() {
            synchronized (this) {
                if (mWakefulHandler == null) {
                    mWakefulHandler = new WakefulHandlerImpl(mContext);
                }
            }

            return mWakefulHandler;
        public Handler getHandler() {
            return new Handler(Looper.getMainLooper());
        }

        @Override
@@ -485,6 +409,7 @@ public class DreamService extends Service implements Window.Callback {
        mInjector = injector;
        mInjector.init(this);
        mDreamManager = mInjector.getDreamManager();
        mHandler = mInjector.getHandler();
    }

    /**
@@ -527,7 +452,7 @@ public class DreamService extends Service implements Window.Callback {

                        // Simply wake up in the case the device is not locked.
                        if (!keyguardManager.isKeyguardLocked()) {
                            wakeUp(false);
                            wakeUp();
                            return true;
                        }

@@ -549,11 +474,11 @@ public class DreamService extends Service implements Window.Callback {

        if (!mInteractive) {
            if (mDebug) Slog.v(mTag, "Waking up on keyEvent");
            wakeUp(false);
            wakeUp();
            return true;
        } else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            if (mDebug) Slog.v(mTag, "Waking up on back key");
            wakeUp(false);
            wakeUp();
            return true;
        }
        return mWindow.superDispatchKeyEvent(event);
@@ -564,7 +489,7 @@ public class DreamService extends Service implements Window.Callback {
    public boolean dispatchKeyShortcutEvent(KeyEvent event) {
        if (!mInteractive) {
            if (mDebug) Slog.v(mTag, "Waking up on keyShortcutEvent");
            wakeUp(false);
            wakeUp();
            return true;
        }
        return mWindow.superDispatchKeyShortcutEvent(event);
@@ -577,7 +502,7 @@ public class DreamService extends Service implements Window.Callback {
        // but finish()es on any other kind of activity
        if (!mInteractive && event.getActionMasked() == MotionEvent.ACTION_UP) {
            if (mDebug) Slog.v(mTag, "Waking up on touchEvent");
            wakeUp(false);
            wakeUp();
            return true;
        }
        return mWindow.superDispatchTouchEvent(event);
@@ -588,7 +513,7 @@ public class DreamService extends Service implements Window.Callback {
    public boolean dispatchTrackballEvent(MotionEvent event) {
        if (!mInteractive) {
            if (mDebug) Slog.v(mTag, "Waking up on trackballEvent");
            wakeUp(false);
            wakeUp();
            return true;
        }
        return mWindow.superDispatchTrackballEvent(event);
@@ -599,7 +524,7 @@ public class DreamService extends Service implements Window.Callback {
    public boolean dispatchGenericMotionEvent(MotionEvent event) {
        if (!mInteractive) {
            if (mDebug) Slog.v(mTag, "Waking up on genericMotionEvent");
            wakeUp(false);
            wakeUp();
            return true;
        }
        return mWindow.superDispatchGenericMotionEvent(event);
@@ -997,18 +922,10 @@ public class DreamService extends Service implements Window.Callback {
        }
    }

    private void postIfNeeded(Runnable runnable) {
        // The handler is based on the populated context is not ready at construction time.
        // therefore we fetch on demand.
        mInjector.getWakefulHandler().postIfNeeded(runnable);
    }
    private synchronized void updateDoze() {
        final IBinder dreamToken = mDreamToken;

    /**
     * Updates doze state. Note that this must be called on the mHandler.
     */
    private void updateDoze() {
        postIfNeeded(() -> {
            if (mDreamToken == null) {
        if (dreamToken == null) {
            Slog.w(mTag, "Updating doze without a dream token.");
            return;
        }
@@ -1020,12 +937,12 @@ public class DreamService extends Service implements Window.Callback {
                        + " mDozeScreenBrightnessFloat=" + mDozeScreenBrightnessFloat);
                if (startAndStopDozingInBackground()) {
                    mDreamManager.startDozingOneway(
                                mDreamToken, mDozeScreenState, mDozeScreenStateReason,
                            dreamToken, mDozeScreenState, mDozeScreenStateReason,
                            mDozeScreenBrightnessFloat, mDozeScreenBrightness,
                            mUseNormalBrightnessForDoze);
                } else {
                    mDreamManager.startDozing(
                                mDreamToken, mDozeScreenState, mDozeScreenStateReason,
                            dreamToken, mDozeScreenState, mDozeScreenStateReason,
                            mDozeScreenBrightnessFloat, mDozeScreenBrightness,
                            mUseNormalBrightnessForDoze);
                }
@@ -1033,7 +950,6 @@ public class DreamService extends Service implements Window.Callback {
                // system server died
            }
        }
        });
    }

    /**
@@ -1049,20 +965,18 @@ public class DreamService extends Service implements Window.Callback {
     */
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
    public void stopDozing() {
        postIfNeeded(() -> {
            if (mDreamToken == null) {
                return;
            }

        if (mDozing) {
            mDozing = false;
            try {
                    mDreamManager.stopDozing(mDreamToken);
                final IBinder dreamToken = mDreamToken;

                if (dreamToken != null) {
                    mDreamManager.stopDozing(dreamToken);
                }
            } catch (RemoteException ex) {
                // system server died
            }
        }
        });
    }

    /**
@@ -1292,7 +1206,7 @@ public class DreamService extends Service implements Window.Callback {
                final long token = Binder.clearCallingIdentity();
                try {
                    // Simply finish dream when exit is requested.
                    postIfNeeded(() -> finishInternal());
                    mHandler.post(() -> finish());
                } finally {
                    Binder.restoreCallingIdentity(token);
                }
@@ -1398,13 +1312,9 @@ public class DreamService extends Service implements Window.Callback {
     * </p>
     */
    public final void finish() {
        postIfNeeded(this::finishInternal);
    }

    private void finishInternal() {
        // If there is an active overlay connection, signal that the dream is ending before
        // continuing. Note that the overlay cannot rely on the unbound state, since another
        // dream might have bound to it in the meantime.
        // continuing. Note that the overlay cannot rely on the unbound state, since another dream
        // might have bound to it in the meantime.
        if (mOverlayConnection != null) {
            mOverlayConnection.addConsumer(overlay -> {
                try {
@@ -1433,7 +1343,8 @@ public class DreamService extends Service implements Window.Callback {
        }
        mFinished = true;

        if (mDreamToken == null) {
        final IBinder dreamToken = mDreamToken;
        if (dreamToken == null) {
            if (mDebug) Slog.v(mTag, "finish() called when not attached.");
            stopSelf();
            return;
@@ -1443,9 +1354,9 @@ public class DreamService extends Service implements Window.Callback {
            // finishSelf will unbind the dream controller from the dream service. This will
            // trigger DreamService.this.onDestroy and DreamService.this will die.
            if (startAndStopDozingInBackground()) {
                mDreamManager.finishSelfOneway(mDreamToken, true /*immediate*/);
                mDreamManager.finishSelfOneway(dreamToken, true /*immediate*/);
            } else {
                mDreamManager.finishSelf(mDreamToken, true /*immediate*/);
                mDreamManager.finishSelf(dreamToken, true /*immediate*/);
            }
        } catch (RemoteException ex) {
            // system server died
@@ -1460,7 +1371,7 @@ public class DreamService extends Service implements Window.Callback {
     * </p>
     */
    public final void wakeUp() {
        postIfNeeded(()-> wakeUp(false));
        wakeUp(false);
    }

    /**
@@ -1532,10 +1443,14 @@ public class DreamService extends Service implements Window.Callback {
                    Slog.w(mTag, "WakeUp was called before the dream was attached.");
                } else {
                    try {
                        final IBinder dreamToken = mDreamToken;

                        if (dreamToken != null) {
                            if (startAndStopDozingInBackground()) {
                            mDreamManager.finishSelfOneway(mDreamToken, false /*immediate*/);
                                mDreamManager.finishSelfOneway(dreamToken, false /*immediate*/);
                            } else {
                            mDreamManager.finishSelf(mDreamToken, false /*immediate*/);
                                mDreamManager.finishSelf(dreamToken, false /*immediate*/);
                            }
                        }
                    } catch (RemoteException ex) {
                        // system server died
@@ -1662,7 +1577,7 @@ public class DreamService extends Service implements Window.Callback {
        if (mActivity != null && !mActivity.isFinishing()) {
            mActivity.finishAndRemoveTask();
        } else {
            finishInternal();
            finish();
        }

        mDreamToken = null;
@@ -1736,7 +1651,7 @@ public class DreamService extends Service implements Window.Callback {
            i.setPackage(mInjector.getDreamPackageName());
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
            DreamActivity.setCallback(i,
                    new DreamActivityCallbacks(mDreamToken, new WeakReference<>(this)));
                    new DreamActivityCallbacks(dreamToken, new WeakReference<>(this)));
            final ServiceInfo serviceInfo = mInjector.getServiceInfo();
            final CharSequence title = fetchDreamLabel(mInjector.getPackageManager(),
                    mInjector.getResources(), serviceInfo, isPreviewMode);
@@ -1822,7 +1737,7 @@ public class DreamService extends Service implements Window.Callback {
                            // the window reference in order to fully release the DreamActivity.
                            mWindow = null;
                            mActivity = null;
                            finishInternal();
                            finish();
                        }

                        if (mOverlayConnection != null && mDreamStartOverlayConsumer != null) {
@@ -1909,8 +1824,7 @@ public class DreamService extends Service implements Window.Callback {

    @Override
    protected void dump(final FileDescriptor fd, PrintWriter pw, final String[] args) {
        DumpUtils.dumpAsync(mInjector.getWakefulHandler().getHandler(),
                (pw1, prefix) -> dumpOnHandler(fd, pw1, args), pw, "", 1000);
        DumpUtils.dumpAsync(mHandler, (pw1, prefix) -> dumpOnHandler(fd, pw1, args), pw, "", 1000);
    }

    /** @hide */
@@ -1966,7 +1880,7 @@ public class DreamService extends Service implements Window.Callback {
                return;
            }

            service.postIfNeeded(() -> consumer.accept(service));
            service.mHandler.post(() -> consumer.accept(service));
        }

        @Override
Loading