diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java index aa899840330f3..2b4b49b82df16 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java @@ -34,6 +34,7 @@ import android.widget.Toolbar; import androidx.annotation.NonNull; +import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.settingslib.Utils; @@ -70,6 +71,7 @@ public class WalletActivity extends LifecycleActivity implements private final UserTracker mUserTracker; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final StatusBarKeyguardViewManager mKeyguardViewManager; + private final UiEventLogger mUiEventLogger; private KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback; private WalletScreenController mWalletScreenController; @@ -87,7 +89,8 @@ public class WalletActivity extends LifecycleActivity implements FalsingCollector falsingCollector, UserTracker userTracker, KeyguardUpdateMonitor keyguardUpdateMonitor, - StatusBarKeyguardViewManager keyguardViewManager) { + StatusBarKeyguardViewManager keyguardViewManager, + UiEventLogger uiEventLogger) { mKeyguardStateController = keyguardStateController; mKeyguardDismissUtil = keyguardDismissUtil; mActivityStarter = activityStarter; @@ -98,6 +101,7 @@ public class WalletActivity extends LifecycleActivity implements mUserTracker = userTracker; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardViewManager = keyguardViewManager; + mUiEventLogger = uiEventLogger; } @Override @@ -129,7 +133,8 @@ public class WalletActivity extends LifecycleActivity implements mUserTracker, mFalsingManager, mKeyguardUpdateMonitor, - mKeyguardStateController); + mKeyguardStateController, + mUiEventLogger); mKeyguardUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override public void onBiometricRunningStateChanged( @@ -153,11 +158,14 @@ public class WalletActivity extends LifecycleActivity implements } if (mKeyguardStateController.isUnlocked()) { + mUiEventLogger.log(WalletUiEvent.QAW_SHOW_ALL); mActivityStarter.startActivity( mWalletClient.createWalletIntent(), true); finish(); } else { + mUiEventLogger.log(WalletUiEvent.QAW_UNLOCK_FROM_SHOW_ALL_BUTTON); mKeyguardDismissUtil.executeWhenUnlocked(() -> { + mUiEventLogger.log(WalletUiEvent.QAW_SHOW_ALL); mActivityStarter.startActivity( mWalletClient.createWalletIntent(), true); finish(); @@ -175,6 +183,7 @@ public class WalletActivity extends LifecycleActivity implements return; } + mUiEventLogger.log(WalletUiEvent.QAW_UNLOCK_FROM_UNLOCK_BUTTON); mKeyguardDismissUtil.executeWhenUnlocked(() -> false, false, false); }); diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java index ab8ad7779689d..2e183b38a7dcc 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java @@ -39,6 +39,7 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; @@ -74,6 +75,7 @@ public class WalletScreenController implements private final WalletView mWalletView; private final WalletCardCarousel mCardCarousel; private final FalsingManager mFalsingManager; + private final UiEventLogger mUiEventLogger; @VisibleForTesting String mSelectedCardId; @VisibleForTesting boolean mIsDismissed; @@ -88,7 +90,8 @@ public class WalletScreenController implements UserTracker userTracker, FalsingManager falsingManager, KeyguardUpdateMonitor keyguardUpdateMonitor, - KeyguardStateController keyguardStateController) { + KeyguardStateController keyguardStateController, + UiEventLogger uiEventLogger) { mContext = context; mWalletClient = walletClient; mActivityStarter = activityStarter; @@ -97,6 +100,7 @@ public class WalletScreenController implements mFalsingManager = falsingManager; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardStateController = keyguardStateController; + mUiEventLogger = uiEventLogger; mPrefs = userTracker.getUserContext().getSharedPreferences(TAG, Context.MODE_PRIVATE); mWalletView = walletView; mWalletView.setMinimumHeight(getExpectedMinHeight()); @@ -147,6 +151,7 @@ public class WalletScreenController implements isUdfpsEnabled); } } + mUiEventLogger.log(WalletUiEvent.QAW_IMPRESSION); removeMinHeightAndRecordHeightOnLayout(); }); } @@ -180,6 +185,9 @@ public class WalletScreenController implements if (mIsDismissed) { return; } + if (mSelectedCardId != null && !mSelectedCardId.equals(card.getCardId())) { + mUiEventLogger.log(WalletUiEvent.QAW_CHANGE_CARD); + } mSelectedCardId = card.getCardId(); selectCard(); } @@ -209,6 +217,12 @@ public class WalletScreenController implements || ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent() == null) { return; } + + if (!mKeyguardStateController.isUnlocked()) { + mUiEventLogger.log(WalletUiEvent.QAW_UNLOCK_FROM_CARD_CLICK); + } + mUiEventLogger.log(WalletUiEvent.QAW_CLICK_CARD); + mActivityStarter.startActivity( ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent().getIntent(), true); } diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletUiEvent.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletUiEvent.java new file mode 100644 index 0000000000000..da3a5c6194468 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletUiEvent.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2021 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 com.android.systemui.wallet.ui; + +import com.android.internal.logging.UiEvent; +import com.android.internal.logging.UiEventLogger; + +/** + * Ui events for the Quick Access Wallet. + */ +public enum WalletUiEvent implements UiEventLogger.UiEventEnum { + @UiEvent(doc = "The default payment app is opened to show all payment cards.") + QAW_SHOW_ALL(860), + + @UiEvent(doc = "The Quick Access Wallet homescreen is unlocked.") + QAW_UNLOCK_FROM_CARD_CLICK(861), + + @UiEvent(doc = "The Quick Access Wallet center card is changed") + QAW_CHANGE_CARD(863), + + @UiEvent(doc = "The Quick Access Wallet is opened.") + QAW_IMPRESSION(864), + + @UiEvent(doc = "The Quick Access Wallet card is clicked") + QAW_CLICK_CARD(865), + + @UiEvent(doc = "The Quick Access Wallet homescreen is unlocked via clicking the unlock button") + QAW_UNLOCK_FROM_UNLOCK_BUTTON(866), + + @UiEvent( + doc = "The Quick Access Wallet homescreen is unlocked via clicking the show all button") + QAW_UNLOCK_FROM_SHOW_ALL_BUTTON(867); + + private final int mId; + + WalletUiEvent(int id) { + mId = id; + } + + @Override + public int getId() { + return mId; + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java index 30180897f5d7b..e3b07b3e8bd7b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java @@ -22,6 +22,7 @@ import static android.view.View.VISIBLE; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -43,6 +44,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; +import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; @@ -91,6 +93,8 @@ public class WalletScreenControllerTest extends SysuiTestCase { KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock KeyguardStateController mKeyguardStateController; + @Mock + UiEventLogger mUiEventLogger; @Captor ArgumentCaptor mIntentCaptor; @Captor @@ -123,7 +127,8 @@ public class WalletScreenControllerTest extends SysuiTestCase { mUserTracker, mFalsingManager, mKeyguardUpdateMonitor, - mKeyguardStateController); + mKeyguardStateController, + mUiEventLogger); } @Test @@ -172,6 +177,8 @@ public class WalletScreenControllerTest extends SysuiTestCase { callback.onWalletCardsRetrieved(response); mTestableLooper.processAllMessages(); + verify(mUiEventLogger).log(WalletUiEvent.QAW_IMPRESSION); + assertEquals(VISIBLE, mWalletView.getCardCarouselContainer().getVisibility()); assertEquals(VISIBLE, mWalletView.getActionButton().getVisibility()); } @@ -198,6 +205,8 @@ public class WalletScreenControllerTest extends SysuiTestCase { assertEquals(VISIBLE, mWalletView.getCardCarouselContainer().getVisibility()); assertEquals("Hold to reader", mWalletView.getCardLabel().getText().toString()); assertEquals(GONE, mWalletView.getErrorView().getVisibility()); + + verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_IMPRESSION); } @Test @@ -351,6 +360,14 @@ public class WalletScreenControllerTest extends SysuiTestCase { assertEquals(CARD_ID_1, mController.mSelectedCardId); } + @Test + public void logOnCardChanged() { + mController.onCardSelected(createCardViewInfo(createWalletCard(mContext))); + mController.onCardSelected(createCardViewInfo(createNonActiveWalletCard(mContext))); + + verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_CHANGE_CARD); + } + @Test public void onCardClicked_startIntent() { WalletCardViewInfo walletCardViewInfo = createCardViewInfo(createWalletCard(mContext)); @@ -361,6 +378,20 @@ public class WalletScreenControllerTest extends SysuiTestCase { assertEquals(mWalletIntent.getAction(), mIntentCaptor.getValue().getAction()); assertEquals(mWalletIntent.getComponent(), mIntentCaptor.getValue().getComponent()); + + verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_CLICK_CARD); + } + + @Test + public void onCardClicked_deviceLocked_logUnlockEvent() { + when(mKeyguardStateController.isUnlocked()).thenReturn(false); + WalletCardViewInfo walletCardViewInfo = createCardViewInfo(createWalletCard(mContext)); + + mController.onCardClicked(walletCardViewInfo); + + verify(mUiEventLogger, times(1)) + .log(WalletUiEvent.QAW_UNLOCK_FROM_CARD_CLICK); + verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_CLICK_CARD); } @Test