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

Commit 901ec941 authored by Matías Hernández's avatar Matías Hernández
Browse files

Fix BroadcastReceiver registration in DefaultDeviceEffectsApplier

Test: atest DefaultDeviceEffectsApplierTest
Bug: 308673343
Change-Id: I0dc733b4846876af4c27737ef6285d8e4ab4597e
parent 9735d938
Loading
Loading
Loading
Loading
+26 −9
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ import android.service.notification.ZenDeviceEffects;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.ConfigChangeOrigin;

import com.android.internal.annotations.GuardedBy;

/** Default implementation for {@link DeviceEffectsApplier}. */
class DefaultDeviceEffectsApplier implements DeviceEffectsApplier {

@@ -50,6 +52,10 @@ class DefaultDeviceEffectsApplier implements DeviceEffectsApplier {
    private final UiModeManager mUiModeManager;
    private final WallpaperManager mWallpaperManager;

    private final Object mRegisterReceiverLock = new Object();
    @GuardedBy("mRegisterReceiverLock")
    private boolean mIsScreenOffReceiverRegistered;

    private ZenDeviceEffects mLastAppliedEffects = new ZenDeviceEffects.Builder().build();
    private boolean mPendingNightMode;

@@ -96,7 +102,6 @@ class DefaultDeviceEffectsApplier implements DeviceEffectsApplier {

    private void updateOrScheduleNightMode(boolean useNightMode, @ConfigChangeOrigin int origin) {
        mPendingNightMode = useNightMode;
        safeUnregisterReceiver(mNightModeWhenScreenOff);

        // Changing the theme can be disruptive for the user (Activities are likely recreated, may
        // lose some state). Therefore we only apply the change immediately if the rule was
@@ -106,17 +111,18 @@ class DefaultDeviceEffectsApplier implements DeviceEffectsApplier {
                || origin == ZenModeConfig.UPDATE_ORIGIN_USER
                || origin == ZenModeConfig.UPDATE_ORIGIN_SYSTEM_OR_SYSTEMUI
                || !mPowerManager.isInteractive()) {
            unregisterScreenOffReceiver();
            updateNightModeImmediately(useNightMode);
        } else {
            mContext.registerReceiver(mNightModeWhenScreenOff, SCREEN_OFF_INTENT_FILTER,
                    Context.RECEIVER_NOT_EXPORTED);
            registerScreenOffReceiver();
        }
    }

    @GuardedBy("mRegisterReceiverLock")
    private final BroadcastReceiver mNightModeWhenScreenOff = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            safeUnregisterReceiver(mNightModeWhenScreenOff);
            unregisterScreenOffReceiver();
            updateNightModeImmediately(mPendingNightMode);
        }
    };
@@ -130,11 +136,22 @@ class DefaultDeviceEffectsApplier implements DeviceEffectsApplier {
        });
    }

    private void safeUnregisterReceiver(BroadcastReceiver br) {
        try {
            mContext.unregisterReceiver(br);
        } catch (IllegalArgumentException e) {
            // It's fine, we haven't registered it yet.
    private void registerScreenOffReceiver() {
        synchronized (mRegisterReceiverLock) {
            if (!mIsScreenOffReceiverRegistered) {
                mContext.registerReceiver(mNightModeWhenScreenOff, SCREEN_OFF_INTENT_FILTER,
                        Context.RECEIVER_NOT_EXPORTED);
                mIsScreenOffReceiverRegistered = true;
            }
        }
    }

    private void unregisterScreenOffReceiver() {
        synchronized (mRegisterReceiverLock) {
            if (mIsScreenOffReceiverRegistered) {
                mIsScreenOffReceiverRegistered = false;
                mContext.unregisterReceiver(mNightModeWhenScreenOff);
            }
        }
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -200,7 +199,7 @@ public class DefaultDeviceEffectsApplierTest {
        // So the effect is applied, and we stopped listening for this event.
        verify(mUiModeManager).setNightModeActivatedForCustomMode(
                eq(MODE_NIGHT_CUSTOM_TYPE_BEDTIME), eq(true));
        verify(mContext, atLeastOnce()).unregisterReceiver(eq(screenOffReceiver));
        verify(mContext).unregisterReceiver(eq(screenOffReceiver));
    }

    @Test