DeviceInfoSettings.java revision b42573d0e6870b026110ece22f13dc15452d507c
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; 22b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.content.pm.ApplicationInfo; 23b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.content.pm.PackageManager; 24b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.content.pm.ResolveInfo; 25b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.os.Binder; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Build; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 28b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.os.Parcel; 29b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.os.RemoteException; 30b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalleyimport android.os.SELinux; 314749fcf762de0e34ac28f927501d42555062c521Dianne Hackbornimport android.os.SystemClock; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemProperties; 339627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasaniimport android.os.UserHandle; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceGroup; 363673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackbornimport android.preference.PreferenceScreen; 373daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkeyimport android.provider.Settings; 38b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport android.text.TextUtils; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 40caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackbornimport android.widget.Toast; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.BufferedReader; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.FileReader; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.IOException; 45b42573d0e6870b026110ece22f13dc15452d507cRajat Dewanimport java.util.List; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.regex.Matcher; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.regex.Pattern; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 499e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaardpublic class DeviceInfoSettings extends RestrictedSettingsFragment { 50c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani 51362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne private static final String LOG_TAG = "DeviceInfoSettings"; 522397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani private static final String FILENAME_PROC_VERSION = "/proc/version"; 532397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani private static final String FILENAME_MSV = "/sys/board_properties/soc/msv"; 542397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_CONTAINER = "container"; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_TEAM = "team"; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_CONTRIBUTORS = "contributors"; 58a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu private static final String KEY_REGULATORY_INFO = "regulatory_info"; 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_TERMS = "terms"; 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_LICENSE = "license"; 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_COPYRIGHT = "copyright"; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings"; 63a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal"; 64b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley private static final String PROPERTY_SELINUX_STATUS = "ro.build.selinux"; 65c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_KERNEL_VERSION = "kernel_version"; 66c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_BUILD_NUMBER = "build_number"; 67c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_DEVICE_MODEL = "device_model"; 68b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley private static final String KEY_SELINUX_STATUS = "selinux_status"; 69c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_BASEBAND_VERSION = "baseband_version"; 70c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_FIRMWARE_VERSION = "firmware_version"; 713feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu private static final String KEY_UPDATE_SETTING = "additional_system_update_settings"; 72b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang private static final String KEY_EQUIPMENT_ID = "fcc_equipment_id"; 73b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang private static final String PROPERTY_EQUIPMENT_ID = "ro.ril.fccid"; 74b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan private static final String KEY_DEVICE_FEEDBACK = "device_feedback"; 752fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 76d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn static final int TAPS_TO_BE_A_DEVELOPER = 7; 77d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn 784749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn long[] mHits = new long[3]; 79caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn int mDevHitCountdown; 80caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast mDevHitToast; 812fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 829e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard public DeviceInfoSettings() { 839e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard super(null /* Don't PIN protect the entire screen */); 849e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard } 859e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 87d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle icicle) { 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 892fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.device_info_settings); 912fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 929e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard // We only call ensurePinRestrictedPreference() when mDevHitCountdown == 0. 939e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard // This will keep us from entering developer mode without a PIN. 949e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard protectByRestrictions(KEY_BUILD_NUMBER); 959e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard 96c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setStringSummary(KEY_FIRMWARE_VERSION, Build.VERSION.RELEASE); 97c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani findPreference(KEY_FIRMWARE_VERSION).setEnabled(true); 98c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setValueSummary(KEY_BASEBAND_VERSION, "gsm.version.baseband"); 992397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani setStringSummary(KEY_DEVICE_MODEL, Build.MODEL + getMsvSuffix()); 100b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang setValueSummary(KEY_EQUIPMENT_ID, PROPERTY_EQUIPMENT_ID); 101b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang setStringSummary(KEY_DEVICE_MODEL, Build.MODEL); 102c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setStringSummary(KEY_BUILD_NUMBER, Build.DISPLAY); 103caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn findPreference(KEY_BUILD_NUMBER).setEnabled(true); 104c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani findPreference(KEY_KERNEL_VERSION).setSummary(getFormattedKernelVersion()); 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 106b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley if (!SELinux.isSELinuxEnabled()) { 107b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley String status = getResources().getString(R.string.selinux_status_disabled); 108b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley setStringSummary(KEY_SELINUX_STATUS, status); 109b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley } else if (!SELinux.isSELinuxEnforced()) { 110b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley String status = getResources().getString(R.string.selinux_status_permissive); 111b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley setStringSummary(KEY_SELINUX_STATUS, status); 112b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley } 113b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley 114b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley // Remove selinux information if property is not present 115b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_SELINUX_STATUS, 116b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley PROPERTY_SELINUX_STATUS); 117b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley 118a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set 119a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville removePreferenceIfPropertyMissing(getPreferenceScreen(), "safetylegal", 120a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville PROPERTY_URL_SAFETYLEGAL); 121a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 122b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang // Remove Equipment id preference if FCC ID is not set by RIL 123b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_EQUIPMENT_ID, 124b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang PROPERTY_EQUIPMENT_ID); 125b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang 126c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani // Remove Baseband version if wifi-only device 1278af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt if (Utils.isWifiOnly(getActivity())) { 128c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani getPreferenceScreen().removePreference(findPreference(KEY_BASEBAND_VERSION)); 129c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani } 130c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani 131b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan // Dont show feedback option if there is no reporter. 132b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan if (TextUtils.isEmpty(getFeedbackReporterPackage(getActivity()))) { 133b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan getPreferenceScreen().removePreference(findPreference(KEY_DEVICE_FEEDBACK)); 134b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 135b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Settings is a generic app and should not contain any device-specific 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info. 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 140d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani final Activity act = getActivity(); 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // These are contained in the "container" preference group 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PreferenceGroup parentPreference = (PreferenceGroup) findPreference(KEY_CONTAINER); 143d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_TERMS, 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 145d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_LICENSE, 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 147d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_COPYRIGHT, 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 149d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_TEAM, 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1512fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // These are contained by the root preference screen 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project parentPreference = getPreferenceScreen(); 1549627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani if (UserHandle.myUserId() == UserHandle.USER_OWNER) { 1559627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, 1569627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani KEY_SYSTEM_UPDATE_SETTINGS, 1579627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1589627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani } else { 1599627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani // Remove for secondary users 1609627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani removePreference(KEY_SYSTEM_UPDATE_SETTINGS); 1619627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani } 162d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_CONTRIBUTORS, 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1643feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu 1653feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu // Read platform settings for additional system update setting 166a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu removePreferenceIfBoolFalse(KEY_UPDATE_SETTING, 167a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu R.bool.config_additional_system_update_setting_enable); 168a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu 1693daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkey // Remove regulatory information if none present. 1703daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkey final Intent intent = new Intent(Settings.ACTION_SHOW_REGULATORY_INFO); 1713daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkey if (getPackageManager().queryIntentActivities(intent, 0).isEmpty()) { 1723daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkey Preference pref = findPreference(KEY_REGULATORY_INFO); 1733daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkey if (pref != null) { 1743daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkey getPreferenceScreen().removePreference(pref); 1753daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkey } 1763daa259d8042b614539cc307c79ef07b526adb0dJeff Sharkey } 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1782fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 1793673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn @Override 180caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn public void onResume() { 181caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn super.onResume(); 182caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitCountdown = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE, 183caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW, 184d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn android.os.Build.TYPE.equals("eng")) ? -1 : TAPS_TO_BE_A_DEVELOPER; 185caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = null; 186caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 187caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn 188caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn @Override 1893673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 190c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani if (preference.getKey().equals(KEY_FIRMWARE_VERSION)) { 1914749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn System.arraycopy(mHits, 1, mHits, 0, mHits.length-1); 1924749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn mHits[mHits.length-1] = SystemClock.uptimeMillis(); 1934749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn if (mHits[0] >= (SystemClock.uptimeMillis()-500)) { 1944749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 1954749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn intent.setClassName("android", 1964749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn com.android.internal.app.PlatLogoActivity.class.getName()); 1974749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn try { 1984749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn startActivity(intent); 1994749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn } catch (Exception e) { 200362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.e(LOG_TAG, "Unable to start activity " + intent.toString()); 2014749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn } 2023673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 203caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } else if (preference.getKey().equals(KEY_BUILD_NUMBER)) { 204b02b26e3cb4a8a3aa7b3dd718fbc2cc7c6ac8016Amith Yamasani // Don't enable developer options for secondary users. 205b02b26e3cb4a8a3aa7b3dd718fbc2cc7c6ac8016Amith Yamasani if (UserHandle.myUserId() != UserHandle.USER_OWNER) return true; 206b02b26e3cb4a8a3aa7b3dd718fbc2cc7c6ac8016Amith Yamasani 207caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitCountdown > 0) { 2089e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard if (mDevHitCountdown == 1) { 2099e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard if (super.ensurePinRestrictedPreference(preference)) { 2109e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard return true; 2119e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard } 2129e543cd0f730aefc95241c7221262e7fff0ceea1Geoffrey Borggaard } 213caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitCountdown--; 214caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitCountdown == 0) { 215caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE, 216caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Context.MODE_PRIVATE).edit().putBoolean( 217caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn DevelopmentSettings.PREF_SHOW, true).apply(); 218caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 219caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 220caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 221caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_on, 222caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_LONG); 223caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 224d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn } else if (mDevHitCountdown > 0 225d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER-2)) { 226caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 227caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 228caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 229673130bbf8017cf0e082dc65a24609290da4daa4Evan Charlton mDevHitToast = Toast.makeText(getActivity(), getResources().getQuantityString( 230673130bbf8017cf0e082dc65a24609290da4daa4Evan Charlton R.plurals.show_dev_countdown, mDevHitCountdown, mDevHitCountdown), 231caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_SHORT); 232caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 233caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 234caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } else if (mDevHitCountdown < 0) { 235caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 236caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 237caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 238caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_already, 239caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_LONG); 240caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 241caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 242b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } else if (preference.getKey().equals(KEY_DEVICE_FEEDBACK)) { 243b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan sendFeedback(); 2443673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 2453673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn return super.onPreferenceTreeClick(preferenceScreen, preference); 2463673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 247a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 248a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup, 249a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville String preference, String property ) { 250a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu if (SystemProperties.get(property).equals("")) { 251a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Property is missing so remove preference from group 252a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville try { 253a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville preferenceGroup.removePreference(findPreference(preference)); 254a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } catch (RuntimeException e) { 255362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.d(LOG_TAG, "Property '" + property + "' missing and no '" 256a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville + preference + "' preference"); 257a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 258a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 259a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 260a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 261a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu private void removePreferenceIfBoolFalse(String preference, int resId) { 262a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu if (!getResources().getBoolean(resId)) { 263185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu Preference pref = findPreference(preference); 264185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu if (pref != null) { 265185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu getPreferenceScreen().removePreference(pref); 266185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu } 267a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu } 268a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu } 269a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setStringSummary(String preference, String value) { 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary(value); 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (RuntimeException e) { 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary( 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getResources().getString(R.string.device_info_default)); 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2782fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setValueSummary(String preference, String property) { 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary( 2822fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng SystemProperties.get(property, 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getResources().getString(R.string.device_info_default))); 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (RuntimeException e) { 285362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne // No recovery 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 289b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan private void sendFeedback() { 290b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan String reporterPackage = getFeedbackReporterPackage(getActivity()); 291b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan if (TextUtils.isEmpty(reporterPackage)) { 292b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan return; 293b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 294b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan Intent intent = new Intent(Intent.ACTION_BUG_REPORT); 295b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan intent.setPackage(reporterPackage); 296b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan startActivityForResult(intent, 0); 297b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 298b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan 2992397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani /** 3002397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * Reads a line from the specified file. 3012397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @param filename the file to read from 3022397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @return the first line, if any. 3032397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @throws IOException if the file couldn't be read 3042397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani */ 305d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes private static String readLine(String filename) throws IOException { 3062397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani BufferedReader reader = new BufferedReader(new FileReader(filename), 256); 3072397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani try { 3082397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return reader.readLine(); 3092397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } finally { 3102397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani reader.close(); 3112397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 3122397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 3132397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani 314d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes public static String getFormattedKernelVersion() { 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 316d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return formatKernelVersion(readLine(FILENAME_PROC_VERSION)); 317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 3182fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng } catch (IOException e) { 319362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.e(LOG_TAG, 320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "IO Exception when getting kernel version for Device Info screen", 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project e); 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return "Unavailable"; 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 327d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes public static String formatKernelVersion(String rawKernelVersion) { 328d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Example (see tests for more): 329d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Linux version 3.0.31-g6fb96c9 (android-build@xxx.xxx.xxx.xxx.com) \ 330d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // (gcc version 4.6.x-xxx 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT \ 331d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Thu Jun 28 11:02:39 PDT 2012 332d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 333d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes final String PROC_VERSION_REGEX = 334d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "Linux version (\\S+) " + /* group 1: "3.0.31-g6fb96c9" */ 335d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "\\((\\S+?)\\) " + /* group 2: "x@y.com" (kernel builder) */ 336d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(?:\\(gcc.+? \\)) " + /* ignore: GCC version information */ 337d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(#\\d+) " + /* group 3: "#1" */ 338d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(?:.*?)?" + /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */ 339d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 4: "Thu Jun 28 11:02:39 PDT 2012" */ 340d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 341d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Matcher m = Pattern.compile(PROC_VERSION_REGEX).matcher(rawKernelVersion); 342d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes if (!m.matches()) { 343d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Log.e(LOG_TAG, "Regex did not match on /proc/version: " + rawKernelVersion); 344d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return "Unavailable"; 345d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } else if (m.groupCount() < 4) { 346d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Log.e(LOG_TAG, "Regex match on /proc/version only returned " + m.groupCount() 347d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes + " groups"); 348d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return "Unavailable"; 349d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } 350d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return m.group(1) + "\n" + // 3.0.31-g6fb96c9 351d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes m.group(2) + " " + m.group(3) + "\n" + // x@y.com #1 352d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes m.group(4); // Thu Jun 28 11:02:39 PDT 2012 353d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } 354d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 3552397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani /** 3562397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * Returns " (ENGINEERING)" if the msv file has a zero value, else returns "". 3572397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @return a string to append to the model number description. 3582397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani */ 3592397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani private String getMsvSuffix() { 3602397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Production devices should have a non-zero value. If we can't read it, assume it's a 3612397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // production device so that we don't accidentally show that it's an ENGINEERING device. 3622397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani try { 3632397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani String msv = readLine(FILENAME_MSV); 3642397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Parse as a hex number. If it evaluates to a zero, then it's an engineering build. 3652397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani if (Long.parseLong(msv, 16) == 0) { 3662397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return " (ENGINEERING)"; 3672397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 3682397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } catch (IOException ioe) { 3692397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Fail quietly, as the file may not exist on some devices. 3702397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } catch (NumberFormatException nfe) { 3712397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Fail quietly, returning empty string should be sufficient 3722397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 3732397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return ""; 3742397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 375b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan 376b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan private static String getFeedbackReporterPackage(Context context) { 377b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan String feedbackReporter = 378b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan context.getResources().getString(R.string.oem_preferred_feedback_reporter); 379b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan if (TextUtils.isEmpty(feedbackReporter)) { 380b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan // Reporter not configured. Return. 381b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan return feedbackReporter; 382b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 383b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan // Additional checks to ensure the reporter is on system image, and reporter is 384b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan // configured to listen to the intent. Otherwise, dont show the "send feedback" option. 385b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan Intent intent = new Intent(Intent.ACTION_BUG_REPORT); 386b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan 387b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan PackageManager pm = context.getPackageManager(); 388b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan List<ResolveInfo> resolvedPackages = 389b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan pm.queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER); 390b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan for (ResolveInfo info : resolvedPackages) { 391b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan if (info.activityInfo != null) { 392b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan if (!TextUtils.isEmpty(info.activityInfo.packageName)) { 393b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan try { 394b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan ApplicationInfo ai = pm.getApplicationInfo(info.activityInfo.packageName, 0); 395b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 396b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan // Package is on the system image 397b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan if (TextUtils.equals( 398b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan info.activityInfo.packageName, feedbackReporter)) { 399b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan return feedbackReporter; 400b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 401b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 402b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } catch (PackageManager.NameNotFoundException e) { 403b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan // No need to do anything here. 404b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 405b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 406b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 407b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 408b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan return null; 409b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan } 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 411b42573d0e6870b026110ece22f13dc15452d507cRajat Dewan 412