[mobile] update player ui - part 7

pull/123/head
FongMi 3 years ago
parent fac6c9acc0
commit b4af82bd0e
  1. 64
      app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/BaseDialog.java
  2. 49
      app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java
  3. 7
      app/src/main/java/com/fongmi/android/tv/utils/Utils.java
  4. 32
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  5. 53
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/FilterDialog.java
  6. 7
      app/src/mobile/res/layout/dialog_track.xml

@ -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<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
behavior.setSkipCollapsed(true);
}
@Override
public void onResume() {
super.onResume();
Utils.hideSystemUI(getDialog().getWindow());
}
}

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

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

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

@ -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> 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<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
behavior.setSkipCollapsed(true);
public FilterDialog filter(List<Filter> 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);
}
}

@ -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" />
app:maxHeight="212dp" />
Loading…
Cancel
Save