[mobile] support push

pull/123/head
FongMi 3 years ago
parent d3ab11c522
commit 2e0df3127c
  1. 4
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  2. 11
      app/src/main/java/com/fongmi/android/tv/utils/Utils.java
  3. 1
      app/src/main/res/values-zh-rCN/strings.xml
  4. 1
      app/src/main/res/values-zh-rTW/strings.xml
  5. 1
      app/src/main/res/values/strings.xml
  6. 7
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  7. 19
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java
  8. 22
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java
  9. 66
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/LinkDialog.java
  10. 20
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java
  11. 0
      app/src/mobile/res/drawable/ic_filter.xml
  12. 10
      app/src/mobile/res/drawable/ic_link.xml
  13. 49
      app/src/mobile/res/layout/dialog_link.xml
  14. 14
      app/src/mobile/res/layout/fragment_vod.xml

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

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

@ -74,6 +74,7 @@
<string name="dialog_positive">确定</string>
<string name="dialog_negative">取消</string>
<string name="dialog_config_hint">请输入接口…</string>
<string name="dialog_config_url">请输入地址…</string>
<!-- Error -->
<string name="error_so_load">FFmpeg 加载失败</string>

@ -74,6 +74,7 @@
<string name="dialog_positive">確定</string>
<string name="dialog_negative">取消</string>
<string name="dialog_config_hint">請輸入接口…</string>
<string name="dialog_config_url">請輸入網址…</string>
<!-- Error -->
<string name="error_so_load">FFmpeg 載入失敗</string>

@ -74,6 +74,7 @@
<string name="dialog_positive">OK</string>
<string name="dialog_negative">Cancel</string>
<string name="dialog_config_hint">Please enter the config…</string>
<string name="dialog_config_url">Please enter the url…</string>
<!-- Error -->
<string name="error_so_load">Failed to load FFmpeg</string>

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

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

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

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

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

@ -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="#FFFFFF"
android:pathData="M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z" />
</vector>

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:hint="@string/dialog_config_url"
android:imeOptions="actionDone"
android:importantForAutofill="no"
android:inputType="textUri"
android:singleLine="true"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/positive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/shape_text"
android:gravity="center"
android:text="@string/dialog_positive"
android:textColor="@color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/negative"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/shape_text"
android:gravity="center"
android:text="@string/dialog_negative"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>

@ -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" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/link"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_margin="16dp"
app:backgroundTint="@color/blue_500"
app:layout_behavior=".ui.custom.CustomFabBehavior"
app:srcCompat="@drawable/ic_link"
app:tint="@color/white" />
</RelativeLayout>

Loading…
Cancel
Save