WirelessSettings.java revision 32711b6752eb73324e1b10db975ac956888eda96
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings;
18
19import android.app.admin.DevicePolicyManager;
20import android.bluetooth.BluetoothAdapter;
21import android.content.Context;
22import android.content.Intent;
23import android.net.ConnectivityManager;
24import android.net.wifi.WifiManager;
25import android.os.Bundle;
26import android.os.ServiceManager;
27import android.os.SystemProperties;
28import android.preference.CheckBoxPreference;
29import android.preference.Preference;
30import android.preference.PreferenceActivity;
31import android.preference.PreferenceScreen;
32import android.provider.Settings;
33import android.util.Log;
34
35import com.android.internal.telephony.TelephonyIntents;
36import com.android.internal.telephony.TelephonyProperties;
37import com.android.settings.bluetooth.BluetoothEnabler;
38import com.android.settings.wifi.WifiEnabler;
39
40public class WirelessSettings extends PreferenceActivity {
41
42    private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane";
43    private static final String KEY_TOGGLE_BLUETOOTH = "toggle_bluetooth";
44    private static final String KEY_TOGGLE_WIFI = "toggle_wifi";
45    private static final String KEY_WIFI_SETTINGS = "wifi_settings";
46    private static final String KEY_BT_SETTINGS = "bt_settings";
47    private static final String KEY_VPN_SETTINGS = "vpn_settings";
48    private static final String KEY_TETHER_SETTINGS = "tether_settings";
49    private static final String KEY_PROXY_SETTINGS = "proxy_settings";
50    public static final String EXIT_ECM_RESULT = "exit_ecm_result";
51    public static final int REQUEST_CODE_EXIT_ECM = 1;
52
53    private AirplaneModeEnabler mAirplaneModeEnabler;
54    private CheckBoxPreference mAirplaneModePreference;
55    private WifiEnabler mWifiEnabler;
56    private BluetoothEnabler mBtEnabler;
57
58    /**
59     * Invoked on each preference click in this hierarchy, overrides
60     * PreferenceActivity's implementation.  Used to make sure we track the
61     * preference click events.
62     */
63    @Override
64    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
65        if (preference == mAirplaneModePreference && Boolean.parseBoolean(
66                SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
67            // In ECM mode launch ECM app dialog
68            startActivityForResult(
69                new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
70                REQUEST_CODE_EXIT_ECM);
71            return true;
72        }
73        // Let the intents be launched by the Preference manager
74        return false;
75    }
76
77    public static boolean isRadioAllowed(Context context, String type) {
78        if (!AirplaneModeEnabler.isAirplaneModeOn(context)) {
79            return true;
80        }
81        // Here we use the same logic in onCreate().
82        String toggleable = Settings.System.getString(context.getContentResolver(),
83                Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
84        return toggleable != null && toggleable.contains(type);
85    }
86
87    @Override
88    protected void onCreate(Bundle savedInstanceState) {
89        super.onCreate(savedInstanceState);
90
91        addPreferencesFromResource(R.xml.wireless_settings);
92
93        CheckBoxPreference airplane = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE);
94        CheckBoxPreference wifi = (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI);
95        CheckBoxPreference bt = (CheckBoxPreference) findPreference(KEY_TOGGLE_BLUETOOTH);
96
97        mAirplaneModeEnabler = new AirplaneModeEnabler(this, airplane);
98        mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE);
99        mWifiEnabler = new WifiEnabler(this, wifi);
100        mBtEnabler = new BluetoothEnabler(this, bt);
101
102        String toggleable = Settings.System.getString(getContentResolver(),
103                Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
104
105        // Manually set dependencies for Wifi when not toggleable.
106        if (toggleable == null || !toggleable.contains(Settings.System.RADIO_WIFI)) {
107            wifi.setDependency(KEY_TOGGLE_AIRPLANE);
108            findPreference(KEY_WIFI_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE);
109            findPreference(KEY_VPN_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE);
110        }
111
112        // Manually set dependencies for Bluetooth when not toggleable.
113        if (toggleable == null || !toggleable.contains(Settings.System.RADIO_BLUETOOTH)) {
114            bt.setDependency(KEY_TOGGLE_AIRPLANE);
115            findPreference(KEY_BT_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE);
116        }
117
118        // Disable Bluetooth Settings if Bluetooth service is not available.
119        if (ServiceManager.getService(BluetoothAdapter.BLUETOOTH_SERVICE) == null) {
120            findPreference(KEY_BT_SETTINGS).setEnabled(false);
121        }
122
123        // Enable Proxy selector settings if allowed.
124        Preference mGlobalProxy = findPreference(KEY_PROXY_SETTINGS);
125        DevicePolicyManager mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
126        mGlobalProxy.setEnabled(mDPM.getGlobalProxyAdmin() == null);
127
128        // Disable Tethering if it's not allowed
129        ConnectivityManager cm =
130                (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
131        if (!cm.isTetheringSupported()) {
132            getPreferenceScreen().removePreference(findPreference(KEY_TETHER_SETTINGS));
133        } else {
134            String[] usbRegexs = cm.getTetherableUsbRegexs();
135            String[] wifiRegexs = cm.getTetherableWifiRegexs();
136            String[] bluetoothRegexs = cm.getTetherableBluetoothRegexs();
137
138            boolean usbAvailable = usbRegexs.length != 0;
139            boolean wifiAvailable = wifiRegexs.length != 0;
140            boolean bluetoothAvailable = bluetoothRegexs.length != 0;
141
142            Preference p = findPreference(KEY_TETHER_SETTINGS);
143            if (wifiAvailable && usbAvailable && bluetoothAvailable) {
144                p.setTitle(R.string.tether_settings_title_all);
145                p.setSummary(R.string.tether_settings_summary_all);
146            } else if (wifiAvailable && usbAvailable) {
147                p.setTitle(R.string.tether_settings_title_all);
148                p.setSummary(R.string.tether_settings_summary_usb_wifi);
149            } else if (wifiAvailable && bluetoothAvailable) {
150                p.setTitle(R.string.tether_settings_title_all);
151                p.setSummary(R.string.tether_settings_summary_wifi_bluetooth);
152            } else if (wifiAvailable) {
153                p.setTitle(R.string.tether_settings_title_wifi);
154                p.setSummary(R.string.tether_settings_summary_wifi);
155            } else if (usbAvailable && bluetoothAvailable) {
156                p.setTitle(R.string.tether_settings_title_usb_bluetooth);
157                p.setSummary(R.string.tether_settings_summary_usb_bluetooth);
158            } else if (usbAvailable) {
159                p.setTitle(R.string.tether_settings_title_usb);
160                p.setSummary(R.string.tether_settings_summary_usb);
161            } else {
162                p.setTitle(R.string.tether_settings_title_bluetooth);
163                p.setSummary(R.string.tether_settings_summary_bluetooth);
164            }
165        }
166    }
167
168    @Override
169    protected void onResume() {
170        super.onResume();
171
172        mAirplaneModeEnabler.resume();
173        mWifiEnabler.resume();
174        mBtEnabler.resume();
175    }
176
177    @Override
178    protected void onPause() {
179        super.onPause();
180
181        mAirplaneModeEnabler.pause();
182        mWifiEnabler.pause();
183        mBtEnabler.pause();
184    }
185
186    @Override
187    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
188        if (requestCode == REQUEST_CODE_EXIT_ECM) {
189            Boolean isChoiceYes = data.getBooleanExtra(EXIT_ECM_RESULT, false);
190            // Set Airplane mode based on the return value and checkbox state
191            mAirplaneModeEnabler.setAirplaneModeInECM(isChoiceYes,
192                    mAirplaneModePreference.isChecked());
193        }
194    }
195}
196