OSDN Git Service

Merge "Disable tethering checkbox when USB mass storage is active."
[android-x86/packages-apps-Settings.git] / src / com / android / settings / TetherSettings.java
1 /*
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
17 package com.android.settings;
18
19 import android.os.Bundle;
20 import android.os.SystemProperties;
21 import android.content.BroadcastReceiver;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.content.IntentFilter;
25 import android.net.ConnectivityManager;
26 import android.os.Environment;
27 import android.preference.Preference;
28 import android.preference.PreferenceActivity;
29 import android.preference.PreferenceScreen;
30 import android.preference.CheckBoxPreference;
31 import android.provider.Settings;
32 import android.util.Log;
33
34 import java.util.ArrayList;
35 /*
36  * Displays preferences for Tethering.
37  */
38 public 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
48     private String[] mUsbRegexs;
49     private ArrayList mUsbIfaces;
50
51     private String[] mWifiRegexs;
52     private ArrayList mWifiIfaces;
53
54     @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);
62
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();
71     }
72
73
74     private class TetherChangeReceiver extends BroadcastReceiver {
75         public void onReceive(Context content, Intent intent) {
76             // 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);
81
82             updateState(available, active);
83         }
84     }
85
86     @Override
87     protected void onResume() {
88         super.onResume();
89         mEnableTetherNotice.setChecked(Settings.Secure.getInt(getContentResolver(),
90                 Settings.Secure.TETHER_NOTIFY, 0) != 0);
91
92         IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
93         filter.addAction(Intent.ACTION_MEDIA_SHARED);
94         filter.addAction(Intent.ACTION_MEDIA_UNSHARED);
95         mTetherChangeReceiver = new TetherChangeReceiver();
96         Intent intent = registerReceiver(mTetherChangeReceiver, filter);
97
98         if (intent != null) mTetherChangeReceiver.onReceive(this, intent);
99     }
100
101     @Override
102     protected void onPause() {
103         super.onPause();
104         unregisterReceiver(mTetherChangeReceiver);
105         mTetherChangeReceiver = null;
106     }
107
108     private void updateState(ArrayList<String> available, ArrayList<String> tethered) {
109         boolean usbTethered = false;
110         boolean usbAvailable = false;
111         boolean wifiTethered = false;
112         boolean wifiAvailable = false;
113         boolean massStorageActive =
114                 Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState());
115
116         for (String s : available) {
117             for (String regex : mUsbRegexs) {
118                 if (s.matches(regex)) usbAvailable = true;
119             }
120             for (String regex : mWifiRegexs) {
121                 if (s.matches(regex)) wifiAvailable = true;
122             }
123         }
124         for (String s : tethered) {
125             for (String regex : mUsbRegexs) {
126                 if (s.matches(regex)) usbTethered = true;
127             }
128             for (String regex : mWifiRegexs) {
129                 if (s.matches(regex)) wifiTethered = true;
130             }
131         }
132
133         if (usbTethered) {
134             mUsbTether.setSummary(R.string.usb_tethering_active_subtext);
135             mUsbTether.setEnabled(true);
136         } else if (massStorageActive) {
137             mUsbTether.setSummary(R.string.usb_tethering_storage_active_subtext);
138             mUsbTether.setEnabled(false);
139         } else if (usbAvailable) {
140             mUsbTether.setSummary(R.string.usb_tethering_available_subtext);
141             mUsbTether.setEnabled(true);
142         } else {
143             mUsbTether.setSummary(R.string.usb_tethering_unavailable_subtext);
144             mUsbTether.setEnabled(false);
145         }
146     }
147
148     @Override
149     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
150
151         if (preference == mEnableTetherNotice) {
152             boolean newState = mEnableTetherNotice.isChecked();
153             Settings.Secure.putInt(getContentResolver(),
154                     Settings.Secure.TETHER_NOTIFY, newState ? 1 : 0);
155             return true;
156         }
157         return false;
158     }
159
160 }