diff --git a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java index 75562fc10..7185f2a15 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java @@ -63,6 +63,10 @@ public class ApiConfig { return get().getSite(key).getName(); } + public static boolean hasPush() { + return get().getSite("push_agent") != null; + } + public ApiConfig init() { this.ads = null; this.wall = null; 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 f34390c50..5824fd645 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 @@ -3,7 +3,6 @@ package com.fongmi.android.tv.utils; import android.Manifest; import android.app.Activity; import android.app.PictureInPictureParams; -import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.pm.PackageManager; @@ -166,14 +165,8 @@ public class Utils { return text; } - public static String getClip() { - ClipboardManager cm = (ClipboardManager) App.get().getSystemService(Context.CLIPBOARD_SERVICE); - return cm.getText() == null ? "" : cm.getText().toString(); - } - - public static void clearClip() { - ClipboardManager cm = (ClipboardManager) App.get().getSystemService(Context.CLIPBOARD_SERVICE); - cm.setPrimaryClip(ClipData.newPlainText("", "")); + public static CharSequence getClipText() { + return ((ClipboardManager) App.get().getSystemService(Context.CLIPBOARD_SERVICE)).getText(); } public static long format(SimpleDateFormat format, String src) { diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d2f196118..fe1d4546f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -74,6 +74,7 @@ 确定 取消 请输入接口… + 请输入地址… FFmpeg 加载失败 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c15178d76..48d03cc5b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -74,6 +74,7 @@ 確定 取消 請輸入接口… + 請輸入網址… FFmpeg 載入失敗 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cf94a147b..28ea4d372 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,6 +74,7 @@ OK Cancel Please enter the config… + Please enter the url… Failed to load FFmpeg 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 880639922..d3e1e637a 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 @@ -88,6 +88,10 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private Runnable mR2; private Runnable mR3; + public static void push(Activity activity, String url) { + start(activity, "push_agent", url, url); + } + public static void start(Activity activity, String id, String name) { start(activity, ApiConfig.get().getHome().getKey(), id, name); } @@ -544,7 +548,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); - App.post(mR3, 3000); setFullscreen(true); hideAll(); } @@ -554,7 +557,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); mBinding.video.setLayoutParams(mFrameParams); - App.post(mR3, 3000); + App.post(mR3, 2000); setFullscreen(false); hideAll(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java index 059617015..9be09fb2b 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java @@ -1,7 +1,6 @@ package com.fongmi.android.tv.ui.activity; import android.content.Intent; -import android.util.Patterns; import android.view.MenuItem; import androidx.annotation.NonNull; @@ -21,8 +20,6 @@ import com.fongmi.android.tv.server.Server; import com.fongmi.android.tv.ui.fragment.SettingFragment; import com.fongmi.android.tv.ui.fragment.VodFragment; import com.fongmi.android.tv.utils.Notify; -import com.fongmi.android.tv.utils.Utils; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.navigation.NavigationBarView; import java.util.ArrayList; @@ -99,20 +96,8 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt } private void checkAction(Intent intent) { - if (ApiConfig.get().getSite("push_agent") == null) return; - boolean hasClip = Patterns.WEB_URL.matcher(Utils.getClip()).matches(); - boolean hasAction = intent.getAction() != null && intent.getAction().equals(Intent.ACTION_SEND) && intent.getType().equals("text/plain"); - if (hasAction) DetailActivity.start(this, "push_agent", intent.getStringExtra(Intent.EXTRA_TEXT), ""); - else if (hasClip) showDialog(Utils.getClip()); - } - - private void showDialog(String text) { - new MaterialAlertDialogBuilder(this).setMessage(getString(R.string.home_open_url, text)) - .setNegativeButton(R.string.dialog_negative, (dialog, which) -> Utils.clearClip()) - .setPositiveButton(R.string.dialog_positive, (dialog, which) -> { - DetailActivity.start(MainActivity.this, "push_agent", text, ""); - Utils.clearClip(); - }).show(); + boolean push = ApiConfig.hasPush() && intent.getAction() != null && intent.getAction().equals(Intent.ACTION_SEND) && intent.getType().equals("text/plain"); + if (push) DetailActivity.push(this, intent.getStringExtra(Intent.EXTRA_TEXT)); } private void setConfirm() { 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 dd7e94626..1d9653353 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 @@ -1,6 +1,5 @@ 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; @@ -13,16 +12,11 @@ import com.fongmi.android.tv.api.LiveConfig; 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.event.ServerEvent; import com.fongmi.android.tv.impl.ConfigCallback; import com.fongmi.android.tv.utils.Utils; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -public class ConfigDialog implements DialogInterface.OnDismissListener { +public class ConfigDialog { private final DialogConfigBinding binding; private final ConfigCallback callback; @@ -53,7 +47,6 @@ public class ConfigDialog implements DialogInterface.OnDismissListener { private void initDialog() { dialog.getWindow().setDimAmount(0); - dialog.setOnDismissListener(this); dialog.show(); } @@ -63,7 +56,6 @@ public class ConfigDialog implements DialogInterface.OnDismissListener { } private void initEvent() { - EventBus.getDefault().register(this); binding.positive.setOnClickListener(this::onPositive); binding.negative.setOnClickListener(this::onNegative); binding.text.setOnEditorActionListener((textView, actionId, event) -> { @@ -95,16 +87,4 @@ public class ConfigDialog implements DialogInterface.OnDismissListener { private void onNegative(View view) { dialog.dismiss(); } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onServerEvent(ServerEvent event) { - if (event.getType() != ServerEvent.Type.API) return; - binding.text.setText(event.getText()); - binding.text.setSelection(binding.text.getText().length()); - } - - @Override - public void onDismiss(DialogInterface dialogInterface) { - EventBus.getDefault().unregister(this); - } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/LinkDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/LinkDialog.java new file mode 100644 index 000000000..10c00df1a --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/LinkDialog.java @@ -0,0 +1,66 @@ +package com.fongmi.android.tv.ui.custom.dialog; + +import android.text.TextUtils; +import android.util.Patterns; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.EditorInfo; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.databinding.DialogLinkBinding; +import com.fongmi.android.tv.ui.activity.DetailActivity; +import com.fongmi.android.tv.utils.Utils; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class LinkDialog { + + private final DialogLinkBinding binding; + private final AlertDialog dialog; + + public static LinkDialog create(Fragment fragment) { + return new LinkDialog(fragment); + } + + public LinkDialog(Fragment fragment) { + this.binding = DialogLinkBinding.inflate(LayoutInflater.from(fragment.getContext())); + this.dialog = new MaterialAlertDialogBuilder(fragment.getActivity()).setView(binding.getRoot()).create(); + } + + public void show() { + initDialog(); + initView(); + initEvent(); + } + + private void initDialog() { + dialog.getWindow().setDimAmount(0); + dialog.show(); + } + + private void initView() { + CharSequence text = Utils.getClipText(); + if (!TextUtils.isEmpty(text) && Patterns.WEB_URL.matcher(text).matches()) binding.text.setText(text); + } + + private void initEvent() { + binding.positive.setOnClickListener(this::onPositive); + binding.negative.setOnClickListener(this::onNegative); + binding.text.setOnEditorActionListener((textView, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_DONE) binding.positive.performClick(); + return true; + }); + } + + private void onPositive(View view) { + String text = binding.text.getText().toString().trim(); + if (!text.isEmpty()) DetailActivity.push(App.activity(), text); + dialog.dismiss(); + } + + private void onNegative(View view) { + dialog.dismiss(); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index abba330af..eb505d435 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -26,6 +26,7 @@ import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.BaseFragment; import com.fongmi.android.tv.ui.adapter.TypeAdapter; import com.fongmi.android.tv.ui.custom.dialog.FilterDialog; +import com.fongmi.android.tv.ui.custom.dialog.LinkDialog; import com.fongmi.android.tv.ui.custom.dialog.SiteDialog; import com.fongmi.android.tv.ui.fragment.child.SiteFragment; import com.fongmi.android.tv.ui.fragment.child.TypeFragment; @@ -67,6 +68,7 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal @Override protected void initEvent() { + mBinding.link.setOnClickListener(this::onLink); mBinding.title.setOnClickListener(this::onTitle); mBinding.filter.setOnClickListener(this::onFilter); mBinding.pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @@ -111,8 +113,17 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal int position = mBinding.pager.getCurrentItem(); if (position == 0) mBinding.filter.setVisibility(View.GONE); Class type = mTypeAdapter.get(position); - if (type.getFilter() != null) mBinding.filter.show(); - else mBinding.filter.hide(); + setFabVisible(type.getFilter() != null); + } + + private void setFabVisible(boolean filter) { + if (filter) { + mBinding.link.hide(); + mBinding.filter.show(); + } else { + mBinding.filter.hide(); + mBinding.link.show(); + } } private void onTitle(View view) { @@ -124,6 +135,11 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal FilterDialog.create(this).filter(mTypeAdapter.get(mBinding.pager.getCurrentItem()).getFilters()).show(getChildFragmentManager(), null); } + private void onLink(View view) { + if (ApiConfig.hasPush()) LinkDialog.create(this).show(); + else mBinding.link.hide(); + } + @Override public void setSite(Site item) { ApiConfig.get().setHome(item); diff --git a/app/src/mobile/res/drawable/ic_type_filter.xml b/app/src/mobile/res/drawable/ic_filter.xml similarity index 100% rename from app/src/mobile/res/drawable/ic_type_filter.xml rename to app/src/mobile/res/drawable/ic_filter.xml diff --git a/app/src/mobile/res/drawable/ic_link.xml b/app/src/mobile/res/drawable/ic_link.xml new file mode 100644 index 000000000..ea91bbaea --- /dev/null +++ b/app/src/mobile/res/drawable/ic_link.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/mobile/res/layout/dialog_link.xml b/app/src/mobile/res/layout/dialog_link.xml new file mode 100644 index 000000000..f52e73a4b --- /dev/null +++ b/app/src/mobile/res/layout/dialog_link.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/fragment_vod.xml b/app/src/mobile/res/layout/fragment_vod.xml index 6b2e41b43..e2831d3a4 100644 --- a/app/src/mobile/res/layout/fragment_vod.xml +++ b/app/src/mobile/res/layout/fragment_vod.xml @@ -50,8 +50,20 @@ android:visibility="gone" app:backgroundTint="@color/blue_500" app:layout_behavior=".ui.custom.CustomFabBehavior" - app:srcCompat="@drawable/ic_type_filter" + app:srcCompat="@drawable/ic_filter" app:tint="@color/white" tools:visibility="visible" /> + +