aboutsummaryrefslogtreecommitdiff
path: root/mediarouter
diff options
context:
space:
mode:
authorKyunglyul Hyun <klhyun@google.com>2018-10-23 10:30:43 +0900
committerKyunglyul Hyun <klhyun@google.com>2018-10-29 02:14:40 +0000
commit826ee3ea3d4615a61fbba90942b384fef2614d85 (patch)
treeb48b5d4483b90ecfeedf8d305b162a0f1d506357 /mediarouter
parent95064cdd9aff33f844c1f784028278384c7859c2 (diff)
downloadsupport-826ee3ea3d4615a61fbba90942b384fef2614d85.tar.gz
MediaRouteButton: hide in airplane mode
Hide the button when the device is disconnected from the network Bug: 112524736 Test: Ran support v7 demos manually with WiFi-enabled/disabled in airplane mode Change-Id: I46e629a8f620d6a39905b8154c6d33b5927664be
Diffstat (limited to 'mediarouter')
-rw-r--r--mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java82
1 files changed, 77 insertions, 5 deletions
diff --git a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
index 846022f59cd..9a5c77c74db 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
@@ -17,13 +17,17 @@
package androidx.mediarouter.app;
import android.app.Activity;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.ContextWrapper;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
+import android.net.ConnectivityManager;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.util.Log;
@@ -40,6 +44,9 @@ import androidx.mediarouter.R;
import androidx.mediarouter.media.MediaRouteSelector;
import androidx.mediarouter.media.MediaRouter;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* The media route button allows the user to select routes and to control the
* currently selected route.
@@ -83,6 +90,8 @@ public class MediaRouteButton extends View {
"android.support.v7.mediarouter:MediaRouteChooserDialogFragment";
private static final String CONTROLLER_FRAGMENT_TAG =
"android.support.v7.mediarouter:MediaRouteControllerDialogFragment";
+ // Used to check connectivity and hide the button
+ private static ConnectivityReceiver sConnectivityReceiver;
private final MediaRouter mRouter;
private final MediaRouterCallback mCallback;
@@ -92,6 +101,8 @@ public class MediaRouteButton extends View {
private boolean mAttachedToWindow;
+ private int mVisibility = VISIBLE;
+
static final SparseArray<Drawable.ConstantState> sRemoteIndicatorCache =
new SparseArray<>(2);
RemoteIndicatorLoader mRemoteIndicatorLoader;
@@ -137,6 +148,10 @@ public class MediaRouteButton extends View {
mRouter = MediaRouter.getInstance(context);
mCallback = new MediaRouterCallback();
+ if (sConnectivityReceiver == null) {
+ sConnectivityReceiver = new ConnectivityReceiver(context.getApplicationContext());
+ }
+
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.MediaRouteButton, defStyleAttr, 0);
mButtonTint = a.getColorStateList(R.styleable.MediaRouteButton_mediaRouteButtonTint);
@@ -385,11 +400,8 @@ public class MediaRouteButton extends View {
@Override
public void setVisibility(int visibility) {
- super.setVisibility(visibility);
-
- if (mRemoteIndicator != null) {
- mRemoteIndicator.setVisible(getVisibility() == VISIBLE, false);
- }
+ mVisibility = visibility;
+ refreshVisibility();
}
@Override
@@ -401,6 +413,8 @@ public class MediaRouteButton extends View {
mRouter.addCallback(mSelector, mCallback);
}
refreshRoute();
+
+ sConnectivityReceiver.registerReceiver(this);
}
@Override
@@ -410,6 +424,8 @@ public class MediaRouteButton extends View {
mRouter.removeCallback(mCallback);
}
+ sConnectivityReceiver.unregisterReceiver(this);
+
super.onDetachedFromWindow();
}
@@ -525,6 +541,14 @@ public class MediaRouteButton extends View {
}
}
+ void refreshVisibility() {
+ super.setVisibility(mVisibility == VISIBLE && !sConnectivityReceiver.isConnected()
+ ? INVISIBLE : mVisibility);
+ if (mRemoteIndicator != null) {
+ mRemoteIndicator.setVisible(getVisibility() == VISIBLE, false);
+ }
+ }
+
void refreshRoute() {
final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
final boolean isRemote = !route.isDefaultOrBluetooth() && route.matchesSelector(mSelector);
@@ -675,4 +699,52 @@ public class MediaRouteButton extends View {
mRemoteIndicatorLoader = null;
}
}
+
+ private static final class ConnectivityReceiver extends BroadcastReceiver {
+ private final Context mContext;
+ // If we have no information, assume that the device is connected
+ private boolean mIsConnected = true;
+ private List<MediaRouteButton> mButtons;
+
+ ConnectivityReceiver(Context context) {
+ mContext = context;
+ mButtons = new ArrayList<MediaRouteButton>();
+ }
+
+ public void registerReceiver(MediaRouteButton button) {
+ if (mButtons.size() == 0) {
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+ mContext.registerReceiver(this, intentFilter);
+ }
+ mButtons.add(button);
+ }
+
+ public void unregisterReceiver(MediaRouteButton button) {
+ mButtons.remove(button);
+
+ if (mButtons.size() == 0) {
+ mContext.unregisterReceiver(this);
+ }
+ }
+
+ public boolean isConnected() {
+ return mIsConnected;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
+ boolean isConnected = !intent.getBooleanExtra(
+ ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
+ if (mIsConnected != isConnected) {
+ mIsConnected = isConnected;
+ for (MediaRouteButton button: mButtons) {
+ button.refreshVisibility();
+ }
+ }
+ }
+ }
+ }
}