From 799c777f67a7e6807ecf4af4f596d0c4709a513d Mon Sep 17 00:00:00 2001 From: jeffreyhuang Date: Thu, 2 Nov 2017 15:46:43 -0700 Subject: [PATCH 1/5] Introduce FirmwareVersionDialogController - Create a controller to display data and handle user input for the Android Version field in FirmwareVersionDialogFragment Bug: 36458278 Test: make RunSettingsRoboTests -j40 Change-Id: Iabd46505103711451001a9374906188c707be548 --- .../FirmwareVersionDialogController.java | 112 ++++++++++++++++++ .../FirmwareVersionDialogFragment.java | 27 ++++- .../FirmwareVersionDialogControllerTest.java | 104 ++++++++++++++++ 3 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogController.java create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogControllerTest.java diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogController.java new file mode 100644 index 00000000000..5794e1273b7 --- /dev/null +++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogController.java @@ -0,0 +1,112 @@ +/* + * 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.deviceinfo.firmwareversion; + +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.SystemClock; +import android.os.UserHandle; +import android.os.UserManager; +import android.support.annotation.VisibleForTesting; +import android.util.Log; +import android.view.View; + +import com.android.settings.R; +import com.android.settingslib.RestrictedLockUtils; + +public class FirmwareVersionDialogController implements View.OnClickListener { + + private static final String TAG = "firmwareDialogCtrl"; + private static final int DELAY_TIMER_MILLIS = 500; + private static final int ACTIVITY_TRIGGER_COUNT = 3; + + @VisibleForTesting + static final int FIRMWARE_VERSION_VALUE_ID = R.id.firmware_version_value; + @VisibleForTesting + static final int FIRMWARE_VERSION_LABEL_ID = R.id.firmware_version_label; + + private final FirmwareVersionDialogFragment mDialog; + private final Context mContext; + private final UserManager mUserManager; + private final long[] mHits = new long[ACTIVITY_TRIGGER_COUNT]; + + private RestrictedLockUtils.EnforcedAdmin mFunDisallowedAdmin; + private boolean mFunDisallowedBySystem; + + public FirmwareVersionDialogController(FirmwareVersionDialogFragment dialog) { + mDialog = dialog; + mContext = dialog.getContext(); + mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + } + + @Override + public void onClick(View v) { + arrayCopy(); + mHits[mHits.length - 1] = SystemClock.uptimeMillis(); + if (mHits[0] >= (SystemClock.uptimeMillis() - DELAY_TIMER_MILLIS)) { + if (mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN)) { + if (mFunDisallowedAdmin != null && !mFunDisallowedBySystem) { + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, + mFunDisallowedAdmin); + } + Log.d(TAG, "Sorry, no fun for you!"); + return; + } + + final Intent intent = new Intent(Intent.ACTION_MAIN) + .setClassName( + "android", com.android.internal.app.PlatLogoActivity.class.getName()); + try { + mContext.startActivity(intent); + } catch (Exception e) { + Log.e(TAG, "Unable to start activity " + intent.toString()); + } + } + } + + /** + * Populates the Android version field in the dialog and registers click listeners. + */ + public void initialize() { + initializeAdminPermissions(); + registerClickListeners(); + + mDialog.setText(FIRMWARE_VERSION_VALUE_ID, Build.VERSION.RELEASE); + } + + private void registerClickListeners() { + mDialog.registerClickListener(FIRMWARE_VERSION_LABEL_ID, this /* listener */); + mDialog.registerClickListener(FIRMWARE_VERSION_VALUE_ID, this /* listener */); + } + + /** + * Copies the array onto itself to remove the oldest hit. + */ + @VisibleForTesting + void arrayCopy() { + System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1); + } + + @VisibleForTesting + void initializeAdminPermissions() { + mFunDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced( + mContext, UserManager.DISALLOW_FUN, UserHandle.myUserId()); + mFunDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction( + mContext, UserManager.DISALLOW_FUN, UserHandle.myUserId()); + } +} diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java index 3af21a93f53..4ef4e05493c 100644 --- a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java +++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java @@ -23,6 +23,7 @@ import android.app.FragmentManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; +import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -32,6 +33,8 @@ public class FirmwareVersionDialogFragment extends InstrumentedDialogFragment { private static final String TAG = "firmwareVersionDialog"; + private View mRootView; + public static void show(Fragment host) { final FragmentManager manager = host.getChildFragmentManager(); if (manager.findFragmentByTag(TAG) == null) { @@ -51,9 +54,29 @@ public class FirmwareVersionDialogFragment extends InstrumentedDialogFragment { .setTitle(R.string.firmware_title) .setPositiveButton(android.R.string.ok, null /* listener */); - final View view = LayoutInflater.from(getActivity()).inflate( + mRootView = LayoutInflater.from(getActivity()).inflate( R.layout.dialog_firmware_version, null /* parent */); - return builder.setView(view).create(); + initializeControllers(); + + return builder.setView(mRootView).create(); + } + + public void setText(int viewId, CharSequence text) { + final TextView view = mRootView.findViewById(viewId); + if (view != null) { + view.setText(text); + } + } + + public void registerClickListener(int viewId, View.OnClickListener listener) { + final View view = mRootView.findViewById(viewId); + if (view != null) { + view.setOnClickListener(listener); + } + } + + private void initializeControllers() { + new FirmwareVersionDialogController(this).initialize(); } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogControllerTest.java new file mode 100644 index 00000000000..00d1386e4ce --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogControllerTest.java @@ -0,0 +1,104 @@ +/* + * 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.deviceinfo.firmwareversion; + +import static com.android.settings.deviceinfo.firmwareversion.FirmwareVersionDialogController + .FIRMWARE_VERSION_LABEL_ID; +import static com.android.settings.deviceinfo.firmwareversion.FirmwareVersionDialogController + .FIRMWARE_VERSION_VALUE_ID; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.os.Build; +import android.os.UserManager; +import android.view.View; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +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_O) +public class FirmwareVersionDialogControllerTest { + + @Mock + private UserManager mUserManager; + @Mock + private FirmwareVersionDialogFragment mDialog; + @Mock + private View mView; + + private Context mContext; + private FirmwareVersionDialogController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + when(mDialog.getContext()).thenReturn(mContext); + mController = spy(new FirmwareVersionDialogController(mDialog)); + ReflectionHelpers.setField(mController, "mUserManager", mUserManager); + doNothing().when(mController).arrayCopy(); + doNothing().when(mController).initializeAdminPermissions(); + } + + @Test + public void initialize_shouldRegisterListenersAndSetBuildVersion() { + mController.initialize(); + + verify(mDialog).registerClickListener(eq(FIRMWARE_VERSION_VALUE_ID), any()); + verify(mDialog).registerClickListener(eq(FIRMWARE_VERSION_LABEL_ID), any()); + verify(mDialog).setText(FIRMWARE_VERSION_VALUE_ID, Build.VERSION.RELEASE); + } + + @Test + public void handleSettingClicked_userRestricted_shouldDoNothing() { + final long[] hits = ReflectionHelpers.getField(mController, "mHits"); + hits[0] = Long.MAX_VALUE; + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN)).thenReturn(true); + + mController.onClick(mView); + + verify(mContext, never()).startActivity(any()); + } + + @Test + public void handleSettingClicked_userNotRestricted_shouldStartActivity() { + final long[] hits = ReflectionHelpers.getField(mController, "mHits"); + hits[0] = Long.MAX_VALUE; + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN)).thenReturn(false); + + mController.onClick(mView); + + verify(mContext).startActivity(any()); + } +} From bebb100e0a5453921f20d17fae3f1d4622af90a8 Mon Sep 17 00:00:00 2001 From: jeffreyhuang Date: Fri, 3 Nov 2017 12:11:19 -0700 Subject: [PATCH 2/5] Introduce SecurityPatchLevelDialogController - Create a controller to display data and handle user input for the security patch level field in FirmwareVersionDialogFragment Bug: 36458278 Test: make RunSettingsRoboTests -j40 Change-Id: I4ca93d9b0e74a5eaf5746704d46de42f5ae27224 --- .../SecurityPatchPreferenceController.java | 5 + .../FirmwareVersionDialogFragment.java | 8 ++ .../SecurityPatchLevelDialogController.java | 86 +++++++++++++ ...ecurityPatchLevelDialogControllerTest.java | 117 ++++++++++++++++++ 4 files changed, 216 insertions(+) create mode 100644 src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogController.java create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogControllerTest.java diff --git a/src/com/android/settings/deviceinfo/SecurityPatchPreferenceController.java b/src/com/android/settings/deviceinfo/SecurityPatchPreferenceController.java index f38602ab531..9b0120e7e77 100644 --- a/src/com/android/settings/deviceinfo/SecurityPatchPreferenceController.java +++ b/src/com/android/settings/deviceinfo/SecurityPatchPreferenceController.java @@ -23,9 +23,14 @@ import android.text.TextUtils; import android.util.Log; import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.deviceinfo.firmwareversion.SecurityPatchLevelDialogController; import com.android.settingslib.DeviceInfoUtils; import com.android.settingslib.core.AbstractPreferenceController; +/** + * deprecated in favor of {@link SecurityPatchLevelDialogController} + */ +@Deprecated public class SecurityPatchPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin { diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java index 4ef4e05493c..265bee55a7d 100644 --- a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java +++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java @@ -69,6 +69,13 @@ public class FirmwareVersionDialogFragment extends InstrumentedDialogFragment { } } + public void removeSettingFromScreen(int viewId) { + final View view = mRootView.findViewById(viewId); + if (view != null) { + view.setVisibility(View.GONE); + } + } + public void registerClickListener(int viewId, View.OnClickListener listener) { final View view = mRootView.findViewById(viewId); if (view != null) { @@ -78,5 +85,6 @@ public class FirmwareVersionDialogFragment extends InstrumentedDialogFragment { private void initializeControllers() { new FirmwareVersionDialogController(this).initialize(); + new SecurityPatchLevelDialogController(this).initialize(); } } diff --git a/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogController.java new file mode 100644 index 00000000000..01f440daca0 --- /dev/null +++ b/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogController.java @@ -0,0 +1,86 @@ +/* + * 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.deviceinfo.firmwareversion; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.support.annotation.VisibleForTesting; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; + +import com.android.settings.R; +import com.android.settingslib.DeviceInfoUtils; +import com.android.settingslib.wrapper.PackageManagerWrapper; + +public class SecurityPatchLevelDialogController implements View.OnClickListener { + + private static final String TAG = "SecurityPatchCtrl"; + private static final Uri INTENT_URI_DATA = Uri.parse( + "https://source.android.com/security/bulletin/"); + + @VisibleForTesting + static final int SECURITY_PATCH_VALUE_ID = R.id.security_patch_level_value; + @VisibleForTesting + static final int SECURITY_PATCH_LABEL_ID = R.id.security_patch_level_label; + + private final FirmwareVersionDialogFragment mDialog; + private final Context mContext; + private final PackageManagerWrapper mPackageManager; + private final String mCurrentPatch; + + public SecurityPatchLevelDialogController(FirmwareVersionDialogFragment dialog) { + mDialog = dialog; + mContext = dialog.getContext(); + mPackageManager = new PackageManagerWrapper(mContext.getPackageManager()); + mCurrentPatch = DeviceInfoUtils.getSecurityPatch(); + } + + @Override + public void onClick(View v) { + final Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(INTENT_URI_DATA); + if (mPackageManager.queryIntentActivities(intent, 0).isEmpty()) { + // Don't send out the intent to stop crash + Log.w(TAG, "Stop click action on " + SECURITY_PATCH_VALUE_ID + ": " + + "queryIntentActivities() returns empty"); + return; + } + + mContext.startActivity(intent); + } + + /** + * Populates the security patch level field in the dialog and registers click listeners. + */ + public void initialize() { + if (TextUtils.isEmpty(mCurrentPatch)) { + mDialog.removeSettingFromScreen(SECURITY_PATCH_LABEL_ID); + mDialog.removeSettingFromScreen(SECURITY_PATCH_VALUE_ID); + return; + } + registerListeners(); + mDialog.setText(SECURITY_PATCH_VALUE_ID, mCurrentPatch); + } + + private void registerListeners() { + mDialog.registerClickListener(SECURITY_PATCH_LABEL_ID, this /* listener */); + mDialog.registerClickListener(SECURITY_PATCH_VALUE_ID, this /* listener */); + } +} diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogControllerTest.java new file mode 100644 index 00000000000..ea37c2ed4e6 --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogControllerTest.java @@ -0,0 +1,117 @@ +/* + * 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.deviceinfo.firmwareversion; + +import static com.android.settings.deviceinfo.firmwareversion.SecurityPatchLevelDialogController + .SECURITY_PATCH_LABEL_ID; +import static com.android.settings.deviceinfo.firmwareversion.SecurityPatchLevelDialogController + .SECURITY_PATCH_VALUE_ID; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.os.Build; +import android.view.View; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.wrapper.PackageManagerWrapper; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +import java.util.Collections; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O) +public class SecurityPatchLevelDialogControllerTest { + + @Mock + private PackageManagerWrapper mPackageManager; + @Mock + private FirmwareVersionDialogFragment mDialog; + @Mock + private View mView; + + private Context mContext; + private SecurityPatchLevelDialogController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + when(mDialog.getContext()).thenReturn(mContext); + } + + @Test + public void initialize_noPatchInfo_shouldRemoveSettingFromDialog() { + ReflectionHelpers.setStaticField(Build.VERSION.class, "SECURITY_PATCH", ""); + mController = new SecurityPatchLevelDialogController(mDialog); + + mController.initialize(); + + verify(mDialog).removeSettingFromScreen(SECURITY_PATCH_VALUE_ID); + verify(mDialog).removeSettingFromScreen(SECURITY_PATCH_LABEL_ID); + } + + @Test + public void initialize_patchInfoAvailable_shouldRegisterListeners() { + ReflectionHelpers.setStaticField(Build.VERSION.class, "SECURITY_PATCH", "foobar"); + mController = new SecurityPatchLevelDialogController(mDialog); + + mController.initialize(); + + verify(mDialog).registerClickListener(eq(SECURITY_PATCH_LABEL_ID), any()); + verify(mDialog).registerClickListener(eq(SECURITY_PATCH_VALUE_ID), any()); + } + + @Test + public void onClick_noActivityIntent_shouldDoNothing() { + when(mPackageManager.queryIntentActivities(any(), anyInt())).thenReturn( + Collections.emptyList()); + mController = new SecurityPatchLevelDialogController(mDialog); + ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager); + + mController.onClick(mView); + + verify(mContext, never()).startActivity(any()); + } + + @Test + public void onClick_activityIntentFound_shouldStartActivity() { + when(mPackageManager.queryIntentActivities(any(), anyInt())).thenReturn( + Collections.singletonList(null)); + mController = new SecurityPatchLevelDialogController(mDialog); + ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager); + + mController.onClick(mView); + + verify(mContext).startActivity(any()); + } +} From 633a67c82194cfc1794c5631fd2570b32a7293f5 Mon Sep 17 00:00:00 2001 From: jeffreyhuang Date: Fri, 3 Nov 2017 13:52:04 -0700 Subject: [PATCH 3/5] Introduce BasebandVersionDialogController - Create a controller to display data and for the baseband version field in FirmwareVersionDialogFragment Bug: 36458278 Test: make RunSettingsRoboTests -j40 Change-Id: I6818966f43549f41f20a488190e3116322858089 --- .../BasebandVersionPreferenceController.java | 5 + .../BasebandVersionDialogController.java | 55 +++++++++++ .../FirmwareVersionDialogFragment.java | 1 + .../BasebandVersionDialogControllerTest.java | 97 +++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogController.java create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogControllerTest.java diff --git a/src/com/android/settings/deviceinfo/BasebandVersionPreferenceController.java b/src/com/android/settings/deviceinfo/BasebandVersionPreferenceController.java index 90d4c1183de..06ed87228e9 100644 --- a/src/com/android/settings/deviceinfo/BasebandVersionPreferenceController.java +++ b/src/com/android/settings/deviceinfo/BasebandVersionPreferenceController.java @@ -21,9 +21,14 @@ import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.deviceinfo.firmwareversion.BasebandVersionDialogController; import com.android.settingslib.Utils; import com.android.settingslib.core.AbstractPreferenceController; +/** + * deprecated in favor of {@link BasebandVersionDialogController} + */ +@Deprecated public class BasebandVersionPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin { diff --git a/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogController.java new file mode 100644 index 00000000000..c857f19c8bf --- /dev/null +++ b/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogController.java @@ -0,0 +1,55 @@ +/* + * 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.deviceinfo.firmwareversion; + +import android.content.Context; +import android.os.SystemProperties; +import android.support.annotation.VisibleForTesting; + +import com.android.settings.R; +import com.android.settings.Utils; + +public class BasebandVersionDialogController { + + @VisibleForTesting + static final int BASEBAND_VERSION_LABEL_ID = R.id.baseband_version_label; + @VisibleForTesting + static final int BASEBAND_VERSION_VALUE_ID = R.id.baseband_version_value; + @VisibleForTesting + static final String BASEBAND_PROPERTY = "gsm.version.baseband"; + + private final FirmwareVersionDialogFragment mDialog; + + public BasebandVersionDialogController(FirmwareVersionDialogFragment dialog) { + mDialog = dialog; + } + + /** + * Updates the baseband version field of the dialog. + */ + public void initialize() { + final Context context = mDialog.getContext(); + if (Utils.isWifiOnly(context)) { + mDialog.removeSettingFromScreen(BASEBAND_VERSION_LABEL_ID); + mDialog.removeSettingFromScreen(BASEBAND_VERSION_VALUE_ID); + return; + } + + mDialog.setText(BASEBAND_VERSION_VALUE_ID, SystemProperties.get(BASEBAND_PROPERTY, + context.getString(R.string.device_info_default))); + } +} diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java index 265bee55a7d..8343c529139 100644 --- a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java +++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java @@ -86,5 +86,6 @@ public class FirmwareVersionDialogFragment extends InstrumentedDialogFragment { private void initializeControllers() { new FirmwareVersionDialogController(this).initialize(); new SecurityPatchLevelDialogController(this).initialize(); + new BasebandVersionDialogController(this).initialize(); } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogControllerTest.java new file mode 100644 index 00000000000..0584a53d152 --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogControllerTest.java @@ -0,0 +1,97 @@ +/* + * 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.deviceinfo.firmwareversion; + +import static com.android.settings.deviceinfo.firmwareversion.BasebandVersionDialogController + .BASEBAND_PROPERTY; +import static com.android.settings.deviceinfo.firmwareversion.BasebandVersionDialogController + .BASEBAND_VERSION_LABEL_ID; +import static com.android.settings.deviceinfo.firmwareversion.BasebandVersionDialogController + .BASEBAND_VERSION_VALUE_ID; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.robolectric.shadow.api.Shadow.extract; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.os.SystemProperties; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowSystemProperties; +import com.android.settings.testutils.shadow.ShadowConnectivityManager; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, + sdk = TestConfig.SDK_VERSION_O, + shadows = {ShadowConnectivityManager.class, SettingsShadowSystemProperties.class}) +public class BasebandVersionDialogControllerTest { + + @Mock + private FirmwareVersionDialogFragment mDialog; + + private Context mContext; + private BasebandVersionDialogController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + when(mDialog.getContext()).thenReturn(mContext); + mController = new BasebandVersionDialogController(mDialog); + } + + @After + public void teardown() { + SettingsShadowSystemProperties.clear(); + } + + @Test + public void initialize_wifiOnly_shouldRemoveSettingFromDialog() { + ShadowConnectivityManager connectivityManager = + extract(mContext.getSystemService(ConnectivityManager.class)); + connectivityManager.setNetworkSupported(ConnectivityManager.TYPE_MOBILE, false); + + mController.initialize(); + + verify(mDialog).removeSettingFromScreen(BASEBAND_VERSION_LABEL_ID); + verify(mDialog).removeSettingFromScreen(BASEBAND_VERSION_VALUE_ID); + } + + @Test + public void initialize_hasMobile_shouldSetDialogTextToBasebandVersion() { + final String text = "test"; + SystemProperties.set(BASEBAND_PROPERTY, text); + ShadowConnectivityManager connectivityManager = + extract(mContext.getSystemService(ConnectivityManager.class)); + connectivityManager.setNetworkSupported(ConnectivityManager.TYPE_MOBILE, true); + + mController.initialize(); + + verify(mDialog).setText(BASEBAND_VERSION_VALUE_ID, text); + } +} From 890d3c766cbf171fb6199182478f5788f9caf6ea Mon Sep 17 00:00:00 2001 From: jeffreyhuang Date: Fri, 3 Nov 2017 14:08:48 -0700 Subject: [PATCH 4/5] Introduce KernelVersionDialogController - Create a controller to display data and for the kernel version field in FirmwareVersionDialogFragment Bug: 36458278 Test: make RunSettingsRoboTests -j40 Change-Id: Ie3f735e4559d8b01f67c65a1a46f1f1ad2dcdcd5 --- .../FirmwareVersionDialogFragment.java | 1 + .../KernelVersionDialogController.java | 41 +++++++++++++ .../KernelVersionDialogControllerTest.java | 57 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 src/com/android/settings/deviceinfo/firmwareversion/KernelVersionDialogController.java create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/KernelVersionDialogControllerTest.java diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java index 8343c529139..d58d999b3e2 100644 --- a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java +++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java @@ -87,5 +87,6 @@ public class FirmwareVersionDialogFragment extends InstrumentedDialogFragment { new FirmwareVersionDialogController(this).initialize(); new SecurityPatchLevelDialogController(this).initialize(); new BasebandVersionDialogController(this).initialize(); + new KernelVersionDialogController(this).initialize(); } } diff --git a/src/com/android/settings/deviceinfo/firmwareversion/KernelVersionDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/KernelVersionDialogController.java new file mode 100644 index 00000000000..c6c84f6f0e6 --- /dev/null +++ b/src/com/android/settings/deviceinfo/firmwareversion/KernelVersionDialogController.java @@ -0,0 +1,41 @@ +/* + * 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.deviceinfo.firmwareversion; + +import android.support.annotation.VisibleForTesting; + +import com.android.settings.R; +import com.android.settingslib.DeviceInfoUtils; + +public class KernelVersionDialogController { + + @VisibleForTesting + static int KERNEL_VERSION_VALUE_ID = R.id.kernel_version_value; + + private final FirmwareVersionDialogFragment mDialog; + + public KernelVersionDialogController(FirmwareVersionDialogFragment dialog) { + mDialog = dialog; + } + + /** + * Updates kernel version to the dialog. + */ + public void initialize() { + mDialog.setText(KERNEL_VERSION_VALUE_ID, DeviceInfoUtils.getFormattedKernelVersion()); + } +} diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/KernelVersionDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/KernelVersionDialogControllerTest.java new file mode 100644 index 00000000000..c679af53d41 --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/KernelVersionDialogControllerTest.java @@ -0,0 +1,57 @@ +/* + * 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.deviceinfo.firmwareversion; + +import static com.android.settings.deviceinfo.firmwareversion.KernelVersionDialogController + .KERNEL_VERSION_VALUE_ID; + +import static org.mockito.Mockito.verify; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.DeviceInfoUtils; + +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_O) +public class KernelVersionDialogControllerTest { + + @Mock + private FirmwareVersionDialogFragment mDialog; + + private KernelVersionDialogController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mController = new KernelVersionDialogController(mDialog); + } + + @Test + public void initialize_shouldUpdateKernelVersionToDialog() { + mController.initialize(); + + verify(mDialog).setText(KERNEL_VERSION_VALUE_ID, + DeviceInfoUtils.getFormattedKernelVersion()); + } +} From 4cbeaf672980ca75ab0bc38636051c2f404124c7 Mon Sep 17 00:00:00 2001 From: jeffreyhuang Date: Fri, 3 Nov 2017 14:36:48 -0700 Subject: [PATCH 5/5] Introduce BuildNumberDialogController - Create a controller to display data and for the build number field in FirmwareVersionDialogFragment Bug: 36458278 Test: make RunSettingsRoboTests -j40 Change-Id: Ie283981d6e7ed519df1a77fd21158feb37f0efd8 --- .../BuildNumberDialogController.java | 43 ++++++++++++++ .../FirmwareVersionDialogFragment.java | 1 + .../BuildNumberDialogControllerTest.java | 59 +++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogController.java create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogControllerTest.java diff --git a/src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogController.java new file mode 100644 index 00000000000..d99586715aa --- /dev/null +++ b/src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogController.java @@ -0,0 +1,43 @@ +/* + * 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.deviceinfo.firmwareversion; + +import android.os.Build; +import android.support.annotation.VisibleForTesting; +import android.text.BidiFormatter; + +import com.android.settings.R; + +public class BuildNumberDialogController { + + @VisibleForTesting + static final int BUILD_NUMBER_VALUE_ID = R.id.build_number_value; + + private final FirmwareVersionDialogFragment mDialog; + + public BuildNumberDialogController(FirmwareVersionDialogFragment dialog) { + mDialog = dialog; + } + + /** + * Updates the build number to the dialog. + */ + public void initialize() { + mDialog.setText(BUILD_NUMBER_VALUE_ID, + BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY)); + } +} diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java index d58d999b3e2..0087444605b 100644 --- a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java +++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java @@ -88,5 +88,6 @@ public class FirmwareVersionDialogFragment extends InstrumentedDialogFragment { new SecurityPatchLevelDialogController(this).initialize(); new BasebandVersionDialogController(this).initialize(); new KernelVersionDialogController(this).initialize(); + new BuildNumberDialogController(this).initialize(); } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogControllerTest.java new file mode 100644 index 00000000000..8bdf84cf414 --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogControllerTest.java @@ -0,0 +1,59 @@ +/* + * 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.deviceinfo.firmwareversion; + +import static com.android.settings.deviceinfo.firmwareversion.BuildNumberDialogController + .BUILD_NUMBER_VALUE_ID; + +import static org.mockito.Mockito.verify; + +import android.os.Build; +import android.text.BidiFormatter; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +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_O) +public class BuildNumberDialogControllerTest { + + @Mock + private FirmwareVersionDialogFragment mDialog; + + private BuildNumberDialogController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mController = new BuildNumberDialogController(mDialog); + } + + @Test + public void initialize_shouldUpdateBuildNumberToDialog() { + mController.initialize(); + + verify(mDialog).setText(BUILD_NUMBER_VALUE_ID, + BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY)); + } +}