diff --git a/src/com/android/settings/network/NetworkResetActionMenuController.java b/src/com/android/settings/network/NetworkResetActionMenuController.java index 028ac7bc95e..254834b9808 100644 --- a/src/com/android/settings/network/NetworkResetActionMenuController.java +++ b/src/com/android/settings/network/NetworkResetActionMenuController.java @@ -17,9 +17,6 @@ package com.android.settings.network; import android.content.Context; -import android.os.UserHandle; -import android.os.UserManager; -import android.support.annotation.VisibleForTesting; import android.view.Menu; import android.view.MenuItem; @@ -27,15 +24,16 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.ResetNetwork; import com.android.settings.Utils; -import com.android.settingslib.RestrictedLockUtils; public class NetworkResetActionMenuController { private static final int MENU_NETWORK_RESET = Menu.FIRST + 200; private final Context mContext; + private final NetworkResetRestrictionChecker mRestrictionChecker; public NetworkResetActionMenuController(Context context) { mContext = context; + mRestrictionChecker = new NetworkResetRestrictionChecker(context); } public void buildMenuItem(Menu menu) { @@ -53,14 +51,8 @@ public class NetworkResetActionMenuController { } } - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + boolean isAvailable() { - return isAvailable(mContext); + return !mRestrictionChecker.hasRestriction(); } - - static boolean isAvailable(Context context) { - return !RestrictedLockUtils.hasBaseUserRestriction(context, - UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId()); - } - } diff --git a/src/com/android/settings/network/NetworkResetPreferenceController.java b/src/com/android/settings/network/NetworkResetPreferenceController.java index 04573c91390..ce36a7f3551 100644 --- a/src/com/android/settings/network/NetworkResetPreferenceController.java +++ b/src/com/android/settings/network/NetworkResetPreferenceController.java @@ -22,13 +22,16 @@ import com.android.settings.core.PreferenceController; public class NetworkResetPreferenceController extends PreferenceController { + private final NetworkResetRestrictionChecker mRestrictionChecker; + public NetworkResetPreferenceController(Context context) { super(context); + mRestrictionChecker = new NetworkResetRestrictionChecker(context); } @Override public boolean isAvailable() { - return NetworkResetActionMenuController.isAvailable(mContext); + return !mRestrictionChecker.hasRestriction(); } @Override diff --git a/src/com/android/settings/network/NetworkResetRestrictionChecker.java b/src/com/android/settings/network/NetworkResetRestrictionChecker.java new file mode 100644 index 00000000000..4fe9f597ab8 --- /dev/null +++ b/src/com/android/settings/network/NetworkResetRestrictionChecker.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2017 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.settings.network; + +import android.content.Context; +import android.os.UserHandle; +import android.os.UserManager; +import android.support.annotation.VisibleForTesting; + +import com.android.settingslib.RestrictedLockUtils; + +public class NetworkResetRestrictionChecker { + + private final Context mContext; + private final UserManager mUserManager; + + public NetworkResetRestrictionChecker(Context context) { + mContext = context; + mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + } + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + boolean hasUserBaseRestriction() { + return RestrictedLockUtils.hasBaseUserRestriction(mContext, + UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId()); + } + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + boolean isRestrictionEnforcedByAdmin() { + return RestrictedLockUtils.checkIfRestrictionEnforced( + mContext, UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId()) != null; + } + + boolean hasRestriction() { + return !mUserManager.isAdminUser() + || hasUserBaseRestriction() + || isRestrictionEnforcedByAdmin(); + } +} diff --git a/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java b/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java index 7cd76d3d15d..ee6ef69afd3 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java @@ -19,9 +19,7 @@ package com.android.settings.network; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -39,6 +37,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @@ -50,19 +49,21 @@ public class NetworkResetActionMenuControllerTest { private Menu mMenu; @Mock private MenuItem mMenuItem; + @Mock + private NetworkResetRestrictionChecker mRestrictionChecker; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mController = spy(new NetworkResetActionMenuController(mContext)); + mController = new NetworkResetActionMenuController(mContext); + ReflectionHelpers.setField(mController, "mRestrictionChecker", mRestrictionChecker); when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem); } @Test public void buildMenuItem_available_shouldAddToMenu() { - doReturn(true).when(mController).isAvailable(); - + when(mRestrictionChecker.hasRestriction()).thenReturn(false); mController.buildMenuItem(mMenu); verify(mMenu).add(anyInt(), anyInt(), anyInt(), anyInt()); @@ -71,7 +72,7 @@ public class NetworkResetActionMenuControllerTest { @Test public void buildMenuItem_notAvailable_shouldNotAddToMenu() { - doReturn(false).when(mController).isAvailable(); + when(mRestrictionChecker.hasRestriction()).thenReturn(true); mController.buildMenuItem(mMenu); diff --git a/tests/robotests/src/com/android/settings/network/NetworkResetRestrictionCheckerTest.java b/tests/robotests/src/com/android/settings/network/NetworkResetRestrictionCheckerTest.java new file mode 100644 index 00000000000..b1c88d595a8 --- /dev/null +++ b/tests/robotests/src/com/android/settings/network/NetworkResetRestrictionCheckerTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2017 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.settings.network; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.os.UserManager; + +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class NetworkResetRestrictionCheckerTest { + + @Mock + private UserManager mUserManager; + @Mock + private Context mContext; + private NetworkResetRestrictionChecker mRestrictionChecker; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + mRestrictionChecker = spy(new NetworkResetRestrictionChecker(mContext)); + } + + @Test + public void testHasRestriction_notAdmin_shouldReturnTrue() { + final Context context = mock(Context.class); + when(context.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + when(mUserManager.isAdminUser()).thenReturn(false); + + assertThat(mRestrictionChecker.hasRestriction()).isTrue(); + } + + @Test + public void testHasRestriction_hasUserRestriction_shouldReturnTrue() { + when(mUserManager.isAdminUser()).thenReturn(true); + doReturn(true).when(mRestrictionChecker).hasUserBaseRestriction(); + doReturn(false).when(mRestrictionChecker).isRestrictionEnforcedByAdmin(); + + assertThat(mRestrictionChecker.hasRestriction()).isTrue(); + } + + @Test + public void testHasRestriction_hasAdminRestriction_shouldReturnTrue() { + when(mUserManager.isAdminUser()).thenReturn(true); + doReturn(false).when(mRestrictionChecker).hasUserBaseRestriction(); + doReturn(true).when(mRestrictionChecker).isRestrictionEnforcedByAdmin(); + + assertThat(mRestrictionChecker.hasRestriction()).isTrue(); + } + + @Test + public void testHasRestriction_noRestriction_shouldReturnFalse() { + when(mUserManager.isAdminUser()).thenReturn(true); + doReturn(false).when(mRestrictionChecker).hasUserBaseRestriction(); + doReturn(false).when(mRestrictionChecker).isRestrictionEnforcedByAdmin(); + + assertThat(mRestrictionChecker.hasRestriction()).isFalse(); + } +}