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