• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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