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

Commit d70ac512 authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Android (Google) Code Review
Browse files

Merge "Apply "most-recent" delivery policy to DREAMING related broadcasts."

parents f92396c5 b69e04e8
Loading
Loading
Loading
Loading
+32 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.dreams;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;

import android.app.ActivityTaskManager;
import android.app.BroadcastOptions;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -45,6 +46,7 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.UUID;

/**
 * Internal controller for starting and stopping the current dream and managing related state.
@@ -69,6 +71,9 @@ final class DreamController {
            .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    private final Intent mDreamingStoppedIntent = new Intent(Intent.ACTION_DREAMING_STOPPED)
            .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    private static final String DREAMING_DELIVERY_GROUP_NAMESPACE = UUID.randomUUID().toString();
    private static final String DREAMING_DELIVERY_GROUP_KEY = UUID.randomUUID().toString();
    private final Bundle mDreamingStartedStoppedOptions = createDreamingStartedStoppedOptions();

    private final Intent mCloseNotificationShadeIntent;

@@ -93,6 +98,29 @@ final class DreamController {
        mCloseNotificationShadeIntent.putExtra("reason", "dream");
    }

    /**
     * Create the {@link BroadcastOptions} bundle that will be used with sending the
     * {@link Intent#ACTION_DREAMING_STARTED} and {@link Intent#ACTION_DREAMING_STOPPED}
     * broadcasts.
     */
    private Bundle createDreamingStartedStoppedOptions() {
        final BroadcastOptions options = BroadcastOptions.makeBasic();
        // This allows the broadcasting system to discard any older broadcasts
        // waiting to be delivered to a process.
        options.setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
        // Set namespace and key to identify which older broadcasts can be discarded.
        // We could use any strings here with the following requirements:
        // - namespace needs to be unlikely to be reused with in
        //   the system_server process, as that could result in potentially discarding some
        //   non-dreaming_started/stopped related broadcast.
        // - key needs to be the same for both DREAMING_STARTED and DREAMING_STOPPED broadcasts
        //   so that dreaming_stopped can also clear any older dreaming_started broadcasts that
        //   are yet to be delivered.
        options.setDeliveryGroupMatchingKey(
                DREAMING_DELIVERY_GROUP_NAMESPACE, DREAMING_DELIVERY_GROUP_KEY);
        return options.toBundle();
    }

    public void dump(PrintWriter pw) {
        pw.println("Dreamland:");
        if (mCurrentDream != null) {
@@ -244,7 +272,8 @@ final class DreamController {
                mCurrentDream = null;

                if (mSentStartBroadcast) {
                    mContext.sendBroadcastAsUser(mDreamingStoppedIntent, UserHandle.ALL);
                    mContext.sendBroadcastAsUser(mDreamingStoppedIntent, UserHandle.ALL,
                            null /* receiverPermission */, mDreamingStartedStoppedOptions);
                    mSentStartBroadcast = false;
                }

@@ -287,7 +316,8 @@ final class DreamController {
        mCurrentDream.mService = service;

        if (!mCurrentDream.mIsPreviewMode && !mSentStartBroadcast) {
            mContext.sendBroadcastAsUser(mDreamingStartedIntent, UserHandle.ALL);
            mContext.sendBroadcastAsUser(mDreamingStartedIntent, UserHandle.ALL,
                    null /* receiverPermission */, mDreamingStartedStoppedOptions);
            mSentStartBroadcast = true;
        }
    }