Merge "HFP: recover BT_SCO and set audio parameters while audio server restarted" into q-keystone-qcom-dev
diff --git a/src/com/android/bluetooth/hfp/HeadsetService.java b/src/com/android/bluetooth/hfp/HeadsetService.java
index 4cbe2b5..0ca6734 100644
--- a/src/com/android/bluetooth/hfp/HeadsetService.java
+++ b/src/com/android/bluetooth/hfp/HeadsetService.java
@@ -56,6 +56,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.concurrent.Executor;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
@@ -128,6 +129,8 @@
     private boolean mIsTwsPlusEnabled = false;
     private boolean mIsTwsPlusShoEnabled = false;
     private vendorhfservice  mVendorHf;
+    private Context mContext = null;
+    private AudioServerStateCallback mServerStateCallback = new AudioServerStateCallback();
 
     @Override
     public IProfileServiceBinder initBinder() {
@@ -226,6 +229,11 @@
             mVendorHf.enableSwb(isSwbEnabled());
         }
 
+        Log.d(TAG, "registering audio server state callback");
+        mContext = getApplicationContext();
+        Executor exec = mContext.getMainExecutor();
+        mSystemInterface.getAudioManager().setAudioServerStateCallback(exec, mServerStateCallback);
+
         Log.i(TAG, " HeadsetService Started ");
         return true;
     }
@@ -424,6 +432,30 @@
         }
     }
 
+    private class AudioServerStateCallback extends AudioManager.AudioServerStateCallback {
+        @Override
+        public void onAudioServerDown() {
+            Log.d(TAG, "notifying onAudioServerDown");
+        }
+
+        @Override
+        public void onAudioServerUp() {
+            Log.d(TAG, "notifying onAudioServerUp");
+            if (isAudioOn()) {
+                Log.d(TAG, "onAudioServerUp: Audio is On, Notify HeadsetStateMachine");
+                synchronized (mStateMachines) {
+                    for (HeadsetStateMachine stateMachine : mStateMachines.values()) {
+                        if (stateMachine.getAudioState()
+                                == BluetoothHeadset.STATE_AUDIO_CONNECTED) {
+                            stateMachine.onAudioServerUp();
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     private final BroadcastReceiver mHeadsetReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
diff --git a/src/com/android/bluetooth/hfp/HeadsetStateMachine.java b/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
index cfa43a7..37c5c22 100644
--- a/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
+++ b/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
@@ -1880,6 +1880,14 @@
         return true;
     }
 
+    public void onAudioServerUp() {
+        Log.i(TAG, "onAudioSeverUp: restore audio parameters");
+        mSystemInterface.getAudioManager().setBluetoothScoOn(false);
+        mSystemInterface.getAudioManager().setParameters("A2dpSuspended=true");
+        setAudioParameters();
+        mSystemInterface.getAudioManager().setBluetoothScoOn(true);
+    }
+
     /*
      * Put the AT command, company ID, arguments, and device in an Intent and broadcast it.
      */