diff --git a/app/build.gradle b/app/build.gradle
index d22555b..1539377 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -157,5 +157,5 @@ dependencies {
implementation 'jp.wasabeef:glide-transformations:4.0.0'
implementation 'su.litvak.chromecast:api-v2:0.11.3'
implementation 'com.fasterxml.jackson.core:jackson-core:2.12.0'
-
+ implementation 'org.slf4j:slf4j-simple:1.7.30'
}
\ No newline at end of file
diff --git a/app/src/acad/res/values/strings.xml b/app/src/acad/res/values/strings.xml
index 5ac6096..8b6952b 100644
--- a/app/src/acad/res/values/strings.xml
+++ b/app/src/acad/res/values/strings.xml
@@ -15,9 +15,12 @@
set_play_screen_lock_choice
set_video_in_list_choice
set_video_sensitive_choice
+ set_cast_choice
+ Activer Chromecast (beta)
Vidéos dans une liste
Change la mise en page pour afficher les vidéos dans une liste
ChromeCast
+ Permet de découvrir les appareils Chromecast sur le réseau.
Choix de la ChromeCast
Réessayer
Échec de rafraîchissement du jeton d\'accès
diff --git a/app/src/full/res/values/strings.xml b/app/src/full/res/values/strings.xml
index 72d782a..e2503bc 100644
--- a/app/src/full/res/values/strings.xml
+++ b/app/src/full/res/values/strings.xml
@@ -13,6 +13,9 @@
set_fullscreen_choice
set_play_screen_lock_choice
set_video_in_list_choice
+ set_cast_choice
+ Enable Chromecast (beta)
+ Allow to discover Chromecast devices on the network.
set_video_sensitive_choice
Videos in list
Change the layout for displaying videos in a list
diff --git a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java
index 3836897..2479668 100644
--- a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java
+++ b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java
@@ -16,8 +16,10 @@ package app.fedilab.fedilabtube;
import android.annotation.SuppressLint;
import android.app.Activity;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
@@ -40,6 +42,7 @@ import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
@@ -105,6 +108,7 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen
private DisplayVideosFragment recentFragment, locaFragment, trendingFragment, subscriptionFragment, mostLikedFragment;
private DisplayOverviewFragment overviewFragment;
private ActivityMainBinding binding;
+ private BroadcastReceiver manage_chromecast;
@SuppressLint("ApplySharedPref")
public static void showRadioButtonDialogFullInstances(Activity activity, boolean storeInDb) {
@@ -232,8 +236,22 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen
super.onDestroy();
binding = null;
ChromeCasts.unregisterListener(this);
+ if (manage_chromecast != null) {
+ LocalBroadcastManager.getInstance(MainActivity.this).unregisterReceiver(manage_chromecast);
+ if (chromeCasts != null && chromeCasts.size() > 0) {
+ for (ChromeCast cast : chromeCasts) {
+ try {
+ cast.disconnect();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ chromeCasts = null;
+ }
}
+ //Method for discovering cast devices
public void discoverCast() {
new Thread(() -> {
if (chromeCasts != null) {
@@ -267,6 +285,7 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen
}
}
}
+ ChromeCasts.stopDiscovery();
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = this::invalidateOptionsMenu;
mainHandler.post(myRunnable);
@@ -276,6 +295,7 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen
}).start();
}
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -284,7 +304,7 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen
setContentView(view);
ChromeCastsListener chromeCastsListener = this;
ChromeCasts.registerListener(chromeCastsListener);
- discoverCast();
+
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -388,6 +408,38 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen
if (!BuildConfig.full_instances) {
PlaylistExportHelper.manageIntentUrl(MainActivity.this, getIntent());
}
+
+ manage_chromecast = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Bundle b = intent.getExtras();
+ assert b != null;
+ boolean state = b.getBoolean("state_asked");
+ if (state) {
+ discoverCast();
+ } else {
+ new Thread(() -> {
+ ChromeCasts.get();
+ if (ChromeCasts.get().size() > 0) {
+ for (ChromeCast cast : ChromeCasts.get()) {
+ try {
+ cast.disconnect();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }).start();
+ }
+ }
+ };
+ final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
+
+ LocalBroadcastManager.getInstance(MainActivity.this).registerReceiver(manage_chromecast, new IntentFilter(Helper.RECEIVE_CAST_SETTINGS));
+ boolean search_cast = sharedpreferences.getBoolean(getString(R.string.set_cast_choice), false);
+ if (search_cast) {
+ discoverCast();
+ }
}
public DisplayVideosFragment getSubscriptionFragment() {
diff --git a/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java b/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java
index dac6658..0f9f8b3 100644
--- a/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java
+++ b/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java
@@ -52,6 +52,7 @@ import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.view.inputmethod.InputMethodManager;
+import android.webkit.MimeTypeMap;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
@@ -150,10 +151,7 @@ import app.fedilab.fedilabtube.webview.CustomWebview;
import app.fedilab.fedilabtube.webview.MastalabWebChromeClient;
import app.fedilab.fedilabtube.webview.MastalabWebViewClient;
import es.dmoral.toasty.Toasty;
-import su.litvak.chromecast.api.v2.Application;
import su.litvak.chromecast.api.v2.ChromeCast;
-import su.litvak.chromecast.api.v2.ChromeCasts;
-import su.litvak.chromecast.api.v2.ChromeCastsListener;
import su.litvak.chromecast.api.v2.Status;
import static app.fedilab.fedilabtube.client.RetrofitPeertubeAPI.ActionType.ADD_COMMENT;
@@ -720,26 +718,25 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
}
} else {
try {
- chromeCast.connect();
-
-
- Status status = chromeCast.getStatus();
-
- Application app = null;
- if (chromeCast.isAppAvailable(CAST_ID) && !status.isAppRunning(CAST_ID)) {
- chromeCast.launchApp(CAST_ID);
-
- }
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> {
invalidateOptionsMenu();
+ player.setPlayWhenReady(false);
dialog.dismiss();
};
+ if (!chromeCast.isConnected()) {
+ chromeCast.connect();
+ }
+ Status status = chromeCast.getStatus();
+ if (chromeCast.isAppAvailable(CAST_ID) && !status.isAppRunning(CAST_ID)) {
+ chromeCast.launchApp(CAST_ID);
+ }
mainHandler.post(myRunnable);
- if (status.isAppRunning(CAST_ID) && chromeCastVideoURL != null) {
- app = status.getRunningApp();
- chromeCast.load(peertube.getTitle(), "https://" + HelperInstance.getLiveInstance(PeertubeActivity.this) + peertube.getThumbnailPath(), chromeCastVideoURL, null);
- //chromeCast.send( app.namespaces.get(app.namespaces.size()-1).name, new DashCastRequest(chromeCastVideoURL, true, false, 0));
+ if (chromeCastVideoURL != null) {
+ String mime = MimeTypeMap.getFileExtensionFromUrl(chromeCastVideoURL);
+ chromeCast.setRequestTimeout(120000);
+ chromeCast.load(peertube.getTitle(), null, chromeCastVideoURL, mime);
+ chromeCast.play();
}
} catch (IOException | GeneralSecurityException e) {
@@ -1341,7 +1338,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
if (torrentStream != null && torrentStream.isStreaming()) {
torrentStream.stopStream();
}
- if (chromeCast != null) {
+ if (chromeCast != null && chromeCast.isConnected()) {
new Thread(() -> {
try {
chromeCast.disconnect();
diff --git a/app/src/main/java/app/fedilab/fedilabtube/fragment/SettingsFragment.java b/app/src/main/java/app/fedilab/fedilabtube/fragment/SettingsFragment.java
index eb3ceab..85e6162 100644
--- a/app/src/main/java/app/fedilab/fedilabtube/fragment/SettingsFragment.java
+++ b/app/src/main/java/app/fedilab/fedilabtube/fragment/SettingsFragment.java
@@ -13,6 +13,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.res.ResourcesCompat;
import androidx.fragment.app.FragmentActivity;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.ListPreference;
import androidx.preference.MultiSelectListPreference;
import androidx.preference.Preference;
@@ -174,7 +175,10 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Shared
editor.putInt(Helper.SET_VIDEO_CACHE, progress * 10);
}
if (key.compareTo(getString(R.string.set_video_minimize_choice)) == 0) {
- SwitchPreference set_video_minimize_choice = findPreference(getString(R.string.set_video_minimize_choice));
+ SwitchPreference set_video_minimize_choice = findPreference(
+
+
+ getString(R.string.set_video_minimize_choice));
assert set_video_minimize_choice != null;
editor.putBoolean(getString(R.string.set_video_minimize_choice), set_video_minimize_choice.isChecked());
}
@@ -229,6 +233,16 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Shared
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
}
+ if (key.compareTo(getString(R.string.set_cast_choice)) == 0) {
+ SwitchPreference set_cast_choice = findPreference(getString(R.string.set_cast_choice));
+ assert set_cast_choice != null;
+ editor.putBoolean(getString(R.string.set_cast_choice), set_cast_choice.isChecked());
+ Intent intentBC = new Intent(Helper.RECEIVE_CAST_SETTINGS);
+ Bundle b = new Bundle();
+ b.putBoolean("state_asked", set_cast_choice.isChecked());
+ intentBC.putExtras(b);
+ LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intentBC);
+ }
if (key.compareTo(getString(R.string.set_video_language_choice)) == 0) {
MultiSelectListPreference set_video_language_choice = findPreference(getString(R.string.set_video_language_choice));
assert set_video_language_choice != null;
@@ -392,6 +406,12 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Shared
assert set_video_in_list_choice != null;
set_video_in_list_choice.setChecked(videosInList);
+ //****** Allow Chromecast *******
+ boolean cast = sharedpref.getBoolean(getString(R.string.set_cast), false);
+ SwitchPreference set_cast_choice = findPreference(getString(R.string.set_cast_choice));
+ assert set_cast_choice != null;
+ set_cast_choice.setChecked(cast);
+
//****** Language filter *********
LinkedHashMap languages = new LinkedHashMap<>(Helper.peertubeInformation.getLanguages());
List entriesLanguages = new ArrayList<>();
diff --git a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java
index 3ea35be..2a05021 100644
--- a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java
+++ b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java
@@ -115,6 +115,7 @@ public class Helper {
public static final String PREF_KEY_OAUTH_TOKEN = "oauth_token";
public static final Pattern redirectPattern = Pattern.compile("externalAuthToken=(\\w+)&username=([\\w.-]+)");
public static final String SET_VIDEO_CACHE = "set_video_cache";
+ public static final String RECEIVE_CAST_SETTINGS = "receive_cast_settings";
//Proxy
public static final String SET_PROXY_ENABLED = "set_proxy_enabled";
public static final String SET_PROXY_HOST = "set_proxy_host";
diff --git a/app/src/main/res/xml/main_preferences.xml b/app/src/main/res/xml/main_preferences.xml
index f96ac1d..f7015ab 100644
--- a/app/src/main/res/xml/main_preferences.xml
+++ b/app/src/main/res/xml/main_preferences.xml
@@ -82,5 +82,10 @@
android:key="@string/set_video_in_list_choice"
android:summary="@string/set_video_in_list_description"
android:title="@string/set_video_in_list" />
+
\ No newline at end of file