diff options
author | Kyunglyul Hyun <klhyun@google.com> | 2018-10-23 10:30:43 +0900 |
---|---|---|
committer | Kyunglyul Hyun <klhyun@google.com> | 2018-10-29 02:14:40 +0000 |
commit | 826ee3ea3d4615a61fbba90942b384fef2614d85 (patch) | |
tree | b48b5d4483b90ecfeedf8d305b162a0f1d506357 /mediarouter | |
parent | 95064cdd9aff33f844c1f784028278384c7859c2 (diff) | |
download | support-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.java | 82 |
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(); + } + } + } + } + } } |