1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport android.app.Activity;
20caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackbornimport android.content.Context;
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Build;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
249d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajanimport android.os.PersistableBundle;
25b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalleyimport android.os.SELinux;
264749fcf762de0e34ac28f927501d42555062c521Dianne Hackbornimport android.os.SystemClock;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemProperties;
28ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport android.os.UserHandle;
296c088cb221bb43d47be065387231ffa7192ff211Julia Reynoldsimport android.os.UserManager;
30b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport android.provider.SearchIndexableResource;
313daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkeyimport android.provider.Settings;
3239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
3339b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceGroup;
349d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajanimport android.telephony.CarrierConfigManager;
35b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.text.TextUtils;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
37caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackbornimport android.widget.Toast;
38ffe701dc0e52ee95bf6c54291ed1b574d389019cChristopher Tate
399d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
409d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport com.android.settings.dashboard.SummaryLoader;
41b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport com.android.settings.search.BaseSearchIndexProvider;
422ec78636f75964a48be5e95fe9b7e71f2270f917Fabrice Di Meglioimport com.android.settings.search.Index;
43b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport com.android.settings.search.Indexable;
444559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantlerimport com.android.settingslib.DeviceInfoUtils;
45ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
47b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport java.util.ArrayList;
48b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport java.util.Arrays;
49b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport java.util.List;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
51ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
52ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka
53b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Megliopublic class DeviceInfoSettings extends SettingsPreferenceFragment implements Indexable {
54c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani
55362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne    private static final String LOG_TAG = "DeviceInfoSettings";
562397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani
575adcb3d353b066a056b86ae66946a06a251ff1fbZachary Kuznia    private static final String KEY_MANUAL = "manual";
58a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu    private static final String KEY_REGULATORY_INFO = "regulatory_info";
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings";
60a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville    private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal";
61b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley    private static final String PROPERTY_SELINUX_STATUS = "ro.build.selinux";
62c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani    private static final String KEY_KERNEL_VERSION = "kernel_version";
63c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani    private static final String KEY_BUILD_NUMBER = "build_number";
64c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani    private static final String KEY_DEVICE_MODEL = "device_model";
65b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley    private static final String KEY_SELINUX_STATUS = "selinux_status";
66c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani    private static final String KEY_BASEBAND_VERSION = "baseband_version";
67c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani    private static final String KEY_FIRMWARE_VERSION = "firmware_version";
68b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn    private static final String KEY_SECURITY_PATCH = "security_patch";
693feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu    private static final String KEY_UPDATE_SETTING = "additional_system_update_settings";
70b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang    private static final String KEY_EQUIPMENT_ID = "fcc_equipment_id";
71b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang    private static final String PROPERTY_EQUIPMENT_ID = "ro.ril.fccid";
72b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan    private static final String KEY_DEVICE_FEEDBACK = "device_feedback";
73b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio    private static final String KEY_SAFETY_LEGAL = "safetylegal";
742fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
75d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn    static final int TAPS_TO_BE_A_DEVELOPER = 7;
76d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn
774749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn    long[] mHits = new long[3];
78caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn    int mDevHitCountdown;
79caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn    Toast mDevHitToast;
802fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
8144879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen    private UserManager mUm;
8244879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen
83ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka    private EnforcedAdmin mFunDisallowedAdmin;
849e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka    private boolean mFunDisallowedBySystem;
85ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka    private EnforcedAdmin mDebuggingFeaturesDisallowedAdmin;
869e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka    private boolean mDebuggingFeaturesDisallowedBySystem;
87ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
898a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
909d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.DEVICEINFO;
918a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
928a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
938a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
9423acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk    protected int getHelpResource() {
9523acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk        return R.string.help_uri_about;
9623acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk    }
9723acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk
9823acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk    @Override
99d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
10144879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen        mUm = UserManager.get(getActivity());
1022fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.device_info_settings);
1042fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
105c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        setStringSummary(KEY_FIRMWARE_VERSION, Build.VERSION.RELEASE);
106c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        findPreference(KEY_FIRMWARE_VERSION).setEnabled(true);
1074559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler
1084559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        final String patch = DeviceInfoUtils.getSecurityPatch();
1093cf07c849bcc65958acc2361d2dbc4492fe70f24Tony Mantler        if (!TextUtils.isEmpty(patch)) {
110b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn            setStringSummary(KEY_SECURITY_PATCH, patch);
111b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn        } else {
112b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn            getPreferenceScreen().removePreference(findPreference(KEY_SECURITY_PATCH));
113b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn        }
1144559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler
115c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        setValueSummary(KEY_BASEBAND_VERSION, "gsm.version.baseband");
1164559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        setStringSummary(KEY_DEVICE_MODEL, Build.MODEL + DeviceInfoUtils.getMsvSuffix());
117b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang        setValueSummary(KEY_EQUIPMENT_ID, PROPERTY_EQUIPMENT_ID);
118b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang        setStringSummary(KEY_DEVICE_MODEL, Build.MODEL);
119c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        setStringSummary(KEY_BUILD_NUMBER, Build.DISPLAY);
120caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn        findPreference(KEY_BUILD_NUMBER).setEnabled(true);
1214559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        findPreference(KEY_KERNEL_VERSION).setSummary(DeviceInfoUtils.getFormattedKernelVersion());
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
123b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        if (!SELinux.isSELinuxEnabled()) {
124b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley            String status = getResources().getString(R.string.selinux_status_disabled);
125b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley            setStringSummary(KEY_SELINUX_STATUS, status);
126b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        } else if (!SELinux.isSELinuxEnforced()) {
127b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley            String status = getResources().getString(R.string.selinux_status_permissive);
128b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley            setStringSummary(KEY_SELINUX_STATUS, status);
129b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        }
130b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley
131b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        // Remove selinux information if property is not present
132b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_SELINUX_STATUS,
133b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley                PROPERTY_SELINUX_STATUS);
134b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley
135a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville        // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set
136b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio        removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_SAFETY_LEGAL,
137a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville                PROPERTY_URL_SAFETYLEGAL);
138a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville
139b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang        // Remove Equipment id preference if FCC ID is not set by RIL
140b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang        removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_EQUIPMENT_ID,
141b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang                PROPERTY_EQUIPMENT_ID);
142b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang
143c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        // Remove Baseband version if wifi-only device
1448af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt        if (Utils.isWifiOnly(getActivity())) {
145c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            getPreferenceScreen().removePreference(findPreference(KEY_BASEBAND_VERSION));
146c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        }
147c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani
148b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        // Dont show feedback option if there is no reporter.
1494559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        if (TextUtils.isEmpty(DeviceInfoUtils.getFeedbackReporterPackage(getActivity()))) {
150b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan            getPreferenceScreen().removePreference(findPreference(KEY_DEVICE_FEEDBACK));
151b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        }
152b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        /*
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         * Settings is a generic app and should not contain any device-specific
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         * info.
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         */
157d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        final Activity act = getActivity();
1582fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // These are contained by the root preference screen
160f94023216accd128b06acdc50950e455a60a9c4eJason Monk        PreferenceGroup parentPreference = getPreferenceScreen();
16144879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen
16244879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen        if (mUm.isAdminUser()) {
1639627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani            Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference,
1649627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                    KEY_SYSTEM_UPDATE_SETTINGS,
1659627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani                    Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
1669627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        } else {
1679627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani            // Remove for secondary users
1689627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani            removePreference(KEY_SYSTEM_UPDATE_SETTINGS);
1699627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani        }
1703feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu
1713feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu        // Read platform settings for additional system update setting
172a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu        removePreferenceIfBoolFalse(KEY_UPDATE_SETTING,
173a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu                R.bool.config_additional_system_update_setting_enable);
174a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu
1755adcb3d353b066a056b86ae66946a06a251ff1fbZachary Kuznia        // Remove manual entry if none present.
1765adcb3d353b066a056b86ae66946a06a251ff1fbZachary Kuznia        removePreferenceIfBoolFalse(KEY_MANUAL, R.bool.config_show_manual);
1775adcb3d353b066a056b86ae66946a06a251ff1fbZachary Kuznia
1781fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        // Remove regulatory labels if no activity present to handle intent.
1791fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        removePreferenceIfActivityMissing(
1801fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein                KEY_REGULATORY_INFO, Settings.ACTION_SHOW_REGULATORY_INFO);
1811fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein
1821fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        removePreferenceIfActivityMissing(
1831fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein                "safety_info", "android.settings.SHOW_SAFETY_AND_REGULATORY_INFO");
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1852fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
1863673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn    @Override
187caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn    public void onResume() {
188caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn        super.onResume();
189caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn        mDevHitCountdown = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
190caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW,
191d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn                        android.os.Build.TYPE.equals("eng")) ? -1 : TAPS_TO_BE_A_DEVELOPER;
192caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn        mDevHitToast = null;
193ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka        mFunDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(
194ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka                getActivity(), UserManager.DISALLOW_FUN, UserHandle.myUserId());
1959e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka        mFunDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(
1969e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                getActivity(), UserManager.DISALLOW_FUN, UserHandle.myUserId());
197ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka        mDebuggingFeaturesDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(
198ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka                getActivity(), UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
1999e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka        mDebuggingFeaturesDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(
2009e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                getActivity(), UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
201caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn    }
202caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn
203caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn    @Override
20439b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public boolean onPreferenceTreeClick(Preference preference) {
205c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        if (preference.getKey().equals(KEY_FIRMWARE_VERSION)) {
2064749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn            System.arraycopy(mHits, 1, mHits, 0, mHits.length-1);
2074749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn            mHits[mHits.length-1] = SystemClock.uptimeMillis();
2084749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn            if (mHits[0] >= (SystemClock.uptimeMillis()-500)) {
2099e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                if (mUm.hasUserRestriction(UserManager.DISALLOW_FUN)) {
2109e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                    if (mFunDisallowedAdmin != null && !mFunDisallowedBySystem) {
2119e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                        RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(),
2129e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                                mFunDisallowedAdmin);
2139e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                    }
2149a5550e9e6efe211b03d067eae2689f6ef5eb2d1Jeff Sharkey                    Log.d(LOG_TAG, "Sorry, no fun for you!");
2159a5550e9e6efe211b03d067eae2689f6ef5eb2d1Jeff Sharkey                    return false;
2169a5550e9e6efe211b03d067eae2689f6ef5eb2d1Jeff Sharkey                }
2179a5550e9e6efe211b03d067eae2689f6ef5eb2d1Jeff Sharkey
2184749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                Intent intent = new Intent(Intent.ACTION_MAIN);
2194749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                intent.setClassName("android",
2204749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                        com.android.internal.app.PlatLogoActivity.class.getName());
2214749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                try {
2224749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                    startActivity(intent);
2234749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                } catch (Exception e) {
224362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne                    Log.e(LOG_TAG, "Unable to start activity " + intent.toString());
2254749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                }
2263673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn            }
227caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn        } else if (preference.getKey().equals(KEY_BUILD_NUMBER)) {
228b02b26e3cb4a8a3aa7b3dd718fbc2cc7c6ac8016Amith Yamasani            // Don't enable developer options for secondary users.
22944879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen            if (!mUm.isAdminUser()) return true;
230b02b26e3cb4a8a3aa7b3dd718fbc2cc7c6ac8016Amith Yamasani
2314836ab6df4d4e82f6b2839b6b9faf3e794d66d5fRussell Brenner            // Don't enable developer options until device has been provisioned
232679f7ad07e4e2a4b4c6645d05bca92790394c2fdUdam Saini            if (!Utils.isDeviceProvisioned(getActivity())) {
2334836ab6df4d4e82f6b2839b6b9faf3e794d66d5fRussell Brenner                return true;
2344836ab6df4d4e82f6b2839b6b9faf3e794d66d5fRussell Brenner            }
2354836ab6df4d4e82f6b2839b6b9faf3e794d66d5fRussell Brenner
2369e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka            if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
2379e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                if (mDebuggingFeaturesDisallowedAdmin != null &&
2389e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                        !mDebuggingFeaturesDisallowedBySystem) {
2399e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                    RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(),
2409e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                            mDebuggingFeaturesDisallowedAdmin);
2419e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                }
242ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka                return true;
243ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka            }
2446c088cb221bb43d47be065387231ffa7192ff211Julia Reynolds
245caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn            if (mDevHitCountdown > 0) {
246caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                mDevHitCountdown--;
247caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                if (mDevHitCountdown == 0) {
248caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
249caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                            Context.MODE_PRIVATE).edit().putBoolean(
250caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                                    DevelopmentSettings.PREF_SHOW, true).apply();
251caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    if (mDevHitToast != null) {
252caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                        mDevHitToast.cancel();
253caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    }
254caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_on,
255caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                            Toast.LENGTH_LONG);
256caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    mDevHitToast.show();
2572ec78636f75964a48be5e95fe9b7e71f2270f917Fabrice Di Meglio                    // This is good time to index the Developer Options
2582ec78636f75964a48be5e95fe9b7e71f2270f917Fabrice Di Meglio                    Index.getInstance(
2592ec78636f75964a48be5e95fe9b7e71f2270f917Fabrice Di Meglio                            getActivity().getApplicationContext()).updateFromClassNameResource(
2602ec78636f75964a48be5e95fe9b7e71f2270f917Fabrice Di Meglio                                    DevelopmentSettings.class.getName(), true, true);
2612ec78636f75964a48be5e95fe9b7e71f2270f917Fabrice Di Meglio
262d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn                } else if (mDevHitCountdown > 0
263d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn                        && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER-2)) {
264caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    if (mDevHitToast != null) {
265caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                        mDevHitToast.cancel();
266caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    }
267673130bbf8017cf0e082dc65a24609290da4daa4Evan Charlton                    mDevHitToast = Toast.makeText(getActivity(), getResources().getQuantityString(
268673130bbf8017cf0e082dc65a24609290da4daa4Evan Charlton                            R.plurals.show_dev_countdown, mDevHitCountdown, mDevHitCountdown),
269caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                            Toast.LENGTH_SHORT);
270caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    mDevHitToast.show();
271caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                }
272caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn            } else if (mDevHitCountdown < 0) {
273caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                if (mDevHitToast != null) {
274caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                    mDevHitToast.cancel();
275caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                }
276caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_already,
277caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                        Toast.LENGTH_LONG);
278caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn                mDevHitToast.show();
279caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn            }
280013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei        } else if (preference.getKey().equals(KEY_SECURITY_PATCH)) {
281013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei            if (getPackageManager().queryIntentActivities(preference.getIntent(), 0).isEmpty()) {
282013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei                // Don't send out the intent to stop crash
283013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei                Log.w(LOG_TAG, "Stop click action on " + KEY_SECURITY_PATCH + ": "
284013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei                        + "queryIntentActivities() returns empty" );
285013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei                return true;
286013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei            }
287b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        } else if (preference.getKey().equals(KEY_DEVICE_FEEDBACK)) {
288b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan            sendFeedback();
2899d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan        } else if(preference.getKey().equals(KEY_SYSTEM_UPDATE_SETTINGS)) {
2909d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            CarrierConfigManager configManager =
2919d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan                    (CarrierConfigManager) getSystemService(Context.CARRIER_CONFIG_SERVICE);
2929d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            PersistableBundle b = configManager.getConfig();
293934a400ddce71f873c2de2564fb51981d57128e2Jason Monk            if (b != null && b.getBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL)) {
2949d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan                ciActionOnSysUpdate(b);
2959d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            }
2963673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn        }
29739b467482d1bf256a111c757e9b7621c6f523271Jason Monk        return super.onPreferenceTreeClick(preference);
2983673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn    }
299a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville
3009d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan    /**
3019d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan     * Trigger client initiated action (send intent) on system update
3029d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan     */
3039d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan    private void ciActionOnSysUpdate(PersistableBundle b) {
3049d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan        String intentStr = b.getString(CarrierConfigManager.
3059d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan                KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING);
3069d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan        if (!TextUtils.isEmpty(intentStr)) {
3079d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            String extra = b.getString(CarrierConfigManager.
3089d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan                    KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING);
3099d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            String extraVal = b.getString(CarrierConfigManager.
3109d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan                    KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING);
3119d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan
3129d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            Intent intent = new Intent(intentStr);
3139d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            if (!TextUtils.isEmpty(extra)) {
3149d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan                intent.putExtra(extra, extraVal);
3159d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            }
3169d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            Log.d(LOG_TAG, "ciActionOnSysUpdate: broadcasting intent " + intentStr +
3179d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan                    " with extra " + extra + ", " + extraVal);
3189d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan            getActivity().getApplicationContext().sendBroadcast(intent);
3199d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan        }
3209d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan    }
3219d4b5486198a16053e5fdeba6b34268104faead2Amit Mahajan
322a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville    private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup,
323a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            String preference, String property ) {
324a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu        if (SystemProperties.get(property).equals("")) {
325a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            // Property is missing so remove preference from group
326a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            try {
327a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville                preferenceGroup.removePreference(findPreference(preference));
328a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            } catch (RuntimeException e) {
329362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne                Log.d(LOG_TAG, "Property '" + property + "' missing and no '"
330a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville                        + preference + "' preference");
331a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            }
332a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville        }
333a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville    }
334a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville
3351fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein    private void removePreferenceIfActivityMissing(String preferenceKey, String action) {
3361fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        final Intent intent = new Intent(action);
3371fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        if (getPackageManager().queryIntentActivities(intent, 0).isEmpty()) {
3381fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein            Preference pref = findPreference(preferenceKey);
3391fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein            if (pref != null) {
3401fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein                getPreferenceScreen().removePreference(pref);
3411fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein            }
3421fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        }
3431fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein    }
3441fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein
345a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu    private void removePreferenceIfBoolFalse(String preference, int resId) {
346a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu        if (!getResources().getBoolean(resId)) {
347185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu            Preference pref = findPreference(preference);
348185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu            if (pref != null) {
349185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu                getPreferenceScreen().removePreference(pref);
350185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu            }
351a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu        }
352a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu    }
353a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu
354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setStringSummary(String preference, String value) {
355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            findPreference(preference).setSummary(value);
357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (RuntimeException e) {
358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            findPreference(preference).setSummary(
359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                getResources().getString(R.string.device_info_default));
360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
3622fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setValueSummary(String preference, String property) {
364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            findPreference(preference).setSummary(
3662fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng                    SystemProperties.get(property,
367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                            getResources().getString(R.string.device_info_default)));
368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (RuntimeException e) {
369362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne            // No recovery
370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
373b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan    private void sendFeedback() {
3744559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        String reporterPackage = DeviceInfoUtils.getFeedbackReporterPackage(getActivity());
375b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        if (TextUtils.isEmpty(reporterPackage)) {
376b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan            return;
377b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        }
378b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
379b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        intent.setPackage(reporterPackage);
380b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        startActivityForResult(intent, 0);
381b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan    }
382b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan
3839d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
3849d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3859d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        private final Context mContext;
3869d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        private final SummaryLoader mSummaryLoader;
3879d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3889d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
3899d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            mContext = context;
3909d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            mSummaryLoader = summaryLoader;
3919d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
3929d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3939d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        @Override
3949d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public void setListening(boolean listening) {
3959d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            if (listening) {
396fd4f729e1fb40372d218cf6385c2c7db478f80bdFan Zhang                mSummaryLoader.setSummary(this, mContext.getString(R.string.about_summary,
397fd4f729e1fb40372d218cf6385c2c7db478f80bdFan Zhang                        Build.VERSION.RELEASE));
3989d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            }
3999d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
4009d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    }
4019d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
4029d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
4039d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            = new SummaryLoader.SummaryProviderFactory() {
4049d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        @Override
4059d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
4069d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                                                                   SummaryLoader summaryLoader) {
4079d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            return new SummaryProvider(activity, summaryLoader);
4089d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
4099d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    };
4109d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
4112397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani    /**
412b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio     * For Search.
413b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio     */
414b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
415b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio        new BaseSearchIndexProvider() {
416b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio
417b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            @Override
418b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            public List<SearchIndexableResource> getXmlResourcesToIndex(
419b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    Context context, boolean enabled) {
420b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                final SearchIndexableResource sir = new SearchIndexableResource(context);
421b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                sir.xmlResId = R.xml.device_info_settings;
422b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                return Arrays.asList(sir);
423b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            }
424b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio
425b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            @Override
426b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            public List<String> getNonIndexableKeys(Context context) {
427b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                final List<String> keys = new ArrayList<String>();
428b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (isPropertyMissing(PROPERTY_SELINUX_STATUS)) {
429b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_SELINUX_STATUS);
430b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
431b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (isPropertyMissing(PROPERTY_URL_SAFETYLEGAL)) {
432b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_SAFETY_LEGAL);
433b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
434b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (isPropertyMissing(PROPERTY_EQUIPMENT_ID)) {
435b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_EQUIPMENT_ID);
436b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
437b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                // Remove Baseband version if wifi-only device
438b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (Utils.isWifiOnly(context)) {
439b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add((KEY_BASEBAND_VERSION));
440b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
441b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                // Dont show feedback option if there is no reporter.
4424559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler                if (TextUtils.isEmpty(DeviceInfoUtils.getFeedbackReporterPackage(context))) {
443b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_DEVICE_FEEDBACK);
444b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
44544879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen                final UserManager um = UserManager.get(context);
44644879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen                // TODO: system update needs to be fixed for non-owner user b/22760654
44744879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen                if (!um.isAdminUser()) {
448b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_SYSTEM_UPDATE_SETTINGS);
449b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
450b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (!context.getResources().getBoolean(
451b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                        R.bool.config_additional_system_update_setting_enable)) {
452b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_UPDATE_SETTING);
453b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
454b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                return keys;
455b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            }
456b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio
457b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            private boolean isPropertyMissing(String property) {
458b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                return SystemProperties.get(property).equals("");
459b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            }
460b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio        };
461b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio
462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
463