diff --git a/app/build.gradle b/app/build.gradle index 31ad2fc0..2c0fd1d1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "ml.docilealligator.infinityforreddit" minSdkVersion 21 targetSdkVersion 31 - versionCode 102 - versionName "5.3.0" + versionCode 103 + versionName "5.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { @@ -77,6 +77,7 @@ dependencies { implementation "com.google.android.exoplayer:exoplayer-dash:$exoplayerVersion" implementation "com.google.android.exoplayer:exoplayer-hls:$exoplayerVersion" implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayerVersion" + implementation "com.google.android.exoplayer:exoplayer-smoothstreaming:$exoplayerVersion" /*def toroVersion = "3.7.0.2010003" implementation "im.ene.toro3:toro:$toroVersion" implementation("im.ene.toro3:toro-ext-exoplayer:$toroVersion") { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/asynctasks/SwitchToAnonymousMode.java b/app/src/main/java/ml/docilealligator/infinityforreddit/asynctasks/SwitchToAnonymousMode.java index c14b7131..d41d04bc 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/asynctasks/SwitchToAnonymousMode.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/asynctasks/SwitchToAnonymousMode.java @@ -7,6 +7,7 @@ import java.util.concurrent.Executor; import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase; import ml.docilealligator.infinityforreddit.account.AccountDao; +import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; public class SwitchToAnonymousMode { public static void switchToAnonymousMode(RedditDataRoomDatabase redditDataRoomDatabase, SharedPreferences currentAccountSharedPreferences, @@ -19,7 +20,9 @@ public class SwitchToAnonymousMode { } accountDao.markAllAccountsNonCurrent(); + String redgifsAccessToken = currentAccountSharedPreferences.getString(SharedPreferencesUtils.REDGIFS_ACCESS_TOKEN, ""); currentAccountSharedPreferences.edit().clear().apply(); + currentAccountSharedPreferences.edit().putString(SharedPreferencesUtils.REDGIFS_ACCESS_TOKEN, redgifsAccessToken).apply(); handler.post(switchToAnonymousAccountAsyncTaskListener::logoutSuccess); }); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/AdsExoPlayerViewHelper.java b/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/AdsExoPlayerViewHelper.java deleted file mode 100644 index 22a63afc..00000000 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/AdsExoPlayerViewHelper.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) 2018 Nam Nguyen, nam@ene.im - * - * 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 ml.docilealligator.infinityforreddit.videoautoplay; - -import android.content.Context; -import android.net.Uri; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.exoplayer2.source.ads.AdsLoader; -import com.google.android.exoplayer2.ui.PlayerView; - -import ml.docilealligator.infinityforreddit.videoautoplay.annotations.Beta; - -/** - * A {@link ToroPlayerHelper} to integrate ExoPlayer IMA Extension. Work together with {@link - * AdsPlayable}. - * - * @author eneim (2018/08/22). - * @since 3.6.0.2802 - */ -@SuppressWarnings("unused") @Beta // -public class AdsExoPlayerViewHelper extends ExoPlayerViewHelper { - - static class DefaultAdViewProvider implements AdsLoader.AdViewProvider { - - @NonNull final ViewGroup viewGroup; - - DefaultAdViewProvider(@NonNull ViewGroup viewGroup) { - this.viewGroup = viewGroup; - } - - @Override public ViewGroup getAdViewGroup() { - return this.viewGroup; - } - - @Override public View[] getAdOverlayViews() { - return new View[0]; - } - } - - private static AdsPlayable createPlayable( /// - ToroPlayer player, // - ExoCreator creator, // - Uri contentUri, // - String fileExt, // - AdsLoader adsLoader, // - AdsLoader.AdViewProvider adViewProvider // - ) { - return new AdsPlayable(creator, contentUri, fileExt, player, adsLoader, adViewProvider); - } - - private static AdsPlayable createPlayable( // - ToroPlayer player, // - Config config, // - Uri contentUri, // - String fileExt, // - AdsLoader adsLoader, // - AdsLoader.AdViewProvider adViewProvider // - ) { - Context context = player.getPlayerView().getContext(); - return createPlayable(player, ToroExo.with(context).getCreator(config), contentUri, fileExt, - adsLoader, adViewProvider); - } - - private static AdsPlayable createPlayable( // - ToroPlayer player, // - Uri contentUri, // - String fileExt, // - AdsLoader adsLoader, // - AdsLoader.AdViewProvider adViewProvider // - ) { - Context context = player.getPlayerView().getContext(); - return createPlayable(player, ToroExo.with(context).getDefaultCreator(), contentUri, fileExt, - adsLoader, adViewProvider); - } - - // Neither ExoCreator nor Config are provided. - - /** - * Create new {@link AdsExoPlayerViewHelper} for a {@link ToroPlayer} and {@link AdsLoader}. - * - * @param adContainer if {@code null} then overlay of {@link PlayerView} will be used. - */ - @Deprecated - public AdsExoPlayerViewHelper( // - @NonNull ToroPlayer player, // - @NonNull Uri uri, // - @Nullable String fileExt, // - @NonNull AdsLoader adsLoader, // - @Nullable ViewGroup adContainer // - ) { - super(player, - createPlayable(player, uri, fileExt, adsLoader, - adContainer != null ? new DefaultAdViewProvider(adContainer) : null)); - } - - public AdsExoPlayerViewHelper( // - @NonNull ToroPlayer player, // - @NonNull Uri uri, // - @Nullable String fileExt, // - @NonNull AdsLoader adsLoader, // - @Nullable ViewGroup adContainer, // will be ignored - @Nullable AdsLoader.AdViewProvider adViewProvider // - ) { - super(player, createPlayable(player, uri, fileExt, adsLoader, adViewProvider)); - } - - // ExoCreator is provided. - - /** - * Create new {@link AdsExoPlayerViewHelper} for a {@link ToroPlayer} and {@link AdsLoader}. - * - * @param adContainer if {@code null} then overlay of {@link PlayerView} will be used. - */ - @Deprecated - public AdsExoPlayerViewHelper( // - @NonNull ToroPlayer player, // - @NonNull Uri uri, // - @Nullable String fileExt, // - @NonNull AdsLoader adsLoader, // - @Nullable ViewGroup adContainer, // - @NonNull ExoCreator creator // - ) { - super(player, createPlayable(player, creator, uri, fileExt, adsLoader, - adContainer != null ? new DefaultAdViewProvider(adContainer) : null)); - } - - public AdsExoPlayerViewHelper( // - @NonNull ToroPlayer player, // - @NonNull Uri uri, // - @Nullable String fileExt, // - @NonNull AdsLoader adsLoader, // - @Nullable ViewGroup adContainer, // will be ignored - @Nullable AdsLoader.AdViewProvider adViewProvider, // - @NonNull ExoCreator creator // - ) { - super(player, createPlayable(player, creator, uri, fileExt, adsLoader, adViewProvider)); - } - // Config is provided. - - /** - * Create new {@link AdsExoPlayerViewHelper} for a {@link ToroPlayer} and {@link AdsLoader}. - * - * @param adContainer if {@code null} then overlay of {@link PlayerView} will be used. - */ - @Deprecated - public AdsExoPlayerViewHelper( // - @NonNull ToroPlayer player, // - @NonNull Uri uri, // - @Nullable String fileExt, // - @NonNull AdsLoader adsLoader, // - @Nullable ViewGroup adContainer, // - @NonNull Config config // - ) { - super(player, createPlayable(player, config, uri, fileExt, adsLoader, - adContainer != null ? new DefaultAdViewProvider(adContainer) : null)); - } - - public AdsExoPlayerViewHelper( // - @NonNull ToroPlayer player, // - @NonNull Uri uri, // - @Nullable String fileExt, // - @NonNull AdsLoader adsLoader, // - @Nullable ViewGroup adContainer, // will be ignored - @Nullable AdsLoader.AdViewProvider adViewProvider, // - @NonNull Config config // - ) { - super(player, createPlayable(player, config, uri, fileExt, adsLoader, adViewProvider)); - } -} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/AdsPlayable.java b/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/AdsPlayable.java deleted file mode 100644 index 666b3815..00000000 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/AdsPlayable.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2018 Nam Nguyen, nam@ene.im - * - * 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 ml.docilealligator.infinityforreddit.videoautoplay; - -import android.net.Uri; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.CallSuper; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.ads.AdsLoader; -import com.google.android.exoplayer2.source.ads.AdsMediaSource; -import com.google.android.exoplayer2.ui.PlayerView; - -import ml.docilealligator.infinityforreddit.videoautoplay.annotations.Beta; - -/** - * A {@link Playable} that is able to integrate with {@link AdsLoader}. - * - * @author eneim (2018/08/22). - * @since 3.6.0.2802 - */ -@Beta // -public class AdsPlayable extends ExoPlayable { - - static class FactoryImpl implements AdsMediaSource.MediaSourceFactory { - - @NonNull final ExoCreator creator; - @NonNull final ToroPlayer player; - - FactoryImpl(@NonNull ExoCreator creator, @NonNull ToroPlayer player) { - this.creator = creator; - this.player = player; - } - - @Override public MediaSource createMediaSource(Uri uri) { - return this.creator.createMediaSource(uri, null); - } - - @Override public int[] getSupportedTypes() { - // IMA does not support Smooth Streaming ads. - return new int[] { C.TYPE_DASH, C.TYPE_HLS, C.TYPE_OTHER }; - } - } - - @NonNull private final AdsLoader adsLoader; - @NonNull private final FactoryImpl factory; - @Nullable private final AdsLoader.AdViewProvider adViewProvider; - - /** - * @deprecated Use the constructors that use {@link AdsLoader.AdViewProvider} instead. - */ - @Deprecated - public AdsPlayable(ExoCreator creator, Uri uri, String fileExt, ToroPlayer player, - @NonNull AdsLoader adsLoader, @Nullable final ViewGroup adsContainer) { - super(creator, uri, fileExt); - this.adsLoader = adsLoader; - this.adViewProvider = adsContainer == null ? null - : new AdsExoPlayerViewHelper.DefaultAdViewProvider(adsContainer); - this.factory = new FactoryImpl(this.creator, player); - } - - @SuppressWarnings("WeakerAccess") - public AdsPlayable(ExoCreator creator, Uri uri, String fileExt, ToroPlayer player, - @NonNull AdsLoader adsLoader, @Nullable AdsLoader.AdViewProvider adViewProvider) { - super(creator, uri, fileExt); - this.adsLoader = adsLoader; - this.adViewProvider = adViewProvider; - this.factory = new FactoryImpl(this.creator, player); - } - - @CallSuper - @Override public void prepare(boolean prepareSource) { - this.mediaSource = createAdsMediaSource(creator, mediaUri, fileExt, // - factory.player, adsLoader, adViewProvider, factory); - super.prepare(prepareSource); - } - - @Override protected void beforePrepareMediaSource() { - super.beforePrepareMediaSource(); - adsLoader.setPlayer(player); - } - - @Override public void release() { - adsLoader.setPlayer(null); - super.release(); - } - - private static MediaSource createAdsMediaSource(ExoCreator creator, Uri uri, String fileExt, - ToroPlayer player, AdsLoader adsLoader, AdsLoader.AdViewProvider adViewProvider, - AdsMediaSource.MediaSourceFactory factory) { - MediaSource original = creator.createMediaSource(uri, fileExt); - View playerView = player.getPlayerView(); - if (!(playerView instanceof PlayerView)) { - throw new IllegalArgumentException("Require PlayerView"); - } - - return new AdsMediaSource(original, factory, adsLoader, - adViewProvider == null ? (PlayerView) playerView : adViewProvider); - } -} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/MediaSourceBuilder.java b/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/MediaSourceBuilder.java index 7daacc99..885319d0 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/MediaSourceBuilder.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/videoautoplay/MediaSourceBuilder.java @@ -35,6 +35,8 @@ import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource; +import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; import com.google.android.exoplayer2.upstream.DataSource; /** @@ -59,11 +61,11 @@ public interface MediaSourceBuilder { @ContentType int type = isEmpty(ext) ? inferContentType(uri) : inferContentType("." + ext); MediaSource result; switch (type) { - /*case C.TYPE_SS: - result = new SsMediaSource.Factory( // - new DefaultSsChunkSource.Factory(mediaDataSourceFactory), manifestDataSourceFactory)// + case C.TYPE_SS: + result = new SsMediaSource.Factory( + new DefaultSsChunkSource.Factory(mediaDataSourceFactory), manifestDataSourceFactory) .createMediaSource(uri); - break;*/ + break; case C.TYPE_DASH: result = new DashMediaSource.Factory( new DefaultDashChunkSource.Factory(mediaDataSourceFactory), manifestDataSourceFactory)