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

Commit bdacdde5 authored by Galia Peycheva's avatar Galia Peycheva
Browse files

Allow doze dream package to start a DreamActivity

After we made the DreamService use an activity, we introduced checks
that only the current active dream component can start a dream activity.
This meant that if the doze dream is in a different package, it would
get suspended.

This CL fixes that by whitelisting also the doze dream package.

Bug: 160109097
Test: m && flash && put two different dream as doze and active dream &&
      check that the doze starts
Test: atest DreamManagerServiceTests
Change-Id: I553dd1d44f3303d18278482b4a4e88a5564a94d3
parent 3c336c4b
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -268,6 +268,7 @@ import android.os.storage.StorageManager;
import android.service.dreams.DreamActivity;
import android.service.dreams.DreamManagerInternal;
import android.service.voice.IVoiceInteractionSession;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.EventLog;
import android.util.Log;
@@ -2054,23 +2055,28 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    }

    static boolean canLaunchDreamActivity(String packageName) {
        final DreamManagerInternal dreamManager =
                LocalServices.getService(DreamManagerInternal.class);

        // Verify that the package is the current active dream. The getActiveDreamComponent()
        // call path does not acquire the DreamManager lock and thus is safe to use.
        final ComponentName activeDream = dreamManager.getActiveDreamComponent(false /* doze */);
        if (activeDream == null || activeDream.getPackageName() == null
                || !activeDream.getPackageName().equals(packageName)) {
        if (packageName == null) {
            return false;
        }

        // Verify that the device is dreaming.
        if (!LocalServices.getService(ActivityTaskManagerInternal.class).isDreaming()) {
            return false;
        }

        return true;
        final DreamManagerInternal dreamManager =
                LocalServices.getService(DreamManagerInternal.class);

        // Verify that the package is the current active dream or doze component. The
        // getActiveDreamComponent() call path does not acquire the DreamManager lock and thus
        // is safe to use.
        final ComponentName activeDream = dreamManager.getActiveDreamComponent(false /* doze */);
        final ComponentName activeDoze = dreamManager.getActiveDreamComponent(true /* doze */);
        return TextUtils.equals(packageName, getPackageName(activeDream))
                || TextUtils.equals(packageName, getPackageName(activeDoze));
    }

    private static String getPackageName(ComponentName componentName) {
        return componentName != null ? componentName.getPackageName() : null;
    }

    private void setActivityType(boolean componentSpecified, int launchedFromUid, Intent intent,