Loading core/java/android/net/ConnectivityManager.java +62 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,24 @@ public class ConnectivityManager public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; /** * Broadcast Action: A tetherable connection has come or gone * TODO - finish the doc * @hide */ public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; /** * @hide */ public static final String EXTRA_AVAILABLE_TETHER_COUNT = "availableCount"; /** * @hide */ public static final String EXTRA_ACTIVE_TETHER_COUNT = "activeCount"; /** * The Default Mobile data connection. When active, all data traffic * will use this connection by default. Should not coexist with other Loading Loading @@ -338,4 +356,48 @@ public class ConnectivityManager } mService = service; } /** * {@hide} */ public String[] getTetherableIfaces() { try { return mService.getTetherableIfaces(); } catch (RemoteException e) { return new String[0]; } } /** * {@hide} */ public String[] getTetheredIfaces() { try { return mService.getTetheredIfaces(); } catch (RemoteException e) { return new String[0]; } } /** * {@hide} */ public boolean tether(String iface) { try { return mService.tether(iface); } catch (RemoteException e) { return false; } } /** * {@hide} */ public boolean untether(String iface) { try { return mService.untether(iface); } catch (RemoteException e) { return false; } } } core/java/android/net/IConnectivityManager.aidl +8 −0 Original line number Diff line number Diff line Loading @@ -50,4 +50,12 @@ interface IConnectivityManager boolean getBackgroundDataSetting(); void setBackgroundDataSetting(boolean allowBackgroundData); boolean tether(String iface); boolean untether(String iface); String[] getTetherableIfaces(); String[] getTetheredIfaces(); } core/java/android/os/INetworkManagementService.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -140,7 +140,8 @@ interface INetworkManagementService * Attaches a PPP server daemon to the specified TTY with the specified * local/remote addresses. */ void attachPppd(String tty, String localAddr, String remoteAddr); void attachPppd(String tty, String localAddr, String remoteAddr, String dns1Addr, String dns2Addr); /** * Detaches a PPP server daemon from the specified TTY. Loading core/java/android/provider/Settings.java +7 −0 Original line number Diff line number Diff line Loading @@ -2943,6 +2943,13 @@ public final class Settings { */ public static final String MOUNT_UMS_NOTIFY_ENABLED = "mount_ums_notify_enabled"; /** * Whether or not a notification is displayed when a Tetherable interface is detected. * (0 = false, 1 = true) * @hide */ public static final String TETHER_NOTIFY = "tether_notify"; /** * If nonzero, ANRs in invisible background processes bring up a dialog. * Otherwise, the process will be silently killed. Loading core/java/com/android/internal/app/TetherActivity.java 0 → 100644 +151 −0 Original line number Diff line number Diff line /* * Copyright (C) 2007 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.app; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.os.Bundle; import android.os.Handler; import android.os.IMountService; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.widget.Toast; import android.util.Log; /** * This activity is shown to the user for him/her to connect/disconnect a Tether * connection. It will display notification when a suitable connection is made * to allow the tether to be setup. A second notification will be show when a * tether is active, allowing the user to manage tethered connections. */ public class TetherActivity extends AlertActivity implements DialogInterface.OnClickListener { private static final int POSITIVE_BUTTON = AlertDialog.BUTTON1; /* Used to detect when the USB cable is unplugged, so we can call finish() */ private BroadcastReceiver mTetherReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() == ConnectivityManager.ACTION_TETHER_STATE_CHANGED) { handleTetherStateChanged(intent); } } }; private boolean mWantTethering; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // determine if we advertise tethering or untethering ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); if (cm.getTetheredIfaces().length > 0) { mWantTethering = false; } else if (cm.getTetherableIfaces().length > 0) { mWantTethering = true; } else { finish(); return; } // Set up the "dialog" if (mWantTethering == true) { mAlertParams.mIconId = com.android.internal.R.drawable.ic_dialog_usb; mAlertParams.mTitle = getString(com.android.internal.R.string.tether_title); mAlertParams.mMessage = getString(com.android.internal.R.string.tether_message); mAlertParams.mPositiveButtonText = getString(com.android.internal.R.string.tether_button); mAlertParams.mPositiveButtonListener = this; mAlertParams.mNegativeButtonText = getString(com.android.internal.R.string.tether_button_cancel); mAlertParams.mNegativeButtonListener = this; } else { mAlertParams.mIconId = com.android.internal.R.drawable.ic_dialog_usb; mAlertParams.mTitle = getString(com.android.internal.R.string.tether_stop_title); mAlertParams.mMessage = getString(com.android.internal.R.string.tether_stop_message); mAlertParams.mPositiveButtonText = getString(com.android.internal.R.string.tether_stop_button); mAlertParams.mPositiveButtonListener = this; mAlertParams.mNegativeButtonText = getString(com.android.internal.R.string.tether_stop_button_cancel); mAlertParams.mNegativeButtonListener = this; } setupAlert(); } @Override protected void onResume() { super.onResume(); registerReceiver(mTetherReceiver, new IntentFilter( ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); } @Override protected void onPause() { super.onPause(); unregisterReceiver(mTetherReceiver); } /** * {@inheritDoc} */ public void onClick(DialogInterface dialog, int which) { if (which == POSITIVE_BUTTON) { ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); // start/stop tethering if (mWantTethering) { if (!connManager.tether("ppp0")) { showTetheringError(); } } else { if (!connManager.untether("ppp0")) { showUnTetheringError(); } } } // No matter what, finish the activity finish(); } private void handleTetherStateChanged(Intent intent) { finish(); } private void showTetheringError() { Toast.makeText(this, com.android.internal.R.string.tether_error_message, Toast.LENGTH_LONG).show(); } private void showUnTetheringError() { Toast.makeText(this, com.android.internal.R.string.tether_stop_error_message, Toast.LENGTH_LONG).show(); } } Loading
core/java/android/net/ConnectivityManager.java +62 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,24 @@ public class ConnectivityManager public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; /** * Broadcast Action: A tetherable connection has come or gone * TODO - finish the doc * @hide */ public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; /** * @hide */ public static final String EXTRA_AVAILABLE_TETHER_COUNT = "availableCount"; /** * @hide */ public static final String EXTRA_ACTIVE_TETHER_COUNT = "activeCount"; /** * The Default Mobile data connection. When active, all data traffic * will use this connection by default. Should not coexist with other Loading Loading @@ -338,4 +356,48 @@ public class ConnectivityManager } mService = service; } /** * {@hide} */ public String[] getTetherableIfaces() { try { return mService.getTetherableIfaces(); } catch (RemoteException e) { return new String[0]; } } /** * {@hide} */ public String[] getTetheredIfaces() { try { return mService.getTetheredIfaces(); } catch (RemoteException e) { return new String[0]; } } /** * {@hide} */ public boolean tether(String iface) { try { return mService.tether(iface); } catch (RemoteException e) { return false; } } /** * {@hide} */ public boolean untether(String iface) { try { return mService.untether(iface); } catch (RemoteException e) { return false; } } }
core/java/android/net/IConnectivityManager.aidl +8 −0 Original line number Diff line number Diff line Loading @@ -50,4 +50,12 @@ interface IConnectivityManager boolean getBackgroundDataSetting(); void setBackgroundDataSetting(boolean allowBackgroundData); boolean tether(String iface); boolean untether(String iface); String[] getTetherableIfaces(); String[] getTetheredIfaces(); }
core/java/android/os/INetworkManagementService.aidl +2 −1 Original line number Diff line number Diff line Loading @@ -140,7 +140,8 @@ interface INetworkManagementService * Attaches a PPP server daemon to the specified TTY with the specified * local/remote addresses. */ void attachPppd(String tty, String localAddr, String remoteAddr); void attachPppd(String tty, String localAddr, String remoteAddr, String dns1Addr, String dns2Addr); /** * Detaches a PPP server daemon from the specified TTY. Loading
core/java/android/provider/Settings.java +7 −0 Original line number Diff line number Diff line Loading @@ -2943,6 +2943,13 @@ public final class Settings { */ public static final String MOUNT_UMS_NOTIFY_ENABLED = "mount_ums_notify_enabled"; /** * Whether or not a notification is displayed when a Tetherable interface is detected. * (0 = false, 1 = true) * @hide */ public static final String TETHER_NOTIFY = "tether_notify"; /** * If nonzero, ANRs in invisible background processes bring up a dialog. * Otherwise, the process will be silently killed. Loading
core/java/com/android/internal/app/TetherActivity.java 0 → 100644 +151 −0 Original line number Diff line number Diff line /* * Copyright (C) 2007 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.app; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.os.Bundle; import android.os.Handler; import android.os.IMountService; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.widget.Toast; import android.util.Log; /** * This activity is shown to the user for him/her to connect/disconnect a Tether * connection. It will display notification when a suitable connection is made * to allow the tether to be setup. A second notification will be show when a * tether is active, allowing the user to manage tethered connections. */ public class TetherActivity extends AlertActivity implements DialogInterface.OnClickListener { private static final int POSITIVE_BUTTON = AlertDialog.BUTTON1; /* Used to detect when the USB cable is unplugged, so we can call finish() */ private BroadcastReceiver mTetherReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() == ConnectivityManager.ACTION_TETHER_STATE_CHANGED) { handleTetherStateChanged(intent); } } }; private boolean mWantTethering; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // determine if we advertise tethering or untethering ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); if (cm.getTetheredIfaces().length > 0) { mWantTethering = false; } else if (cm.getTetherableIfaces().length > 0) { mWantTethering = true; } else { finish(); return; } // Set up the "dialog" if (mWantTethering == true) { mAlertParams.mIconId = com.android.internal.R.drawable.ic_dialog_usb; mAlertParams.mTitle = getString(com.android.internal.R.string.tether_title); mAlertParams.mMessage = getString(com.android.internal.R.string.tether_message); mAlertParams.mPositiveButtonText = getString(com.android.internal.R.string.tether_button); mAlertParams.mPositiveButtonListener = this; mAlertParams.mNegativeButtonText = getString(com.android.internal.R.string.tether_button_cancel); mAlertParams.mNegativeButtonListener = this; } else { mAlertParams.mIconId = com.android.internal.R.drawable.ic_dialog_usb; mAlertParams.mTitle = getString(com.android.internal.R.string.tether_stop_title); mAlertParams.mMessage = getString(com.android.internal.R.string.tether_stop_message); mAlertParams.mPositiveButtonText = getString(com.android.internal.R.string.tether_stop_button); mAlertParams.mPositiveButtonListener = this; mAlertParams.mNegativeButtonText = getString(com.android.internal.R.string.tether_stop_button_cancel); mAlertParams.mNegativeButtonListener = this; } setupAlert(); } @Override protected void onResume() { super.onResume(); registerReceiver(mTetherReceiver, new IntentFilter( ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); } @Override protected void onPause() { super.onPause(); unregisterReceiver(mTetherReceiver); } /** * {@inheritDoc} */ public void onClick(DialogInterface dialog, int which) { if (which == POSITIVE_BUTTON) { ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); // start/stop tethering if (mWantTethering) { if (!connManager.tether("ppp0")) { showTetheringError(); } } else { if (!connManager.untether("ppp0")) { showUnTetheringError(); } } } // No matter what, finish the activity finish(); } private void handleTetherStateChanged(Intent intent) { finish(); } private void showTetheringError() { Toast.makeText(this, com.android.internal.R.string.tether_error_message, Toast.LENGTH_LONG).show(); } private void showUnTetheringError() { Toast.makeText(this, com.android.internal.R.string.tether_stop_error_message, Toast.LENGTH_LONG).show(); } }