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
This commit is contained in:
Mill Chen
2019-07-16 17:45:46 +08:00
parent 136a0f53f6
commit f3242dab35
2 changed files with 55 additions and 0 deletions

View File

@@ -15,11 +15,17 @@
*/ */
package com.android.settings.accounts; package com.android.settings.accounts;
import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.provider.Settings.EXTRA_AUTHORITIES; import static android.provider.Settings.EXTRA_AUTHORITIES;
import android.app.ActivityManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.os.Bundle;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
@@ -40,6 +46,14 @@ public class AccountDashboardFragment extends DashboardFragment {
private static final String TAG = "AccountDashboardFrag"; 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 @Override
public int getMetricsCategory() { public int getMetricsCategory() {
@@ -83,6 +97,13 @@ public class AccountDashboardFragment extends DashboardFragment {
return controllers; 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 = public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider() {
@Override @Override

View File

@@ -15,8 +15,16 @@
*/ */
package com.android.settings.accounts; 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 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 android.provider.SearchIndexableResource;
import com.android.settingslib.drawer.CategoryKey; import com.android.settingslib.drawer.CategoryKey;
@@ -26,6 +34,8 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowActivityManager;
import java.util.List; import java.util.List;
@@ -33,10 +43,12 @@ import java.util.List;
public class AccountDashboardFragmentTest { public class AccountDashboardFragmentTest {
private AccountDashboardFragment mFragment; private AccountDashboardFragment mFragment;
private Context mContext;
@Before @Before
public void setUp() { public void setUp() {
mFragment = new AccountDashboardFragment(); mFragment = new AccountDashboardFragment();
mContext = RuntimeEnvironment.application;
} }
@Test @Test
@@ -53,4 +65,26 @@ public class AccountDashboardFragmentTest {
assertThat(indexRes).isNotNull(); assertThat(indexRes).isNotNull();
assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId()); 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();
}
} }