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; 279627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasaniimport android.os.UserHandle; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceGroup; 303673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackbornimport android.preference.PreferenceScreen; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 32caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackbornimport android.widget.Toast; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.BufferedReader; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.FileReader; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.IOException; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.regex.Matcher; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.regex.Pattern; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 40d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasanipublic class DeviceInfoSettings extends SettingsPreferenceFragment { 41c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani 42362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne private static final String LOG_TAG = "DeviceInfoSettings"; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 442397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani private static final String FILENAME_PROC_VERSION = "/proc/version"; 452397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani private static final String FILENAME_MSV = "/sys/board_properties/soc/msv"; 462397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_CONTAINER = "container"; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_TEAM = "team"; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_CONTRIBUTORS = "contributors"; 50a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu private static final String KEY_REGULATORY_INFO = "regulatory_info"; 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_TERMS = "terms"; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_LICENSE = "license"; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_COPYRIGHT = "copyright"; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings"; 55a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal"; 56b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley private static final String PROPERTY_SELINUX_STATUS = "ro.build.selinux"; 57c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_KERNEL_VERSION = "kernel_version"; 58c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_BUILD_NUMBER = "build_number"; 59c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_DEVICE_MODEL = "device_model"; 60b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley private static final String KEY_SELINUX_STATUS = "selinux_status"; 61c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_BASEBAND_VERSION = "baseband_version"; 62c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani private static final String KEY_FIRMWARE_VERSION = "firmware_version"; 633feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu private static final String KEY_UPDATE_SETTING = "additional_system_update_settings"; 64b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang private static final String KEY_EQUIPMENT_ID = "fcc_equipment_id"; 65b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang private static final String PROPERTY_EQUIPMENT_ID = "ro.ril.fccid"; 662fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 67d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn static final int TAPS_TO_BE_A_DEVELOPER = 7; 68d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn 694749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn long[] mHits = new long[3]; 70caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn int mDevHitCountdown; 71caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast mDevHitToast; 722fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 74d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle icicle) { 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 762fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.device_info_settings); 782fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 79c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setStringSummary(KEY_FIRMWARE_VERSION, Build.VERSION.RELEASE); 80c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani findPreference(KEY_FIRMWARE_VERSION).setEnabled(true); 81c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setValueSummary(KEY_BASEBAND_VERSION, "gsm.version.baseband"); 822397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani setStringSummary(KEY_DEVICE_MODEL, Build.MODEL + getMsvSuffix()); 83b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang setValueSummary(KEY_EQUIPMENT_ID, PROPERTY_EQUIPMENT_ID); 84b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang setStringSummary(KEY_DEVICE_MODEL, Build.MODEL); 85c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setStringSummary(KEY_BUILD_NUMBER, Build.DISPLAY); 86caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn findPreference(KEY_BUILD_NUMBER).setEnabled(true); 87c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani findPreference(KEY_KERNEL_VERSION).setSummary(getFormattedKernelVersion()); 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 89b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley if (!SELinux.isSELinuxEnabled()) { 90b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley String status = getResources().getString(R.string.selinux_status_disabled); 91b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley setStringSummary(KEY_SELINUX_STATUS, status); 92b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley } else if (!SELinux.isSELinuxEnforced()) { 93b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley String status = getResources().getString(R.string.selinux_status_permissive); 94b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley setStringSummary(KEY_SELINUX_STATUS, status); 95b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley } 96b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley 97b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley // Remove selinux information if property is not present 98b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_SELINUX_STATUS, 99b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley PROPERTY_SELINUX_STATUS); 100b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley 101a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set 102a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville removePreferenceIfPropertyMissing(getPreferenceScreen(), "safetylegal", 103a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville PROPERTY_URL_SAFETYLEGAL); 104a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 105b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang // Remove Equipment id preference if FCC ID is not set by RIL 106b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_EQUIPMENT_ID, 107b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang PROPERTY_EQUIPMENT_ID); 108b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang 109c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani // Remove Baseband version if wifi-only device 1108af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt if (Utils.isWifiOnly(getActivity())) { 111c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani getPreferenceScreen().removePreference(findPreference(KEY_BASEBAND_VERSION)); 112c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani } 113c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Settings is a generic app and should not contain any device-specific 116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info. 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 118d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani final Activity act = getActivity(); 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // These are contained in the "container" preference group 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PreferenceGroup parentPreference = (PreferenceGroup) findPreference(KEY_CONTAINER); 121d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_TERMS, 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 123d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_LICENSE, 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 125d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_COPYRIGHT, 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 127d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_TEAM, 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1292fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // These are contained by the root preference screen 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project parentPreference = getPreferenceScreen(); 1329627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani if (UserHandle.myUserId() == UserHandle.USER_OWNER) { 1339627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, 1349627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani KEY_SYSTEM_UPDATE_SETTINGS, 1359627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1369627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani } else { 1379627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani // Remove for secondary users 1389627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani removePreference(KEY_SYSTEM_UPDATE_SETTINGS); 1399627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani } 140d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_CONTRIBUTORS, 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1423feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu 1433feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu // Read platform settings for additional system update setting 144a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu removePreferenceIfBoolFalse(KEY_UPDATE_SETTING, 145a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu R.bool.config_additional_system_update_setting_enable); 146a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu 147a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu // Remove regulatory information if not enabled. 148a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu removePreferenceIfBoolFalse(KEY_REGULATORY_INFO, 149a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu R.bool.config_show_regulatory_info); 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1512fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 1523673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn @Override 153caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn public void onResume() { 154caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn super.onResume(); 155caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitCountdown = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE, 156caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW, 157d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn android.os.Build.TYPE.equals("eng")) ? -1 : TAPS_TO_BE_A_DEVELOPER; 158caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = null; 159caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 160caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn 161caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn @Override 1623673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 163c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani if (preference.getKey().equals(KEY_FIRMWARE_VERSION)) { 1644749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn System.arraycopy(mHits, 1, mHits, 0, mHits.length-1); 1654749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn mHits[mHits.length-1] = SystemClock.uptimeMillis(); 1664749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn if (mHits[0] >= (SystemClock.uptimeMillis()-500)) { 1674749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 1684749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn intent.setClassName("android", 1694749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn com.android.internal.app.PlatLogoActivity.class.getName()); 1704749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn try { 1714749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn startActivity(intent); 1724749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn } catch (Exception e) { 173362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.e(LOG_TAG, "Unable to start activity " + intent.toString()); 1744749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn } 1753673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 176caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } else if (preference.getKey().equals(KEY_BUILD_NUMBER)) { 177b02b26e3cb4a8a3aa7b3dd718fbc2cc7c6ac8016Amith Yamasani // Don't enable developer options for secondary users. 178b02b26e3cb4a8a3aa7b3dd718fbc2cc7c6ac8016Amith Yamasani if (UserHandle.myUserId() != UserHandle.USER_OWNER) return true; 179b02b26e3cb4a8a3aa7b3dd718fbc2cc7c6ac8016Amith Yamasani 180caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitCountdown > 0) { 181caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitCountdown--; 182caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitCountdown == 0) { 183caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE, 184caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Context.MODE_PRIVATE).edit().putBoolean( 185caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn DevelopmentSettings.PREF_SHOW, true).apply(); 186caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 187caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 188caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 189caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_on, 190caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_LONG); 191caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 192d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn } else if (mDevHitCountdown > 0 193d6a24d505a237c26a280cfbeb5a3bedaca8a3f7dDianne Hackborn && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER-2)) { 194caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 195caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 196caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 197673130bbf8017cf0e082dc65a24609290da4daa4Evan Charlton mDevHitToast = Toast.makeText(getActivity(), getResources().getQuantityString( 198673130bbf8017cf0e082dc65a24609290da4daa4Evan Charlton R.plurals.show_dev_countdown, mDevHitCountdown, mDevHitCountdown), 199caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_SHORT); 200caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 201caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 202caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } else if (mDevHitCountdown < 0) { 203caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 204caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 205caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 206caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_already, 207caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_LONG); 208caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 209caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 2103673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 2113673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn return super.onPreferenceTreeClick(preferenceScreen, preference); 2123673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 213a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 214a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup, 215a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville String preference, String property ) { 216a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu if (SystemProperties.get(property).equals("")) { 217a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Property is missing so remove preference from group 218a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville try { 219a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville preferenceGroup.removePreference(findPreference(preference)); 220a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } catch (RuntimeException e) { 221362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.d(LOG_TAG, "Property '" + property + "' missing and no '" 222a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville + preference + "' preference"); 223a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 224a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 225a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 226a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 227a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu private void removePreferenceIfBoolFalse(String preference, int resId) { 228a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu if (!getResources().getBoolean(resId)) { 229185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu Preference pref = findPreference(preference); 230185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu if (pref != null) { 231185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu getPreferenceScreen().removePreference(pref); 232185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu } 233a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu } 234a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu } 235a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setStringSummary(String preference, String value) { 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary(value); 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (RuntimeException e) { 240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary( 241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getResources().getString(R.string.device_info_default)); 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2442fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setValueSummary(String preference, String property) { 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary( 2482fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng SystemProperties.get(property, 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getResources().getString(R.string.device_info_default))); 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (RuntimeException e) { 251362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne // No recovery 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2552397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani /** 2562397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * Reads a line from the specified file. 2572397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @param filename the file to read from 2582397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @return the first line, if any. 2592397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @throws IOException if the file couldn't be read 2602397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani */ 261d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes private static String readLine(String filename) throws IOException { 2622397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani BufferedReader reader = new BufferedReader(new FileReader(filename), 256); 2632397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani try { 2642397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return reader.readLine(); 2652397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } finally { 2662397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani reader.close(); 2672397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 2682397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 2692397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani 270d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes public static String getFormattedKernelVersion() { 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 272d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return formatKernelVersion(readLine(FILENAME_PROC_VERSION)); 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2742fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng } catch (IOException e) { 275362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.e(LOG_TAG, 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "IO Exception when getting kernel version for Device Info screen", 277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project e); 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return "Unavailable"; 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 283d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes public static String formatKernelVersion(String rawKernelVersion) { 284d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Example (see tests for more): 285d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Linux version 3.0.31-g6fb96c9 (android-build@xxx.xxx.xxx.xxx.com) \ 286d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // (gcc version 4.6.x-xxx 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT \ 287d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Thu Jun 28 11:02:39 PDT 2012 288d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 289d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes final String PROC_VERSION_REGEX = 290d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "Linux version (\\S+) " + /* group 1: "3.0.31-g6fb96c9" */ 291d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "\\((\\S+?)\\) " + /* group 2: "x@y.com" (kernel builder) */ 292d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(?:\\(gcc.+? \\)) " + /* ignore: GCC version information */ 293d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(#\\d+) " + /* group 3: "#1" */ 294d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(?:.*?)?" + /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */ 295d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 4: "Thu Jun 28 11:02:39 PDT 2012" */ 296d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 297d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Matcher m = Pattern.compile(PROC_VERSION_REGEX).matcher(rawKernelVersion); 298d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes if (!m.matches()) { 299d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Log.e(LOG_TAG, "Regex did not match on /proc/version: " + rawKernelVersion); 300d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return "Unavailable"; 301d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } else if (m.groupCount() < 4) { 302d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Log.e(LOG_TAG, "Regex match on /proc/version only returned " + m.groupCount() 303d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes + " groups"); 304d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return "Unavailable"; 305d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } 306d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return m.group(1) + "\n" + // 3.0.31-g6fb96c9 307d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes m.group(2) + " " + m.group(3) + "\n" + // x@y.com #1 308d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes m.group(4); // Thu Jun 28 11:02:39 PDT 2012 309d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } 310d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 3112397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani /** 3122397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * Returns " (ENGINEERING)" if the msv file has a zero value, else returns "". 3132397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @return a string to append to the model number description. 3142397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani */ 3152397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani private String getMsvSuffix() { 3162397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Production devices should have a non-zero value. If we can't read it, assume it's a 3172397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // production device so that we don't accidentally show that it's an ENGINEERING device. 3182397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani try { 3192397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani String msv = readLine(FILENAME_MSV); 3202397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Parse as a hex number. If it evaluates to a zero, then it's an engineering build. 3212397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani if (Long.parseLong(msv, 16) == 0) { 3222397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return " (ENGINEERING)"; 3232397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 3242397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } catch (IOException ioe) { 3252397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Fail quietly, as the file may not exist on some devices. 3262397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } catch (NumberFormatException nfe) { 3272397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Fail quietly, returning empty string should be sufficient 3282397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 3292397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return ""; 3302397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 332