From c3fbc726fafd17a86ff7ab47dae9befce6a002ca Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 27 Mar 2023 18:49:59 +0800 Subject: [PATCH] [mobile] update dev --- app/build.gradle | 2 +- .../tv/ui/activity/CollectActivity.java | 4 +- .../tv/ui/activity/DetailActivity.java | 18 +- ...mListener.java => CustomTextListener.java} | 2 +- .../com/fongmi/android/tv/ui/custom/Pip.java | 65 ----- .../tv/ui/custom/dialog/ConfigDialog.java | 10 + .../tv/ui/fragment/SettingFragment.java | 44 ++-- .../mobile/res/drawable/ic_config_choose.xml | 10 + .../mobile/res/layout/adapter_vod_folder.xml | 55 ++++ app/src/mobile/res/layout/dialog_config.xml | 6 +- app/src/mobile/res/layout/dialog_control.xml | 236 ++++++++++++++++++ 11 files changed, 356 insertions(+), 96 deletions(-) rename app/src/mobile/java/com/fongmi/android/tv/ui/custom/{CustomListener.java => CustomTextListener.java} (87%) delete mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java create mode 100644 app/src/mobile/res/drawable/ic_config_choose.xml create mode 100644 app/src/mobile/res/layout/adapter_vod_folder.xml create mode 100644 app/src/mobile/res/layout/dialog_control.xml diff --git a/app/build.gradle b/app/build.gradle index b6ffb367c..aa78438a7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,7 +22,7 @@ android { mobile { dimension "mode" versionCode 8 - versionName "20230321#2" + versionName "20230327#1" } java { dimension = "api" diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java index 7c18013d0..dbd710997 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java @@ -34,7 +34,7 @@ import com.fongmi.android.tv.ui.adapter.RecordAdapter; import com.fongmi.android.tv.ui.adapter.VodAdapter; import com.fongmi.android.tv.ui.adapter.WordAdapter; import com.fongmi.android.tv.ui.base.BaseActivity; -import com.fongmi.android.tv.ui.custom.CustomListener; +import com.fongmi.android.tv.ui.custom.CustomTextListener; import com.fongmi.android.tv.ui.custom.ViewType; import com.fongmi.android.tv.ui.custom.dialog.SiteDialog; import com.fongmi.android.tv.utils.PauseThreadPoolExecutor; @@ -106,7 +106,7 @@ public class CollectActivity extends BaseActivity implements SiteCallback, WordA if (actionId == EditorInfo.IME_ACTION_DONE) search(); return true; }); - mBinding.keyword.addTextChangedListener(new CustomListener() { + mBinding.keyword.addTextChangedListener(new CustomTextListener() { @Override public void afterTextChanged(Editable s) { if (s.toString().isEmpty()) getHot(); 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 92cb5d336..24f31b7fc 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 @@ -39,14 +39,14 @@ import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; -import com.fongmi.android.tv.receiver.PipReceiver; +import com.fongmi.android.tv.receiver.PiPReceiver; import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; import com.fongmi.android.tv.ui.adapter.FlagAdapter; import com.fongmi.android.tv.ui.adapter.ParseAdapter; import com.fongmi.android.tv.ui.adapter.SearchAdapter; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.CustomKeyDownVod; -import com.fongmi.android.tv.ui.custom.Pip; +import com.fongmi.android.tv.utils.PiP; import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.ui.custom.ViewType; import com.fongmi.android.tv.ui.custom.dialog.ControlDialog; @@ -85,7 +85,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private ExecutorService mExecutor; private SiteViewModel mViewModel; private FlagAdapter mFlagAdapter; - private PipReceiver mReceiver; + private PiPReceiver mReceiver; private History mHistory; private Players mPlayers; private boolean fullscreen; @@ -100,7 +100,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private Runnable mR2; private Runnable mR3; private String mKey; - private Pip mPip; + private PiP mPiP; public static void push(Activity activity, String url) { start(activity, "push_agent", url, url); @@ -186,12 +186,12 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mKeyDown = CustomKeyDownVod.create(this, mBinding.video); mFrameParams = mBinding.video.getLayoutParams(); mBinding.progressLayout.showProgress(); - mReceiver = new PipReceiver(mBinding); + mReceiver = new PiPReceiver(mBinding); mPlayers = new Players().init(); mR1 = this::hideControl; mR2 = this::setTraffic; mR3 = this::setOrient; - mPip = new Pip(); + mPiP = new PiP(); mKey = getKey(); setRecyclerView(); setVideoView(); @@ -255,7 +255,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.control.action.player.setText(mPlayers.getPlayerText()); getExo().setVisibility(mPlayers.isExo() ? View.VISIBLE : View.GONE); getIjk().setVisibility(mPlayers.isIjk() ? View.VISIBLE : View.GONE); - mBinding.video.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> mPip.update(getActivity(), view)); + mBinding.video.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> mPiP.update(getActivity(), view)); } private void setDecodeView() { @@ -732,7 +732,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void checkPlayImg(boolean playing) { mBinding.control.play.setImageResource(playing ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play); - mPip.update(this, playing); + mPiP.update(this, playing); } private void checkLockImg() { @@ -1091,7 +1091,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override protected void onUserLeaveHint() { super.onUserLeaveHint(); - mPip.enter(this, getScale() == 2); + mPiP.enter(this, getScale() == 2); if (isLock()) App.post(this::onLock, 500); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomListener.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomTextListener.java similarity index 87% rename from app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomListener.java rename to app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomTextListener.java index 601667ee1..9dcd80744 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomListener.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomTextListener.java @@ -3,7 +3,7 @@ package com.fongmi.android.tv.ui.custom; import android.text.Editable; import android.text.TextWatcher; -public class CustomListener implements TextWatcher { +public class CustomTextListener implements TextWatcher { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java deleted file mode 100644 index cfb120c18..000000000 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.fongmi.android.tv.ui.custom; - -import android.app.Activity; -import android.app.PendingIntent; -import android.app.PictureInPictureParams; -import android.app.RemoteAction; -import android.content.Intent; -import android.graphics.Rect; -import android.graphics.drawable.Icon; -import android.os.Build; -import android.util.Rational; -import android.view.View; - -import com.fongmi.android.tv.utils.Utils; - -import java.util.ArrayList; -import java.util.List; - -public class Pip { - - public static final String ACTION_MEDIA_CONTROL = "media_control"; - public static final String EXTRA_CONTROL_TYPE = "control_type"; - - public static final int CONTROL_TYPE_PREV = 1; - public static final int CONTROL_TYPE_NEXT = 2; - public static final int CONTROL_TYPE_PLAY = 3; - public static final int CONTROL_TYPE_PAUSE = 4; - - private PictureInPictureParams.Builder builder; - - public Pip() { - if (!Utils.hasPIP()) return; - this.builder = new PictureInPictureParams.Builder(); - } - - public void update(Activity activity, View view) { - if (!Utils.hasPIP()) return; - Rect sourceRectHint = new Rect(); - view.getGlobalVisibleRect(sourceRectHint); - builder.setSourceRectHint(sourceRectHint); - activity.setPictureInPictureParams(builder.build()); - } - - public void update(Activity activity, boolean play) { - if (!Utils.hasPIP()) return; - List actions = new ArrayList<>(); - int icon = play ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play; - actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_PREV, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PREV), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))); - actions.add(new RemoteAction(Icon.createWithResource(activity, icon), "", "", PendingIntent.getBroadcast(activity, play ? CONTROL_TYPE_PAUSE : CONTROL_TYPE_PLAY, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, play ? CONTROL_TYPE_PAUSE : CONTROL_TYPE_PLAY), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))); - actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_next), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_NEXT, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_NEXT), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))); - activity.setPictureInPictureParams(builder.setActions(actions).build()); - } - - public void enter(Activity activity, boolean four) { - try { - if (!Utils.hasPIP() || activity.isInPictureInPictureMode()) return; - builder.setAspectRatio(new Rational(four ? 4 : 16, four ? 3 : 9)); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) builder.setAutoEnterEnabled(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) builder.setSeamlessResizeEnabled(true); - activity.enterPictureInPictureMode(builder.build()); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java index 0a14fe4ca..2f69de1af 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java @@ -2,6 +2,7 @@ package com.fongmi.android.tv.ui.custom.dialog; import android.content.DialogInterface; import android.view.LayoutInflater; +import android.view.View; import android.view.inputmethod.EditorInfo; import androidx.appcompat.app.AlertDialog; @@ -14,6 +15,7 @@ import com.fongmi.android.tv.api.WallConfig; import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.databinding.DialogConfigBinding; import com.fongmi.android.tv.impl.ConfigCallback; +import com.fongmi.android.tv.utils.FileChooser; import com.fongmi.android.tv.utils.Utils; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -21,6 +23,7 @@ public class ConfigDialog { private final DialogConfigBinding binding; private final ConfigCallback callback; + private final Fragment fragment; private AlertDialog dialog; private String url; private int type; @@ -35,6 +38,7 @@ public class ConfigDialog { } public ConfigDialog(Fragment fragment) { + this.fragment = fragment; this.callback = (ConfigCallback) fragment; this.binding = DialogConfigBinding.inflate(LayoutInflater.from(fragment.getContext())); } @@ -54,6 +58,7 @@ public class ConfigDialog { private void initView() { binding.text.setText(url = getUrl()); binding.text.setSelection(url.length()); + binding.input.setEndIconOnClickListener(this::onChoose); } private void initEvent() { @@ -76,6 +81,11 @@ public class ConfigDialog { } } + private void onChoose(View view) { + FileChooser.from(fragment).show(); + dialog.dismiss(); + } + private void onPositive(DialogInterface dialog, int which) { String text = Utils.checkClan(binding.text.getText().toString().trim()); if (text.isEmpty()) Config.delete(url, type); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java index 28e7c1316..ad14ddcb8 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java @@ -1,6 +1,8 @@ package com.fongmi.android.tv.ui.fragment; import android.Manifest; +import android.app.Activity; +import android.content.Intent; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -28,6 +30,8 @@ import com.fongmi.android.tv.ui.custom.dialog.ConfigDialog; import com.fongmi.android.tv.ui.custom.dialog.HistoryDialog; import com.fongmi.android.tv.ui.custom.dialog.LiveDialog; import com.fongmi.android.tv.ui.custom.dialog.SiteDialog; +import com.fongmi.android.tv.utils.FileChooser; +import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; @@ -38,7 +42,7 @@ import com.permissionx.guolindev.PermissionX; public class SettingFragment extends BaseFragment implements ConfigCallback, SiteCallback, LiveCallback { private FragmentSettingBinding mBinding; - private Config config; + private int type; public static SettingFragment newInstance() { return new SettingFragment(); @@ -66,11 +70,11 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit protected void initEvent() { mBinding.vodHome.setOnClickListener(view -> SiteDialog.create(this).all().show()); mBinding.liveHome.setOnClickListener(view -> LiveDialog.create(this).show()); - mBinding.vod.setOnClickListener(view -> ConfigDialog.create(this).type(0).show()); - mBinding.live.setOnClickListener(view -> ConfigDialog.create(this).type(1).show()); - mBinding.wall.setOnClickListener(view -> ConfigDialog.create(this).type(2).show()); - mBinding.vodHistory.setOnClickListener(view -> HistoryDialog.create(this).type(0).show()); - mBinding.liveHistory.setOnClickListener(view -> HistoryDialog.create(this).type(1).show()); + mBinding.vod.setOnClickListener(view -> ConfigDialog.create(this).type(type = 0).show()); + mBinding.live.setOnClickListener(view -> ConfigDialog.create(this).type(type = 1).show()); + mBinding.wall.setOnClickListener(view -> ConfigDialog.create(this).type(type = 2).show()); + mBinding.vodHistory.setOnClickListener(view -> HistoryDialog.create(this).type(type = 0).show()); + mBinding.liveHistory.setOnClickListener(view -> HistoryDialog.create(this).type(type = 1).show()); mBinding.wallDefault.setOnClickListener(view -> setWallDefault()); mBinding.wallRefresh.setOnClickListener(view -> setWallRefresh()); mBinding.version.setOnLongClickListener(view -> onVersion(true)); @@ -84,38 +88,37 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit @Override public void setConfig(Config config) { - this.config = config; - checkPermission(); + checkPermission(config); } - private void checkPermission() { + private void checkPermission(Config config) { if (config.getUrl().startsWith("file") && !Utils.hasPermission(getActivity())) { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> loadConfig()); + PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> load(config)); } else { - loadConfig(); + load(config); } } - private void loadConfig() { + private void load(Config config) { switch (config.getType()) { case 0: Notify.progress(getActivity(), true); mBinding.vodUrl.setText(config.getUrl()); - ApiConfig.get().clear().config(config).load(getCallback()); + ApiConfig.get().clear().config(config).load(getCallback(config)); break; case 1: Notify.progress(getActivity(), true); mBinding.liveUrl.setText(config.getUrl()); - LiveConfig.get().clear().config(config).load(getCallback()); + LiveConfig.get().clear().config(config).load(getCallback(config)); break; case 2: mBinding.wallUrl.setText(config.getUrl()); - WallConfig.get().clear().config(config).load(getCallback()); + WallConfig.get().clear().config(config).load(getCallback(config)); break; } } - private Callback getCallback() { + private Callback getCallback(Config config) { return new Callback() { @Override public void success() { @@ -132,7 +135,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit } private void setConfig() { - switch (config.getType()) { + switch (type) { case 0: Notify.dismiss(); RefreshEvent.video(); @@ -218,4 +221,11 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit private void setWallRefresh() { WallConfig.get().load(); } + + @Override + public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode != Activity.RESULT_OK || requestCode != FileChooser.REQUEST_PICK_FILE) return; + setConfig(Config.find("file:/" + FileChooser.getPathFromUri(getContext(), data.getData()).replace(FileUtil.getRootPath(), ""), type)); + } } diff --git a/app/src/mobile/res/drawable/ic_config_choose.xml b/app/src/mobile/res/drawable/ic_config_choose.xml new file mode 100644 index 000000000..94c3ffe26 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_config_choose.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/mobile/res/layout/adapter_vod_folder.xml b/app/src/mobile/res/layout/adapter_vod_folder.xml new file mode 100644 index 000000000..dce6cc508 --- /dev/null +++ b/app/src/mobile/res/layout/adapter_vod_folder.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/dialog_config.xml b/app/src/mobile/res/layout/dialog_config.xml index cdb1eae74..545008747 100644 --- a/app/src/mobile/res/layout/dialog_config.xml +++ b/app/src/mobile/res/layout/dialog_config.xml @@ -1,5 +1,6 @@ + android:hint="@string/dialog_config_hint" + app:endIconDrawable="@drawable/ic_config_choose" + app:endIconMode="custom"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file