[FM] Earphone mode incoming call ringtone issue in loudspeaker

Listen to FM -> switch to loudspeaker mode -> now go to music
player to listen to music with earphone connected, Music switches
to loudspeaker mode automatically even when the earphones are connected.

Bug 19729515
from: https://partner-android-review.googlesource.com/#/c/209191/

Change-Id: I17f84a6ceb63783ca7627eab2b8dd6bf59fe151b
Signed-off-by: Benson Huang <benson.huang@mediatek.com>
diff --git a/src/com/android/fmradio/FmService.java b/src/com/android/fmradio/FmService.java
index 7f2ef78..35efe56 100644
--- a/src/com/android/fmradio/FmService.java
+++ b/src/com/android/fmradio/FmService.java
@@ -1927,6 +1927,10 @@
      * @return true, success; false, fail;
      */
     public boolean requestAudioFocus() {
+        if (FmUtils.getIsSpeakerModeOnFocusLost(mContext)) {
+            setForceUse(true);
+            FmUtils.setIsSpeakerModeOnFocusLost(mContext, false);
+        }
         if (mIsAudioFocusHeld) {
             return true;
         }
@@ -2034,6 +2038,7 @@
                     }
                 }
                 handlePowerDown();
+                forceToHeadsetMode();
                 break;
 
             case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
@@ -2055,9 +2060,14 @@
                     }
                 }
                 handlePowerDown();
+                forceToHeadsetMode();
                 break;
 
             case AudioManager.AUDIOFOCUS_GAIN:
+                if (FmUtils.getIsSpeakerModeOnFocusLost(mContext)) {
+                    setForceUse(true);
+                    FmUtils.setIsSpeakerModeOnFocusLost(mContext, false);
+                }
                 if ((mPowerStatus != POWER_UP) && mPausedByTransientLossOfFocus) {
                     final int bundleSize = 1;
                     mFmServiceHandler.removeMessages(FmListener.MSGID_POWERUP_FINISHED);
@@ -2078,6 +2088,14 @@
         }
     }
 
+    private void forceToHeadsetMode() {
+        if (mIsSpeakerUsed && isHeadSetIn()) {
+            AudioSystem.setForceUse(FOR_PROPRIETARY, AudioSystem.FORCE_NONE);
+            // save user's option to shared preferences.
+            FmUtils.setIsSpeakerModeOnFocusLost(mContext, true);
+        }
+    }
+
     /**
      * FM Radio listener record
      */
diff --git a/src/com/android/fmradio/FmUtils.java b/src/com/android/fmradio/FmUtils.java
index 608ced7..b6219fd 100644
--- a/src/com/android/fmradio/FmUtils.java
+++ b/src/com/android/fmradio/FmUtils.java
@@ -61,6 +61,7 @@
     private static final String FM_LOCATION_LATITUDE = "fm_location_latitude";
     private static final String FM_LOCATION_LONGITUDE = "fm_location_longitude";
     private static final String FM_IS_FIRST_TIME_PLAY = "fm_is_first_time_play";
+    private static final String FM_IS_SPEAKER_MODE = "fm_is_speaker_mode";
     private static final String FM_IS_FIRST_ENTER_STATION_LIST = "fm_is_first_enter_station_list";
     // StorageManager For FM record
     private static StorageManager sStorageManager = null;
@@ -298,4 +299,27 @@
         iconLayout.destroyDrawingCache();
         return largeIcon;
     }
+
+    /**
+     * Get whether speaker mode is in use when audio focus lost.
+     * @param context the Context
+     * @return true for speaker mode, false for non speaker mode
+     */
+    public static boolean getIsSpeakerModeOnFocusLost(Context context) {
+        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+        return prefs.getBoolean(FM_IS_SPEAKER_MODE, false);
+    }
+
+    /**
+     * Set whether speaker mode is in use.
+     * @param context the Context
+     * @param isSpeaker speaker state
+     */
+    public static void setIsSpeakerModeOnFocusLost(Context context, boolean isSpeaker) {
+        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+        SharedPreferences.Editor editor = prefs.edit();
+        editor.putBoolean(FM_IS_SPEAKER_MODE, isSpeaker);
+        editor.commit();
+    }
 }