Issue #123 - improve player
This commit is contained in:
parent
de14e95e90
commit
fbeb87e29e
|
@ -22,6 +22,7 @@
|
||||||
<string name="cast">ChromeCast</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="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="chromecast_choice">Choix de la ChromeCast</string>
|
||||||
|
<string name="please_wait">Veuillez patienter</string>
|
||||||
<string name="_retry">Réessayer</string>
|
<string name="_retry">Réessayer</string>
|
||||||
<string name="refresh_token_failed">Échec de rafraîchissement du jeton d\'accès</string>
|
<string name="refresh_token_failed">Échec de rafraîchissement du jeton d\'accès</string>
|
||||||
<string name="refresh_token_failed_message">Vous pouvez réessayer de le rafraîchir ou simplement déconnecter le compte</string>
|
<string name="refresh_token_failed_message">Vous pouvez réessayer de le rafraîchir ou simplement déconnecter le compte</string>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<string name="app_name" translatable="false">Bittube</string>
|
<string name="app_name" translatable="false">bittube</string>
|
||||||
<string name="app_id" translatable="false">app.fedilab.bittube</string>
|
<string name="app_id" translatable="false">app.fedilab.bittube</string>
|
||||||
<string name="set_video_mode_choice" translatable="false">set_video_mode_choice</string>
|
<string name="set_video_mode_choice" translatable="false">set_video_mode_choice</string>
|
||||||
<string name="set_video_minimize_choice" translatable="false">set_video_minimize_choice</string>
|
<string name="set_video_minimize_choice" translatable="false">set_video_minimize_choice</string>
|
||||||
|
@ -13,6 +13,10 @@
|
||||||
<string name="set_fullscreen_choice" translatable="false">set_fullscreen_choice</string>
|
<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_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_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="please_wait">Please wait</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_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">Videos in list</string>
|
||||||
<string name="set_video_in_list_description">Change the layout for displaying videos in a list</string>
|
<string name="set_video_in_list_description">Change the layout for displaying videos in a list</string>
|
||||||
|
@ -21,6 +25,7 @@
|
||||||
<string name="show_less">Show less</string>
|
<string name="show_less">Show less</string>
|
||||||
<string name="cast">ChromeCast</string>
|
<string name="cast">ChromeCast</string>
|
||||||
<string name="chromecast_choice">ChromeCast choice</string>
|
<string name="chromecast_choice">ChromeCast choice</string>
|
||||||
|
|
||||||
<string name="set_play_screen_lock">Screen lock</string>
|
<string name="set_play_screen_lock">Screen lock</string>
|
||||||
<string name="set_play_screen_lock_description">Keep playing videos when the screen is locked</string>
|
<string name="set_play_screen_lock_description">Keep playing videos when the screen is locked</string>
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<string name="set_video_in_list_choice" translatable="false">set_video_in_list_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_choice" translatable="false">set_cast_choice</string>
|
||||||
<string name="set_cast">Enable Chromecast (beta)</string>
|
<string name="set_cast">Enable Chromecast (beta)</string>
|
||||||
|
<string name="please_wait">Please wait</string>
|
||||||
<string name="set_cast_description">Allow to discover Chromecast devices on the network.</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_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">Videos in list</string>
|
||||||
|
|
|
@ -152,6 +152,7 @@ import app.fedilab.fedilabtube.webview.MastalabWebChromeClient;
|
||||||
import app.fedilab.fedilabtube.webview.MastalabWebViewClient;
|
import app.fedilab.fedilabtube.webview.MastalabWebViewClient;
|
||||||
import es.dmoral.toasty.Toasty;
|
import es.dmoral.toasty.Toasty;
|
||||||
import su.litvak.chromecast.api.v2.ChromeCast;
|
import su.litvak.chromecast.api.v2.ChromeCast;
|
||||||
|
import su.litvak.chromecast.api.v2.MediaStatus;
|
||||||
import su.litvak.chromecast.api.v2.Status;
|
import su.litvak.chromecast.api.v2.Status;
|
||||||
|
|
||||||
import static app.fedilab.fedilabtube.client.RetrofitPeertubeAPI.ActionType.ADD_COMMENT;
|
import static app.fedilab.fedilabtube.client.RetrofitPeertubeAPI.ActionType.ADD_COMMENT;
|
||||||
|
@ -446,6 +447,35 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
binding.castPlay.setOnClickListener(v -> {
|
||||||
|
binding.castLoader.setVisibility(View.VISIBLE);
|
||||||
|
if (chromeCast != null) {
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
int icon = -1;
|
||||||
|
if (chromeCast.getMediaStatus().playerState == MediaStatus.PlayerState.PLAYING) {
|
||||||
|
chromeCast.pause();
|
||||||
|
icon = R.drawable.ic_baseline_play_arrow_32;
|
||||||
|
} else if (chromeCast.getMediaStatus().playerState == MediaStatus.PlayerState.PAUSED) {
|
||||||
|
chromeCast.play();
|
||||||
|
icon = R.drawable.ic_baseline_pause_32;
|
||||||
|
}
|
||||||
|
if (icon != -1) {
|
||||||
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
|
int finalIcon = icon;
|
||||||
|
Runnable myRunnable = () -> binding.castPlay.setImageResource(finalIcon);
|
||||||
|
mainHandler.post(myRunnable);
|
||||||
|
}
|
||||||
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
|
Runnable myRunnable = () -> binding.castLoader.setVisibility(View.GONE);
|
||||||
|
mainHandler.post(myRunnable);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void manageVIewVideos(APIResponse apiResponse) {
|
private void manageVIewVideos(APIResponse apiResponse) {
|
||||||
|
@ -713,6 +743,13 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
|
||||||
try {
|
try {
|
||||||
chromeCast.disconnect();
|
chromeCast.disconnect();
|
||||||
chromeCast = null;
|
chromeCast = null;
|
||||||
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
|
Runnable myRunnable = () -> {
|
||||||
|
binding.doubleTapPlayerView.setVisibility(View.VISIBLE);
|
||||||
|
binding.castController.setVisibility(View.GONE);
|
||||||
|
};
|
||||||
|
mainHandler.post(myRunnable);
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -721,24 +758,35 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
|
||||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
Runnable myRunnable = () -> {
|
Runnable myRunnable = () -> {
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
|
binding.castLoader.setVisibility(View.VISIBLE);
|
||||||
player.setPlayWhenReady(false);
|
player.setPlayWhenReady(false);
|
||||||
|
binding.doubleTapPlayerView.setVisibility(View.GONE);
|
||||||
|
binding.castController.setVisibility(View.VISIBLE);
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
};
|
};
|
||||||
|
mainHandler.post(myRunnable);
|
||||||
if (!chromeCast.isConnected()) {
|
if (!chromeCast.isConnected()) {
|
||||||
chromeCast.connect();
|
chromeCast.connect();
|
||||||
}
|
}
|
||||||
|
myRunnable = this::invalidateOptionsMenu;
|
||||||
|
mainHandler.post(myRunnable);
|
||||||
Status status = chromeCast.getStatus();
|
Status status = chromeCast.getStatus();
|
||||||
if (chromeCast.isAppAvailable(CAST_ID) && !status.isAppRunning(CAST_ID)) {
|
if (chromeCast.isAppAvailable(CAST_ID) && !status.isAppRunning(CAST_ID)) {
|
||||||
chromeCast.launchApp(CAST_ID);
|
chromeCast.launchApp(CAST_ID);
|
||||||
}
|
}
|
||||||
mainHandler.post(myRunnable);
|
|
||||||
if (chromeCastVideoURL != null) {
|
if (chromeCastVideoURL != null) {
|
||||||
|
if (player != null && player.getCurrentPosition() > 0) {
|
||||||
|
chromeCastVideoURL += "?start=" + (player.getCurrentPosition() / 1000);
|
||||||
|
}
|
||||||
String mime = MimeTypeMap.getFileExtensionFromUrl(chromeCastVideoURL);
|
String mime = MimeTypeMap.getFileExtensionFromUrl(chromeCastVideoURL);
|
||||||
chromeCast.setRequestTimeout(120000);
|
chromeCast.setRequestTimeout(120000);
|
||||||
chromeCast.load(peertube.getTitle(), null, chromeCastVideoURL, mime);
|
chromeCast.load(peertube.getTitle(), null, chromeCastVideoURL, mime);
|
||||||
chromeCast.play();
|
chromeCast.play();
|
||||||
|
binding.castPlay.setImageResource(R.drawable.ic_baseline_pause_32);
|
||||||
}
|
}
|
||||||
|
myRunnable = () -> binding.castLoader.setVisibility(View.GONE);
|
||||||
|
mainHandler.post(myRunnable);
|
||||||
} catch (IOException | GeneralSecurityException e) {
|
} catch (IOException | GeneralSecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -1301,6 +1349,9 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
|
||||||
@Override
|
@Override
|
||||||
public void onConfigurationChanged(@NotNull Configuration newConfig) {
|
public void onConfigurationChanged(@NotNull Configuration newConfig) {
|
||||||
super.onConfigurationChanged(newConfig);
|
super.onConfigurationChanged(newConfig);
|
||||||
|
if (binding.castController.getVisibility() == View.VISIBLE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
||||||
if (mode != Helper.VIDEO_MODE_WEBVIEW) {
|
if (mode != Helper.VIDEO_MODE_WEBVIEW) {
|
||||||
openFullscreenDialog();
|
openFullscreenDialog();
|
||||||
|
@ -1376,7 +1427,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
|
||||||
}
|
}
|
||||||
if (player != null && (!isPlayInMinimized || !playInMinimized)) {
|
if (player != null && (!isPlayInMinimized || !playInMinimized)) {
|
||||||
player.setPlayWhenReady(false);
|
player.setPlayWhenReady(false);
|
||||||
} else if (playInMinimized) {
|
} else if (playInMinimized && binding.castController.getVisibility() != View.VISIBLE) {
|
||||||
enterVideoMode();
|
enterVideoMode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="32dp"
|
||||||
|
android:height="32dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z" />
|
||||||
|
</vector>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="32dp"
|
||||||
|
android:height="32dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M8,5v14l11,-7z" />
|
||||||
|
</vector>
|
|
@ -67,6 +67,59 @@
|
||||||
app:yt_playerView="@+id/doubleTapPlayerView"
|
app:yt_playerView="@+id/doubleTapPlayerView"
|
||||||
android:gravity="center" />
|
android:gravity="center" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/cast_controller"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@android:color/black"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/cast_play"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:contentDescription="@string/play"
|
||||||
|
android:src="@drawable/ic_baseline_play_arrow_32"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/cast_loader"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/cast_loader_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/please_wait"
|
||||||
|
android:textColor="?colorAccent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/cast_loader_small"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<com.github.ybq.android.spinkit.SpinKitView
|
||||||
|
android:id="@+id/cast_loader_small"
|
||||||
|
style="@style/progressBottom"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="18dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
app:SpinKit_Color="?colorAccent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/cast_loader_text"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<app.fedilab.fedilabtube.webview.CustomWebview
|
<app.fedilab.fedilabtube.webview.CustomWebview
|
||||||
android:id="@+id/webview_video"
|
android:id="@+id/webview_video"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
Loading…
Reference in New Issue