Merge "Fix a bug that the QuickAccessWalletTile displaying packageName as title." into sc-dev
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index 82b6c0c..ab81ac1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -153,9 +153,25 @@
         });
     }
 
+    @Nullable
+    private CharSequence getServiceLabelSafe() {
+        try {
+            return mController.getWalletClient().getServiceLabel();
+        } catch (RuntimeException e) {
+            Log.e(TAG, "Failed to get the service label safely, recreating wallet client", e);
+            mController.reCreateWalletClient();
+            try {
+                return mController.getWalletClient().getServiceLabel();
+            } catch (RuntimeException e2) {
+                Log.e(TAG, "The QAW service label is broken.", e2);
+                return null;
+            }
+        }
+    }
+
     @Override
     protected void handleUpdateState(State state, Object arg) {
-        CharSequence label = mController.getWalletClient().getServiceLabel();
+        CharSequence label = getServiceLabelSafe();
         state.label = label == null ? mLabel : label;
         state.contentDescription = state.label;
         Drawable tileIcon = mController.getWalletClient().getTileIcon();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
index a70c2be..17797b7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
@@ -30,6 +30,7 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -256,6 +257,19 @@
     }
 
     @Test
+    public void testGetServiceLabelUnsafe_recreateWalletClient() {
+        doAnswer(invocation -> {
+            throw new Exception("Bad service label.");
+        }).when(mQuickAccessWalletClient).getServiceLabel();
+
+        QSTile.State state = new QSTile.State();
+
+        mTile.handleUpdateState(state, null);
+
+        verify(mController).reCreateWalletClient();
+    }
+
+    @Test
     public void testHandleUpdateState_updateLabelAndIcon() {
         QSTile.State state = new QSTile.State();