[mobile] add info dialog

pull/171/head
FongMi 2 years ago
parent 2ed5cf3b3b
commit b3005e19d3
  1. 2
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  2. 9
      app/src/main/java/com/fongmi/android/tv/utils/Util.java
  3. 46
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  4. 49
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  5. 87
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/InfoDialog.java
  6. 10
      app/src/mobile/res/drawable/ic_control_info.xml
  7. 10
      app/src/mobile/res/drawable/ic_control_share.xml
  8. 39
      app/src/mobile/res/layout/dialog_info.xml
  9. 4
      app/src/mobile/res/layout/view_control_live.xml
  10. 4
      app/src/mobile/res/layout/view_control_vod.xml
  11. 3
      app/src/mobile/res/values-zh-rCN/strings.xml
  12. 3
      app/src/mobile/res/values-zh-rTW/strings.xml
  13. 3
      app/src/mobile/res/values/strings.xml

@ -157,7 +157,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic
}
public Map<String, String> getHeaders() {
return headers;
return checkUa(headers);
}
public String[] getHeaderArray() {

@ -1,6 +1,7 @@
package com.fongmi.android.tv.utils;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.ComponentName;
import android.content.Context;
@ -61,7 +62,13 @@ public class Util {
}
public static CharSequence getClipText() {
return ((ClipboardManager) App.get().getSystemService(Context.CLIPBOARD_SERVICE)).getText();
ClipboardManager manager = (ClipboardManager) App.get().getSystemService(Context.CLIPBOARD_SERVICE);
return manager.getText();
}
public static void copy(String text) {
ClipboardManager manager = (ClipboardManager) App.get().getSystemService(Context.CLIPBOARD_SERVICE);
manager.setPrimaryClip(ClipData.newPlainText("", text));
}
public static int getDigit(String text) {

@ -10,6 +10,7 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.media.MediaMetadataCompat;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.Dimension;
@ -54,6 +55,7 @@ import com.fongmi.android.tv.ui.adapter.GroupAdapter;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.custom.CustomKeyDownLive;
import com.fongmi.android.tv.ui.dialog.CastDialog;
import com.fongmi.android.tv.ui.dialog.InfoDialog;
import com.fongmi.android.tv.ui.dialog.LiveDialog;
import com.fongmi.android.tv.ui.dialog.PassDialog;
import com.fongmi.android.tv.ui.dialog.SubtitleDialog;
@ -178,8 +180,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
protected void initEvent() {
mBinding.control.seek.setListener(mPlayers);
mBinding.control.cast.setOnClickListener(view -> onCast());
mBinding.control.share.setOnClickListener(view -> onShare());
mBinding.control.share.setOnLongClickListener(view -> onChoose());
mBinding.control.info.setOnClickListener(view -> onInfo());
mBinding.control.right.back.setOnClickListener(view -> onBack());
mBinding.control.right.lock.setOnClickListener(view -> onLock());
mBinding.control.right.rotate.setOnClickListener(view -> onRotate());
@ -196,8 +197,10 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
mBinding.control.action.player.setOnClickListener(view -> onPlayer());
mBinding.control.action.decode.setOnClickListener(view -> onDecode());
mBinding.control.action.text.setOnLongClickListener(view -> onTextLong());
mBinding.control.action.player.setOnLongClickListener(view -> onChoose());
mBinding.control.action.speed.setOnLongClickListener(view -> onSpeedLong());
mBinding.video.setOnTouchListener((view, event) -> mKeyDown.onTouchEvent(event));
mBinding.control.action.getRoot().setOnTouchListener(this::onActionTouch);
}
private void setRecyclerView() {
@ -303,28 +306,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
CastDialog.create().video(CastVideo.get(mBinding.control.title.getText().toString(), mPlayers.getUrl())).fm(false).show(this);
}
private void onShare() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, mPlayers.getUrl());
intent.putExtra("name", mBinding.control.title.getText());
intent.putExtra("title", mBinding.control.title.getText());
startActivity(Util.getChooser(intent));
private void onInfo() {
InfoDialog.create(this).title(mBinding.control.title.getText()).headers(mPlayers.getHeaders()).url(mPlayers.getUrl()).show();
setRedirect(true);
}
private boolean onChoose() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("headers", mPlayers.getHeaderArray());
intent.putExtra("title", mBinding.control.title.getText());
intent.setDataAndType(Uri.parse(mPlayers.getUrl()), "video/*");
startActivity(Util.getChooser(intent));
setRedirect(true);
return true;
}
private void onBack() {
finish();
}
@ -420,6 +406,22 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
fetch();
}
private boolean onChoose() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("headers", mPlayers.getHeaderArray());
intent.putExtra("title", mBinding.control.title.getText());
intent.setDataAndType(Uri.parse(mPlayers.getUrl()), "video/*");
startActivity(Util.getChooser(intent));
setRedirect(true);
return true;
}
private boolean onActionTouch(View v, MotionEvent e) {
setR1Callback();
return false;
}
private void hideUI() {
if (isGone(mBinding.recycler)) return;
mBinding.recycler.setVisibility(View.GONE);
@ -457,7 +459,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
}
private void showControl() {
mBinding.control.share.setVisibility(mPlayers.getUrl() == null ? View.GONE : View.VISIBLE);
mBinding.control.info.setVisibility(mPlayers.getUrl() == null ? View.GONE : View.VISIBLE);
mBinding.control.cast.setVisibility(mPlayers.getUrl() == null ? View.GONE : View.VISIBLE);
mBinding.control.right.rotate.setVisibility(isLock() ? View.GONE : View.VISIBLE);
mBinding.control.right.back.setVisibility(isLock() ? View.GONE : View.VISIBLE);

@ -80,6 +80,7 @@ import com.fongmi.android.tv.ui.dialog.CastDialog;
import com.fongmi.android.tv.ui.dialog.ControlDialog;
import com.fongmi.android.tv.ui.dialog.EpisodeGridDialog;
import com.fongmi.android.tv.ui.dialog.EpisodeListDialog;
import com.fongmi.android.tv.ui.dialog.InfoDialog;
import com.fongmi.android.tv.ui.dialog.TrackDialog;
import com.fongmi.android.tv.utils.Clock;
import com.fongmi.android.tv.utils.FileChooser;
@ -331,15 +332,14 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mBinding.reverse.setOnClickListener(view -> onReverse());
mBinding.name.setOnLongClickListener(view -> onChange());
mBinding.control.cast.setOnClickListener(view -> onCast());
mBinding.control.info.setOnClickListener(view -> onInfo());
mBinding.control.full.setOnClickListener(view -> onFull());
mBinding.control.keep.setOnClickListener(view -> onKeep());
mBinding.control.share.setOnClickListener(view -> onShare());
mBinding.control.danmu.setOnClickListener(view -> onDanmu());
mBinding.control.play.setOnClickListener(view -> checkPlay());
mBinding.control.next.setOnClickListener(view -> checkNext());
mBinding.control.prev.setOnClickListener(view -> checkPrev());
mBinding.control.setting.setOnClickListener(view -> onSetting());
mBinding.control.share.setOnLongClickListener(view -> onChoose());
mBinding.control.title.setOnLongClickListener(view -> onChange());
mBinding.control.right.back.setOnClickListener(view -> onFull());
mBinding.control.right.lock.setOnClickListener(view -> onLock());
@ -356,6 +356,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mBinding.control.action.ending.setOnClickListener(view -> onEnding());
mBinding.control.action.opening.setOnClickListener(view -> onOpening());
mBinding.control.action.episodes.setOnClickListener(view -> onEpisodes());
mBinding.control.action.player.setOnLongClickListener(view -> onChoose());
mBinding.control.action.speed.setOnLongClickListener(view -> onSpeedLong());
mBinding.control.action.reset.setOnLongClickListener(view -> onResetToggle());
mBinding.control.action.ending.setOnLongClickListener(view -> onEndingReset());
@ -697,6 +698,11 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
CastDialog.create().history(mHistory).video(CastVideo.get(mBinding.name.getText().toString(), mPlayers.getUrl())).fm(true).show(this);
}
private void onInfo() {
InfoDialog.create(this).title(mBinding.control.title.getText()).headers(mPlayers.getHeaders()).url(mPlayers.getUrl()).show();
setRedirect(true);
}
private void onFull() {
setR1Callback();
toggleFullscreen();
@ -711,30 +717,6 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
checkKeepImg();
}
private void onShare() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, mPlayers.getUrl());
intent.putExtra("name", mBinding.control.title.getText());
intent.putExtra("title", mBinding.control.title.getText());
startActivity(Util.getChooser(intent));
setRedirect(true);
}
private boolean onChoose() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("return_result", true);
intent.putExtra("headers", mPlayers.getHeaderArray());
intent.putExtra("position", (int) mPlayers.getPosition());
intent.putExtra("title", mBinding.control.title.getText());
intent.setDataAndType(Uri.parse(mPlayers.getUrl()), "video/*");
startActivityForResult(Util.getChooser(intent), 1001);
setRedirect(true);
return true;
}
private void onDanmu() {
Setting.putDanmu(!Setting.isDanmu());
checkDanmuImg();
@ -896,6 +878,19 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mDialogs.add(EpisodeListDialog.create(this).episodes(mEpisodeAdapter.getItems()).show());
}
private boolean onChoose() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("return_result", true);
intent.putExtra("headers", mPlayers.getHeaderArray());
intent.putExtra("position", (int) mPlayers.getPosition());
intent.putExtra("title", mBinding.control.title.getText());
intent.setDataAndType(Uri.parse(mPlayers.getUrl()), "video/*");
startActivityForResult(Util.getChooser(intent), 1001);
setRedirect(true);
return true;
}
private boolean onActionTouch(View v, MotionEvent e) {
setR1Callback();
return false;
@ -986,7 +981,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mBinding.control.right.back.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE);
mBinding.control.parse.setVisibility(isFullscreen() && isUseParse() ? View.VISIBLE : View.GONE);
mBinding.control.action.getRoot().setVisibility(isFullscreen() ? View.VISIBLE : View.GONE);
mBinding.control.share.setVisibility(mPlayers.getUrl() == null ? View.GONE : View.VISIBLE);
mBinding.control.info.setVisibility(mPlayers.getUrl() == null ? View.GONE : View.VISIBLE);
mBinding.control.cast.setVisibility(mPlayers.getUrl() == null ? View.GONE : View.VISIBLE);
mBinding.control.right.lock.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE);
mBinding.control.center.setVisibility(isLock() ? View.GONE : View.VISIBLE);

@ -0,0 +1,87 @@
package com.fongmi.android.tv.ui.dialog;
import android.app.Activity;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import androidx.appcompat.app.AlertDialog;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.databinding.DialogInfoBinding;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.Util;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.Map;
public class InfoDialog {
private final DialogInfoBinding binding;
private final Activity activity;
private AlertDialog dialog;
private CharSequence title;
private String header;
private String url;
public static InfoDialog create(Activity activity) {
return new InfoDialog(activity);
}
public InfoDialog(Activity activity) {
this.binding = DialogInfoBinding.inflate(LayoutInflater.from(this.activity = activity));
}
public InfoDialog title(CharSequence title) {
this.title = title;
return this;
}
public InfoDialog headers(Map<String, String> headers) {
StringBuilder sb = new StringBuilder();
for (String key : headers.keySet()) sb.append(key).append(" : ").append(headers.get(key)).append("\n");
this.header = Util.substring(sb.toString());
return this;
}
public InfoDialog url(String url) {
this.url = url;
return this;
}
public void show() {
initDialog();
initView();
}
private void initDialog() {
dialog = new MaterialAlertDialogBuilder(binding.getRoot().getContext()).setView(binding.getRoot()).create();
dialog.getWindow().setDimAmount(0);
dialog.show();
}
private void initView() {
binding.url.setText(url);
binding.title.setText(title);
binding.header.setText(header);
binding.url.setOnClickListener(this::onShare);
binding.url.setOnLongClickListener(this::onCopy);
}
private void onShare(View view) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_TEXT, url);
intent.putExtra("name", title);
intent.putExtra("title", title);
intent.setType("text/plain");
activity.startActivity(Util.getChooser(intent));
dialog.dismiss();
}
private boolean onCopy(View view) {
Notify.show(R.string.copied);
Util.copy(url);
return true;
}
}

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M11,7h2v2h-2zM11,11h2v6h-2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" />
</vector>

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92s2.92,-1.31 2.92,-2.92c0,-1.61 -1.31,-2.92 -2.92,-2.92zM18,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM6,13c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM18,20.02c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z" />
</vector>

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="24dp"
android:paddingTop="16dp"
android:paddingEnd="24dp"
android:paddingBottom="16dp">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:linksClickable="false"
android:textColor="?android:attr/textColorPrimary"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:autoLink="all"
android:linksClickable="false"
android:textColor="?android:attr/textColorPrimary"
android:textSize="12sp" />
<TextView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textColor="?android:attr/textColorPrimary"
android:textSize="12sp" />
</LinearLayout>

@ -56,12 +56,12 @@
android:src="@drawable/ic_control_cast" />
<ImageView
android:id="@+id/share"
android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="8dp"
android:src="@drawable/ic_control_share" />
android:src="@drawable/ic_control_info" />
</LinearLayout>
</LinearLayout>

@ -57,12 +57,12 @@
android:src="@drawable/ic_control_cast" />
<ImageView
android:id="@+id/share"
android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="8dp"
android:src="@drawable/ic_control_share" />
android:src="@drawable/ic_control_info" />
<ImageView
android:id="@+id/keep"

@ -35,6 +35,9 @@
<string name="dialog_delete_keep">收藏纪录将会全部删除。</string>
<string name="dialog_delete_history">观看纪录将会全部删除。</string>
<!-- Hint -->
<string name="copied">已复制</string>
<string-array name="select_background">
<item>关闭</item>
<item>开启</item>

@ -35,6 +35,9 @@
<string name="dialog_delete_keep">收藏紀錄將會全部刪除。</string>
<string name="dialog_delete_history">觀看紀錄將會全部刪除。</string>
<!-- Hint -->
<string name="copied">已複製</string>
<string-array name="select_background">
<item>關閉</item>
<item>開啟</item>

@ -35,6 +35,9 @@
<string name="dialog_delete_keep">All keep records will be removed.</string>
<string name="dialog_delete_history">All history records will be removed.</string>
<!-- Hint -->
<string name="copied">Copied</string>
<string-array name="select_background">
<item>Off</item>
<item>On</item>

Loading…
Cancel
Save