diff --git a/src/com/android/settings/deviceinfo/BasebandVersionPreferenceController.java b/src/com/android/settings/deviceinfo/BasebandVersionPreferenceController.java
index 90d4c11..06ed872 100644
--- a/src/com/android/settings/deviceinfo/BasebandVersionPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BasebandVersionPreferenceController.java
@@ -21,9 +21,14 @@
 
 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/SecurityPatchPreferenceController.java b/src/com/android/settings/deviceinfo/SecurityPatchPreferenceController.java
index f38602a..9b0120e 100644
--- a/src/com/android/settings/deviceinfo/SecurityPatchPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/SecurityPatchPreferenceController.java
@@ -23,9 +23,14 @@
 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/BasebandVersionDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogController.java
new file mode 100644
index 0000000..c857f19
--- /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/BuildNumberDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/BuildNumberDialogController.java
new file mode 100644
index 0000000..d995867
--- /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/FirmwareVersionDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogController.java
new file mode 100644
index 0000000..5794e12
--- /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 3af21a9..0087444 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.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 @@
 
     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,40 @@
                 .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 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) {
+            view.setOnClickListener(listener);
+        }
+    }
+
+    private void initializeControllers() {
+        new FirmwareVersionDialogController(this).initialize();
+        new SecurityPatchLevelDialogController(this).initialize();
+        new BasebandVersionDialogController(this).initialize();
+        new KernelVersionDialogController(this).initialize();
+        new BuildNumberDialogController(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 0000000..c6c84f6
--- /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/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogController.java b/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelDialogController.java
new file mode 100644
index 0000000..01f440d
--- /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/BasebandVersionDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionDialogControllerTest.java
new file mode 100644
index 0000000..0584a53
--- /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);
+    }
+}
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 0000000..8bdf84c
--- /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));
+    }
+}
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 0000000..00d1386
--- /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());
+    }
+}
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 0000000..c679af5
--- /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());
+    }
+}
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 0000000..ea37c2e
--- /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());
+    }
+}
