gaming: fix: can't turn on speaker

Signed-off-by: cjybyjk <cjybyjk@zjnu.edu.cn>
diff --git a/app/src/main/java/org/exthmui/game/services/GamingService.java b/app/src/main/java/org/exthmui/game/services/GamingService.java
index d5bef4d..936e99f 100644
--- a/app/src/main/java/org/exthmui/game/services/GamingService.java
+++ b/app/src/main/java/org/exthmui/game/services/GamingService.java
@@ -26,7 +26,9 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.media.AudioDeviceInfo;
 import android.media.AudioManager;
+import android.media.AudioSystem;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -355,6 +357,17 @@
         private int mPrevMode = AudioManager.MODE_NORMAL;
         private AudioManager mAudioManager = getSystemService(AudioManager.class);
 
+        private boolean isHeadsetPluggedIn() {
+            AudioDeviceInfo[] audioDeviceInfoArr = mAudioManager.getDevices(AudioManager.GET_DEVICES_ALL);
+            for (AudioDeviceInfo info : audioDeviceInfoArr) {
+                if (info.getType() == AudioDeviceInfo.TYPE_WIRED_HEADPHONES || info.getType() == AudioDeviceInfo.TYPE_WIRED_HEADSET ||
+                    info.getType() == AudioDeviceInfo.TYPE_USB_HEADSET) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
         @Override
         public void onCallStateChanged(int state, String phoneNumber) {
             if (Settings.System.getInt(getContentResolver(), Settings.System.GAMING_MODE_AUTO_ANSWER_CALL, 0) != 0) {
@@ -365,13 +378,22 @@
                     case TelephonyManager.CALL_STATE_OFFHOOK:
                         if (mPrevState == TelephonyManager.CALL_STATE_RINGING) {
                             mPrevMode = mAudioManager.getMode();
-                            mAudioManager.setMode(AudioManager.MODE_IN_CALL);
-                            mAudioManager.setSpeakerphoneOn(!mAudioManager.isWiredHeadsetOn());
+                            mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
+                            if (isHeadsetPluggedIn()) {
+                                mAudioManager.setSpeakerphoneOn(false);
+                                AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_NONE);
+                            } else {
+                                mAudioManager.setSpeakerphoneOn(true);
+                                AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_SPEAKER);
+                            }
+                            mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
                         }
                         break;
                     case TelephonyManager.CALL_STATE_IDLE:
                         if (mPrevState == TelephonyManager.CALL_STATE_OFFHOOK) {
                             mAudioManager.setMode(mPrevMode);
+                            AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION, AudioSystem.FORCE_NONE);
+                            mAudioManager.setSpeakerphoneOn(false);
                         }
                         break;
                 }