Removed radio app service start audio from create method. am: 1e039f0718

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Car/Radio/+/17952354

Change-Id: Ia7a5da5b8e0ac28dbf614be074189df3a32571f1
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/car/radio/audio/AudioStreamController.java b/src/com/android/car/radio/audio/AudioStreamController.java
index c29811f..2b92a9b 100644
--- a/src/com/android/car/radio/audio/AudioStreamController.java
+++ b/src/com/android/car/radio/audio/AudioStreamController.java
@@ -21,6 +21,7 @@
 import android.media.AudioFocusRequest;
 import android.media.AudioManager;
 import android.media.session.PlaybackState;
+import android.util.IndentingPrintWriter;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
@@ -80,7 +81,7 @@
      *
      * It may be ducked, transiently lost or delayed.
      */
-    private boolean mHasSomeFocus = false;
+    private boolean mHasSomeFocus;
 
     private int mCurrentPlaybackState = PlaybackState.STATE_NONE;
     private Object mTuningToken;
@@ -231,6 +232,7 @@
      * @return true, if request has succeeded (maybe delayed)
      */
     public boolean requestMuted(boolean muted) {
+        Log.v(TAG, "requestMuted(" + muted + ")");
         synchronized (mLock) {
             if (muted) {
                 if (mTuningToken == null) {
@@ -272,4 +274,19 @@
             }
         }
     }
+
+    /**
+     * Dumps the current audio stream controller state
+     */
+    public void dump(IndentingPrintWriter writer) {
+        writer.println("AudioStreamController");
+        writer.increaseIndent();
+        synchronized (mLock) {
+            writer.printf("Focus Request: %s\n", mGainFocusReq);
+            writer.printf("Has Some Focus: %b\n", mHasSomeFocus);
+            writer.printf("PlayBack State: %d\n", mCurrentPlaybackState);
+            writer.printf("Is Tuning Token Available: %s\n", mTuningToken != null);
+        }
+        writer.decreaseIndent();
+    }
 }
diff --git a/src/com/android/car/radio/media/TunerSession.java b/src/com/android/car/radio/media/TunerSession.java
index 0cda1f3..3d9c70c 100644
--- a/src/com/android/car/radio/media/TunerSession.java
+++ b/src/com/android/car/radio/media/TunerSession.java
@@ -149,6 +149,7 @@
 
         @Override
         public void onPlay() {
+            mAppService.tuneToDefaultIfNeeded();
             mAppService.setMuted(false);
         }
 
diff --git a/src/com/android/car/radio/service/IRadioAppService.aidl b/src/com/android/car/radio/service/IRadioAppService.aidl
index 6ece15a..66f9211 100644
--- a/src/com/android/car/radio/service/IRadioAppService.aidl
+++ b/src/com/android/car/radio/service/IRadioAppService.aidl
@@ -95,4 +95,9 @@
      * Returns current region config (like frequency ranges for AM/FM).
      */
     RegionConfig getRegionConfig();
+
+    /**
+     * Tunes to the previously selected program or the default channel.
+     */
+    void tuneToDefaultIfNeeded();
 }
diff --git a/src/com/android/car/radio/service/RadioAppService.java b/src/com/android/car/radio/service/RadioAppService.java
index f6446d7..e906bcd 100644
--- a/src/com/android/car/radio/service/RadioAppService.java
+++ b/src/com/android/car/radio/service/RadioAppService.java
@@ -32,7 +32,9 @@
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.service.media.MediaBrowserService;
+import android.util.IndentingPrintWriter;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.lifecycle.Lifecycle;
@@ -92,10 +94,13 @@
     private TunerSession mMediaSession;
 
     // current observables state for newly bound IRadioAppCallbacks
+    @GuardedBy("mLock")
     private ProgramInfo mCurrentProgram = null;
+    @GuardedBy("mLock")
     private int mCurrentPlaybackState = PlaybackState.STATE_NONE;
+    @GuardedBy("mLock")
     private long mLastProgramListPush;
-
+    @GuardedBy("mLock")
     private RegionConfig mRegionConfigCache;
 
     private SkipController mSkipController;
@@ -139,14 +144,13 @@
             mProgramList.addOnCompleteListener(this::pushProgramListUpdate);
         }
 
-        tuneToDefault(null);
-        mAudioStreamController.requestMuted(false);
-
         mLifecycleRegistry.markState(Lifecycle.State.CREATED);
     }
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
+        Log.d(TAG, "onStartCommand intent [%s] flags[%d] startId[%d]",
+                intent.toString(), flags, startId);
         mLifecycleRegistry.markState(Lifecycle.State.STARTED);
         if (BrowseTree.ACTION_PLAY_BROADCASTRADIO.equals(intent.getAction())) {
             Log.i(TAG, "Executing general play radio intent");
@@ -160,6 +164,7 @@
 
     @Override
     public IBinder onBind(Intent intent) {
+        Log.i(TAG, "onBind intent[" + intent + "]");
         mLifecycleRegistry.markState(Lifecycle.State.STARTED);
         if (mRadioTuner == null) return null;
         if (ACTION_APP_SERVICE.equals(intent.getAction())) {
@@ -193,6 +198,7 @@
     }
 
     private void onPlaybackStateChanged(int newState) {
+        Log.d(TAG, "onPlaybackStateChanged new state [%d]", newState);
         synchronized (mLock) {
             mCurrentPlaybackState = newState;
             for (IRadioAppCallback callback : mRadioAppCallbacks) {
@@ -289,10 +295,25 @@
 
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        if (mSkipController != null) {
-            pw.println("SkipController:"); mSkipController.dump(pw, "  ");
-        } else {
-            pw.println("no SkipController");
+        try (IndentingPrintWriter writer = new IndentingPrintWriter(pw)) {
+            pw.println("RadioAppService:");
+            writer.increaseIndent();
+            if (mSkipController != null) {
+                writer.increaseIndent();
+                mSkipController.dump(writer);
+                writer.decreaseIndent();
+            } else {
+                pw.println("No SkipController");
+            }
+
+            if (mAudioStreamController != null) {
+                writer.increaseIndent();
+                mAudioStreamController.dump(writer);
+                writer.decreaseIndent();
+            } else {
+                pw.println("No AudioStreamController");
+            }
+            writer.decreaseIndent();
         }
     }
 
@@ -381,6 +402,21 @@
         }
 
         @Override
+        public void tuneToDefaultIfNeeded() {
+            synchronized (mLock) {
+                if (mRadioTuner == null) {
+                    throw new IllegalStateException("Tuner session is closed");
+                }
+
+                if (mCurrentPlaybackState != PlaybackState.STATE_NONE) {
+                    return;
+                }
+            }
+
+            tuneToDefault(null);
+        }
+
+        @Override
         public void switchBand(ProgramType band) {
             tuneToDefault(band);
         }
diff --git a/src/com/android/car/radio/service/RadioAppServiceWrapper.java b/src/com/android/car/radio/service/RadioAppServiceWrapper.java
index 154a408..cfd07af 100644
--- a/src/com/android/car/radio/service/RadioAppServiceWrapper.java
+++ b/src/com/android/car/radio/service/RadioAppServiceWrapper.java
@@ -365,6 +365,13 @@
     }
 
     /**
+     * Tunes to the previously selected program or the default channel.
+     */
+    public void tuneToDefaultIfNeeded() {
+        callService(service -> service.tuneToDefaultIfNeeded());
+    }
+
+    /**
      * Tune to a default channel of a given program type (band).
      *
      * Usually, this means tuning to the recently listened program of a given band.
diff --git a/src/com/android/car/radio/service/SkipController.java b/src/com/android/car/radio/service/SkipController.java
index 574399b..5df31cb 100644
--- a/src/com/android/car/radio/service/SkipController.java
+++ b/src/com/android/car/radio/service/SkipController.java
@@ -16,6 +16,7 @@
 package com.android.car.radio.service;
 
 import android.os.RemoteException;
+import android.util.IndentingPrintWriter;
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
@@ -26,7 +27,6 @@
 import com.android.car.radio.SkipMode;
 import com.android.car.radio.util.Log;
 
-import java.io.PrintWriter;
 import java.util.List;
 
 /**
@@ -41,13 +41,13 @@
 
     private final IRadioAppService.Stub mService;
 
-    @GuardedBy("mlock")
+    @GuardedBy("mLock")
     private List<Program> mFavorites;
 
-    @GuardedBy("mlock")
+    @GuardedBy("mLock")
     private int mCurrentIndex;
 
-    @GuardedBy("mlock")
+    @GuardedBy("mLock")
     private SkipMode mSkipMode;
 
     SkipController(@NonNull IRadioAppService.Stub service,
@@ -128,25 +128,27 @@
         return program;
     }
 
-    void dump(@NonNull PrintWriter pw, @NonNull String prefix) {
+    void dump(IndentingPrintWriter pw) {
+        pw.println("SkipController");
+        pw.increaseIndent();
         synchronized (mLock) {
-            pw.print(prefix); pw.print("mode: "); pw.println(mSkipMode);
-            pw.print(prefix); pw.print("current index: "); pw.println(mCurrentIndex);
+            pw.printf("mode: %s\n", mSkipMode);
+            pw.printf("current index: %d\n", mCurrentIndex);
             if (mFavorites == null || mFavorites.isEmpty()) {
-                pw.print(prefix); pw.println("no favorites");
-                return;
-            }
-            int size = mFavorites.size();
-            pw.print(prefix); pw.print(size); pw.println(" favorites: ");
-            String prefix2 = prefix + "  ";
-            for (int i = 0; i < size; i++) {
-                pw.print(prefix2);
-                pw.print(i); pw.print(": "); pw.print(mFavorites.get(i).getName());
-                if (i == mCurrentIndex) {
-                    pw.print(" (current)");
+                pw.println("no favorites");
+            } else {
+                pw.printf("%d favorites:\n", mFavorites.size());
+                pw.increaseIndent();
+                for (int i = 0; i < mFavorites.size(); i++) {
+                    pw.printf("Favorite[%d]: %s ", i, mFavorites.get(i).getName());
+                    if (i == mCurrentIndex) {
+                        pw.printf(" is current");
+                    }
+                    pw.println();
                 }
-                pw.println();
+                pw.decreaseIndent();
             }
         }
+        pw.decreaseIndent();
     }
 }