diff options
| author | 2022-04-12 13:16:54 +0000 | |
|---|---|---|
| committer | 2022-04-12 13:16:54 +0000 | |
| commit | 4ae15e81bc2fa8a9b7d05fcaf72935b35a26e8dd (patch) | |
| tree | facee5e4dac04f0aee204b9664d752d005a32f96 | |
| parent | 331f163d20d1a7245edddfbdafa4c51c8bc17235 (diff) | |
| parent | 0549cf1251869cbfca200e12f8e1aa5deee4facb (diff) | |
Merge "Don't crash TileService app when systemui crashes" into tm-dev
| -rw-r--r-- | core/java/android/service/quicksettings/TileService.java | 8 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/service/quicksettings/TileServiceTest.java | 107 |
2 files changed, 114 insertions, 1 deletions
diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java index 0829d2813c83..85502197ea7e 100644 --- a/core/java/android/service/quicksettings/TileService.java +++ b/core/java/android/service/quicksettings/TileService.java @@ -353,7 +353,13 @@ public class TileService extends Service { try { mTile = mService.getTile(mTileToken); } catch (RemoteException e) { - throw new RuntimeException("Unable to reach IQSService", e); + String name = TileService.this.getClass().getSimpleName(); + Log.w(TAG, name + " - Couldn't get tile from IQSService.", e); + // If we couldn't receive the tile, there's not much reason to continue as users won't + // be able to interact. Returning `null` will trigger an unbind in SystemUI and + // eventually we'll rebind when needed. This usually means that SystemUI crashed + // right after binding and therefore `mService` is outdated. + return null; } if (mTile != null) { mTile.setService(mService, mTileToken); diff --git a/core/tests/coretests/src/android/service/quicksettings/TileServiceTest.java b/core/tests/coretests/src/android/service/quicksettings/TileServiceTest.java new file mode 100644 index 000000000000..d28eeffae742 --- /dev/null +++ b/core/tests/coretests/src/android/service/quicksettings/TileServiceTest.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.quicksettings; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Intent; +import android.os.Binder; +import android.os.IBinder; +import android.os.RemoteException; +import android.testing.TestableLooper; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidJUnit4.class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +public class TileServiceTest { + + @Mock + private IQSService.Stub mIQSService; + + private IBinder mTileToken; + private TileService mTileService; + private Tile mTile; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mTileToken = new Binder(); + when(mIQSService.asBinder()).thenCallRealMethod(); + when(mIQSService.queryLocalInterface(anyString())).thenReturn(mIQSService); + + mTile = new Tile(); + + mTileService = new TileService(); + } + + @Test + public void testErrorRetrievingTile_nullBinding() throws RemoteException { + Intent intent = new Intent(); + intent.putExtra(TileService.EXTRA_SERVICE, mIQSService); + intent.putExtra(TileService.EXTRA_TOKEN, mTileToken); + when(mIQSService.getTile(mTileToken)).thenThrow(new RemoteException()); + + IBinder result = mTileService.onBind(intent); + assertNull(result); + } + + @Test + public void testNullTile_doesntSendStartSuccessful() throws RemoteException { + Intent intent = new Intent(); + intent.putExtra(TileService.EXTRA_SERVICE, mIQSService); + intent.putExtra(TileService.EXTRA_TOKEN, mTileToken); + when(mIQSService.getTile(mTileToken)).thenReturn(null); + + IBinder result = mTileService.onBind(intent); + + assertNotNull(result); + verify(mIQSService, never()).onStartSuccessful(any()); + } + + @Test + public void testBindSuccessful() throws RemoteException { + Intent intent = new Intent(); + intent.putExtra(TileService.EXTRA_SERVICE, mIQSService); + intent.putExtra(TileService.EXTRA_TOKEN, mTileToken); + when(mIQSService.getTile(mTileToken)).thenReturn(mTile); + + IBinder result = mTileService.onBind(intent); + + assertNotNull(result); + verify(mIQSService).onStartSuccessful(mTileToken); + + mTile.updateTile(); + verify(mIQSService).updateQsTile(mTile, mTileToken); + } + +} |