From 9c676d80025bdef8b77a6ae9a2a32b5aa8cb2333 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 16 Nov 2020 18:54:59 +0100 Subject: [PATCH 01/95] some improvements --- .../fedilab/fedilabtube/PeertubeActivity.java | 267 +++++++++--------- .../fedilabtube/client/MenuItemVideo.java | 50 ++++ .../fedilabtube/drawer/MenuAdapter.java | 96 +++++++ .../helper/FullScreenMediaController.java | 130 --------- .../fedilab/fedilabtube/helper/Helper.java | 10 +- app/src/main/res/layout/activity_peertube.xml | 34 +++ app/src/main/res/layout/drawer_menu.xml | 29 ++ .../res/layout/exo_player_control_view.xml | 36 ++- app/src/main/res/values/styles.xml | 1 + 9 files changed, 379 insertions(+), 274 deletions(-) create mode 100644 app/src/main/java/app/fedilab/fedilabtube/client/MenuItemVideo.java create mode 100644 app/src/main/java/app/fedilab/fedilabtube/drawer/MenuAdapter.java delete mode 100644 app/src/main/java/app/fedilab/fedilabtube/helper/FullScreenMediaController.java create mode 100644 app/src/main/res/layout/drawer_menu.xml diff --git a/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java b/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java index d30280c..72eaa2c 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/PeertubeActivity.java @@ -17,7 +17,6 @@ package app.fedilab.fedilabtube; import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.Dialog; import android.app.PictureInPictureParams; import android.content.BroadcastReceiver; import android.content.Context; @@ -42,14 +41,12 @@ import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.EditText; -import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; @@ -109,6 +106,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import app.fedilab.fedilabtube.client.APIResponse; +import app.fedilab.fedilabtube.client.MenuItemVideo; import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI; import app.fedilab.fedilabtube.client.data.AccountData.Account; import app.fedilab.fedilabtube.client.data.CaptionData.Caption; @@ -122,8 +120,8 @@ import app.fedilab.fedilabtube.client.entities.PlaylistExist; import app.fedilab.fedilabtube.client.entities.Report; import app.fedilab.fedilabtube.databinding.ActivityPeertubeBinding; import app.fedilab.fedilabtube.drawer.CommentListAdapter; +import app.fedilab.fedilabtube.drawer.MenuAdapter; import app.fedilab.fedilabtube.helper.CacheDataSourceFactory; -import app.fedilab.fedilabtube.helper.FullScreenMediaController; import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.sqlite.AccountDAO; import app.fedilab.fedilabtube.sqlite.Sqlite; @@ -150,16 +148,14 @@ import static app.fedilab.fedilabtube.helper.Helper.loadGiF; import static com.google.android.exoplayer2.Player.MEDIA_ITEM_TRANSITION_REASON_AUTO; -public class PeertubeActivity extends AppCompatActivity implements CommentListAdapter.AllCommentRemoved, Player.EventListener, VideoListener, TorrentListener { +public class PeertubeActivity extends AppCompatActivity implements CommentListAdapter.AllCommentRemoved, Player.EventListener, VideoListener, TorrentListener, MenuAdapter.ItemClicked { public static String video_id; public static List playedVideos = new ArrayList<>(); private String peertubeInstance, videoUuid; - private FullScreenMediaController.fullscreen fullscreen; private ImageView fullScreenIcon; private SimpleExoPlayer player; private boolean fullScreenMode; - private Dialog fullScreenDialog; private VideoData.Video peertube; private int mode; private Map> playlists; @@ -183,6 +179,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd private videoOrientation videoOrientationType; private int initialOrientation; + public static void hideKeyboard(Activity activity) { if (activity != null && activity.getWindow() != null) { activity.getWindow().getDecorView(); @@ -252,6 +249,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd .removeFilesAfterStop(true) .build(); + fullScreenMode = false; torrentStream = TorrentStream.init(torrentOptions); torrentStream.addListener(PeertubeActivity.this); initialOrientation = getResources().getConfiguration().orientation; @@ -322,29 +320,12 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd MastalabWebChromeClient mastalabWebChromeClient = new MastalabWebChromeClient(PeertubeActivity.this, webview_video, binding.mainMediaFrame, binding.videoLayout); mastalabWebChromeClient.setOnToggledFullscreen(fullscreen -> { - if (fullscreen) { binding.videoLayout.setVisibility(View.VISIBLE); - WindowManager.LayoutParams attrs = getWindow().getAttributes(); - attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; - attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; - getWindow().setAttributes(attrs); - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); - binding.peertubeInformationContainer.setVisibility(View.GONE); - if (videoOrientationType == videoOrientation.LANDSCAPE) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - } else { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - } } else { - WindowManager.LayoutParams attrs = getWindow().getAttributes(); - attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN; - attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; - getWindow().setAttributes(attrs); - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); binding.videoLayout.setVisibility(View.GONE); - binding.peertubeInformationContainer.setVisibility(View.VISIBLE); } + toogleFullscreen(fullscreen); }); binding.webviewVideo.getSettings().setAllowFileAccess(true); binding.webviewVideo.setWebChromeClient(mastalabWebChromeClient); @@ -361,21 +342,24 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd if (mode != Helper.VIDEO_MODE_WEBVIEW) { binding.doubleTapPlayerView.setControllerShowTimeoutMs(1000); binding.doubleTapPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT); - initFullscreenDialog(); - initFullscreenButton(); + // initFullscreenDialog(); + initControllerButtons(); binding.doubleTapPlayerView .setDoubleTapDelay(500); binding.doubleTapPlayerView.setDoubleTapEnabled(true); + binding.doubleTapPlayerView.setControllerShowTimeoutMs(0); binding.mediaVideo.performListener(new YouTubeOverlay.PerformListener() { @Override public void onAnimationStart() { binding.mediaVideo.setVisibility(View.VISIBLE); + binding.doubleTapPlayerView.setUseController(false); } @Override public void onAnimationEnd() { binding.mediaVideo.setVisibility(View.GONE); + binding.doubleTapPlayerView.setUseController(true); } }).playerView(binding.doubleTapPlayerView).seekSeconds(10); binding.doubleTapPlayerView.setPlayer(player); @@ -419,13 +403,18 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd registBroadcastReceiver(); if (autoFullscreen && autoPlay) { openFullscreenDialog(); - if (videoOrientationType == videoOrientation.LANDSCAPE) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - } else { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - } } binding.postCommentButton.setOnClickListener(v -> openPostComment(null, 0)); + + List menuItemVideos = new ArrayList<>(); + MenuItemVideo resolutionItem = new MenuItemVideo(); + resolutionItem.setIcon(R.drawable.ic_baseline_settings_24); + resolutionItem.setTitle(getString(R.string.pickup_resolution)); + resolutionItem.setAction(MenuItemVideo.actionType.RESOLUTION); + + MenuAdapter menuAdapter = new MenuAdapter(menuItemVideos); + binding.mainOptionsVideo.setAdapter(menuAdapter); + } private void manageVIewVideos(APIResponse apiResponse) { @@ -559,19 +548,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd show_more_content = null; binding.peertubeDescriptionMore.setVisibility(View.GONE); if (autoFullscreen && autoPlay) { - fullscreen = FullScreenMediaController.fullscreen.ON; - setFullscreen(FullScreenMediaController.fullscreen.ON); - fullScreenMode = true; openFullscreenDialog(); - if (videoOrientationType == videoOrientation.LANDSCAPE) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - } else { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - } - } else { - fullscreen = FullScreenMediaController.fullscreen.OFF; - setFullscreen(FullScreenMediaController.fullscreen.OFF); - fullScreenMode = false; } binding.peertubePlaylist.setVisibility(View.VISIBLE); binding.peertubeBookmark.setVisibility(View.GONE); @@ -608,20 +585,6 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd }).start(); } - public void change() { - if (fullscreen == FullScreenMediaController.fullscreen.ON) { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | - WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - Objects.requireNonNull(getSupportActionBar()).hide(); - binding.peertubeInformationContainer.setVisibility(View.GONE); - } else { - getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); - Objects.requireNonNull(getSupportActionBar()).show(); - binding.peertubeInformationContainer.setVisibility(View.VISIBLE); - } - } - @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { @@ -671,13 +634,6 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd alertDialog2.show(); } - public FullScreenMediaController.fullscreen getFullscreen() { - return fullscreen; - } - - public void setFullscreen(FullScreenMediaController.fullscreen fullscreen) { - this.fullscreen = fullscreen; - } public void manageCaptions(APIResponse apiResponse) { if (apiResponse == null || (apiResponse.getError() != null) || apiResponse.getCaptions() == null || apiResponse.getCaptions().size() == 0) { @@ -1069,7 +1025,6 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd if (mode != Helper.VIDEO_MODE_WEBVIEW) { openFullscreenDialog(); } - setFullscreen(FullScreenMediaController.fullscreen.ON); if (initialOrientation == Configuration.ORIENTATION_LANDSCAPE) { LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( ConstraintLayout.LayoutParams.MATCH_PARENT, @@ -1082,7 +1037,6 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd if (mode != Helper.VIDEO_MODE_WEBVIEW) { closeFullscreenDialog(); } - setFullscreen(FullScreenMediaController.fullscreen.OFF); if (initialOrientation == Configuration.ORIENTATION_LANDSCAPE) { LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( ConstraintLayout.LayoutParams.MATCH_PARENT, @@ -1092,7 +1046,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd binding.videoContainer.setLayoutParams(param); } } - change(); + //change(); } @Override @@ -1106,9 +1060,6 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd torrentStream.stopStream(); } unregisterReceiver(); - if (fullScreenDialog != null && fullScreenDialog.isShowing()) { - fullScreenDialog.dismiss(); - } } @Override @@ -1152,6 +1103,8 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd if (player != null && isPlayInMinimized) { if (!sharedpreferences.getBoolean(getString(R.string.set_play_screen_lock_choice), false)) { player.setPlayWhenReady(false); + } else { + player.setWakeMode(C.WAKE_MODE_NETWORK); } } } @@ -1161,15 +1114,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd } private void unregisterReceiver() { - int apiLevel = Build.VERSION.SDK_INT; - - if (apiLevel >= 7) { - try { - getApplicationContext().unregisterReceiver(mPowerKeyReceiver); - } catch (IllegalArgumentException e) { - mPowerKeyReceiver = null; - } - } else { + if (mPowerKeyReceiver != null) { getApplicationContext().unregisterReceiver(mPowerKeyReceiver); mPowerKeyReceiver = null; } @@ -1198,25 +1143,31 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd @Override public void onBackPressed() { + if (binding.mainOptionsVideo.getVisibility() == View.VISIBLE) { + closeMainMenuOptions(); + return; + } if (binding.postComment.getVisibility() == View.VISIBLE) { closePostComment(); - } else if (binding.replyThread.getVisibility() == View.VISIBLE) { + return; + } + if (binding.replyThread.getVisibility() == View.VISIBLE) { closeCommentThread(); + return; + } + if (playInMinimized && player != null) { + enterVideoMode(); } else { - if (playInMinimized && player != null) { - enterVideoMode(); - } else { - super.onBackPressed(); - } + super.onBackPressed(); } } @Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) { if (isInPictureInPictureMode) { - setFullscreen(FullScreenMediaController.fullscreen.ON); + fullScreenMode = true; } else { - setFullscreen(FullScreenMediaController.fullscreen.OFF); + fullScreenMode = false; if (onStopCalled) { isPlayInMinimized = false; finishAndRemoveTask(); @@ -1261,36 +1212,38 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd builderSingle.show(); } - private void initFullscreenDialog() { + private void toogleFullscreen(boolean fullscreen) { - fullScreenDialog = new Dialog(this, android.R.style.Theme_Black_NoTitleBar_Fullscreen) { - public void onBackPressed() { - if (player != null && player.isPlaying() && fullScreenMode) { - player.setPlayWhenReady(false); - } - if (fullScreenMode) { - closeFullscreenDialog(); - if (!Helper.isTablet(PeertubeActivity.this) && initialOrientation != Configuration.ORIENTATION_LANDSCAPE) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - Handler handler = new Handler(); - handler.postDelayed(() -> setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR), 2000); - } else { - binding.peertubeInformationContainer.setVisibility(View.VISIBLE); - } - } - super.onBackPressed(); + if (fullscreen) { + WindowManager.LayoutParams attrs = getWindow().getAttributes(); + attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN; + attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; + getWindow().setAttributes(attrs); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); + binding.bottomVideo.setVisibility(View.GONE); + Objects.requireNonNull(getSupportActionBar()).hide(); + if (videoOrientationType == videoOrientation.LANDSCAPE) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } else { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } - }; + } else { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + binding.bottomVideo.setVisibility(View.VISIBLE); + Objects.requireNonNull(getSupportActionBar()).show(); + } } private void openFullscreenDialog() { - - ((ViewGroup) binding.doubleTapPlayerView.getParent()).removeView(binding.doubleTapPlayerView); - fullScreenDialog.addContentView(binding.doubleTapPlayerView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); fullScreenIcon.setImageDrawable(ContextCompat.getDrawable(PeertubeActivity.this, R.drawable.ic_baseline_fullscreen_exit_24)); fullScreenMode = true; + toogleFullscreen(true); + } - fullScreenDialog.show(); + private void closeFullscreenDialog() { + fullScreenMode = false; + fullScreenIcon.setImageDrawable(ContextCompat.getDrawable(PeertubeActivity.this, R.drawable.ic_baseline_fullscreen_24)); + toogleFullscreen(false); } public void openCommentThread(Comment comment) { @@ -1313,6 +1266,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd public void onAnimationEnd(Animation animation) { binding.peertubeInformationContainer.setVisibility(View.GONE); } + @Override public void onAnimationRepeat(Animation animation) { } @@ -1321,6 +1275,64 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd binding.replyThread.startAnimation(animate); } + + public void openMainMenuOptions() { + binding.videoParams.setVisibility(View.VISIBLE); + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + int height = displayMetrics.heightPixels; + + + TranslateAnimation animate = new TranslateAnimation( + 0, + 0, + height, + height - binding.videoParams.getHeight()); + animate.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + animate.setDuration(500); + binding.videoParams.startAnimation(animate); + } + + public void closeMainMenuOptions() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + int height = displayMetrics.heightPixels; + TranslateAnimation animate = new TranslateAnimation( + 0, + 0, + height - binding.videoParams.getHeight(), + height); + animate.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + binding.videoParams.setVisibility(View.GONE); + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + animate.setDuration(500); + binding.videoParams.startAnimation(animate); + } + + private void sendComment(Comment comment, int position) { if (isLoggedIn(PeertubeActivity.this) && !sepiaSearch) { if (comment == null) { @@ -1480,16 +1492,8 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd } } - private void closeFullscreenDialog() { - ((ViewGroup) binding.doubleTapPlayerView.getParent()).removeView(binding.doubleTapPlayerView); - ((FrameLayout) findViewById(R.id.main_media_frame)).addView(binding.doubleTapPlayerView); - fullScreenMode = false; - fullScreenDialog.dismiss(); - fullScreenIcon.setImageDrawable(ContextCompat.getDrawable(PeertubeActivity.this, R.drawable.ic_baseline_fullscreen_24)); - } - - private void initFullscreenButton() { + private void initControllerButtons() { PlayerControlView controlView = binding.doubleTapPlayerView.findViewById(R.id.exo_controller); fullScreenIcon = controlView.findViewById(R.id.exo_fullscreen_icon); @@ -1497,11 +1501,6 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd fullScreenButton.setOnClickListener(v -> { if (!fullScreenMode) { openFullscreenDialog(); - if (videoOrientationType == videoOrientation.LANDSCAPE) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - } else { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - } } else { closeFullscreenDialog(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); @@ -1510,20 +1509,25 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd } }); + ImageButton playButton = controlView.findViewById(R.id.exo_play); playButton.setOnClickListener(v -> { if (autoFullscreen && !fullScreenMode) { openFullscreenDialog(); - if (videoOrientationType == videoOrientation.LANDSCAPE) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - } else { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - } } player.setPlayWhenReady(true); }); View exo_next = controlView.findViewById(R.id.exo_next); exo_next.setOnClickListener(v -> playNextVideo()); + + View exoSettings = controlView.findViewById(R.id.exo_settings); + exoSettings.setOnClickListener(v -> { + if (binding.videoParams.getVisibility() == View.VISIBLE) { + closeMainMenuOptions(); + } else { + openMainMenuOptions(); + } + }); } private void initResolution() { @@ -1695,6 +1699,11 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd } + @Override + public void onItemClicked(MenuItemVideo.actionType action) { + + } + enum videoOrientation { LANDSCAPE, diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/MenuItemVideo.java b/app/src/main/java/app/fedilab/fedilabtube/client/MenuItemVideo.java new file mode 100644 index 0000000..51f023a --- /dev/null +++ b/app/src/main/java/app/fedilab/fedilabtube/client/MenuItemVideo.java @@ -0,0 +1,50 @@ +package app.fedilab.fedilabtube.client; +/* Copyright 2020 Thomas Schneider + * + * This file is a part of TubeLab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with TubeLab; if not, + * see . */ + +public class MenuItemVideo { + + int icon; + String title; + actionType action; + + public int getIcon() { + return icon; + } + + public void setIcon(int icon) { + this.icon = icon; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public actionType getAction() { + return action; + } + + public void setAction(actionType action) { + this.action = action; + } + + public enum actionType { + RESOLUTION + } +} diff --git a/app/src/main/java/app/fedilab/fedilabtube/drawer/MenuAdapter.java b/app/src/main/java/app/fedilab/fedilabtube/drawer/MenuAdapter.java new file mode 100644 index 0000000..13d8d78 --- /dev/null +++ b/app/src/main/java/app/fedilab/fedilabtube/drawer/MenuAdapter.java @@ -0,0 +1,96 @@ +package app.fedilab.fedilabtube.drawer; +/* Copyright 2020 Thomas Schneider + * + * This file is a part of TubeLab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with TubeLab; if not, + * see . */ + + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; + +import java.util.List; + +import app.fedilab.fedilabtube.client.MenuItemVideo; +import app.fedilab.fedilabtube.databinding.DrawerMenuBinding; + + +public class MenuAdapter extends RecyclerView.Adapter { + + + private final List menuItemVideos; + public ItemClicked itemClicked; + private Context context; + + + public MenuAdapter(List menuItemVideos) { + this.menuItemVideos = menuItemVideos; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return menuItemVideos.size(); + } + + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + context = parent.getContext(); + DrawerMenuBinding itemBinding = DrawerMenuBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new ViewHolder(itemBinding); + } + + @Override + public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) { + + context = viewHolder.itemView.getContext(); + + final ViewHolder holder = (ViewHolder) viewHolder; + + final MenuItemVideo menuItemVideo = menuItemVideos.get(i); + + Glide.with(context).load(menuItemVideo.getIcon()).into(holder.binding.menuIcon); + holder.binding.title.setText(menuItemVideo.getTitle()); + holder.binding.itemMenuContainer.setOnClickListener(v -> { + itemClicked.onItemClicked(menuItemVideo.getAction()); + }); + + } + + public interface ItemClicked { + void onItemClicked(MenuItemVideo.actionType actionType); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + + DrawerMenuBinding binding; + + ViewHolder(DrawerMenuBinding itemView) { + super(itemView.getRoot()); + binding = itemView; + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/fedilabtube/helper/FullScreenMediaController.java b/app/src/main/java/app/fedilab/fedilabtube/helper/FullScreenMediaController.java deleted file mode 100644 index 17ae253..0000000 --- a/app/src/main/java/app/fedilab/fedilabtube/helper/FullScreenMediaController.java +++ /dev/null @@ -1,130 +0,0 @@ -package app.fedilab.fedilabtube.helper; -/* Copyright 2020 Thomas Schneider - * - * This file is a part of TubeLab - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with TubeLab; if not, - * see . */ - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Color; -import android.view.Gravity; -import android.view.View; -import android.widget.Button; -import android.widget.ImageButton; -import android.widget.MediaController; - -import androidx.core.content.res.ResourcesCompat; - -import app.fedilab.fedilabtube.PeertubeActivity; -import app.fedilab.fedilabtube.R; -import app.fedilab.fedilabtube.client.data.VideoData.Video; - - -/** - * Created by Thomas - * FullScreenMediaController. Inspired from the work at http://www.zoftino.com/android-videoview-playing-videos-full-screen - */ -public class FullScreenMediaController extends MediaController { - - private final Context context; - private ImageButton fullScreen; - private Button resolution; - private Video peertube; - private String resolutionVal; - - public FullScreenMediaController(Context context) { - super(context); - this.context = context; - } - - @SuppressWarnings({"unused", "RedundantSuppression"}) - public FullScreenMediaController(Context context, Video peertube) { - super(context); - this.peertube = peertube; - this.context = context; - } - - @Override - public void setAnchorView(View view) { - - super.setAnchorView(view); - - //image button for full screen to be added to media controller - fullScreen = new ImageButton(context); - LayoutParams params = - new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT); - params.gravity = Gravity.END; - params.rightMargin = 80; - params.topMargin = 22; - addView(fullScreen, params); - - if (resolutionVal == null) - resolutionVal = peertube.getFiles().get(0).getResolutions().getLabel() + "p"; - resolution = new Button(context); - resolution.setAllCaps(false); - resolution.setBackgroundColor(Color.TRANSPARENT); - resolution.setText(resolutionVal); - resolution.setPadding(0, 0, 0, 0); - LayoutParams paramsButton = - new LayoutParams(LayoutParams.WRAP_CONTENT, - LayoutParams.WRAP_CONTENT); - paramsButton.gravity = Gravity.START; - paramsButton.rightMargin = 80; - paramsButton.topMargin = 22; - resolution.setOnClickListener(v -> ((PeertubeActivity) getContext()).displayResolution()); - addView(resolution, paramsButton); - - if (((PeertubeActivity) getContext()).getFullscreen() == fullscreen.ON) { - Resources resources = getResources(); - fullScreen.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_baseline_fullscreen_exit_24, null)); - } else { - Resources resources = getResources(); - fullScreen.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_baseline_fullscreen_24, null)); - } - //add listener to image button to handle full screen and exit full screen events - fullScreen.setOnClickListener(v -> { - - if (((PeertubeActivity) getContext()).getFullscreen() == fullscreen.ON) { - ((PeertubeActivity) getContext()).setFullscreen(fullscreen.OFF); - } else { - ((PeertubeActivity) getContext()).setFullscreen(fullscreen.ON); - } - ((PeertubeActivity) getContext()).change(); - changeIcon(); - }); - } - - @SuppressWarnings({"unused", "RedundantSuppression"}) - public void setResolutionVal(String resolutionVal) { - this.resolutionVal = resolutionVal; - if (resolution != null) - resolution.setText(String.format("%sp", resolutionVal)); - } - - public void changeIcon() { - //fullscreen indicator from intent - if (((PeertubeActivity) getContext()).getFullscreen() == fullscreen.ON) { - Resources resources = getResources(); - fullScreen.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_baseline_fullscreen_exit_24, null)); - } else { - Resources resources = getResources(); - fullScreen.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_baseline_fullscreen_24, null)); - } - } - - public enum fullscreen { - OFF, - ON - } -} \ No newline at end of file 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 491c68d..6a3d2df 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java +++ b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java @@ -734,7 +734,15 @@ public class Helper { if (video_quality == QUALITY_HIGH) { return files.get(0); } else if (video_quality == QUALITY_LOW) { - return files.get(files.size() - 1); + if (files.get(files.size() - 1).getResolutions().getLabel().trim().toLowerCase().compareTo("0p") != 0) { + return files.get(files.size() - 1); + } else { + if (files.size() > 1) { + return files.get(files.size() - 2); + } else { + return files.get(0); + } + } } else { if (files.size() < 3) { return files.get(files.size() - 1); diff --git a/app/src/main/res/layout/activity_peertube.xml b/app/src/main/res/layout/activity_peertube.xml index a63575b..7b3031d 100644 --- a/app/src/main/res/layout/activity_peertube.xml +++ b/app/src/main/res/layout/activity_peertube.xml @@ -40,6 +40,7 @@ android:layout_centerInParent="true" android:layout_gravity="center" android:background="#000000" + android:animateLayoutChanges="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" @@ -47,6 +48,7 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/drawer_menu.xml b/app/src/main/res/layout/drawer_menu.xml new file mode 100644 index 0000000..2e28f36 --- /dev/null +++ b/app/src/main/res/layout/drawer_menu.xml @@ -0,0 +1,29 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/exo_player_control_view.xml b/app/src/main/res/layout/exo_player_control_view.xml index 01ad9fc..6b35d36 100644 --- a/app/src/main/res/layout/exo_player_control_view.xml +++ b/app/src/main/res/layout/exo_player_control_view.xml @@ -9,29 +9,36 @@ See the License for the specific language governing permissions and limitations under the License. --> - + + + app:layout_constraintTop_toTopOf="parent"> - - - - + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4e30a33..3ae510b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -24,4 +24,5 @@ diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3ae510b..97324ce 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,5 +1,5 @@ - + - -