diff options
author | Domingos Lopes <domingos86lopes@gmail.com> | 2016-03-26 00:45:50 -0400 |
---|---|---|
committer | Domingos Lopes <domingos86lopes+github@gmail.com> | 2016-04-23 21:39:54 -0400 |
commit | 037b705075a2af95042308c810b41b6dbff55b13 (patch) | |
tree | 6d23e5a35658f328fe460387ee7ccf6a0a2ff833 /core/src/main/java | |
parent | af7526a4099d739f2d668151ffa46d606493aea7 (diff) | |
download | AntennaPod-037b705075a2af95042308c810b41b6dbff55b13.zip |
* add GooglePlayServices check
* implement wifi-reconnect feature for casting
* move wifiLock logic to abstract PSMP
Diffstat (limited to 'core/src/main/java')
6 files changed, 99 insertions, 28 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java b/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java index 998142971..7094017db 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java @@ -136,6 +136,7 @@ public class CastManager extends BaseCastManager implements OnFailedListener { if (ConnectionResult.SUCCESS != GoogleApiAvailability.getInstance() .isGooglePlayServicesAvailable(context)) { Log.e(TAG, "Couldn't find the appropriate version of Google Play Services"); + //TODO check whether creating an instance without google play services installed actually gives an exception } INSTANCE = new CastManager(context, castConfiguration); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index 175f1256f..379875478 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -2,7 +2,6 @@ package de.danoeh.antennapod.core.service.playback; import android.content.Context; import android.media.AudioManager; -import android.net.wifi.WifiManager; import android.os.PowerManager; import android.support.annotation.NonNull; import android.telephony.TelephonyManager; @@ -56,11 +55,6 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { private final ThreadPoolExecutor executor; - /** - * A wifi-lock that is acquired if the media file is being streamed. - */ - private WifiManager.WifiLock wifiLock; - public LocalPSMP(@NonNull Context context, @NonNull PSMPCallback callback) { super(context, callback); @@ -805,21 +799,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { }); } - private synchronized void acquireWifiLockIfNecessary() { - if (stream) { - if (wifiLock == null) { - wifiLock = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)) - .createWifiLock(WifiManager.WIFI_MODE_FULL, TAG); - wifiLock.setReferenceCounted(false); - } - wifiLock.acquire(); - } - } - - private synchronized void releaseWifiLockIfNecessary() { - if (wifiLock != null && wifiLock.isHeld()) { - wifiLock.release(); - } + @Override + protected boolean shouldLockWifi(){ + return stream; } private IPlayer setMediaPlayerListeners(IPlayer mp) { @@ -878,13 +860,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { return callback.onMediaPlayerInfo(what); } - private final MediaPlayer.OnSpeedAdjustmentAvailableChangedListener - audioSetSpeedAbilityListener = new MediaPlayer.OnSpeedAdjustmentAvailableChangedListener() { - @Override - public void onSpeedAdjustmentAvailableChanged(MediaPlayer arg0, boolean speedAdjustmentAvailable) { - callback.setSpeedAbilityChanged(); - } - }; + private final MediaPlayer.OnSpeedAdjustmentAvailableChangedListener audioSetSpeedAbilityListener = + (arg0, speedAdjustmentAvailable) -> callback.setSpeedAbilityChanged(); private final MediaPlayer.OnErrorListener audioErrorListener = diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 467c9e9c5..d85bcb820 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -15,6 +15,8 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.AudioManager; import android.media.MediaPlayer; +import android.net.NetworkInfo; +import android.net.wifi.WifiManager; import android.os.Binder; import android.os.Build; import android.os.IBinder; @@ -60,6 +62,7 @@ import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.IntList; +import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.QueueAccess; import de.danoeh.antennapod.core.util.flattr.FlattrUtils; import de.danoeh.antennapod.core.util.playback.ExternalMedia; @@ -168,6 +171,12 @@ public class PlaybackService extends Service implements SharedPreferences.OnShar public static final int INVALID_TIME = -1; /** + * Time in seconds during which the CastManager will try to reconnect to the Cast Device after + * the Wifi Connection is regained. + */ + private static final int RECONNECTION_ATTEMPT_PERIOD_S = 15; + + /** * Is true if service is running. */ public static boolean isRunning = false; @@ -188,6 +197,9 @@ public class PlaybackService extends Service implements SharedPreferences.OnShar */ private volatile PlaybackServiceMediaPlayer.PSMPInfo infoBeforeCastDisconnection; + private boolean mWifiConnectivity = true; + private BroadcastReceiver mWifiBroadcastReceiver; + private static final int NOTIFICATION_ID = 1; private PlaybackServiceMediaPlayer mediaPlayer; @@ -318,6 +330,7 @@ public class PlaybackService extends Service implements SharedPreferences.OnShar unregisterReceiver(pausePlayCurrentEpisodeReceiver); unregisterReceiver(pauseResumeCurrentEpisodeReceiver); CastManager.getInstance().removeCastConsumer(castConsumer); + unregisterWifiBroadcastReceiver(); mediaPlayer.shutdown(); taskManager.shutdown(); } @@ -1561,6 +1574,7 @@ public class PlaybackService extends Service implements SharedPreferences.OnShar (mediaPlayer != null) ? mediaPlayer.getPSMPInfo() : new PlaybackServiceMediaPlayer.PSMPInfo(PlayerStatus.STOPPED, null)); sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, EXTRA_CODE_CAST); + registerWifiBroadcastReceiver(); } @Override @@ -1602,6 +1616,7 @@ public class PlaybackService extends Service implements SharedPreferences.OnShar Log.d(TAG, "Cast session disconnected, but no current media"); sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_END, 0); } + unregisterWifiBroadcastReceiver(); } }; @@ -1620,4 +1635,37 @@ public class PlaybackService extends Service implements SharedPreferences.OnShar info.playerStatus.isAtLeast(PlayerStatus.PREPARING)); } } + + private void registerWifiBroadcastReceiver() { + if (mWifiBroadcastReceiver != null) { + return; + } + mWifiBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { + NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); + boolean isConnected = info.isConnected(); + //apparently this method gets called twice when a change happens, but one run is enough. + if (isConnected && !mWifiConnectivity) { + mWifiConnectivity = true; + CastManager castMgr = CastManager.getInstance(); + castMgr.startCastDiscovery(); + castMgr.reconnectSessionIfPossible(RECONNECTION_ATTEMPT_PERIOD_S, NetworkUtils.getWifiSsid()); + } else { + mWifiConnectivity = isConnected; + } + } + } + }; + registerReceiver(mWifiBroadcastReceiver, + new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION)); + } + + private void unregisterWifiBroadcastReceiver() { + if (mWifiBroadcastReceiver != null) { + unregisterReceiver(mWifiBroadcastReceiver); + mWifiBroadcastReceiver = null; + } + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java index b21978ed4..7570e7db0 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.core.service.playback; import android.content.Context; +import android.net.wifi.WifiManager; import android.support.annotation.NonNull; import android.util.Log; import android.util.Pair; @@ -33,6 +34,11 @@ public abstract class PlaybackServiceMediaPlayer { protected volatile PlayerStatus playerStatus; + /** + * A wifi-lock that is acquired if the media file is being streamed. + */ + private WifiManager.WifiLock wifiLock; + protected final PSMPCallback callback; protected final Context context; @@ -238,6 +244,28 @@ public abstract class PlaybackServiceMediaPlayer { public abstract void stop(); /** + * @return {@code true} if the WifiLock feature should be used, {@code false} otherwise. + */ + protected abstract boolean shouldLockWifi(); + + protected final synchronized void acquireWifiLockIfNecessary() { + if (shouldLockWifi()) { + if (wifiLock == null) { + wifiLock = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)) + .createWifiLock(WifiManager.WIFI_MODE_FULL, TAG); + wifiLock.setReferenceCounted(false); + } + wifiLock.acquire(); + } + } + + protected final synchronized void releaseWifiLockIfNecessary() { + if (wifiLock != null && wifiLock.isHeld()) { + wifiLock.release(); + } + } + + /** * Sets the player status of the PSMP object. PlayerStatus and media attributes have to be set at the same time * so that getPSMPInfo can't return an invalid state (e.g. status is PLAYING, but media is null). * <p/> diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java index f87ebb795..4ae777e65 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/RemotePSMP.java @@ -450,4 +450,9 @@ public class RemotePSMP extends PlaybackServiceMediaPlayer { public void stop() { //TODO } + + @Override + protected boolean shouldLockWifi() { + return false; + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java index 927639e69..55b608dce 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java @@ -92,6 +92,18 @@ public class NetworkUtils { return mWifi.isConnected(); } + /** + * Returns the SSID of the wifi connection, or <code>null</code> if there is no wifi. + */ + public static String getWifiSsid() { + WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + WifiInfo wifiInfo = wifiManager.getConnectionInfo(); + if (wifiInfo != null) { + return wifiInfo.getSSID(); + } + return null; + } + public static Observable<Long> getFeedMediaSizeObservable(FeedMedia media) { return Observable.create(new Observable.OnSubscribe<Long>() { @Override |