Convert more of StatusFragment to PreferenceControllers

Bug: 67410808
Test: RunSettingsRoboTests
Change-Id: Ia79d89d3d3b70bf7af950daa3e588db3f7f597e2
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8f6cc9c..ce0370e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2695,8 +2695,6 @@
     <string name="status_bt_address">Bluetooth address</string>
     <!-- About phone, status item title.  The hardware serial number. [CHAR LIMIT=30]-->
     <string name="status_serial_number">Serial number</string>
-    <!-- About phone, status item value if the actual value is not available. -->
-    <string name="status_unavailable">Unavailable</string>
     <!-- About phone, status item title.  How long the device has been running since its last reboot. -->
     <string name="status_up_time">Up time</string>
     <!-- About phone, status item title.  How much time the device has had its main CPU awake. -->
@@ -5532,8 +5530,6 @@
     <!-- Messaage shown in dialog when you can't manually sync -->
     <string name="cant_sync_dialog_message">Sync for this item is currently disabled. To change this setting, temporarily turn on background data and automatic sync.</string>
 
-    <string name="wimax_settings">4G</string>
-    <string name="status_wimax_mac_address">4G MAC address</string>
     <!-- This is displayed to the user when the device needs to be decrypted -->
     <string name="enter_password">To start Android, enter your password</string>
     <!-- Informational text on the pin entry screen prompting the user for their pin -->
@@ -9071,10 +9067,4 @@
     <!-- Note displayed when certain features are not available on low ram devices. [CHAR LIMIT=NONE] -->
     <string name="disabled_low_ram_device">This feature is not available on this device</string>
 
-    <!--Label of IMS registration header -->
-    <string name="ims_reg_title">"IMS registration state"</string>
-    <!--Used when IMS registration state is registered -->
-    <string name="ims_reg_status_registered">"Registered"</string>
-    <!--Used when IMS registration state is not registered -->
-    <string name="ims_reg_status_not_registered">"Not registered"</string>
 </resources>
diff --git a/res/xml/device_info_status.xml b/res/xml/device_info_status.xml
index 3456f91..07bbc4e 100644
--- a/res/xml/device_info_status.xml
+++ b/res/xml/device_info_status.xml
@@ -83,13 +83,6 @@
         android:summary="@string/summary_placeholder"
         android:persistent="false" />
     <Preference
-        android:key="wimax_mac_address"
-        android:enabled="false"
-        android:shouldDisableView="false"
-        android:title="@string/status_wimax_mac_address"
-        android:summary="@string/summary_placeholder"
-        android:persistent="false" />
-    <Preference
         android:key="ims_reg_state"
         android:enabled="false"
         android:shouldDisableView="false"
diff --git a/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java b/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java
new file mode 100644
index 0000000..431ead5
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/BluetoothAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractBluetoothAddressPreferenceController;
+
+/**
+ * Concrete subclass of bluetooth address preference controller
+ */
+public class BluetoothAddressPreferenceController extends
+        AbstractBluetoothAddressPreferenceController implements PreferenceControllerMixin {
+    public BluetoothAddressPreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java b/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java
new file mode 100644
index 0000000..07bd4a6
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/ImsStatusPreferenceController.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractImsStatusPreferenceController;
+
+/**
+ * Concrete subclass of IMS status preference controller
+ */
+public class ImsStatusPreferenceController extends AbstractImsStatusPreferenceController
+        implements PreferenceControllerMixin {
+    public ImsStatusPreferenceController(Context context,
+            Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java b/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java
new file mode 100644
index 0000000..f4e2f8c
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/IpAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractIpAddressPreferenceController;
+
+/**
+ * Concrete subclass of IP address preference controller
+ */
+public class IpAddressPreferenceController extends AbstractIpAddressPreferenceController implements
+        PreferenceControllerMixin {
+    public IpAddressPreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 228774f..080becc 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -16,115 +16,45 @@
 
 package com.android.settings.deviceinfo;
 
-import android.bluetooth.BluetoothAdapter;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.net.ConnectivityManager;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
 import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PersistableBundle;
-import android.os.SystemClock;
-import android.os.SystemProperties;
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.ArrayUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
+import com.android.settingslib.core.lifecycle.Lifecycle;
 
-import java.lang.ref.WeakReference;
 import java.util.Arrays;
 import java.util.List;
 
-import static android.content.Context.CONNECTIVITY_SERVICE;
-import static android.content.Context.WIFI_SERVICE;
-
+/**
+ * Fragment for showing device hardware info, such as MAC addresses and serial numbers
+ */
 public class Status extends SettingsPreferenceFragment implements Indexable {
 
     private static final String KEY_BATTERY_STATUS = "battery_status";
     private static final String KEY_BATTERY_LEVEL = "battery_level";
-    private static final String KEY_IP_ADDRESS = "wifi_ip_address";
-    private static final String KEY_WIFI_MAC_ADDRESS = "wifi_mac_address";
-    private static final String KEY_BT_ADDRESS = "bt_address";
-    private static final String KEY_WIMAX_MAC_ADDRESS = "wimax_mac_address";
     private static final String KEY_SIM_STATUS = "sim_status";
     private static final String KEY_IMEI_INFO = "imei_info";
-    private static final String KEY_IMS_REGISTRATION_STATE = "ims_reg_state";
-
-    // Broadcasts to listen to for connectivity changes.
-    private static final String[] CONNECTIVITY_INTENTS = {
-            BluetoothAdapter.ACTION_STATE_CHANGED,
-            ConnectivityManager.CONNECTIVITY_ACTION,
-            WifiManager.LINK_CONFIGURATION_CHANGED_ACTION,
-            WifiManager.NETWORK_STATE_CHANGED_ACTION,
-    };
-
-    private static final int EVENT_UPDATE_STATS = 500;
-
-    private static final int EVENT_UPDATE_CONNECTIVITY = 600;
-
-    private ConnectivityManager mCM;
-    private WifiManager mWifiManager;
-
-    private Resources mRes;
-
-    private String mUnavailable;
 
     private SerialNumberPreferenceController mSerialNumberPreferenceController;
-
-    private Preference mUptime;
+    private UptimePreferenceController mUptimePreferenceController;
     private Preference mBatteryStatus;
     private Preference mBatteryLevel;
-    private Preference mBtAddress;
-    private Preference mIpAddress;
-    private Preference mWifiMacAddress;
-    private Preference mWimaxMacAddress;
-    private Preference mImsStatus;
-
-    private Handler mHandler;
-
-    private static class MyHandler extends Handler {
-        private WeakReference<Status> mStatus;
-
-        public MyHandler(Status activity) {
-            mStatus = new WeakReference<Status>(activity);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            Status status = mStatus.get();
-            if (status == null) {
-                return;
-            }
-
-            switch (msg.what) {
-                case EVENT_UPDATE_STATS:
-                    status.updateTimes();
-                    sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000);
-                    break;
-
-                case EVENT_UPDATE_CONNECTIVITY:
-                    status.updateConnectivity();
-                    break;
-            }
-        }
-    }
+    private BluetoothAddressPreferenceController mBluetoothAddressPreferenceController;
+    private IpAddressPreferenceController mIpAddressPreferenceController;
+    private WifiMacAddressPreferenceController mWifiMacAddressPreferenceController;
+    private ImsStatusPreferenceController mImsStatusPreferenceController;
 
     private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
 
@@ -138,68 +68,33 @@
         }
     };
 
-    private IntentFilter mConnectivityIntentFilter;
-    private final BroadcastReceiver mConnectivityReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (ArrayUtils.contains(CONNECTIVITY_INTENTS, action)) {
-                mHandler.sendEmptyMessage(EVENT_UPDATE_CONNECTIVITY);
-            }
-        }
-    };
-
-    private boolean hasBluetooth() {
-        return BluetoothAdapter.getDefaultAdapter() != null;
-    }
-
-    private boolean hasWimax() {
-        return  mCM.getNetworkInfo(ConnectivityManager.TYPE_WIMAX) != null;
-    }
-
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
-        mHandler = new MyHandler(this);
-
-        mCM = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
-        mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
-        mSerialNumberPreferenceController = new SerialNumberPreferenceController(getActivity());
+        final Context context = getContext();
+        final Lifecycle lifecycle = getLifecycle();
+        mSerialNumberPreferenceController = new SerialNumberPreferenceController(context);
+        mUptimePreferenceController = new UptimePreferenceController(context, lifecycle);
+        mBluetoothAddressPreferenceController =
+                new BluetoothAddressPreferenceController(context, lifecycle);
+        mIpAddressPreferenceController = new IpAddressPreferenceController(context, lifecycle);
+        mWifiMacAddressPreferenceController =
+                new WifiMacAddressPreferenceController(context, lifecycle);
+        mImsStatusPreferenceController = new ImsStatusPreferenceController(context, lifecycle);
 
         addPreferencesFromResource(R.xml.device_info_status);
         mBatteryLevel = findPreference(KEY_BATTERY_LEVEL);
         mBatteryStatus = findPreference(KEY_BATTERY_STATUS);
-        mBtAddress = findPreference(KEY_BT_ADDRESS);
-        mWifiMacAddress = findPreference(KEY_WIFI_MAC_ADDRESS);
-        mWimaxMacAddress = findPreference(KEY_WIMAX_MAC_ADDRESS);
-        mIpAddress = findPreference(KEY_IP_ADDRESS);
-        mImsStatus = findPreference(KEY_IMS_REGISTRATION_STATE);
 
-        mRes = getResources();
-        mUnavailable = mRes.getString(R.string.status_unavailable);
-
-        // Note - missing in zaku build, be careful later...
-        mUptime = findPreference("up_time");
         final PreferenceScreen screen = getPreferenceScreen();
-        if (!hasBluetooth()) {
-            screen.removePreference(mBtAddress);
-            mBtAddress = null;
-        }
-
-        if (!hasWimax()) {
-            screen.removePreference(mWimaxMacAddress);
-            mWimaxMacAddress = null;
-        }
-
-        mConnectivityIntentFilter = new IntentFilter();
-        for (String intent: CONNECTIVITY_INTENTS) {
-             mConnectivityIntentFilter.addAction(intent);
-        }
-
-        updateConnectivity();
 
         mSerialNumberPreferenceController.displayPreference(screen);
+        mUptimePreferenceController.displayPreference(screen);
+        mBluetoothAddressPreferenceController.displayPreference(screen);
+        mIpAddressPreferenceController.displayPreference(screen);
+        mWifiMacAddressPreferenceController.displayPreference(screen);
+        mImsStatusPreferenceController.displayPreference(screen);
 
         // Remove SimStatus and Imei for Secondary user as it access Phone b/19165700
         // Also remove on Wi-Fi only devices.
@@ -219,11 +114,8 @@
     @Override
     public void onResume() {
         super.onResume();
-        getContext().registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter,
-                         android.Manifest.permission.CHANGE_NETWORK_STATE, null);
         getContext().registerReceiver(mBatteryInfoReceiver,
                 new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-        mHandler.sendEmptyMessage(EVENT_UPDATE_STATS);
     }
 
     @Override
@@ -231,8 +123,6 @@
         super.onPause();
 
         getContext().unregisterReceiver(mBatteryInfoReceiver);
-        getContext().unregisterReceiver(mConnectivityReceiver);
-        mHandler.removeMessages(EVENT_UPDATE_STATS);
     }
 
     /**
@@ -246,96 +136,6 @@
         }
     }
 
-    private void setWimaxStatus() {
-        if (mWimaxMacAddress != null) {
-            String macAddress = SystemProperties.get("net.wimax.mac.address", mUnavailable);
-            mWimaxMacAddress.setSummary(macAddress);
-        }
-    }
-
-    private void setWifiStatus() {
-        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
-        boolean hasMacAddress = wifiInfo != null && wifiInfo.hasRealMacAddress();
-        String macAddress = hasMacAddress ? wifiInfo.getMacAddress() : null;
-        mWifiMacAddress.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress : mUnavailable);
-    }
-
-    private void setIpAddressStatus() {
-        String ipAddress = Utils.getDefaultIpAddresses(this.mCM);
-        if (ipAddress != null) {
-            mIpAddress.setSummary(ipAddress);
-        } else {
-            mIpAddress.setSummary(mUnavailable);
-        }
-    }
-
-    private void setBtStatus() {
-        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
-        if (bluetooth != null && mBtAddress != null) {
-            String address = bluetooth.isEnabled() ? bluetooth.getAddress() : null;
-            if (!TextUtils.isEmpty(address)) {
-               // Convert the address to lowercase for consistency with the wifi MAC address.
-                mBtAddress.setSummary(address.toLowerCase());
-            } else {
-                mBtAddress.setSummary(mUnavailable);
-            }
-        }
-    }
-
-    private void setImsRegistrationStatus() {
-        CarrierConfigManager configManager = (CarrierConfigManager)
-                getSystemService(Context.CARRIER_CONFIG_SERVICE);
-        int subId = SubscriptionManager.getDefaultDataSubscriptionId();
-        PersistableBundle config = null;
-        if (configManager != null) {
-            config = configManager.getConfigForSubId(subId);
-        }
-        if (config != null && config.getBoolean(
-                CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL)) {
-            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
-            mImsStatus.setSummary((tm != null && tm.isImsRegistered(subId)) ?
-                    R.string.ims_reg_status_registered : R.string.ims_reg_status_not_registered);
-        } else {
-            removePreferenceFromScreen(KEY_IMS_REGISTRATION_STATE);
-            mImsStatus = null;
-        }
-    }
-
-    void updateConnectivity() {
-        setWimaxStatus();
-        setWifiStatus();
-        setBtStatus();
-        setIpAddressStatus();
-        setImsRegistrationStatus();
-    }
-
-    void updateTimes() {
-        long at = SystemClock.uptimeMillis() / 1000;
-        long ut = SystemClock.elapsedRealtime() / 1000;
-
-        if (ut == 0) {
-            ut = 1;
-        }
-
-        mUptime.setSummary(convert(ut));
-    }
-
-    private String pad(int n) {
-        if (n >= 10) {
-            return String.valueOf(n);
-        } else {
-            return "0" + String.valueOf(n);
-        }
-    }
-
-    private String convert(long t) {
-        int s = (int)(t % 60);
-        int m = (int)((t / 60) % 60);
-        int h = (int)((t / 3600));
-
-        return h + ":" + pad(m) + ":" + pad(s);
-    }
-
     /**
      * For Search.
      */
diff --git a/src/com/android/settings/deviceinfo/UptimePreferenceController.java b/src/com/android/settings/deviceinfo/UptimePreferenceController.java
new file mode 100644
index 0000000..8bb0df7
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/UptimePreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractUptimePreferenceController;
+
+/**
+ * Concrete subclass of uptime preference controller
+ */
+public class UptimePreferenceController extends AbstractUptimePreferenceController
+        implements PreferenceControllerMixin {
+    public UptimePreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
diff --git a/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java b/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
new file mode 100644
index 0000000..92390d7
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractWifiMacAddressPreferenceController;
+
+/**
+ * Concrete subclass of WIFI MAC address preference controller
+ */
+public class WifiMacAddressPreferenceController extends AbstractWifiMacAddressPreferenceController
+        implements PreferenceControllerMixin {
+    public WifiMacAddressPreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}