diff --git a/starboard/android/apk/apk_sources.gni b/starboard/android/apk/apk_sources.gni index 7f85c40f50df..29a454cbfd9f 100644 --- a/starboard/android/apk/apk_sources.gni +++ b/starboard/android/apk/apk_sources.gni @@ -30,7 +30,6 @@ apk_sources = [ "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltTextToSpeechHelper.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CrashContextUpdateHandler.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/ErrorDialog.java", - "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/NetworkStatus.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/NullCobaltFactory.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/PlatformError.java", diff --git a/starboard/android/apk/app/src/app/AndroidManifest.xml b/starboard/android/apk/app/src/app/AndroidManifest.xml index 279494d88773..4c17fd1910a7 100644 --- a/starboard/android/apk/app/src/app/AndroidManifest.xml +++ b/starboard/android/apk/app/src/app/AndroidManifest.xml @@ -72,11 +72,6 @@ - - diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java deleted file mode 100644 index 8f7742bf9f99..000000000000 --- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2020 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package dev.cobalt.coat; - -import static dev.cobalt.media.Log.TAG; - -import android.app.Notification; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ServiceInfo; -import android.os.Build.VERSION; -import android.os.IBinder; -import android.os.RemoteException; -import androidx.annotation.RequiresApi; -import androidx.core.app.NotificationCompat; -import dev.cobalt.util.Log; -import dev.cobalt.util.UsedByNative; - -/** Implementation of the MediaPlaybackService used for Background mode media playing. */ -public class MediaPlaybackService extends Service { - - private static final int NOTIFICATION_ID = 193266736; // CL number for uniqueness. - private static final String NOTIFICATION_CHANNEL_ID = "dev.cobalt.coat media playback service"; - private static final String NOTIFICATION_CHANNEL_NAME = "Media playback service"; - private boolean channelCreated = true; - private NotificationManager notificationManager = null; - - @Override - public void onCreate() { - Log.i(TAG, "Creating a Media playback foreground service."); - super.onCreate(); - if (getStarboardBridge() != null) { - getStarboardBridge().onServiceStart(this); - } - this.notificationManager = - (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); - this.channelCreated = createNotificationChannel(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - Log.i(TAG, "Cold start - Starting the service."); - startService(); - // It is better for background media playback service. - return START_STICKY; - } - - @Override - public IBinder onBind(Intent intent) { - // Do not support binding. - return null; - } - - @Override - public void onDestroy() { - Log.i(TAG, "Destroying the Media playback service."); - - if (VERSION.SDK_INT >= 26 && this.channelCreated) { - this.notificationManager.deleteNotificationChannel(NOTIFICATION_CHANNEL_ID); - } - - if (getStarboardBridge() != null) { - getStarboardBridge().onServiceDestroy(this); - } - super.onDestroy(); - } - - public void startService() { - if (this.channelCreated) { - try { - if (VERSION.SDK_INT >= 29) { - startForeground( - NOTIFICATION_ID, buildNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST); - } else { - startForeground(NOTIFICATION_ID, buildNotification()); - } - } catch (IllegalStateException e) { - Log.e(TAG, "Failed to start Foreground Service", e); - } - } - } - - public void stopService() { - // Let service itself handle notification deletion. - if (this.channelCreated) { - stopForeground(true); - } - stopSelf(); - } - - private boolean createNotificationChannel() { - if (VERSION.SDK_INT >= 26) { - try { - createNotificationChannelInternalV26(); - } catch (RemoteException e) { - Log.e(TAG, "Failed to create Notification Channel.", e); - return false; - } - } - return true; - } - - @RequiresApi(26) - private void createNotificationChannelInternalV26() throws RemoteException { - NotificationChannel channel = - new NotificationChannel( - NOTIFICATION_CHANNEL_ID, - NOTIFICATION_CHANNEL_NAME, - notificationManager.IMPORTANCE_DEFAULT); - channel.setDescription("Channel for showing persistent notification"); - this.notificationManager.createNotificationChannel(channel); - } - - Notification buildNotification() { - String channelId = ""; - if (VERSION.SDK_INT >= 26) { - // Channel with ID=NOTIFICATION_CHANNEL_ID is created for version >= 26 - channelId = NOTIFICATION_CHANNEL_ID; - } - - NotificationCompat.Builder builder = - new NotificationCompat.Builder(this, channelId) - .setShowWhen(false) - .setPriority(NotificationCompat.PRIORITY_MIN) - .setSmallIcon(android.R.drawable.stat_sys_warning) - .setContentTitle("Media playback service") - .setContentText("Media playback service is running"); - - return builder.build(); - } - - @UsedByNative - protected StarboardBridge getStarboardBridge() { - if (getApplication() == null) { - Log.e(TAG, "Application already destroyed."); - return null; - } - return ((StarboardBridge.HostApplication) getApplication()).getStarboardBridge(); - } -} diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java index d730b15d52a7..a6114598794f 100644 --- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java +++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java @@ -31,7 +31,6 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.os.Build; -import android.os.Build.VERSION; import android.util.Pair; import android.util.Size; import android.util.SizeF; @@ -184,48 +183,6 @@ protected void onServiceDestroy(Service service) { } } - @SuppressWarnings("unused") - @UsedByNative - protected void startMediaPlaybackService() { - if (cobaltMediaSession == null || !cobaltMediaSession.isActive()) { - Log.w(TAG, "Do not start a MediaPlaybackService when the MediSsession is null or inactive."); - return; - } - - Service service = serviceHolder.get(); - if (service == null) { - if (appContext == null) { - Log.w(TAG, "Activiy already destroyed."); - return; - } - Log.i(TAG, "Cold start - Instantiating a MediaPlaybackService."); - Intent intent = new Intent(appContext, MediaPlaybackService.class); - try { - if (VERSION.SDK_INT >= 26) { - appContext.startForegroundService(intent); - } else { - appContext.startService(intent); - } - } catch (SecurityException e) { - Log.e(TAG, "Failed to start MediaPlaybackService with intent.", e); - return; - } - } else { - Log.i(TAG, "Warm start - Restarting the MediaPlaybackService."); - ((MediaPlaybackService) service).startService(); - } - } - - @SuppressWarnings("unused") - @UsedByNative - protected void stopMediaPlaybackService() { - Service service = serviceHolder.get(); - if (service != null) { - Log.i(TAG, "Stopping the MediaPlaybackService."); - ((MediaPlaybackService) service).stopService(); - } - } - @SuppressWarnings("unused") @UsedByNative protected void beforeStartOrResume() { @@ -253,9 +210,6 @@ protected void beforeSuspend() { for (CobaltService service : cobaltServices.values()) { service.beforeSuspend(); } - // We need to stop MediaPlaybackService before suspending so that this foreground service - // would not prevent releasing activity's memory consumption. - stopMediaPlaybackService(); } catch (Throwable e) { Log.i(TAG, "Caught exception in beforeSuspend: " + e.getMessage()); } diff --git a/starboard/android/shared/android_main.cc b/starboard/android/shared/android_main.cc index e303604ac0b6..4de29227a1d9 100644 --- a/starboard/android/shared/android_main.cc +++ b/starboard/android/shared/android_main.cc @@ -270,20 +270,12 @@ void OnStart(GameActivity* activity) { void OnResume(GameActivity* activity) { if (g_app_running.load()) { - // Stop the MediaPlaybackService if activity state transits from background - // to foreground. Note that the MediaPlaybackService may already have - // been stopped before Cobalt's lifecycle state transits from Concealed - // to Frozen. - ApplicationAndroid::Get()->StopMediaPlaybackService(); ApplicationAndroid::Get()->SendAndroidCommand(AndroidCommand::kResume); } } void OnPause(GameActivity* activity) { if (g_app_running.load()) { - // Start the MediaPlaybackService before activity state transits from - // foreground to background. - ApplicationAndroid::Get()->StartMediaPlaybackService(); ApplicationAndroid::Get()->SendAndroidCommand(AndroidCommand::kPause); } } diff --git a/starboard/android/shared/application_android.cc b/starboard/android/shared/application_android.cc index ce2ae6965bcc..527fa0a7fa1a 100644 --- a/starboard/android/shared/application_android.cc +++ b/starboard/android/shared/application_android.cc @@ -257,16 +257,6 @@ void ApplicationAndroid::OnSuspend() { env->CallStarboardVoidMethodOrAbort("beforeSuspend", "()V"); } -void ApplicationAndroid::StartMediaPlaybackService() { - JniEnvExt* env = JniEnvExt::Get(); - env->CallStarboardVoidMethodOrAbort("startMediaPlaybackService", "()V"); -} - -void ApplicationAndroid::StopMediaPlaybackService() { - JniEnvExt* env = JniEnvExt::Get(); - env->CallStarboardVoidMethodOrAbort("stopMediaPlaybackService", "()V"); -} - void ApplicationAndroid::ProcessAndroidCommand() { JniEnvExt* env = JniEnvExt::Get(); AndroidCommand cmd; diff --git a/starboard/android/shared/application_android.h b/starboard/android/shared/application_android.h index 0b7d34cc3fac..1ceefd919350 100644 --- a/starboard/android/shared/application_android.h +++ b/starboard/android/shared/application_android.h @@ -107,10 +107,6 @@ class ApplicationAndroid std::string GetOverlayedStringValue(const char* var_name); bool GetOverlayedBoolValue(const char* var_name); - // Methods to start/stop Media playback service. - void StartMediaPlaybackService(); - void StopMediaPlaybackService(); - protected: // --- Application overrides --- void Initialize() override;