DeviceInfoSettings.java revision caefa9b5f03b595b81729407e4123fee18a4342c
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 674749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn long[] mHits = new long[3]; 68caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn int mDevHitCountdown; 69caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast mDevHitToast; 702fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 72d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle icicle) { 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 742fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.device_info_settings); 762fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 77c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setStringSummary(KEY_FIRMWARE_VERSION, Build.VERSION.RELEASE); 78c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani findPreference(KEY_FIRMWARE_VERSION).setEnabled(true); 79c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setValueSummary(KEY_BASEBAND_VERSION, "gsm.version.baseband"); 802397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani setStringSummary(KEY_DEVICE_MODEL, Build.MODEL + getMsvSuffix()); 81b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang setValueSummary(KEY_EQUIPMENT_ID, PROPERTY_EQUIPMENT_ID); 82b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang setStringSummary(KEY_DEVICE_MODEL, Build.MODEL); 83c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani setStringSummary(KEY_BUILD_NUMBER, Build.DISPLAY); 84caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn findPreference(KEY_BUILD_NUMBER).setEnabled(true); 85c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani findPreference(KEY_KERNEL_VERSION).setSummary(getFormattedKernelVersion()); 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 87b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley if (!SELinux.isSELinuxEnabled()) { 88b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley String status = getResources().getString(R.string.selinux_status_disabled); 89b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley setStringSummary(KEY_SELINUX_STATUS, status); 90b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley } else if (!SELinux.isSELinuxEnforced()) { 91b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley String status = getResources().getString(R.string.selinux_status_permissive); 92b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley setStringSummary(KEY_SELINUX_STATUS, status); 93b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley } 94b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley 95b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley // Remove selinux information if property is not present 96b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_SELINUX_STATUS, 97b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley PROPERTY_SELINUX_STATUS); 98b4e84f34e095ad423b854f66f75aeb36514d49f0Stephen Smalley 99a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set 100a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville removePreferenceIfPropertyMissing(getPreferenceScreen(), "safetylegal", 101a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville PROPERTY_URL_SAFETYLEGAL); 102a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 103b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang // Remove Equipment id preference if FCC ID is not set by RIL 104b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang removePreferenceIfPropertyMissing(getPreferenceScreen(), KEY_EQUIPMENT_ID, 105b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang PROPERTY_EQUIPMENT_ID); 106b0b45c02ec73c87f78a8358a7e98747bd96ec103John Wang 107c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani // Remove Baseband version if wifi-only device 1088af88fb8387259e51615709b2d1ea0260f7057fdRobert Greenwalt if (Utils.isWifiOnly(getActivity())) { 109c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani getPreferenceScreen().removePreference(findPreference(KEY_BASEBAND_VERSION)); 110c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani } 111c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Settings is a generic app and should not contain any device-specific 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info. 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 116d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani final Activity act = getActivity(); 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // These are contained in the "container" preference group 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PreferenceGroup parentPreference = (PreferenceGroup) findPreference(KEY_CONTAINER); 119d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_TERMS, 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 121d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_LICENSE, 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 123d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_COPYRIGHT, 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 125d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_TEAM, 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1272fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // These are contained by the root preference screen 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project parentPreference = getPreferenceScreen(); 1309627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani if (UserHandle.myUserId() == UserHandle.USER_OWNER) { 1319627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, 1329627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani KEY_SYSTEM_UPDATE_SETTINGS, 1339627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1349627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani } else { 1359627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani // Remove for secondary users 1369627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani removePreference(KEY_SYSTEM_UPDATE_SETTINGS); 1379627a8ea151c1f27e5e9f34592c7b34fea3101c3Amith Yamasani } 138d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani Utils.updatePreferenceToSpecificActivityOrRemove(act, parentPreference, KEY_CONTRIBUTORS, 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 1403feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu 1413feacdf3969800d6c53c6ca6f8ced2f8fc637f7fMeng Hu // Read platform settings for additional system update setting 142a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu removePreferenceIfBoolFalse(KEY_UPDATE_SETTING, 143a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu R.bool.config_additional_system_update_setting_enable); 144a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu 145a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu // Remove regulatory information if not enabled. 146a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu removePreferenceIfBoolFalse(KEY_REGULATORY_INFO, 147a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu R.bool.config_show_regulatory_info); 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1492fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 1503673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn @Override 151caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn public void onResume() { 152caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn super.onResume(); 153caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitCountdown = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE, 154caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW, 155caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn android.os.Build.TYPE.equals("eng")) ? -1 : 7; 156caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = null; 157caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 158caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn 159caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn @Override 1603673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 161c06d4c48a9455d6018f2d793c6b8f211f1131055Amith Yamasani if (preference.getKey().equals(KEY_FIRMWARE_VERSION)) { 1624749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn System.arraycopy(mHits, 1, mHits, 0, mHits.length-1); 1634749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn mHits[mHits.length-1] = SystemClock.uptimeMillis(); 1644749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn if (mHits[0] >= (SystemClock.uptimeMillis()-500)) { 1654749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 1664749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn intent.setClassName("android", 1674749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn com.android.internal.app.PlatLogoActivity.class.getName()); 1684749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn try { 1694749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn startActivity(intent); 1704749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn } catch (Exception e) { 171362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.e(LOG_TAG, "Unable to start activity " + intent.toString()); 1724749fcf762de0e34ac28f927501d42555062c521Dianne Hackborn } 1733673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 174caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } else if (preference.getKey().equals(KEY_BUILD_NUMBER)) { 175caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitCountdown > 0) { 176caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitCountdown--; 177caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitCountdown == 0) { 178caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE, 179caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Context.MODE_PRIVATE).edit().putBoolean( 180caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn DevelopmentSettings.PREF_SHOW, true).apply(); 181caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 182caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 183caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 184caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_on, 185caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_LONG); 186caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 187caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } else if (mDevHitCountdown > 0) { 188caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 189caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 190caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 191caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = Toast.makeText(getActivity(), getResources().getString( 192caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn R.string.show_dev_countdown, mDevHitCountdown), 193caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_SHORT); 194caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 195caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 196caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } else if (mDevHitCountdown < 0) { 197caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn if (mDevHitToast != null) { 198caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.cancel(); 199caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 200caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_already, 201caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn Toast.LENGTH_LONG); 202caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn mDevHitToast.show(); 203caefa9b5f03b595b81729407e4123fee18a4342cDianne Hackborn } 2043673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 2053673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn return super.onPreferenceTreeClick(preferenceScreen, preference); 2063673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 207a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 208a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup, 209a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville String preference, String property ) { 210a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu if (SystemProperties.get(property).equals("")) { 211a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Property is missing so remove preference from group 212a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville try { 213a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville preferenceGroup.removePreference(findPreference(preference)); 214a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } catch (RuntimeException e) { 215362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.d(LOG_TAG, "Property '" + property + "' missing and no '" 216a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville + preference + "' preference"); 217a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 218a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 219a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 220a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 221a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu private void removePreferenceIfBoolFalse(String preference, int resId) { 222a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu if (!getResources().getBoolean(resId)) { 223185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu Preference pref = findPreference(preference); 224185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu if (pref != null) { 225185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu getPreferenceScreen().removePreference(pref); 226185ba407bab02c1442d02b82800f0220779ecb10Brian Muramatsu } 227a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu } 228a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu } 229a6dbaea2dacaaef7c91f89aae8d5f1ed7580b893Brian Muramatsu 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setStringSummary(String preference, String value) { 231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary(value); 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (RuntimeException e) { 234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary( 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getResources().getString(R.string.device_info_default)); 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2382fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setValueSummary(String preference, String property) { 240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary( 2422fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng SystemProperties.get(property, 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getResources().getString(R.string.device_info_default))); 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (RuntimeException e) { 245362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne // No recovery 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2492397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani /** 2502397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * Reads a line from the specified file. 2512397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @param filename the file to read from 2522397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @return the first line, if any. 2532397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @throws IOException if the file couldn't be read 2542397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani */ 255d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes private static String readLine(String filename) throws IOException { 2562397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani BufferedReader reader = new BufferedReader(new FileReader(filename), 256); 2572397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani try { 2582397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return reader.readLine(); 2592397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } finally { 2602397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani reader.close(); 2612397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 2622397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 2632397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani 264d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes public static String getFormattedKernelVersion() { 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 266d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return formatKernelVersion(readLine(FILENAME_PROC_VERSION)); 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2682fc2ba11fedd529340eefc042d3a00ef6f70e7b6Freeman Ng } catch (IOException e) { 269362bd107a11e4cb74c53e8058fe0dfaf9baac65fGilles Debunne Log.e(LOG_TAG, 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "IO Exception when getting kernel version for Device Info screen", 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project e); 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return "Unavailable"; 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 277d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes public static String formatKernelVersion(String rawKernelVersion) { 278d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Example (see tests for more): 279d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Linux version 3.0.31-g6fb96c9 (android-build@xxx.xxx.xxx.xxx.com) \ 280d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // (gcc version 4.6.x-xxx 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT \ 281d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes // Thu Jun 28 11:02:39 PDT 2012 282d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 283d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes final String PROC_VERSION_REGEX = 284d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "Linux version (\\S+) " + /* group 1: "3.0.31-g6fb96c9" */ 285d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "\\((\\S+?)\\) " + /* group 2: "x@y.com" (kernel builder) */ 286d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(?:\\(gcc.+? \\)) " + /* ignore: GCC version information */ 287d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(#\\d+) " + /* group 3: "#1" */ 288d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "(?:.*?)?" + /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */ 289d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 4: "Thu Jun 28 11:02:39 PDT 2012" */ 290d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 291d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Matcher m = Pattern.compile(PROC_VERSION_REGEX).matcher(rawKernelVersion); 292d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes if (!m.matches()) { 293d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Log.e(LOG_TAG, "Regex did not match on /proc/version: " + rawKernelVersion); 294d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return "Unavailable"; 295d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } else if (m.groupCount() < 4) { 296d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes Log.e(LOG_TAG, "Regex match on /proc/version only returned " + m.groupCount() 297d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes + " groups"); 298d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return "Unavailable"; 299d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } 300d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes return m.group(1) + "\n" + // 3.0.31-g6fb96c9 301d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes m.group(2) + " " + m.group(3) + "\n" + // x@y.com #1 302d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes m.group(4); // Thu Jun 28 11:02:39 PDT 2012 303d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes } 304d267d377fba9f6685dfd73af51d85c244f1f970fElliott Hughes 3052397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani /** 3062397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * Returns " (ENGINEERING)" if the msv file has a zero value, else returns "". 3072397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani * @return a string to append to the model number description. 3082397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani */ 3092397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani private String getMsvSuffix() { 3102397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Production devices should have a non-zero value. If we can't read it, assume it's a 3112397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // production device so that we don't accidentally show that it's an ENGINEERING device. 3122397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani try { 3132397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani String msv = readLine(FILENAME_MSV); 3142397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Parse as a hex number. If it evaluates to a zero, then it's an engineering build. 3152397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani if (Long.parseLong(msv, 16) == 0) { 3162397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return " (ENGINEERING)"; 3172397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 3182397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } catch (IOException ioe) { 3192397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Fail quietly, as the file may not exist on some devices. 3202397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } catch (NumberFormatException nfe) { 3212397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani // Fail quietly, returning empty string should be sufficient 3222397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 3232397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani return ""; 3242397a7391e2ba9434ee89345c1d3a47948d8f226Amith Yamasani } 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 326