From dba8503a02fc9647b3c25bad803ae6c174f5cdc4 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 29 Jun 2023 17:41:23 +0800 Subject: [PATCH] [mobile] add service for keep play --- .../main/java/com/fongmi/android/tv/App.java | 2 + .../com/fongmi/android/tv/utils/Notify.java | 10 +++++ app/src/mobile/AndroidManifest.xml | 11 ++++++ .../android/tv/service/PlaybackService.java | 37 +++++++++++++++++++ .../tv/ui/activity/DetailActivity.java | 19 +++++++--- .../android/tv/ui/activity/LiveActivity.java | 13 ++++++- .../java/com/fongmi/android/tv/utils/PiP.java | 4 -- 7 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 app/src/mobile/java/com/fongmi/android/tv/service/PlaybackService.java diff --git a/app/src/main/java/com/fongmi/android/tv/App.java b/app/src/main/java/com/fongmi/android/tv/App.java index 94f21db80..88b077593 100644 --- a/app/src/main/java/com/fongmi/android/tv/App.java +++ b/app/src/main/java/com/fongmi/android/tv/App.java @@ -11,6 +11,7 @@ import androidx.annotation.Nullable; import androidx.core.os.HandlerCompat; import com.fongmi.android.tv.ui.activity.CrashActivity; +import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; import com.github.catvod.bean.Doh; import com.github.catvod.net.OkHttp; @@ -76,6 +77,7 @@ public class App extends Application { @Override public void onCreate() { super.onCreate(); + Notify.createChannel(); OkHttp.get().setDoh(this, Doh.objectFrom(Prefers.getDoh())); CaocConfig.Builder.create().backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT).errorActivity(CrashActivity.class).apply(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Notify.java b/app/src/main/java/com/fongmi/android/tv/utils/Notify.java index d62129708..bd66dd356 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Notify.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Notify.java @@ -1,6 +1,9 @@ package com.fongmi.android.tv.utils; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.content.Context; +import android.os.Build; import android.text.TextUtils; import android.view.LayoutInflater; import android.widget.Toast; @@ -13,6 +16,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; public class Notify { + public static final String DEFAULT = "default"; private AlertDialog mDialog; private Toast mToast; @@ -24,6 +28,12 @@ public class Notify { return Loader.INSTANCE; } + public static void createChannel() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; + NotificationManager notifyMgr = (NotificationManager) App.get().getSystemService(Context.NOTIFICATION_SERVICE); + notifyMgr.createNotificationChannel(new NotificationChannel(DEFAULT, "預設", NotificationManager.IMPORTANCE_HIGH)); + } + public static void show(int resId) { if (resId != 0) show(ResUtil.getString(resId)); } diff --git a/app/src/mobile/AndroidManifest.xml b/app/src/mobile/AndroidManifest.xml index 8f7ee5d86..91bec65ef 100644 --- a/app/src/mobile/AndroidManifest.xml +++ b/app/src/mobile/AndroidManifest.xml @@ -7,6 +7,8 @@ android:required="false" /> + + @@ -88,5 +90,14 @@ android:name="com.android.cast.dlna.dmc.DLNACastService" android:exported="false" /> + + + + + + \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/service/PlaybackService.java b/app/src/mobile/java/com/fongmi/android/tv/service/PlaybackService.java new file mode 100644 index 000000000..ccb02cdb0 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/service/PlaybackService.java @@ -0,0 +1,37 @@ +package com.fongmi.android.tv.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import androidx.annotation.Nullable; +import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.utils.Notify; + +public class PlaybackService extends Service { + + public static void start() { + ContextCompat.startForegroundService(App.get(), new Intent(App.get(), PlaybackService.class)); + } + + public static void stop() { + App.get().stopService(new Intent(App.get(), PlaybackService.class)); + } + + @Override + public void onCreate() { + super.onCreate(); + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, Notify.DEFAULT).setVisibility(NotificationCompat.VISIBILITY_PUBLIC).setSmallIcon(R.drawable.ic_logo); + startForeground(9527, builder.build()); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } +} 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 6e78a8e73..67e4955a3 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 @@ -50,6 +50,7 @@ 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.service.PlaybackService; import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; import com.fongmi.android.tv.ui.adapter.FlagAdapter; import com.fongmi.android.tv.ui.adapter.ParseAdapter; @@ -1302,18 +1303,24 @@ public class DetailActivity extends BaseActivity implements Clock.Callback, Cust protected void onStart() { super.onStart(); setStop(false); - if (PiP.isIn(this)) return; - mPlayers.play(); - Clock.start(); + if (PiP.isIn(this)) { + PlaybackService.stop(); + } else { + mPlayers.play(); + Clock.start(); + } } @Override protected void onStop() { super.onStop(); setStop(true); - if (PiP.isIn(this)) return; - mPlayers.pause(); - Clock.stop(); + if (PiP.isIn(this)) { + PlaybackService.start(); + } else { + mPlayers.pause(); + Clock.stop(); + } } @Override 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 38bb54ebf..1134b1dae 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 @@ -40,6 +40,7 @@ import com.fongmi.android.tv.player.source.Force; import com.fongmi.android.tv.player.source.TVBus; import com.fongmi.android.tv.player.source.ZLive; import com.fongmi.android.tv.receiver.PiPReceiver; +import com.fongmi.android.tv.service.PlaybackService; import com.fongmi.android.tv.ui.adapter.ChannelAdapter; import com.fongmi.android.tv.ui.adapter.GroupAdapter; import com.fongmi.android.tv.ui.base.BaseActivity; @@ -867,14 +868,22 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List protected void onStart() { super.onStart(); setStop(false); - if (PiP.notIn(this)) mPlayers.play(); + if (PiP.isIn(this)) { + PlaybackService.stop(); + } else { + mPlayers.play(); + } } @Override protected void onStop() { super.onStop(); setStop(true); - if (PiP.notIn(this)) mPlayers.pause(); + if (PiP.isIn(this)) { + PlaybackService.start(); + } else { + mPlayers.pause(); + } } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java b/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java index dffa4512f..7b189d740 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java +++ b/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java @@ -35,10 +35,6 @@ public class PiP { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && activity.isInPictureInPictureMode(); } - public static boolean notIn(Activity activity) { - return Build.VERSION.SDK_INT < Build.VERSION_CODES.O || !activity.isInPictureInPictureMode(); - } - private boolean noPiP() { return Build.VERSION.SDK_INT < Build.VERSION_CODES.O || !App.get().getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE); }