1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.deviceinfo.aboutphone; 18 19 import android.app.Activity; 20 import android.app.settings.SettingsEnums; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.content.pm.UserInfo; 24 import android.os.Bundle; 25 import android.os.UserManager; 26 import android.view.View; 27 28 import androidx.annotation.NonNull; 29 import androidx.annotation.Nullable; 30 31 import com.android.settings.R; 32 import com.android.settings.Utils; 33 import com.android.settings.dashboard.DashboardFragment; 34 import com.android.settings.deviceinfo.BluetoothAddressPreferenceController; 35 import com.android.settings.deviceinfo.BuildNumberPreferenceController; 36 import com.android.settings.deviceinfo.DeviceNamePreferenceController; 37 import com.android.settings.deviceinfo.FccEquipmentIdPreferenceController; 38 import com.android.settings.deviceinfo.FeedbackPreferenceController; 39 import com.android.settings.deviceinfo.IpAddressPreferenceController; 40 import com.android.settings.deviceinfo.ManualPreferenceController; 41 import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController; 42 import com.android.settings.deviceinfo.SafetyInfoPreferenceController; 43 import com.android.settings.deviceinfo.UptimePreferenceController; 44 import com.android.settings.deviceinfo.WifiMacAddressPreferenceController; 45 import com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController; 46 import com.android.settings.deviceinfo.simstatus.EidStatus; 47 import com.android.settings.deviceinfo.simstatus.SimEidPreferenceController; 48 import com.android.settings.deviceinfo.simstatus.SimStatusPreferenceController; 49 import com.android.settings.deviceinfo.simstatus.SlotSimStatus; 50 import com.android.settings.search.BaseSearchIndexProvider; 51 import com.android.settings.widget.EntityHeaderController; 52 import com.android.settingslib.core.AbstractPreferenceController; 53 import com.android.settingslib.core.lifecycle.Lifecycle; 54 import com.android.settingslib.search.SearchIndexable; 55 import com.android.settingslib.widget.LayoutPreference; 56 57 import java.util.ArrayList; 58 import java.util.List; 59 import java.util.concurrent.ExecutorService; 60 import java.util.concurrent.Executors; 61 import java.util.function.Consumer; 62 63 @SearchIndexable 64 public class MyDeviceInfoFragment extends DashboardFragment 65 implements DeviceNamePreferenceController.DeviceNamePreferenceHost { 66 67 private static final String LOG_TAG = "MyDeviceInfoFragment"; 68 private static final String KEY_EID_INFO = "eid_info"; 69 private static final String KEY_MY_DEVICE_INFO_HEADER = "my_device_info_header"; 70 71 private BuildNumberPreferenceController mBuildNumberPreferenceController; 72 73 @Override getMetricsCategory()74 public int getMetricsCategory() { 75 return SettingsEnums.DEVICEINFO; 76 } 77 78 @Override getHelpResource()79 public int getHelpResource() { 80 return R.string.help_uri_about; 81 } 82 83 @Override onAttach(Context context)84 public void onAttach(Context context) { 85 super.onAttach(context); 86 use(DeviceNamePreferenceController.class).setHost(this /* parent */); 87 mBuildNumberPreferenceController = use(BuildNumberPreferenceController.class); 88 mBuildNumberPreferenceController.setHost(this /* parent */); 89 } 90 91 @Override onStart()92 public void onStart() { 93 super.onStart(); 94 initHeader(); 95 } 96 97 @Override getLogTag()98 protected String getLogTag() { 99 return LOG_TAG; 100 } 101 102 @Override getPreferenceScreenResId()103 protected int getPreferenceScreenResId() { 104 return R.xml.my_device_info; 105 } 106 107 @Override createPreferenceControllers(Context context)108 protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { 109 return buildPreferenceControllers(context, this /* fragment */, getSettingsLifecycle()); 110 } 111 buildPreferenceControllers( Context context, MyDeviceInfoFragment fragment, Lifecycle lifecycle)112 private static List<AbstractPreferenceController> buildPreferenceControllers( 113 Context context, MyDeviceInfoFragment fragment, Lifecycle lifecycle) { 114 final List<AbstractPreferenceController> controllers = new ArrayList<>(); 115 116 final ExecutorService executor = (fragment == null) ? null : 117 Executors.newSingleThreadExecutor(); 118 androidx.lifecycle.Lifecycle lifecycleObject = (fragment == null) ? null : 119 fragment.getLifecycle(); 120 final SlotSimStatus slotSimStatus = new SlotSimStatus(context, executor, lifecycleObject); 121 122 controllers.add(new IpAddressPreferenceController(context, lifecycle)); 123 controllers.add(new WifiMacAddressPreferenceController(context, lifecycle)); 124 controllers.add(new BluetoothAddressPreferenceController(context, lifecycle)); 125 controllers.add(new RegulatoryInfoPreferenceController(context)); 126 controllers.add(new SafetyInfoPreferenceController(context)); 127 controllers.add(new ManualPreferenceController(context)); 128 controllers.add(new FeedbackPreferenceController(fragment, context)); 129 controllers.add(new FccEquipmentIdPreferenceController(context)); 130 controllers.add(new UptimePreferenceController(context, lifecycle)); 131 132 Consumer<String> imeiInfoList = imeiKey -> { 133 ImeiInfoPreferenceController imeiRecord = 134 new ImeiInfoPreferenceController(context, imeiKey); 135 imeiRecord.init(fragment, slotSimStatus); 136 controllers.add(imeiRecord); 137 }; 138 139 if (fragment != null) { 140 imeiInfoList.accept(ImeiInfoPreferenceController.DEFAULT_KEY); 141 } 142 143 for (int slotIndex = 0; slotIndex < slotSimStatus.size(); slotIndex ++) { 144 SimStatusPreferenceController slotRecord = 145 new SimStatusPreferenceController(context, 146 slotSimStatus.getPreferenceKey(slotIndex)); 147 slotRecord.init(fragment, slotSimStatus); 148 controllers.add(slotRecord); 149 150 if (fragment != null) { 151 imeiInfoList.accept(ImeiInfoPreferenceController.DEFAULT_KEY + (1 + slotIndex)); 152 } 153 } 154 155 EidStatus eidStatus = new EidStatus(slotSimStatus, context, executor); 156 SimEidPreferenceController simEid = new SimEidPreferenceController(context, KEY_EID_INFO); 157 simEid.init(slotSimStatus, eidStatus); 158 controllers.add(simEid); 159 160 if (executor != null) { 161 executor.shutdown(); 162 } 163 return controllers; 164 } 165 166 @Override onActivityResult(int requestCode, int resultCode, Intent data)167 public void onActivityResult(int requestCode, int resultCode, Intent data) { 168 if (mBuildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) { 169 return; 170 } 171 super.onActivityResult(requestCode, resultCode, data); 172 } 173 initHeader()174 private void initHeader() { 175 // TODO: Migrate into its own controller. 176 final LayoutPreference headerPreference = 177 getPreferenceScreen().findPreference(KEY_MY_DEVICE_INFO_HEADER); 178 final boolean shouldDisplayHeader = getContext().getResources().getBoolean( 179 R.bool.config_show_device_header_in_device_info); 180 headerPreference.setVisible(shouldDisplayHeader); 181 if (!shouldDisplayHeader) { 182 return; 183 } 184 final View headerView = headerPreference.findViewById(R.id.entity_header); 185 final Activity context = getActivity(); 186 final Bundle bundle = getArguments(); 187 final EntityHeaderController controller = EntityHeaderController 188 .newInstance(context, this, headerView) 189 .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE, 190 EntityHeaderController.ActionType.ACTION_NONE); 191 192 // TODO: There may be an avatar setting action we can use here. 193 final int iconId = bundle.getInt("icon_id", 0); 194 if (iconId == 0) { 195 final UserManager userManager = (UserManager) getActivity().getSystemService( 196 Context.USER_SERVICE); 197 final UserInfo info = Utils.getExistingUser(userManager, 198 android.os.Process.myUserHandle()); 199 controller.setLabel(info.name); 200 controller.setIcon( 201 com.android.settingslib.Utils.getUserIcon(getActivity(), userManager, info)); 202 } 203 204 controller.done(true /* rebindActions */); 205 } 206 207 @Override showDeviceNameWarningDialog(String deviceName)208 public void showDeviceNameWarningDialog(String deviceName) { 209 DeviceNameWarningDialog.show(this); 210 } 211 onSetDeviceNameConfirm(boolean confirm)212 public void onSetDeviceNameConfirm(boolean confirm) { 213 final DeviceNamePreferenceController controller = use(DeviceNamePreferenceController.class); 214 controller.updateDeviceName(confirm); 215 } 216 217 @Override getPreferenceScreenBindingKey(@onNull Context context)218 public @Nullable String getPreferenceScreenBindingKey(@NonNull Context context) { 219 return MyDeviceInfoScreen.KEY; 220 } 221 222 /** 223 * For Search. 224 */ 225 public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 226 new BaseSearchIndexProvider(R.xml.my_device_info) { 227 228 @Override 229 public List<AbstractPreferenceController> createPreferenceControllers( 230 Context context) { 231 return buildPreferenceControllers(context, null /* fragment */, 232 null /* lifecycle */); 233 } 234 }; 235 } 236