diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/BaseDialog.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/BaseDialog.java new file mode 100644 index 000000000..a4ca6c2e4 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/BaseDialog.java @@ -0,0 +1,64 @@ +package com.fongmi.android.tv.ui.custom.dialog; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; + +import com.fongmi.android.tv.utils.Utils; +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +public abstract class BaseDialog extends BottomSheetDialogFragment { + + protected abstract ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container); + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return getBinding(inflater, container).getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + initView(); + initEvent(); + } + + protected void initView() { + } + + protected void initEvent() { + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + dialog.setOnShowListener((DialogInterface f) -> setBehavior(dialog)); + return dialog; + } + + private void setBehavior(BottomSheetDialog dialog) { + FrameLayout bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet); + BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + behavior.setSkipCollapsed(true); + } + + @Override + public void onResume() { + super.onResume(); + Utils.hideSystemUI(getDialog().getWindow()); + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java index 0e77b2924..3c787aadc 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java @@ -1,10 +1,11 @@ package com.fongmi.android.tv.ui.custom.dialog; -import android.app.Activity; import android.view.LayoutInflater; -import android.view.WindowManager; +import android.view.ViewGroup; -import androidx.appcompat.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.bean.Track; import com.fongmi.android.tv.databinding.DialogTrackBinding; @@ -12,32 +13,28 @@ import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.adapter.TrackAdapter; import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.ui.custom.TrackNameProvider; -import com.fongmi.android.tv.utils.ResUtil; import com.google.android.exoplayer2.Tracks; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.ArrayList; import java.util.List; import tv.danmaku.ijk.media.player.misc.IjkTrackInfo; -public final class TrackDialog implements TrackAdapter.OnClickListener { +public final class TrackDialog extends BaseDialog implements TrackAdapter.OnClickListener { - private final DialogTrackBinding binding; + private DialogTrackBinding binding; private final TrackNameProvider provider; private final TrackAdapter adapter; - private final AlertDialog dialog; - private Listener listener; + private final Listener listener; private Players player; private int type; - public static TrackDialog create(Activity activity) { - return new TrackDialog(activity); + public static TrackDialog create(Listener listener) { + return new TrackDialog(listener); } - public TrackDialog(Activity activity) { - this.binding = DialogTrackBinding.inflate(LayoutInflater.from(activity)); - this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + public TrackDialog(Listener listener) { + this.listener = listener; this.adapter = new TrackAdapter(this); this.provider = new TrackNameProvider(); } @@ -52,31 +49,19 @@ public final class TrackDialog implements TrackAdapter.OnClickListener { return this; } - public TrackDialog listener(Listener listener) { - this.listener = listener; - return this; - } - - public void show() { - setRecyclerView(); - setDialog(); + @Override + protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return binding = DialogTrackBinding.inflate(inflater, container, false); } - private void setRecyclerView() { + @Override + protected void initView() { binding.recycler.setHasFixedSize(true); binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16)); binding.recycler.setAdapter(adapter.addAll(getTrack())); binding.recycler.scrollToPosition(adapter.getSelected()); } - private void setDialog() { - WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); - params.width = (int) (ResUtil.getScreenWidthPx() * 0.4f); - dialog.getWindow().setAttributes(params); - dialog.getWindow().setDimAmount(0); - dialog.show(); - } - private List getTrack() { List items = new ArrayList<>(); if (player.isExo()) addExoTrack(items); @@ -118,7 +103,7 @@ public final class TrackDialog implements TrackAdapter.OnClickListener { public void onItemClick(Track item) { if (listener != null) listener.onTrackClick(item); player.setTrack(List.of(item)); - dialog.dismiss(); + dismiss(); } public interface Listener { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java index 7d3041bb3..d866af0ab 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java @@ -16,6 +16,7 @@ import android.util.Base64; import android.util.Rational; import android.view.KeyEvent; import android.view.View; +import android.view.Window; import android.view.inputmethod.InputMethodManager; import androidx.fragment.app.FragmentActivity; @@ -76,8 +77,12 @@ public class Utils { } public static void hideSystemUI(Activity activity) { + hideSystemUI(activity.getWindow()); + } + + public static void hideSystemUI(Window window) { int flags = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; - activity.getWindow().getDecorView().setSystemUiVisibility(flags); + window.getDecorView().setSystemUiVisibility(flags); } public static void toggleFab(int dy, FloatingActionButton fab) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 1634fa258..3b1e3446a 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -17,6 +17,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.widget.PopupMenu; import androidx.core.app.ShareCompat; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; @@ -53,6 +54,7 @@ import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Traffic; import com.fongmi.android.tv.utils.Utils; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.ui.StyledPlayerView; @@ -209,9 +211,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis protected void initEvent() { mBinding.control.seek.setListener(mPlayers); mBinding.more.setOnClickListener(view -> onMore()); - //mBinding.control.text.setOnClickListener(this::onTrack); - //mBinding.control.audio.setOnClickListener(this::onTrack); - //mBinding.control.video.setOnClickListener(this::onTrack); mBinding.reverse.setOnClickListener(view -> onReverse()); mBinding.control.full.setOnClickListener(view -> onFull()); mBinding.control.keep.setOnClickListener(view -> onKeep()); @@ -415,13 +414,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis reverseEpisode(); } - private void onTrack(View view) { - int type = Integer.parseInt(view.getTag().toString()); - TrackDialog.create(this).player(mPlayers).type(type).listener(this).show(); - setR1Callback(); - hideControl(); - } - private void onFull() { setR1Callback(); toggleFullscreen(); @@ -562,7 +554,17 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void onSetting() { - setR1Callback(); + PopupMenu popup = new PopupMenu(this, mBinding.control.setting); + if (mPlayers.haveTrack(C.TRACK_TYPE_TEXT)) popup.getMenu().add(0, C.TRACK_TYPE_TEXT, 0, R.string.play_track_text); + if (mPlayers.haveTrack(C.TRACK_TYPE_AUDIO)) popup.getMenu().add(0, C.TRACK_TYPE_AUDIO, 1, R.string.play_track_audio); + if (mPlayers.haveTrack(C.TRACK_TYPE_VIDEO)) popup.getMenu().add(0, C.TRACK_TYPE_VIDEO, 2, R.string.play_track_video); + popup.setOnMenuItemClickListener(item -> { + TrackDialog.create(this).player(mPlayers).type(item.getItemId()).show(getSupportFragmentManager(), null); + return true; + }); + if (popup.getMenu().size() > 0) { + popup.show(); + } } private void toggleFullscreen() { @@ -732,7 +734,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis switch (event.getState()) { case 0: checkPosition(); - setTrackVisible(false); break; case Player.STATE_IDLE: break; @@ -744,7 +745,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis hideProgress(); mPlayers.reset(); setDefaultTrack(); - setTrackVisible(true); mBinding.control.size.setText(mPlayers.getSizeText()); break; case Player.STATE_ENDED: @@ -759,12 +759,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis setInitTrack(true); } - private void setTrackVisible(boolean visible) { - //mBinding.control.text.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_TEXT) ? View.VISIBLE : View.GONE); - //mBinding.control.audio.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); - //mBinding.control.video.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); - } - private void setDefaultTrack() { if (isInitTrack()) { setInitTrack(false); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/FilterDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/FilterDialog.java index 69bd47efd..49d6644fb 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/FilterDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/FilterDialog.java @@ -1,28 +1,20 @@ package com.fongmi.android.tv.ui.custom.dialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.os.Bundle; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.bean.Filter; import com.fongmi.android.tv.databinding.DialogFilterBinding; import com.fongmi.android.tv.impl.FilterCallback; import com.fongmi.android.tv.ui.adapter.FilterAdapter; -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import java.util.List; -public class FilterDialog extends BottomSheetDialogFragment { +public class FilterDialog extends BaseDialog { private final FilterCallback callback; private DialogFilterBinding binding; @@ -32,48 +24,23 @@ public class FilterDialog extends BottomSheetDialogFragment { return new FilterDialog(callback); } - public FilterDialog filter(List filter) { - this.filter = filter; - return this; - } - public FilterDialog(FilterCallback callback) { this.callback = callback; } - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - binding = DialogFilterBinding.inflate(inflater, container, false); - binding.recycler.setAdapter(new FilterAdapter(callback, filter)); - binding.recycler.setHasFixedSize(true); - return binding.getRoot(); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState); - dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); - dialog.setOnShowListener((DialogInterface f) -> setBehavior(dialog)); - return dialog; - } - - private void setBehavior(BottomSheetDialog dialog) { - FrameLayout bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet); - BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); - behavior.setState(BottomSheetBehavior.STATE_EXPANDED); - behavior.setSkipCollapsed(true); + public FilterDialog filter(List filter) { + this.filter = filter; + return this; } @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); + protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return binding = DialogFilterBinding.inflate(inflater, container, false); } @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; + protected void initView() { + binding.recycler.setAdapter(new FilterAdapter(callback, filter)); + binding.recycler.setHasFixedSize(true); } } diff --git a/app/src/mobile/res/layout/dialog_track.xml b/app/src/mobile/res/layout/dialog_track.xml index d5b105654..6e721c1d4 100644 --- a/app/src/mobile/res/layout/dialog_track.xml +++ b/app/src/mobile/res/layout/dialog_track.xml @@ -4,6 +4,9 @@ android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="16dp" + android:paddingStart="12dp" + android:paddingTop="8dp" + android:paddingEnd="12dp" + android:paddingBottom="8dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" - app:maxHeight="228dp" /> \ No newline at end of file + app:maxHeight="212dp" /> \ No newline at end of file