From f3242dab3546c019d4b79c502f7b8850d36123a5 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Tue, 16 Jul 2019 17:45:46 +0800 Subject: [PATCH] Prevent accounts page directly opening in screen pinning mode There is no auth mechanism to prevent accounts page being opened in screen pinning mode. We will directly close the account page if users are trying to navigate to it from screen pinning mode. Fixes: 137015265 Test: manual, robotests Change-Id: If26eda408a9ef6fa03ad82e5bee51bb7185950d6 --- .../accounts/AccountDashboardFragment.java | 21 ++++++++++++ .../AccountDashboardFragmentTest.java | 34 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java index 515008af596..0dae10bbe29 100644 --- a/src/com/android/settings/accounts/AccountDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountDashboardFragment.java @@ -15,11 +15,17 @@ */ package com.android.settings.accounts; +import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; import static android.provider.Settings.EXTRA_AUTHORITIES; +import android.app.ActivityManager; import android.app.settings.SettingsEnums; import android.content.Context; +import android.os.Bundle; import android.provider.SearchIndexableResource; +import android.util.Log; + +import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; @@ -40,6 +46,14 @@ public class AccountDashboardFragment extends DashboardFragment { private static final String TAG = "AccountDashboardFrag"; + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + if (isLockTaskModePinned()) { + Log.w(TAG, "Devices lock task mode pinned."); + finish(); + } + } @Override public int getMetricsCategory() { @@ -83,6 +97,13 @@ public class AccountDashboardFragment extends DashboardFragment { return controllers; } + @VisibleForTesting + boolean isLockTaskModePinned() { + final ActivityManager activityManager = + getContext().getSystemService(ActivityManager.class); + return activityManager.getLockTaskModeState() == LOCK_TASK_MODE_PINNED; + } + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java index 006087516cf..c07f915cc30 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java @@ -15,8 +15,16 @@ */ package com.android.settings.accounts; +import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; +import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + +import android.app.ActivityManager; +import android.content.Context; import android.provider.SearchIndexableResource; import com.android.settingslib.drawer.CategoryKey; @@ -26,6 +34,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowActivityManager; import java.util.List; @@ -33,10 +43,12 @@ import java.util.List; public class AccountDashboardFragmentTest { private AccountDashboardFragment mFragment; + private Context mContext; @Before public void setUp() { mFragment = new AccountDashboardFragment(); + mContext = RuntimeEnvironment.application; } @Test @@ -53,4 +65,26 @@ public class AccountDashboardFragmentTest { assertThat(indexRes).isNotNull(); assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId()); } + + @Test + public void isLockTaskModePinned_disableLockTaskMode_shouldReturnFalse() { + final AccountDashboardFragment fragment = spy(mFragment); + doReturn(mContext).when(fragment).getContext(); + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setLockTaskModeState(LOCK_TASK_MODE_NONE); + + assertThat(fragment.isLockTaskModePinned()).isFalse(); + } + + @Test + public void isLockTaskModePinned_hasTaskPinned_shouldReturnTrue() { + final AccountDashboardFragment fragment = spy(mFragment); + doReturn(mContext).when(fragment).getContext(); + final ShadowActivityManager activityManager = + Shadow.extract(mContext.getSystemService(ActivityManager.class)); + activityManager.setLockTaskModeState(LOCK_TASK_MODE_PINNED); + + assertThat(fragment.isLockTaskModePinned()).isTrue(); + } }