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

Commit e87e605f authored by sqian's avatar sqian
Browse files

Fix synchronization in SystemStateHelper

Properly acquire the big telecom lock before doing anything after
receiving a broadcast.

Bug: 181057509
Test: atest CarModeInCallServiceTest
Change-Id: Ie4c2311278c7c27560c16c87d1eeed282470f9e8
Merged-In: Ie4c2311278c7c27560c16c87d1eeed282470f9e8
(cherry picked from commit 04263bff)
parent 2c35aadb
Loading
Loading
Loading
Loading
+34 −28
Original line number Diff line number Diff line
@@ -63,13 +63,15 @@ public class SystemStateHelper {
        public void onReceive(Context context, Intent intent) {
            Log.startSession("SSP.oR");
            try {
                synchronized (mLock) {
                    String action = intent.getAction();
                    if (UiModeManager.ACTION_ENTER_CAR_MODE_PRIORITIZED.equals(action)) {
                        int priority = intent.getIntExtra(UiModeManager.EXTRA_PRIORITY,
                                UiModeManager.DEFAULT_PRIORITY);
                        String callingPackage = intent.getStringExtra(
                                UiModeManager.EXTRA_CALLING_PACKAGE);
                    Log.i(SystemStateHelper.this, "ENTER_CAR_MODE_PRIORITIZED; priority=%d, pkg=%s",
                        Log.i(SystemStateHelper.this,
                                "ENTER_CAR_MODE_PRIORITIZED; priority=%d, pkg=%s",
                                priority, callingPackage);
                        onEnterCarMode(priority, callingPackage);
                    } else if (UiModeManager.ACTION_EXIT_CAR_MODE_PRIORITIZED.equals(action)) {
@@ -77,7 +79,8 @@ public class SystemStateHelper {
                                UiModeManager.DEFAULT_PRIORITY);
                        String callingPackage = intent.getStringExtra(
                                UiModeManager.EXTRA_CALLING_PACKAGE);
                    Log.i(SystemStateHelper.this, "EXIT_CAR_MODE_PRIORITIZED; priority=%d, pkg=%s",
                        Log.i(SystemStateHelper.this,
                                "EXIT_CAR_MODE_PRIORITIZED; priority=%d, pkg=%s",
                                priority, callingPackage);
                        onExitCarMode(priority, callingPackage);
                    } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
@@ -93,6 +96,7 @@ public class SystemStateHelper {
                        Log.w(SystemStateHelper.this,
                                "Unexpected intent received: %s", intent.getAction());
                    }
                }
            } finally {
                Log.endSession();
            }
@@ -101,9 +105,11 @@ public class SystemStateHelper {

    private Set<SystemStateListener> mListeners = new CopyOnWriteArraySet<>();
    private boolean mIsCarMode;
    private final TelecomSystem.SyncRoot mLock;

    public SystemStateHelper(Context context) {
    public SystemStateHelper(Context context, TelecomSystem.SyncRoot lock) {
        mContext = context;
        mLock = lock;

        IntentFilter intentFilter1 = new IntentFilter(
                UiModeManager.ACTION_ENTER_CAR_MODE_PRIORITIZED);
+1 −1
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ public class TelecomSystem {
            mContext.registerReceiver(bluetoothStateReceiver, BluetoothStateReceiver.INTENT_FILTER);

            WiredHeadsetManager wiredHeadsetManager = new WiredHeadsetManager(mContext);
            SystemStateHelper systemStateHelper = new SystemStateHelper(mContext);
            SystemStateHelper systemStateHelper = new SystemStateHelper(mContext, mLock);

            mMissedCallNotifier = missedCallNotifierImplFactory
                    .makeMissedCallNotifierImpl(mContext, mPhoneAccountRegistrar,
+8 −6
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.test.suitebuilder.annotation.SmallTest;

import com.android.server.telecom.SystemStateHelper;
import com.android.server.telecom.SystemStateHelper.SystemStateListener;
import com.android.server.telecom.TelecomSystem;

import org.junit.After;
import org.junit.Before;
@@ -77,6 +78,7 @@ public class SystemStateHelperTest extends TelecomTestCase {
    @Mock SensorManager mSensorManager;
    @Mock Intent mIntentEnter;
    @Mock Intent mIntentExit;
    TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };

    @Override
    @Before
@@ -106,7 +108,7 @@ public class SystemStateHelperTest extends TelecomTestCase {
    @SmallTest
    @Test
    public void testListeners() throws Exception {
        SystemStateHelper systemStateHelper = new SystemStateHelper(mContext);
        SystemStateHelper systemStateHelper = new SystemStateHelper(mContext, mLock);

        assertFalse(systemStateHelper.removeListener(mSystemStateListener));
        systemStateHelper.addListener(mSystemStateListener);
@@ -119,7 +121,7 @@ public class SystemStateHelperTest extends TelecomTestCase {
    public void testQuerySystemForCarMode_True() {
        when(mContext.getSystemService(Context.UI_MODE_SERVICE)).thenReturn(mUiModeManager);
        when(mUiModeManager.getCurrentModeType()).thenReturn(Configuration.UI_MODE_TYPE_CAR);
        assertTrue(new SystemStateHelper(mContext).isCarMode());
        assertTrue(new SystemStateHelper(mContext, mLock).isCarMode());
    }

    @SmallTest
@@ -127,7 +129,7 @@ public class SystemStateHelperTest extends TelecomTestCase {
    public void testQuerySystemForCarMode_False() {
        when(mContext.getSystemService(Context.UI_MODE_SERVICE)).thenReturn(mUiModeManager);
        when(mUiModeManager.getCurrentModeType()).thenReturn(Configuration.UI_MODE_TYPE_NORMAL);
        assertFalse(new SystemStateHelper(mContext).isCarMode());
        assertFalse(new SystemStateHelper(mContext, mLock).isCarMode());
    }

    @SmallTest
@@ -135,7 +137,7 @@ public class SystemStateHelperTest extends TelecomTestCase {
    public void testPackageRemoved() {
        ArgumentCaptor<BroadcastReceiver> receiver =
                ArgumentCaptor.forClass(BroadcastReceiver.class);
        new SystemStateHelper(mContext).addListener(mSystemStateListener);
        new SystemStateHelper(mContext, mLock).addListener(mSystemStateListener);
        verify(mContext, atLeastOnce())
                .registerReceiver(receiver.capture(), any(IntentFilter.class));
        Intent packageRemovedIntent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
@@ -149,7 +151,7 @@ public class SystemStateHelperTest extends TelecomTestCase {
    public void testReceiverAndIntentFilter() {
        ArgumentCaptor<IntentFilter> intentFilterCaptor =
                ArgumentCaptor.forClass(IntentFilter.class);
        new SystemStateHelper(mContext);
        new SystemStateHelper(mContext, mLock);
        verify(mContext, times(2)).registerReceiver(
                any(BroadcastReceiver.class), intentFilterCaptor.capture());

@@ -186,7 +188,7 @@ public class SystemStateHelperTest extends TelecomTestCase {
    public void testOnEnterExitCarMode() {
        ArgumentCaptor<BroadcastReceiver> receiver =
                ArgumentCaptor.forClass(BroadcastReceiver.class);
        new SystemStateHelper(mContext).addListener(mSystemStateListener);
        new SystemStateHelper(mContext, mLock).addListener(mSystemStateListener);

        verify(mContext, atLeastOnce())
                .registerReceiver(receiver.capture(), any(IntentFilter.class));