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