Support pass

pull/123/head
FongMi 4 years ago
parent fdbc1818f6
commit bccf9d005c
  1. 6
      app/src/leanback/java/com/fongmi/android/tv/impl/PassCallback.java
  2. 42
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  3. 94
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/PassDialog.java
  4. 1
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/GroupPresenter.java
  5. 40
      app/src/leanback/res/layout/dialog_pass.xml
  6. 15
      app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java
  7. 23
      app/src/main/java/com/fongmi/android/tv/bean/Group.java
  8. 5
      app/src/main/res/values-zh-rCN/strings.xml
  9. 5
      app/src/main/res/values-zh-rTW/strings.xml
  10. 5
      app/src/main/res/values/strings.xml

@ -0,0 +1,6 @@
package com.fongmi.android.tv.impl;
public interface PassCallback {
void setPass(String pass);
}

@ -16,20 +16,24 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.api.LiveConfig;
import com.fongmi.android.tv.bean.Channel;
import com.fongmi.android.tv.bean.Group;
import com.fongmi.android.tv.databinding.ActivityLiveBinding;
import com.fongmi.android.tv.event.PlayerEvent;
import com.fongmi.android.tv.impl.PassCallback;
import com.fongmi.android.tv.model.LiveViewModel;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.player.source.Force;
import com.fongmi.android.tv.ui.custom.CustomKeyDownLive;
import com.fongmi.android.tv.ui.custom.CustomLiveListView;
import com.fongmi.android.tv.ui.custom.dialog.PassDialog;
import com.fongmi.android.tv.ui.presenter.ChannelPresenter;
import com.fongmi.android.tv.ui.presenter.GroupPresenter;
import com.fongmi.android.tv.utils.Clock;
import com.fongmi.android.tv.utils.Prefers;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.ui.StyledPlayerView;
@ -40,13 +44,14 @@ import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback {
public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, PassCallback {
private ActivityLiveBinding mBinding;
private ArrayObjectAdapter mChannelAdapter;
private ArrayObjectAdapter mGroupAdapter;
private CustomKeyDownLive mKeyDown;
private LiveViewModel mViewModel;
private List<Group> mHides;
private Handler mHandler;
private Players mPlayers;
private Channel mChannel;
@ -55,6 +60,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private Runnable mR0;
private Runnable mR1;
private Runnable mR2;
private int count;
public static void start(Activity activity) {
if (LiveConfig.get().isEmpty()) return;
@ -86,6 +92,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mPlayers = new Players().init();
mHandler = new Handler(Looper.getMainLooper());
mKeyDown = CustomKeyDownLive.create(this);
mHides = new ArrayList<>();
setRecyclerView();
setViewModel();
setVideoView();
@ -126,13 +133,16 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private void getLive() {
List<Group> items = new ArrayList<>();
items.addAll(LiveConfig.get().getHome().getGroups());
items.add(new Group(ResUtil.getString(R.string.live_keep)));
for (Group group : LiveConfig.get().getHome().getGroups()) (group.isHidden() ? mHides : items).add(group);
items.add(new Group(ResUtil.getString(R.string.live_setting)));
mGroupAdapter.setItems(items, null);
mBinding.group.setVisibility(mGroupAdapter.size() == 1 ? View.GONE : View.VISIBLE);
setPosition(LiveConfig.get().getKeep());
setPosition(LiveConfig.get().getKeep(mGroupAdapter.unmodifiableList()));
}
private void setPosition(int[] position) {
if (position[0] == -1) return;
mGroup = (Group) mGroupAdapter.get(position[0]);
mBinding.group.setSelectedPosition(position[0]);
mGroup.setPosition(position[1]);
@ -192,10 +202,18 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.info.getRoot().setVisibility(View.VISIBLE);
}
private void resetPass() {
this.count = 0;
}
@Override
public void onItemClick(Group item) {
mChannelAdapter.setItems(mGroup.getChannel(), null);
mBinding.channel.setSelectedPosition(mGroup.getPosition());
if (!item.isKeep() || ++count < 5) return;
mHandler.removeCallbacks(mR0);
PassDialog.show(this);
resetPass();
}
@Override
@ -225,6 +243,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.group.setSelectedPosition(position);
mChannelAdapter.setItems(mGroup.getChannel(), null);
mGroup.setPosition(0);
resetPass();
}
@Override
@ -235,6 +254,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.group.setSelectedPosition(position);
mChannelAdapter.setItems(mGroup.getChannel(), null);
mGroup.setPosition(mGroup.getChannel().size() - 1);
resetPass();
}
@Override
@ -258,8 +278,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
public void onFind(String number) {
mBinding.digital.setVisibility(View.GONE);
int[] position = LiveConfig.get().find(number);
if (position[0] != -1) setPosition(position);
setPosition(LiveConfig.get().find(number, mGroupAdapter.unmodifiableList()));
}
@Override
@ -304,6 +323,19 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
public void onLongPress() {
}
@Override
public void setPass(String pass) {
int position = mGroupAdapter.size() - 1;
for (Group item : mHides) {
if (!item.getPass().equals(pass)) continue;
mGroupAdapter.add(position, item);
mBinding.group.setSelectedPosition(position);
mHides.remove(item);
onItemClick(item);
break;
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPlayerEvent(PlayerEvent event) {
switch (event.getState()) {

@ -0,0 +1,94 @@
package com.fongmi.android.tv.ui.custom.dialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import com.fongmi.android.tv.databinding.DialogPassBinding;
import com.fongmi.android.tv.impl.PassCallback;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
public class PassDialog extends BottomSheetDialogFragment {
private final PassCallback callback;
private DialogPassBinding binding;
public static void show(FragmentActivity activity) {
for (Fragment fragment : activity.getSupportFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) return;
new PassDialog(activity).show(activity.getSupportFragmentManager(), null);
}
private PassDialog(FragmentActivity activity) {
this.callback = (PassCallback) activity;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = DialogPassBinding.inflate(inflater, container, false);
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) {
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
FrameLayout bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet);
BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
params.width = ResUtil.dp2px(250);
dialog.getWindow().setAttributes(params);
behavior.setSkipCollapsed(true);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initEvent();
}
protected void initEvent() {
binding.positive.setOnClickListener(this::onPass);
binding.pass.setOnEditorActionListener(this::onEditorAction);
}
private boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) binding.positive.performClick();
return true;
}
private void onPass(View view) {
String pass = binding.pass.getText().toString().trim();
if (pass.length() > 0) callback.setPass(pass);
dismiss();
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}

@ -33,7 +33,6 @@ public class GroupPresenter extends Presenter {
item.loadLogo(holder.binding.logo);
holder.binding.name.setText(item.getName());
holder.binding.logo.setVisibility(item.getVisible());
holder.binding.getRoot().setSelected(item.isSelected());
setOnClickListener(holder, view -> mListener.onItemClick(item));
}

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/white"
android:fitsSystemWindows="true"
android:gravity="center"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/pass"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:layout_weight="1"
android:background="@null"
android:hint="@string/live_pass"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLength="20"
android:singleLine="true"
android:textSize="16sp" />
<TextView
android:id="@+id/positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:singleLine="true"
android:text="@string/dialog_positive"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>

@ -131,24 +131,23 @@ public class LiveConfig {
}
public void setKeep(Group group, Channel channel) {
Prefers.putKeep(home.getName() + AppDatabase.SYMBOL + group.getName() + AppDatabase.SYMBOL + channel.getName());
if (!group.isHidden()) Prefers.putKeep(home.getName() + AppDatabase.SYMBOL + group.getName() + AppDatabase.SYMBOL + channel.getName());
}
public int[] getKeep() {
public int[] getKeep(List<Group> items) {
String[] splits = Prefers.getKeep().split(AppDatabase.SYMBOL);
if (!home.getName().equals(splits[0])) return new int[]{0, 0};
for (int i = 0; i < home.getGroups().size(); i++) {
Group group = home.getGroups().get(i);
if (!home.getName().equals(splits[0])) return new int[]{1, 0};
for (int i = 0; i < items.size(); i++) {
Group group = items.get(i);
if (group.getName().equals(splits[1])) {
int j = group.find(splits[2]);
if (j != -1) return new int[]{i, j};
}
}
return new int[]{0, 0};
return new int[]{1, 0};
}
public int[] find(String number) {
List<Group> items = home.getGroups();
public int[] find(String number, List<Group> items) {
for (int i = 0; i < items.size(); i++) {
int j = items.get(i).find(Integer.parseInt(number));
if (j != -1) return new int[]{i, j};

@ -6,6 +6,8 @@ import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
@ -22,7 +24,6 @@ public class Group {
@SerializedName("pass")
private String pass;
private boolean selected;
private int position;
public Group(String name) {
@ -64,18 +65,6 @@ public class Group {
this.pass = pass;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public void setSelected(Group item) {
this.selected = item.equals(this);
}
public int getPosition() {
return position;
}
@ -88,6 +77,14 @@ public class Group {
return !TextUtils.isEmpty(getPass());
}
public boolean isKeep() {
return getName().equals(ResUtil.getString(R.string.live_keep));
}
public boolean isSetting() {
return getName().equals(ResUtil.getString(R.string.live_setting));
}
public int getVisible() {
return getLogo().isEmpty() ? View.GONE : View.VISIBLE;
}

@ -11,9 +11,12 @@
<string name="vod_last">上次看到<xliff:g name="name">%s</xliff:g></string>
<!-- Live -->
<string name="live_keep">收藏</string>
<string name="live_pass">密码</string>
<string name="live_setting">设定</string>
<string name="live_epg_empty">暂无节目资讯</string>
<string name="live_epg_now">正在播放:<xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<string name="live_epg_next">下个节目:<xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<string name="live_epg_empty">暂无节目资讯</string>
<string name="live_line">线路 <xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<!-- Push -->

@ -11,9 +11,12 @@
<string name="vod_last">上次看到<xliff:g name="name">%s</xliff:g></string>
<!-- Live -->
<string name="live_keep">收藏</string>
<string name="live_pass">密碼</string>
<string name="live_setting">設定</string>
<string name="live_epg_empty">暫無頻道資訊</string>
<string name="live_epg_now">正在播放:<xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<string name="live_epg_next">下個節目:<xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<string name="live_epg_empty">暫無頻道資訊</string>
<string name="live_line">來源 <xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<!-- Push -->

@ -11,9 +11,12 @@
<string name="vod_last">Last seen <xliff:g name="name">%s</xliff:g></string>
<!-- Live -->
<string name="live_keep">Keep</string>
<string name="live_pass">Pass</string>
<string name="live_setting">Setting</string>
<string name="live_epg_empty">No schedule</string>
<string name="live_epg_now">Playing: <xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<string name="live_epg_next">Nex: <xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<string name="live_epg_empty">No schedule</string>
<string name="live_line">Line <xliff:g name="name">%s</xliff:g>/<xliff:g name="name">%s</xliff:g></string>
<!-- Push -->

Loading…
Cancel
Save