DeviceInfoSettings.java revision 3673546205ebf1b4c83c212c1032eea38c8adbe7
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 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Build; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemProperties; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceActivity; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceGroup; 263673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackbornimport android.preference.PreferenceScreen; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 283673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackbornimport android.view.MotionEvent; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.BufferedReader; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.FileReader; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.io.IOException; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.regex.Matcher; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.regex.Pattern; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class DeviceInfoSettings extends PreferenceActivity { 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String TAG = "DeviceInfoSettings"; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_CONTAINER = "container"; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_TEAM = "team"; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_CONTRIBUTORS = "contributors"; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_TERMS = "terms"; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_LICENSE = "license"; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_COPYRIGHT = "copyright"; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings"; 46a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal"; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle icicle) { 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.device_info_settings); 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setStringSummary("firmware_version", Build.VERSION.RELEASE); 553673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn findPreference("firmware_version").setEnabled(true); 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setValueSummary("baseband_version", "gsm.version.baseband"); 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setStringSummary("device_model", Build.MODEL); 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setStringSummary("build_number", Build.DISPLAY); 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference("kernel_version").setSummary(getFormattedKernelVersion()); 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 61a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set 62a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville removePreferenceIfPropertyMissing(getPreferenceScreen(), "safetylegal", 63a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville PROPERTY_URL_SAFETYLEGAL); 64a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Settings is a generic app and should not contain any device-specific 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info. 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // These are contained in the "container" preference group 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PreferenceGroup parentPreference = (PreferenceGroup) findPreference(KEY_CONTAINER); 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_TERMS, 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_LICENSE, 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_COPYRIGHT, 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_TEAM, 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // These are contained by the root preference screen 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project parentPreference = getPreferenceScreen(); 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project KEY_SYSTEM_UPDATE_SETTINGS, 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_CONTRIBUTORS, 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 893673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn 903673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn @Override 913673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 923673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn if (preference.getKey().equals("firmware_version")) { 933673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 943673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn intent.setClassName("android", 953673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn com.android.internal.app.PlatLogoActivity.class.getName()); 963673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn try { 973673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn startActivity(intent); 983673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } catch (Exception e) { 993673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 1003673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 1013673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn return super.onPreferenceTreeClick(preferenceScreen, preference); 1023673546205ebf1b4c83c212c1032eea38c8adbe7Dianne Hackborn } 103a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 104a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup, 105a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville String preference, String property ) { 106a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville if (SystemProperties.get(property).equals("")) 107a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville { 108a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Property is missing so remove preference from group 109a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville try { 110a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville preferenceGroup.removePreference(findPreference(preference)); 111a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } catch (RuntimeException e) { 112a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville Log.d(TAG, "Property '" + property + "' missing and no '" 113a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville + preference + "' preference"); 114a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 115a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 116a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 117a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setStringSummary(String preference, String value) { 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary(value); 121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (RuntimeException e) { 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary( 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getResources().getString(R.string.device_info_default)); 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setValueSummary(String preference, String property) { 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project findPreference(preference).setSummary( 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project SystemProperties.get(property, 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getResources().getString(R.string.device_info_default))); 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (RuntimeException e) { 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getFormattedKernelVersion() { 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String procVersionStr; 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project BufferedReader reader = new BufferedReader(new FileReader("/proc/version"), 256); 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project procVersionStr = reader.readLine(); 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } finally { 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project reader.close(); 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String PROC_VERSION_REGEX = 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "\\w+\\s+" + /* ignore: Linux */ 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "\\w+\\s+" + /* ignore: version */ 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "([^\\s]+)\\s+" + /* group 1: 2.6.22-omap1 */ 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "\\(([^\\s@]+(?:@[^\\s.]+)?)[^)]*\\)\\s+" + /* group 2: (xxxxxx@xxxxx.constant) */ 153a6b9dcbb161e9d7ede0573397ee22d6c3f0bbcaePatrick Auchter "\\((?:[^(]*\\([^)]*\\))?[^)]*\\)\\s+" + /* ignore: (gcc ..) */ 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "([^\\s]+)\\s+" + /* group 3: #26 */ 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "(?:PREEMPT\\s+)?" + /* ignore: PREEMPT (optional) */ 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "(.+)"; /* group 4: date */ 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Pattern p = Pattern.compile(PROC_VERSION_REGEX); 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Matcher m = p.matcher(procVersionStr); 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!m.matches()) { 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.e(TAG, "Regex did not match on /proc/version: " + procVersionStr); 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return "Unavailable"; 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (m.groupCount() < 4) { 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.e(TAG, "Regex match on /proc/version only returned " + m.groupCount() 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project + " groups"); 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return "Unavailable"; 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return (new StringBuilder(m.group(1)).append("\n").append( 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project m.group(2)).append(" ").append(m.group(3)).append("\n") 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .append(m.group(4))).toString(); 172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (IOException e) { 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.e(TAG, 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "IO Exception when getting kernel version for Device Info screen", 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project e); 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return "Unavailable"; 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 183