blob: 3e41bb8e0f2c53b85b7d3e637a01275e71afae82 [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 {
Robert Greenwalt3901edb2010-01-26 10:22:37 -080039 private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
40
Robert Greenwalt3901edb2010-01-26 10:22:37 -080041 private PreferenceScreen mUsbTether;
42
43 private BroadcastReceiver mTetherChangeReceiver;
44
Robert Greenwaltc4764d22010-02-12 14:21:37 -080045 private String[] mUsbRegexs;
46 private ArrayList mUsbIfaces;
47
48 private String[] mWifiRegexs;
49 private ArrayList mWifiIfaces;
50
Robert Greenwalt3901edb2010-01-26 10:22:37 -080051 @Override
52 protected void onCreate(Bundle icicle) {
53 super.onCreate(icicle);
54
55 addPreferencesFromResource(R.xml.tether_prefs);
56
Robert Greenwalt3901edb2010-01-26 10:22:37 -080057 mUsbTether = (PreferenceScreen) findPreference(USB_TETHER_SETTINGS);
Robert Greenwaltc4764d22010-02-12 14:21:37 -080058
59 ConnectivityManager cm =
60 (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
61 mUsbRegexs = cm.getTetherableUsbRegexs();
62 if (mUsbRegexs.length == 0) {
63 getPreferenceScreen().removePreference(mUsbTether);
Robert Greenwaltc4764d22010-02-12 14:21:37 -080064 }
65 mWifiRegexs = cm.getTetherableWifiRegexs();
Robert Greenwalt3901edb2010-01-26 10:22:37 -080066 }
67
Robert Greenwaltc4764d22010-02-12 14:21:37 -080068
Robert Greenwalt3901edb2010-01-26 10:22:37 -080069 private class TetherChangeReceiver extends BroadcastReceiver {
70 public void onReceive(Context content, Intent intent) {
Robert Greenwaltc4764d22010-02-12 14:21:37 -080071 // TODO - this should understand the interface types
72 ArrayList<String> available = intent.getStringArrayListExtra(
73 ConnectivityManager.EXTRA_AVAILABLE_TETHER);
74 ArrayList<String> active = intent.getStringArrayListExtra(
75 ConnectivityManager.EXTRA_ACTIVE_TETHER);
Robert Greenwaltd5f121c2010-03-02 17:33:11 -080076 ArrayList<String> errored = intent.getStringArrayListExtra(
77 ConnectivityManager.EXTRA_ERRORED_TETHER);
Robert Greenwaltc4764d22010-02-12 14:21:37 -080078
Robert Greenwaltd5f121c2010-03-02 17:33:11 -080079 updateState(available, active, errored);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080080 }
81 }
82
83 @Override
84 protected void onResume() {
85 super.onResume();
Robert Greenwalt3901edb2010-01-26 10:22:37 -080086
87 IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
Mike Lockwood26dad3e2010-03-03 06:19:55 -050088 filter.addAction(Intent.ACTION_MEDIA_SHARED);
89 filter.addAction(Intent.ACTION_MEDIA_UNSHARED);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080090 mTetherChangeReceiver = new TetherChangeReceiver();
Robert Greenwaltc4764d22010-02-12 14:21:37 -080091 Intent intent = registerReceiver(mTetherChangeReceiver, filter);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080092
Robert Greenwaltc4764d22010-02-12 14:21:37 -080093 if (intent != null) mTetherChangeReceiver.onReceive(this, intent);
Robert Greenwalt3901edb2010-01-26 10:22:37 -080094 }
95
96 @Override
97 protected void onPause() {
98 super.onPause();
99 unregisterReceiver(mTetherChangeReceiver);
100 mTetherChangeReceiver = null;
101 }
102
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800103 private void updateState(ArrayList<String> available, ArrayList<String> tethered,
104 ArrayList<String> errored) {
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800105 boolean usbTethered = false;
106 boolean usbAvailable = false;
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800107 boolean usbErrored = false;
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800108 boolean wifiTethered = false;
109 boolean wifiAvailable = false;
Mike Lockwood26dad3e2010-03-03 06:19:55 -0500110 boolean massStorageActive =
111 Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState());
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800112 boolean wifiErrored = false;
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800113
114 for (String s : available) {
115 for (String regex : mUsbRegexs) {
116 if (s.matches(regex)) usbAvailable = true;
117 }
118 for (String regex : mWifiRegexs) {
119 if (s.matches(regex)) wifiAvailable = true;
120 }
121 }
122 for (String s : tethered) {
123 for (String regex : mUsbRegexs) {
124 if (s.matches(regex)) usbTethered = true;
125 }
126 for (String regex : mWifiRegexs) {
127 if (s.matches(regex)) wifiTethered = true;
128 }
129 }
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800130 for (String s: errored) {
131 for (String regex : mUsbRegexs) {
132 if (s.matches(regex)) usbErrored = true;
133 }
134 for (String regex : mWifiRegexs) {
135 if (s.matches(regex)) wifiErrored = true;
136 }
137 }
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800138
139 if (usbTethered) {
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800140 mUsbTether.setSummary(R.string.usb_tethering_active_subtext);
141 mUsbTether.setEnabled(true);
Mike Lockwood26dad3e2010-03-03 06:19:55 -0500142 } else if (massStorageActive) {
143 mUsbTether.setSummary(R.string.usb_tethering_storage_active_subtext);
144 mUsbTether.setEnabled(false);
Robert Greenwaltc4764d22010-02-12 14:21:37 -0800145 } else if (usbAvailable) {
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800146 mUsbTether.setSummary(R.string.usb_tethering_available_subtext);
147 mUsbTether.setEnabled(true);
Robert Greenwaltd5f121c2010-03-02 17:33:11 -0800148 } else if (usbErrored) {
149 mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
150 mUsbTether.setEnabled(false);
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800151 } else {
152 mUsbTether.setSummary(R.string.usb_tethering_unavailable_subtext);
153 mUsbTether.setEnabled(false);
154 }
155 }
Robert Greenwalt3901edb2010-01-26 10:22:37 -0800156}