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