aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/org/connectbot/service/ConnectivityReceiver.java
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2014-10-01 23:04:51 +0100
committerKenny Root <kenny@the-b.org>2014-10-01 12:48:19 +0100
commit49b779dcaf03e3598d2709b321e20ea029b25163 (patch)
tree05af547b1f1433d7dd6f7373d0b25a455e053a03 /app/src/main/java/org/connectbot/service/ConnectivityReceiver.java
parentd64786d9197090c74072b648e487e3d34817bb57 (diff)
downloadconnectbot-49b779dcaf03e3598d2709b321e20ea029b25163.tar.gz
connectbot-49b779dcaf03e3598d2709b321e20ea029b25163.tar.bz2
connectbot-49b779dcaf03e3598d2709b321e20ea029b25163.zip
Convert to gradle build system
Diffstat (limited to 'app/src/main/java/org/connectbot/service/ConnectivityReceiver.java')
-rw-r--r--app/src/main/java/org/connectbot/service/ConnectivityReceiver.java154
1 files changed, 154 insertions, 0 deletions
diff --git a/app/src/main/java/org/connectbot/service/ConnectivityReceiver.java b/app/src/main/java/org/connectbot/service/ConnectivityReceiver.java
new file mode 100644
index 0000000..3248a2a
--- /dev/null
+++ b/app/src/main/java/org/connectbot/service/ConnectivityReceiver.java
@@ -0,0 +1,154 @@
+/**
+ *
+ */
+package org.connectbot.service;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.State;
+import android.net.wifi.WifiManager;
+import android.net.wifi.WifiManager.WifiLock;
+import android.util.Log;
+
+/**
+ * @author kroot
+ *
+ */
+public class ConnectivityReceiver extends BroadcastReceiver {
+ private static final String TAG = "ConnectBot.ConnectivityManager";
+
+ private boolean mIsConnected = false;
+
+ final private TerminalManager mTerminalManager;
+
+ final private WifiLock mWifiLock;
+
+ private int mNetworkRef = 0;
+
+ private boolean mLockingWifi;
+
+ private Object[] mLock = new Object[0];
+
+ public ConnectivityReceiver(TerminalManager manager, boolean lockingWifi) {
+ mTerminalManager = manager;
+
+ final ConnectivityManager cm =
+ (ConnectivityManager) manager.getSystemService(Context.CONNECTIVITY_SERVICE);
+
+ final WifiManager wm = (WifiManager) manager.getSystemService(Context.WIFI_SERVICE);
+ mWifiLock = wm.createWifiLock(TAG);
+
+ final NetworkInfo info = cm.getActiveNetworkInfo();
+ if (info != null) {
+ mIsConnected = (info.getState() == State.CONNECTED);
+ }
+
+ mLockingWifi = lockingWifi;
+
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+ manager.registerReceiver(this, filter);
+ }
+
+ /* (non-Javadoc)
+ * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
+ */
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+
+ if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
+ Log.w(TAG, "onReceived() called: " + intent);
+ return;
+ }
+
+ boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
+ boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
+
+ Log.d(TAG, "onReceived() called; noConnectivity? " + noConnectivity + "; isFailover? " + isFailover);
+
+ if (noConnectivity && !isFailover && mIsConnected) {
+ mIsConnected = false;
+ mTerminalManager.onConnectivityLost();
+ } else if (!mIsConnected) {
+ NetworkInfo info = (NetworkInfo) intent.getExtras()
+ .get(ConnectivityManager.EXTRA_NETWORK_INFO);
+
+ if (mIsConnected = (info.getState() == State.CONNECTED)) {
+ mTerminalManager.onConnectivityRestored();
+ }
+ }
+ }
+
+ /**
+ *
+ */
+ public void cleanup() {
+ if (mWifiLock.isHeld())
+ mWifiLock.release();
+
+ mTerminalManager.unregisterReceiver(this);
+ }
+
+ /**
+ * Increase the number of things using the network. Acquire a Wi-Fi lock
+ * if necessary.
+ */
+ public void incRef() {
+ synchronized (mLock) {
+ mNetworkRef += 1;
+
+ acquireWifiLockIfNecessaryLocked();
+ }
+ }
+
+ /**
+ * Decrease the number of things using the network. Release the Wi-Fi lock
+ * if necessary.
+ */
+ public void decRef() {
+ synchronized (mLock) {
+ mNetworkRef -= 1;
+
+ releaseWifiLockIfNecessaryLocked();
+ }
+ }
+
+ /**
+ * @param mLockingWifi
+ */
+ public void setWantWifiLock(boolean lockingWifi) {
+ synchronized (mLock) {
+ mLockingWifi = lockingWifi;
+
+ if (mLockingWifi) {
+ acquireWifiLockIfNecessaryLocked();
+ } else {
+ releaseWifiLockIfNecessaryLocked();
+ }
+ }
+ }
+
+ private void acquireWifiLockIfNecessaryLocked() {
+ if (mLockingWifi && mNetworkRef > 0 && !mWifiLock.isHeld()) {
+ mWifiLock.acquire();
+ }
+ }
+
+ private void releaseWifiLockIfNecessaryLocked() {
+ if (mNetworkRef == 0 && mWifiLock.isHeld()) {
+ mWifiLock.release();
+ }
+ }
+
+ /**
+ * @return whether we're connected to a network
+ */
+ public boolean isConnected() {
+ return mIsConnected;
+ }
+}