blob: ec552a55bcf35e4696c3af7532e90af8548527d2 [file] [log] [blame]
Robert Greenwalt3901edb2010-01-26 10:22:37 -08001/*
2 * Copyright (C) 2008 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.os.Bundle;
20import android.os.SystemProperties;
21import android.content.BroadcastReceiver;
22import android.content.Context;
23import android.content.Intent;
24import android.content.IntentFilter;
25import android.net.ConnectivityManager;
Mike Lockwood26dad3e2010-03-03 06:19:55 -050026import android.os.Environment;
Robert Greenwalt3901edb2010-01-26 10:22:37 -080027import android.preference.Preference;
28import android.preference.PreferenceActivity;
29import android.preference.PreferenceScreen;
30import android.preference.CheckBoxPreference;
31import android.provider.Settings;
32import android.util.Log;
33
Robert Greenwaltc4764d22010-02-12 14:21:37 -080034import java.util.ArrayList;
Robert Greenwalt3901edb2010-01-26 10:22:37 -080035/*
36 * Displays preferences for Tethering.
37 */
38public class TetherSettings extends PreferenceActivity {
39
40 private static final String ENABLE_TETHER_NOTICE = "enable_tether_notice";
41 private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
42
43 private CheckBoxPreference mEnableTetherNotice;
44 private PreferenceScreen mUsbTether;
45
46 private BroadcastReceiver mTetherChangeReceiver;
47
Robert Greenwaltc4764d22010-02-12 14:21:37 -080048 private String[] mUsbRegexs;
49 private ArrayList mUsbIfaces;
50
51 private String[] mWifiRegexs;
52 private ArrayList mWifiIfaces;
53
Robert Greenwalt3901edb2010-01-26 10:22:37 -080054 @Override
55 protected void onCreate(Bundle icicle) {
56 super.onCreate(icicle);
57
58 addPreferencesFromResource(R.xml.tether_prefs);
59
60 mEnableTetherNotice = (CheckBoxPreference) findPreference(ENABLE_TETHER_NOTICE);
61 mUsbTether = (PreferenceScreen) findPreference(USB_TETHER_SETTINGS);
Robert Greenwaltc4764d22010-02-12 14:21:37 -080062
63 ConnectivityManager cm =
64 (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
65 mUsbRegexs = cm.getTetherableUsbRegexs();
66 if (mUsbRegexs.length == 0) {
67 getPreferenceScreen().removePreference(mUsbTether);
68 getPreferenceScreen().removePreference(mEnableTetherNotice);
69 }
70 mWifiRegexs = cm.getTetherableWifiRegexs();
Robert Greenwalt3901edb2010-01-26 10:22:37 -080071 }
72
Robert Greenwaltc4764d22010-02-12 14:21:37 -080073
Robert Greenwalt3901edb2010-01-26 10:22:37 -080074 private class TetherChangeReceiver extends BroadcastReceiver {
75 public void onReceive(Context content, Intent intent) {
Robert Greenwaltc4764d22010-02-12 14:21:37 -080076 // TODO - this should understand the interface types
77 ArrayList<String> available = intent.getStringArrayListExtra(
78 ConnectivityManager.EXTRA_AVAILABLE_TETHER);
79 ArrayList<String> active = intent.getStringArrayListExtra(
80 ConnectivityManager.EXTRA_ACTIVE_TETHER);
Robert Greenwaltd5f121c2010-03-02 17:33:11 -080081 ArrayList<String> errored = intent.getStringArrayListExtra(
82 ConnectivityManager.EXTRA_ERRORED_TETHER);
Robert Greenwaltc4764d22010-02-12 14:21:37 -080083
Robert Greenwaltd5f121c2010-03-02 17:33:11 -080084 updateState(available, active, errored);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080085 }
86 }
87
88 @Override
89 protected void onResume() {
90 super.onResume();
91 mEnableTetherNotice.setChecked(Settings.Secure.getInt(getContentResolver(),
92 Settings.Secure.TETHER_NOTIFY, 0) != 0);
93
94 IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
Mike Lockwood26dad3e2010-03-03 06:19:55 -050095 filter.addAction(Intent.ACTION_MEDIA_SHARED);
96 filter.addAction(Intent.ACTION_MEDIA_UNSHARED);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080097 mTetherChangeReceiver = new TetherChangeReceiver();
Robert Greenwaltc4764d22010-02-12 14:21:37 -080098 Intent intent = registerReceiver(mTetherChangeReceiver, filter);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080099
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800100 if (intent != null) mTetherChangeReceiver.onReceive(this, intent);
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800101 }
102
103 @Override
104 protected void onPause() {
105 super.onPause();
106 unregisterReceiver(mTetherChangeReceiver);
107 mTetherChangeReceiver = null;
108 }
109
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800110 private void updateState(ArrayList<String> available, ArrayList<String> tethered,
111 ArrayList<String> errored) {
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800112 boolean usbTethered = false;
113 boolean usbAvailable = false;
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800114 boolean usbErrored = false;
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800115 boolean wifiTethered = false;
116 boolean wifiAvailable = false;
Mike Lockwood26dad3e2010-03-03 06:19:55 -0500117 boolean massStorageActive =
118 Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState());
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800119 boolean wifiErrored = false;
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800120
121 for (String s : available) {
122 for (String regex : mUsbRegexs) {
123 if (s.matches(regex)) usbAvailable = true;
124 }
125 for (String regex : mWifiRegexs) {
126 if (s.matches(regex)) wifiAvailable = true;
127 }
128 }
129 for (String s : tethered) {
130 for (String regex : mUsbRegexs) {
131 if (s.matches(regex)) usbTethered = true;
132 }
133 for (String regex : mWifiRegexs) {
134 if (s.matches(regex)) wifiTethered = true;
135 }
136 }
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800137 for (String s: errored) {
138 for (String regex : mUsbRegexs) {
139 if (s.matches(regex)) usbErrored = true;
140 }
141 for (String regex : mWifiRegexs) {
142 if (s.matches(regex)) wifiErrored = true;
143 }
144 }
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800145
146 if (usbTethered) {
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800147 mUsbTether.setSummary(R.string.usb_tethering_active_subtext);
148 mUsbTether.setEnabled(true);
Mike Lockwood26dad3e2010-03-03 06:19:55 -0500149 } else if (massStorageActive) {
150 mUsbTether.setSummary(R.string.usb_tethering_storage_active_subtext);
151 mUsbTether.setEnabled(false);
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800152 } else if (usbAvailable) {
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800153 mUsbTether.setSummary(R.string.usb_tethering_available_subtext);
154 mUsbTether.setEnabled(true);
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800155 } else if (usbErrored) {
156 mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
157 mUsbTether.setEnabled(false);
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800158 } else {
159 mUsbTether.setSummary(R.string.usb_tethering_unavailable_subtext);
160 mUsbTether.setEnabled(false);
161 }
162 }
163
164 @Override
165 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
166
167 if (preference == mEnableTetherNotice) {
168 boolean newState = mEnableTetherNotice.isChecked();
169 Settings.Secure.putInt(getContentResolver(),
170 Settings.Secure.TETHER_NOTIFY, newState ? 1 : 0);
171 return true;
172 }
173 return false;
174 }
175
176}