Recreate the Wallet client before query the wallet cards with a time am: afe1913257
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15315891 Change-Id: Ifd6c3888440ba96c26f7a20c7f567b8f0a353aee
This commit is contained in:
@@ -153,25 +153,9 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@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
|
@Override
|
||||||
protected void handleUpdateState(State state, Object arg) {
|
protected void handleUpdateState(State state, Object arg) {
|
||||||
CharSequence label = getServiceLabelSafe();
|
CharSequence label = mController.getWalletClient().getServiceLabel();
|
||||||
state.label = label == null ? mLabel : label;
|
state.label = label == null ? mLabel : label;
|
||||||
state.contentDescription = state.label;
|
state.contentDescription = state.label;
|
||||||
Drawable tileIcon = mController.getWalletClient().getTileIcon();
|
Drawable tileIcon = mController.getWalletClient().getTileIcon();
|
||||||
|
|||||||
@@ -31,8 +31,10 @@ import com.android.systemui.R;
|
|||||||
import com.android.systemui.dagger.SysUISingleton;
|
import com.android.systemui.dagger.SysUISingleton;
|
||||||
import com.android.systemui.dagger.qualifiers.Main;
|
import com.android.systemui.dagger.qualifiers.Main;
|
||||||
import com.android.systemui.util.settings.SecureSettings;
|
import com.android.systemui.util.settings.SecureSettings;
|
||||||
|
import com.android.systemui.util.time.SystemClock;
|
||||||
|
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
@@ -52,9 +54,11 @@ public class QuickAccessWalletController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final String TAG = "QAWController";
|
private static final String TAG = "QAWController";
|
||||||
|
private static final long RECREATION_TIME_WINDOW = TimeUnit.MINUTES.toMillis(10L);
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final Executor mExecutor;
|
private final Executor mExecutor;
|
||||||
private final SecureSettings mSecureSettings;
|
private final SecureSettings mSecureSettings;
|
||||||
|
private final SystemClock mClock;
|
||||||
|
|
||||||
private QuickAccessWalletClient mQuickAccessWalletClient;
|
private QuickAccessWalletClient mQuickAccessWalletClient;
|
||||||
private ContentObserver mWalletPreferenceObserver;
|
private ContentObserver mWalletPreferenceObserver;
|
||||||
@@ -62,17 +66,21 @@ public class QuickAccessWalletController {
|
|||||||
private int mWalletPreferenceChangeEvents = 0;
|
private int mWalletPreferenceChangeEvents = 0;
|
||||||
private int mDefaultPaymentAppChangeEvents = 0;
|
private int mDefaultPaymentAppChangeEvents = 0;
|
||||||
private boolean mWalletEnabled = false;
|
private boolean mWalletEnabled = false;
|
||||||
|
private long mQawClientCreatedTimeMillis;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public QuickAccessWalletController(
|
public QuickAccessWalletController(
|
||||||
Context context,
|
Context context,
|
||||||
@Main Executor executor,
|
@Main Executor executor,
|
||||||
SecureSettings secureSettings,
|
SecureSettings secureSettings,
|
||||||
QuickAccessWalletClient quickAccessWalletClient) {
|
QuickAccessWalletClient quickAccessWalletClient,
|
||||||
|
SystemClock clock) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mExecutor = executor;
|
mExecutor = executor;
|
||||||
mSecureSettings = secureSettings;
|
mSecureSettings = secureSettings;
|
||||||
mQuickAccessWalletClient = quickAccessWalletClient;
|
mQuickAccessWalletClient = quickAccessWalletClient;
|
||||||
|
mClock = clock;
|
||||||
|
mQawClientCreatedTimeMillis = mClock.elapsedRealtime();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -143,6 +151,11 @@ public class QuickAccessWalletController {
|
|||||||
*/
|
*/
|
||||||
public void queryWalletCards(
|
public void queryWalletCards(
|
||||||
QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
|
QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
|
||||||
|
if (mClock.elapsedRealtime() - mQawClientCreatedTimeMillis
|
||||||
|
> RECREATION_TIME_WINDOW) {
|
||||||
|
Log.i(TAG, "Re-creating the QAW client to avoid stale.");
|
||||||
|
reCreateWalletClient();
|
||||||
|
}
|
||||||
if (!mQuickAccessWalletClient.isWalletFeatureAvailable()) {
|
if (!mQuickAccessWalletClient.isWalletFeatureAvailable()) {
|
||||||
Log.d(TAG, "QuickAccessWallet feature is not available.");
|
Log.d(TAG, "QuickAccessWallet feature is not available.");
|
||||||
return;
|
return;
|
||||||
@@ -162,6 +175,7 @@ public class QuickAccessWalletController {
|
|||||||
*/
|
*/
|
||||||
public void reCreateWalletClient() {
|
public void reCreateWalletClient() {
|
||||||
mQuickAccessWalletClient = QuickAccessWalletClient.create(mContext);
|
mQuickAccessWalletClient = QuickAccessWalletClient.create(mContext);
|
||||||
|
mQawClientCreatedTimeMillis = mClock.elapsedRealtime();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupDefaultPaymentAppObserver(
|
private void setupDefaultPaymentAppObserver(
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import static junit.framework.TestCase.assertTrue;
|
|||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.doAnswer;
|
|
||||||
import static org.mockito.Mockito.doNothing;
|
import static org.mockito.Mockito.doNothing;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
@@ -256,19 +255,6 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
|
|||||||
assertThat(nextStartedIntent.getComponent().getClassName()).isEqualTo(walletClassName);
|
assertThat(nextStartedIntent.getComponent().getClassName()).isEqualTo(walletClassName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@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
|
@Test
|
||||||
public void testHandleUpdateState_updateLabelAndIcon() {
|
public void testHandleUpdateState_updateLabelAndIcon() {
|
||||||
QSTile.State state = new QSTile.State();
|
QSTile.State state = new QSTile.State();
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import androidx.test.filters.SmallTest;
|
|||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.util.settings.SecureSettings;
|
import com.android.systemui.util.settings.SecureSettings;
|
||||||
|
import com.android.systemui.util.time.FakeSystemClock;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.MoreExecutors;
|
import com.google.common.util.concurrent.MoreExecutors;
|
||||||
|
|
||||||
@@ -62,6 +63,7 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
|
|||||||
@Captor
|
@Captor
|
||||||
private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
|
private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
|
||||||
|
|
||||||
|
private FakeSystemClock mClock = new FakeSystemClock();
|
||||||
private QuickAccessWalletController mController;
|
private QuickAccessWalletController mController;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -70,12 +72,14 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
|
|||||||
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
|
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
|
||||||
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
|
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
|
||||||
when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
|
when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
|
||||||
|
mClock.setElapsedRealtime(100L);
|
||||||
|
|
||||||
mController = new QuickAccessWalletController(
|
mController = new QuickAccessWalletController(
|
||||||
mContext,
|
mContext,
|
||||||
MoreExecutors.directExecutor(),
|
MoreExecutors.directExecutor(),
|
||||||
mSecureSettings,
|
mSecureSettings,
|
||||||
mQuickAccessWalletClient);
|
mQuickAccessWalletClient,
|
||||||
|
mClock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -124,6 +128,23 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
|
|||||||
assertNotSame(mQuickAccessWalletClient, mController.getWalletClient());
|
assertNotSame(mQuickAccessWalletClient, mController.getWalletClient());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void queryWalletCards_avoidStale_recreateClient() {
|
||||||
|
// advance current time by 100 seconds, should not recreate the client.
|
||||||
|
mClock.setElapsedRealtime(100100L);
|
||||||
|
|
||||||
|
mController.queryWalletCards(mCardsRetriever);
|
||||||
|
|
||||||
|
assertSame(mQuickAccessWalletClient, mController.getWalletClient());
|
||||||
|
|
||||||
|
// advance current time by another 501 seconds, should recreate the client.
|
||||||
|
mClock.setElapsedRealtime(601100L);
|
||||||
|
|
||||||
|
mController.queryWalletCards(mCardsRetriever);
|
||||||
|
|
||||||
|
assertNotSame(mQuickAccessWalletClient, mController.getWalletClient());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void queryWalletCards_walletEnabled_queryCards() {
|
public void queryWalletCards_walletEnabled_queryCards() {
|
||||||
mController.queryWalletCards(mCardsRetriever);
|
mController.queryWalletCards(mCardsRetriever);
|
||||||
|
|||||||
Reference in New Issue
Block a user