DeviceInfoSettings.java revision c62e2f033d945b8bc576f87bc5aaaba37e2afc87
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;
24b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalleyimport android.os.SELinux;
254749fcf762de0e34ac28f927501d42555062c521Dianne Hackbornimport android.os.SystemClock;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemProperties;
27ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport android.os.UserHandle;
286c088cb221bb43d47be065387231ffa7192ff211Julia Reynoldsimport android.os.UserManager;
29b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport android.provider.SearchIndexableResource;
303daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkeyimport android.provider.Settings;
3139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
3239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceGroup;
33b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.text.TextUtils;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
35ffe701dc0e52ee95bf6c54291ed1b574d389019cChristopher Tate
36265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
37c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhangimport com.android.settings.core.PreferenceController;
38c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhangimport com.android.settings.dashboard.DashboardFragment;
399d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport com.android.settings.dashboard.SummaryLoader;
4066b573ad5ac6782b0e65b3dd98037eae01b527e5Fan Zhangimport com.android.settings.deviceinfo.AdditionalSystemUpdatePreferenceController;
413aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhangimport com.android.settings.deviceinfo.BuildNumberPreferenceController;
42c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhangimport com.android.settings.deviceinfo.ManualPreferenceController;
439c1fcf9916857df1cb831428251eecece70b0c30Fan Zhangimport com.android.settings.deviceinfo.SystemUpdatePreferenceController;
44b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport com.android.settings.search.BaseSearchIndexProvider;
45b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport com.android.settings.search.Indexable;
464559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantlerimport com.android.settingslib.DeviceInfoUtils;
47ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
49b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport java.util.ArrayList;
50b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglioimport java.util.Arrays;
51b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport java.util.List;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
53ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
54ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka
55c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhangpublic class DeviceInfoSettings extends DashboardFragment implements Indexable {
56c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani
57362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne    private static final String LOG_TAG = "DeviceInfoSettings";
582397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani
59a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu    private static final String KEY_REGULATORY_INFO = "regulatory_info";
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_DEVICE_MODEL = "device_model";
64b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley    private static final String KEY_SELINUX_STATUS = "selinux_status";
65c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani    private static final String KEY_BASEBAND_VERSION = "baseband_version";
66c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani    private static final String KEY_FIRMWARE_VERSION = "firmware_version";
67b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn    private static final String KEY_SECURITY_PATCH = "security_patch";
68b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang    private static final String KEY_EQUIPMENT_ID = "fcc_equipment_id";
69b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang    private static final String PROPERTY_EQUIPMENT_ID = "ro.ril.fccid";
70b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan    private static final String KEY_DEVICE_FEEDBACK = "device_feedback";
71b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio    private static final String KEY_SAFETY_LEGAL = "safetylegal";
722fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
73d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn
744749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn    long[] mHits = new long[3];
753aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang    private BuildNumberPreferenceController mBuildNumberPreferenceController;
762fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
7744879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen    private UserManager mUm;
7844879a387a6be6b93cdcc8894227d68af7dbbb1aXiaohui Chen
79ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka    private EnforcedAdmin mFunDisallowedAdmin;
809e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka    private boolean mFunDisallowedBySystem;
81ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
836507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang    public int getMetricsCategory() {
849d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.DEVICEINFO;
858a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
868a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
878a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
8823acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk    protected int getHelpResource() {
8923acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk        return R.string.help_uri_about;
9023acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk    }
9123acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk
9223acc2bb8af7da000d72a8c1d8c28a2792200348Jason Monk    @Override
93c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    public void onAttach(Context context) {
94c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        super.onAttach(context);
95c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
96c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    }
97c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang
98c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    @Override
993aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang    public void onActivityResult(int requestCode, int resultCode, Intent data) {
1003aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang        if (mBuildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
1013aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang            return;
1023aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang        }
1033aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang        super.onActivityResult(requestCode, resultCode, data);
1043aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang    }
1053aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang
1063aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang    @Override
107d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
1092fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
110c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        setStringSummary(KEY_FIRMWARE_VERSION, Build.VERSION.RELEASE);
111c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        findPreference(KEY_FIRMWARE_VERSION).setEnabled(true);
1124559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler
1134559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        final String patch = DeviceInfoUtils.getSecurityPatch();
1143cf07c849bcc65958acc2361d2dbc4492fe70f24Tony Mantler        if (!TextUtils.isEmpty(patch)) {
115b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn            setStringSummary(KEY_SECURITY_PATCH, patch);
116b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn        } else {
117b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn            getPreferenceScreen().removePreference(findPreference(KEY_SECURITY_PATCH));
118b9a8e277d94827a16e7366d60914de34533b23a6Dianne Hackborn        }
1194559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler
120c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        setValueSummary(KEY_BASEBAND_VERSION, "gsm.version.baseband");
1214559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        setStringSummary(KEY_DEVICE_MODEL, Build.MODEL + DeviceInfoUtils.getMsvSuffix());
122b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang        setValueSummary(KEY_EQUIPMENT_ID, PROPERTY_EQUIPMENT_ID);
1234559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        findPreference(KEY_KERNEL_VERSION).setSummary(DeviceInfoUtils.getFormattedKernelVersion());
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
125b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        if (!SELinux.isSELinuxEnabled()) {
126b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley            String status = getResources().getString(R.string.selinux_status_disabled);
127b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley            setStringSummary(KEY_SELINUX_STATUS, status);
128b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        } else if (!SELinux.isSELinuxEnforced()) {
129b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley            String status = getResources().getString(R.string.selinux_status_permissive);
130b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley            setStringSummary(KEY_SELINUX_STATUS, status);
131b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        }
132b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley
133b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        // Remove selinux information if property is not present
134b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley        removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_SELINUX_STATUS,
135b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley                PROPERTY_SELINUX_STATUS);
136b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley
137a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville        // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set
138b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio        removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_SAFETY_LEGAL,
139a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville                PROPERTY_URL_SAFETYLEGAL);
140a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville
141b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang        // Remove Equipment id preference if FCC ID is not set by RIL
142b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang        removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_EQUIPMENT_ID,
143b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang                PROPERTY_EQUIPMENT_ID);
144b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang
145c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        // Remove Baseband version if wifi-only device
1468af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt        if (Utils.isWifiOnly(getActivity())) {
147c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani            getPreferenceScreen().removePreference(findPreference(KEY_BASEBAND_VERSION));
148c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        }
149c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani
150b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        // Dont show feedback option if there is no reporter.
1514559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        if (TextUtils.isEmpty(DeviceInfoUtils.getFeedbackReporterPackage(getActivity()))) {
152b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan            getPreferenceScreen().removePreference(findPreference(KEY_DEVICE_FEEDBACK));
153b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        }
154b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan
1551fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        // Remove regulatory labels if no activity present to handle intent.
1561fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        removePreferenceIfActivityMissing(
1571fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein                KEY_REGULATORY_INFO, Settings.ACTION_SHOW_REGULATORY_INFO);
1581fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein
1591fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        removePreferenceIfActivityMissing(
1601fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein                "safety_info", "android.settings.SHOW_SAFETY_AND_REGULATORY_INFO");
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1622fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
1633673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn    @Override
164caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn    public void onResume() {
165caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn        super.onResume();
166ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka        mFunDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(
167ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka                getActivity(), UserManager.DISALLOW_FUN, UserHandle.myUserId());
1689e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka        mFunDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(
1699e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                getActivity(), UserManager.DISALLOW_FUN, UserHandle.myUserId());
170caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn    }
171caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn
172caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn    @Override
17339b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public boolean onPreferenceTreeClick(Preference preference) {
1743aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang        if (mBuildNumberPreferenceController.handlePreferenceTreeClick(preference)) {
1753aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang            return true;
1763aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang        }
177c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani        if (preference.getKey().equals(KEY_FIRMWARE_VERSION)) {
1783aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang            System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
1793aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang            mHits[mHits.length - 1] = SystemClock.uptimeMillis();
1803aa68c8b80633b9091734fd237e1921fb7efc792Fan Zhang            if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
1819e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                if (mUm.hasUserRestriction(UserManager.DISALLOW_FUN)) {
1829e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                    if (mFunDisallowedAdmin != null && !mFunDisallowedBySystem) {
1839e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                        RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(),
1849e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                                mFunDisallowedAdmin);
1859e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                    }
1869a5550e9e6efe211b03d067eae2689f6ef5eb2d1Jeff Sharkey                    Log.d(LOG_TAG, "Sorry, no fun for you!");
1879a5550e9e6efe211b03d067eae2689f6ef5eb2d1Jeff Sharkey                    return false;
1889a5550e9e6efe211b03d067eae2689f6ef5eb2d1Jeff Sharkey                }
1899a5550e9e6efe211b03d067eae2689f6ef5eb2d1Jeff Sharkey
1904749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                Intent intent = new Intent(Intent.ACTION_MAIN);
1914749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                intent.setClassName("android",
1924749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                        com.android.internal.app.PlatLogoActivity.class.getName());
1934749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                try {
1944749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                    startActivity(intent);
1954749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                } catch (Exception e) {
196362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne                    Log.e(LOG_TAG, "Unable to start activity " + intent.toString());
1974749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn                }
1983673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn            }
199013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei        } else if (preference.getKey().equals(KEY_SECURITY_PATCH)) {
200013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei            if (getPackageManager().queryIntentActivities(preference.getIntent(), 0).isEmpty()) {
201013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei                // Don't send out the intent to stop crash
202013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei                Log.w(LOG_TAG, "Stop click action on " + KEY_SECURITY_PATCH + ": "
203013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei                        + "queryIntentActivities() returns empty" );
204013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei                return true;
205013da34209877ed2d1169a860a72ee776f978fd0jackqdyulei            }
206b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        } else if (preference.getKey().equals(KEY_DEVICE_FEEDBACK)) {
207b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan            sendFeedback();
2083673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn        }
20939b467482d1bf256a111c757e9b7621c6f523271Jason Monk        return super.onPreferenceTreeClick(preference);
2103673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn    }
211a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville
212c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    @Override
213c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    protected String getLogTag() {
214c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        return LOG_TAG;
215c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    }
216c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang
217c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    @Override
218c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    protected int getPreferenceScreenResId() {
219c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        return R.xml.device_info_settings;
220c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    }
221c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang
222c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    @Override
223c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang    protected List<PreferenceController> getPreferenceControllers(Context context) {
224c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        final List<PreferenceController> controllers = new ArrayList<>();
225c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        mBuildNumberPreferenceController =
226c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang                new BuildNumberPreferenceController(context, getActivity(), this /* fragment */);
227c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        getLifecycle().addObserver(mBuildNumberPreferenceController);
228c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        controllers.add(mBuildNumberPreferenceController);
229c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        controllers.add(new AdditionalSystemUpdatePreferenceController(context));
230c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        controllers.add(new ManualPreferenceController(context));
231c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang        return controllers;
232e3751a1a7357ed6c185187d0fc09ddce05f060bdDoris Ling    }
233e3751a1a7357ed6c185187d0fc09ddce05f060bdDoris Ling
234a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville    private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup,
235c62e2f033d945b8bc576f87bc5aaaba37e2afc87Fan Zhang            String preference, String property) {
236a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu        if (SystemProperties.get(property).equals("")) {
237a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            // Property is missing so remove preference from group
238a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            try {
239a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville                preferenceGroup.removePreference(findPreference(preference));
240a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            } catch (RuntimeException e) {
241362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne                Log.d(LOG_TAG, "Property '" + property + "' missing and no '"
242a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville                        + preference + "' preference");
243a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville            }
244a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville        }
245a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville    }
246a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville
2471fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein    private void removePreferenceIfActivityMissing(String preferenceKey, String action) {
2481fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        final Intent intent = new Intent(action);
2491fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein        if (getPackageManager().queryIntentActivities(intent, 0).isEmpty()) {
2501fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein            Preference pref = findPreference(preferenceKey);
2511fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein            if (pref != null) {
2521fad9af3c7b16669fc5d31f442fbd85e380001e9Andrew Sapperstein                getPreferenceScreen().removePreference(pref);
253185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu            }
254a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu        }
255a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu    }
256a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setStringSummary(String preference, String value) {
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            findPreference(preference).setSummary(value);
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (RuntimeException e) {
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            findPreference(preference).setSummary(
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                getResources().getString(R.string.device_info_default));
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2652fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setValueSummary(String preference, String property) {
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            findPreference(preference).setSummary(
2692fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng                    SystemProperties.get(property,
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                            getResources().getString(R.string.device_info_default)));
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (RuntimeException e) {
272362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne            // No recovery
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
276b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan    private void sendFeedback() {
2774559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler        String reporterPackage = DeviceInfoUtils.getFeedbackReporterPackage(getActivity());
278b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        if (TextUtils.isEmpty(reporterPackage)) {
279b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan            return;
280b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        }
281b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
282b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        intent.setPackage(reporterPackage);
283b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan        startActivityForResult(intent, 0);
284b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan    }
285b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan
2869d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
2879d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
2889d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        private final Context mContext;
2899d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        private final SummaryLoader mSummaryLoader;
2909d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
2919d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
2929d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            mContext = context;
2939d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            mSummaryLoader = summaryLoader;
2949d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
2959d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
2969d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        @Override
2979d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public void setListening(boolean listening) {
2989d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            if (listening) {
299fd4f729e1fb40372d218cf6385c2c7db478f80bdFan Zhang                mSummaryLoader.setSummary(this, mContext.getString(R.string.about_summary,
300fd4f729e1fb40372d218cf6385c2c7db478f80bdFan Zhang                        Build.VERSION.RELEASE));
3019d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            }
3029d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
3039d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    }
3049d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3059d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
3069d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            = new SummaryLoader.SummaryProviderFactory() {
3079d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        @Override
3089d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
3099d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                                                                   SummaryLoader summaryLoader) {
3109d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            return new SummaryProvider(activity, summaryLoader);
3119d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
3129d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    };
3139d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
3142397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani    /**
315b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio     * For Search.
316b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio     */
317b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
318b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio        new BaseSearchIndexProvider() {
319b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio
320b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            @Override
321b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            public List<SearchIndexableResource> getXmlResourcesToIndex(
322b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    Context context, boolean enabled) {
323b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                final SearchIndexableResource sir = new SearchIndexableResource(context);
324b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                sir.xmlResId = R.xml.device_info_settings;
325b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                return Arrays.asList(sir);
326b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            }
327b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio
328b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            @Override
329b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            public List<String> getNonIndexableKeys(Context context) {
330b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                final List<String> keys = new ArrayList<String>();
331b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (isPropertyMissing(PROPERTY_SELINUX_STATUS)) {
332b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_SELINUX_STATUS);
333b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
334b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (isPropertyMissing(PROPERTY_URL_SAFETYLEGAL)) {
335b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_SAFETY_LEGAL);
336b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
337b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (isPropertyMissing(PROPERTY_EQUIPMENT_ID)) {
338b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_EQUIPMENT_ID);
339b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
340b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                // Remove Baseband version if wifi-only device
341b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                if (Utils.isWifiOnly(context)) {
342b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add((KEY_BASEBAND_VERSION));
343b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
344b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                // Dont show feedback option if there is no reporter.
3454559b5d62fc0ee6c1bb4feb9fe007e2599af378aTony Mantler                if (TextUtils.isEmpty(DeviceInfoUtils.getFeedbackReporterPackage(context))) {
346b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                    keys.add(KEY_DEVICE_FEEDBACK);
347b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                }
3489c1fcf9916857df1cb831428251eecece70b0c30Fan Zhang                new SystemUpdatePreferenceController(context, UserManager.get(context))
3499c1fcf9916857df1cb831428251eecece70b0c30Fan Zhang                        .updateNonIndexableKeys(keys);
35066b573ad5ac6782b0e65b3dd98037eae01b527e5Fan Zhang                new AdditionalSystemUpdatePreferenceController(context)
35166b573ad5ac6782b0e65b3dd98037eae01b527e5Fan Zhang                        .updateNonIndexableKeys(keys);
352b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                return keys;
353b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            }
354b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio
355b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            private boolean isPropertyMissing(String property) {
356b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio                return SystemProperties.get(property).equals("");
357b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio            }
358b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio        };
359b2385ea46286933add8ea3fb86db7870fe294334Fabrice Di Meglio
360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
361