summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fabian Kozynski <kozynski@google.com> 2022-04-12 13:16:54 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-04-12 13:16:54 +0000
commit4ae15e81bc2fa8a9b7d05fcaf72935b35a26e8dd (patch)
treefacee5e4dac04f0aee204b9664d752d005a32f96
parent331f163d20d1a7245edddfbdafa4c51c8bc17235 (diff)
parent0549cf1251869cbfca200e12f8e1aa5deee4facb (diff)
Merge "Don't crash TileService app when systemui crashes" into tm-dev
-rw-r--r--core/java/android/service/quicksettings/TileService.java8
-rw-r--r--core/tests/coretests/src/android/service/quicksettings/TileServiceTest.java107
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);
+ }
+
+}