1
0
mirror of https://framagit.org/tom79/fedilab-tube synced 2025-06-05 21:09:11 +02:00

Issue #123 - Working cast

This commit is contained in:
Thomas
2020-12-05 17:28:25 +01:00
parent 35c5713b0a
commit de14e95e90
8 changed files with 102 additions and 21 deletions

View File

@ -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'
}

View File

@ -15,9 +15,12 @@
<string name="set_play_screen_lock_choice" translatable="false">set_play_screen_lock_choice</string>
<string name="set_video_in_list_choice" translatable="false">set_video_in_list_choice</string>
<string name="set_video_sensitive_choice" translatable="false">set_video_sensitive_choice</string>
<string name="set_cast_choice" translatable="false">set_cast_choice</string>
<string name="set_cast">Activer Chromecast (beta)</string>
<string name="set_video_in_list">Vidéos dans une liste</string>
<string name="set_video_in_list_description">Change la mise en page pour afficher les vidéos dans une liste</string>
<string name="cast">ChromeCast</string>
<string name="set_cast_description">Permet de découvrir les appareils Chromecast sur le réseau.</string>
<string name="chromecast_choice">Choix de la ChromeCast</string>
<string name="_retry">Réessayer</string>
<string name="refresh_token_failed">Échec de rafraîchissement du jeton d\'accès</string>

View File

@ -13,6 +13,9 @@
<string name="set_fullscreen_choice" translatable="false">set_fullscreen_choice</string>
<string name="set_play_screen_lock_choice" translatable="false">set_play_screen_lock_choice</string>
<string name="set_video_in_list_choice" translatable="false">set_video_in_list_choice</string>
<string name="set_cast_choice" translatable="false">set_cast_choice</string>
<string name="set_cast">Enable Chromecast (beta)</string>
<string name="set_cast_description">Allow to discover Chromecast devices on the network.</string>
<string name="set_video_sensitive_choice" translatable="false">set_video_sensitive_choice</string>
<string name="set_video_in_list">Videos in list</string>
<string name="set_video_in_list_description">Change the layout for displaying videos in a list</string>

View File

@ -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() {

View File

@ -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();

View File

@ -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<String, String> languages = new LinkedHashMap<>(Helper.peertubeInformation.getLanguages());
List<CharSequence> entriesLanguages = new ArrayList<>();

View File

@ -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";

View File

@ -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" />
<androidx.preference.SwitchPreference
android:icon="@drawable/ic_baseline_cast_24"
android:key="@string/set_cast_choice"
android:summary="@string/set_cast_description"
android:title="@string/set_cast" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>