DevelopmentSettings.java revision f3b325f54dadb482d73111ab17cf6a51784de11a
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
19b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwoodimport android.app.AlertDialog;
2024bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasaniimport android.app.Dialog;
21ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.content.ContentResolver;
22b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwoodimport android.content.DialogInterface;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.BatteryManager;
24f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.os.Build;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
26f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.os.SystemProperties;
27f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.preference.CheckBoxPreference;
28f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.preference.ListPreference;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
30ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.preference.PreferenceFragment;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
32f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.preference.Preference.OnPreferenceChangeListener;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Displays preferences for application developers.
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
38ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornpublic class DevelopmentSettings extends PreferenceFragment
39f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
40f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                OnPreferenceChangeListener {
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ENABLE_ADB = "enable_adb";
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEEP_SCREEN_ON = "keep_screen_on";
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ALLOW_MOCK_LOCATION = "allow_mock_location";
45f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    private static final String HDCP_CHECKING_KEY = "hdcp_checking";
46f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking";
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mEnableAdb;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mKeepScreenOn;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mAllowMockLocation;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
52b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    // To track whether Yes was clicked in the adb warning dialog
53b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    private boolean mOkClicked;
54b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood
5524bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    private Dialog mOkDialog;
5624bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
58ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onCreate(Bundle icicle) {
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.development_prefs);
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mEnableAdb = (CheckBoxPreference) findPreference(ENABLE_ADB);
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mKeepScreenOn = (CheckBoxPreference) findPreference(KEEP_SCREEN_ON);
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAllowMockLocation = (CheckBoxPreference) findPreference(ALLOW_MOCK_LOCATION);
66f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani
67f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        removeHdcpOptionsForProduction();
68f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    }
69f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani
70f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    private void removeHdcpOptionsForProduction() {
71f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        if ("user".equals(Build.TYPE)) {
72f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            Preference hdcpChecking = findPreference(HDCP_CHECKING_KEY);
73f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            if (hdcpChecking != null) {
74f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                // Remove the preference
75f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                getPreferenceScreen().removePreference(hdcpChecking);
76f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            }
77f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        }
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
81ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onResume() {
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
8350cb76f58554dbccc51a754a73abef2debd8b721Ying Wang
84ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        final ContentResolver cr = getActivity().getContentResolver();
85ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mEnableAdb.setChecked(Settings.Secure.getInt(cr,
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.Secure.ADB_ENABLED, 0) != 0);
87ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mKeepScreenOn.setChecked(Settings.System.getInt(cr,
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0) != 0);
89ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mAllowMockLocation.setChecked(Settings.Secure.getInt(cr,
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0);
91f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        updateHdcpValues();
92f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    }
93f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani
94f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    private void updateHdcpValues() {
95f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values
96f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY);
97f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        if (hdcpChecking != null) {
98f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            String currentValue = SystemProperties.get(HDCP_CHECKING_PROPERTY);
99f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            String[] values = getResources().getStringArray(R.array.hdcp_checking_values);
100f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            String[] summaries = getResources().getStringArray(R.array.hdcp_checking_summaries);
101f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            for (int i = 0; i < values.length; i++) {
102f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                if (currentValue.equals(values[i])) {
103f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                    index = i;
104f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                    break;
105f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                }
106f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            }
107f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            hdcpChecking.setValue(values[index]);
108f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            hdcpChecking.setSummary(summaries[index]);
109f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            hdcpChecking.setOnPreferenceChangeListener(this);
110f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        }
111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
116a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang        if (Utils.isMonkeyRunning()) {
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference == mEnableAdb) {
121b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            if (mEnableAdb.isChecked()) {
122b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood                mOkClicked = false;
12324bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani                if (mOkDialog != null) dismissDialog();
124ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                mOkDialog = new AlertDialog.Builder(getActivity()).setMessage(
125ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                        getActivity().getResources().getString(R.string.adb_warning_message))
126b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood                        .setTitle(R.string.adb_warning_title)
127b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood                        .setIcon(android.R.drawable.ic_dialog_alert)
128b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood                        .setPositiveButton(android.R.string.yes, this)
129b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood                        .setNegativeButton(android.R.string.no, this)
13024bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani                        .show();
13124bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani                mOkDialog.setOnDismissListener(this);
132b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            } else {
133ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                Settings.Secure.putInt(getActivity().getContentResolver(),
134ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                        Settings.Secure.ADB_ENABLED, 0);
135b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            }
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mKeepScreenOn) {
137ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            Settings.System.putInt(getActivity().getContentResolver(),
138ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    Settings.System.STAY_ON_WHILE_PLUGGED_IN,
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mKeepScreenOn.isChecked() ?
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0);
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mAllowMockLocation) {
142ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            Settings.Secure.putInt(getActivity().getContentResolver(),
143ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    Settings.Secure.ALLOW_MOCK_LOCATION,
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mAllowMockLocation.isChecked() ? 1 : 0);
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
14624bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return false;
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
149b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood
15024bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    private void dismissDialog() {
1518ccb9e0d33dcba1bd9f26e54d7066397e47a74a9Amith Yamasani        if (mOkDialog == null) return;
15224bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani        mOkDialog.dismiss();
15324bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani        mOkDialog = null;
15424bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    }
15524bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani
156b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    public void onClick(DialogInterface dialog, int which) {
157b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        if (which == DialogInterface.BUTTON_POSITIVE) {
158b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            mOkClicked = true;
159ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            Settings.Secure.putInt(getActivity().getContentResolver(),
160ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    Settings.Secure.ADB_ENABLED, 1);
161b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        } else {
162b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            // Reset the toggle
163b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            mEnableAdb.setChecked(false);
164b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        }
165b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    }
166b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood
167b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    public void onDismiss(DialogInterface dialog) {
168b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        // Assuming that onClick gets called first
169b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        if (!mOkClicked) {
170b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            mEnableAdb.setChecked(false);
171b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        }
172b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    }
17324bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani
17424bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    @Override
17524bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    public void onDestroy() {
17624bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani        dismissDialog();
17724bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani        super.onDestroy();
17824bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    }
179f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani
180f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    @Override
181f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    public boolean onPreferenceChange(Preference preference, Object newValue) {
182f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        if (HDCP_CHECKING_KEY.equals(preference.getKey())) {
183f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString());
184f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            updateHdcpValues();
185f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            return true;
186f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        }
187f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        return false;
188f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    }
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
190