From f0a6f761dc2a8a95a23895b7c162bbb1bc37bd1f Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 26 Nov 2023 18:50:23 +0800 Subject: [PATCH] [mobile] support shortcut --- .../com/fongmi/android/tv/api/LiveConfig.java | 18 +++++------ app/src/mobile/AndroidManifest.xml | 8 ++++- .../android/tv/receiver/ShortcutReceiver.java | 18 +++++++++++ .../android/tv/ui/activity/LiveActivity.java | 32 +++++++++++++++++-- .../android/tv/ui/activity/MainActivity.java | 14 ++++++++ app/src/mobile/res/values-zh-rCN/strings.xml | 1 + app/src/mobile/res/values-zh-rTW/strings.xml | 1 + app/src/mobile/res/values/strings.xml | 1 + app/src/mobile/res/values/styles.xml | 4 +++ 9 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 app/src/mobile/java/com/fongmi/android/tv/receiver/ShortcutReceiver.java diff --git a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java index 7b4bc7e46..a234c7035 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java @@ -73,19 +73,19 @@ public class LiveConfig { public LiveConfig init() { this.home = null; this.config = Config.live(); - this.lives = new ArrayList<>(); return this; } public LiveConfig config(Config config) { this.config = config; + if (config.getUrl() == null) return this; this.same = config.getUrl().equals(ApiConfig.getUrl()); return this; } public LiveConfig clear() { this.home = null; - this.lives.clear(); + getLives().clear(); return this; } @@ -118,8 +118,8 @@ public class LiveConfig { private void parseText(String text, Callback callback) { Live live = new Live(config.getUrl()).sync(); LiveParser.text(live, text); - lives.remove(live); - lives.add(live); + getLives().remove(live); + getLives().add(live); setHome(live, true); App.post(callback::success); } @@ -144,13 +144,13 @@ public class LiveConfig { private void parseConfig(JsonObject object, Callback callback) { if (!object.has("lives")) return; for (JsonElement element : Json.safeListElement(object, "lives")) add(Live.objectFrom(element).check()); - for (Live live : lives) if (live.getName().equals(config.getHome())) setHome(live, true); - if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0), true); + for (Live live : getLives()) if (live.getName().equals(config.getHome())) setHome(live, true); + if (home == null) setHome(getLives().isEmpty() ? new Live() : getLives().get(0), true); if (callback != null) App.post(callback::success); } private void add(Live live) { - if (!lives.contains(live)) lives.add(live.sync()); + if (!getLives().contains(live)) getLives().add(live.sync()); } private void bootLive() { @@ -212,7 +212,7 @@ public class LiveConfig { } public List getLives() { - return lives; + return lives == null ? lives = new ArrayList<>() : lives; } public Config getConfig() { @@ -231,7 +231,7 @@ public class LiveConfig { this.home = home; this.home.setActivated(true); config.home(home.getName()).update(); - for (Live item : lives) item.setActivated(home); + for (Live item : getLives()) item.setActivated(home); if (check) if (home.isBoot() || Setting.isBootLive()) App.post(this::bootLive); } } diff --git a/app/src/mobile/AndroidManifest.xml b/app/src/mobile/AndroidManifest.xml index e1dd4c74c..1e1aed32b 100644 --- a/app/src/mobile/AndroidManifest.xml +++ b/app/src/mobile/AndroidManifest.xml @@ -96,10 +96,12 @@ + android:supportsPictureInPicture="true" + android:theme="@style/AppTheme.Live" /> + + diff --git a/app/src/mobile/java/com/fongmi/android/tv/receiver/ShortcutReceiver.java b/app/src/mobile/java/com/fongmi/android/tv/receiver/ShortcutReceiver.java new file mode 100644 index 000000000..50c0d237f --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/receiver/ShortcutReceiver.java @@ -0,0 +1,18 @@ +package com.fongmi.android.tv.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.utils.Notify; + +public class ShortcutReceiver extends BroadcastReceiver { + + public static final String ACTION = ShortcutReceiver.class.getSimpleName(); + + @Override + public void onReceive(Context context, Intent intent) { + Notify.show(R.string.shortcut); + } +} \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index ba40dcd35..afe96d9ee 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -31,6 +31,7 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.LiveConfig; import com.fongmi.android.tv.bean.Channel; +import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Epg; import com.fongmi.android.tv.bean.Group; import com.fongmi.android.tv.bean.Keep; @@ -41,6 +42,7 @@ import com.fongmi.android.tv.databinding.ActivityLiveBinding; import com.fongmi.android.tv.event.ActionEvent; import com.fongmi.android.tv.event.ErrorEvent; import com.fongmi.android.tv.event.PlayerEvent; +import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.PassCallback; import com.fongmi.android.tv.impl.SubtitleCallback; @@ -105,7 +107,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List private PiP mPiP; public static void start(Context context) { - if (!LiveConfig.isEmpty()) context.startActivity(new Intent(context, LiveActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + if (!LiveConfig.isEmpty()) context.startActivity(new Intent(context, LiveActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).putExtra("empty", false)); + } + + private boolean isEmpty() { + return getIntent().getBooleanExtra("empty", true); } private PlayerView getExo() { @@ -162,7 +168,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List setRecyclerView(); setVideoView(); setViewModel(); - getLive(); + checkLive(); } @Override @@ -248,6 +254,28 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List }); } + private void checkLive() { + if (isEmpty()) { + LiveConfig.load(Config.live(), getCallback()); + } else { + getLive(); + } + } + + private Callback getCallback() { + return new Callback() { + @Override + public void success() { + getLive(); + } + + @Override + public void error(String msg) { + Notify.show(msg); + } + }; + } + private void getLive() { mBinding.control.action.home.setText(getHome().getName()); mPlayers.setPlayer(getPlayerType(-1)); 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 d8ab90fb9..a27e3cc10 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,13 +1,18 @@ package com.fongmi.android.tv.ui.activity; import android.Manifest; +import android.app.PendingIntent; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.text.TextUtils; import android.view.MenuItem; +import android.view.View; import androidx.annotation.NonNull; +import androidx.core.content.pm.ShortcutInfoCompat; +import androidx.core.content.pm.ShortcutManagerCompat; +import androidx.core.graphics.drawable.IconCompat; import androidx.fragment.app.Fragment; import androidx.viewbinding.ViewBinding; @@ -24,6 +29,7 @@ import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.event.ServerEvent; import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.player.Source; +import com.fongmi.android.tv.receiver.ShortcutReceiver; import com.fongmi.android.tv.server.Server; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.FragmentStateManager; @@ -67,6 +73,7 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt @Override protected void initEvent() { mBinding.navigation.setOnItemSelectedListener(this); + mBinding.navigation.findViewById(R.id.live).setOnLongClickListener(this::addShortcut); } private void checkAction(Intent intent) { @@ -148,6 +155,13 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt return false; } + private boolean addShortcut(View view) { + ShortcutInfoCompat info = new ShortcutInfoCompat.Builder(this, getString(R.string.nav_live)).setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher)).setIntent(new Intent(Intent.ACTION_VIEW, null, this, LiveActivity.class)).setShortLabel(getString(R.string.nav_live)).build(); + PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, ShortcutReceiver.class).setAction(ShortcutReceiver.ACTION), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + ShortcutManagerCompat.requestPinShortcut(this, info, pendingIntent.getIntentSender()); + return true; + } + private void setConfirm() { confirm = true; Notify.show(R.string.app_exit); diff --git a/app/src/mobile/res/values-zh-rCN/strings.xml b/app/src/mobile/res/values-zh-rCN/strings.xml index 4c181dea0..29e6dfcc9 100644 --- a/app/src/mobile/res/values-zh-rCN/strings.xml +++ b/app/src/mobile/res/values-zh-rCN/strings.xml @@ -37,6 +37,7 @@ 已复制 + 已于主萤幕新增捷径。 关闭 diff --git a/app/src/mobile/res/values-zh-rTW/strings.xml b/app/src/mobile/res/values-zh-rTW/strings.xml index e3f335086..a741f8761 100644 --- a/app/src/mobile/res/values-zh-rTW/strings.xml +++ b/app/src/mobile/res/values-zh-rTW/strings.xml @@ -37,6 +37,7 @@ 已複製 + 已於主螢幕新增捷徑。 關閉 diff --git a/app/src/mobile/res/values/strings.xml b/app/src/mobile/res/values/strings.xml index dd5eead3e..6bbbd8b3d 100644 --- a/app/src/mobile/res/values/strings.xml +++ b/app/src/mobile/res/values/strings.xml @@ -37,6 +37,7 @@ Copied + Shortcut has been added. Off diff --git a/app/src/mobile/res/values/styles.xml b/app/src/mobile/res/values/styles.xml index 677c301ce..e1e1af6cf 100644 --- a/app/src/mobile/res/values/styles.xml +++ b/app/src/mobile/res/values/styles.xml @@ -4,6 +4,10 @@ true + +