add: auto answer call in gaming mode

Signed-off-by: cjybyjk <cjybyjk@gmail.com>
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b46f012..54dac14 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,8 +4,12 @@
     android:sharedUserId="android.uid.system">
 
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
     <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
+    <uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />
 
     <application
         android:allowBackup="true"
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 f4d663a..809bc8f 100644
--- a/app/src/main/java/org/exthmui/game/services/GamingService.java
+++ b/app/src/main/java/org/exthmui/game/services/GamingService.java
@@ -34,6 +34,11 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Settings;
+import android.telecom.CallAudioState;
+import android.telecom.InCallService;
+import android.telecom.TelecomManager;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
@@ -68,6 +73,10 @@
     private AudioManager mAudioManager;
     private IStatusBarService mStatusBarService;
     private LineageHardwareManager mLineageHardware;
+    private TelephonyManager mTelephonyManager;
+    private TelecomManager mTelecomManager;
+
+    private GamingPhoneStateListener mPhoneStateListener;
 
     private BroadcastReceiver mGamingModeOffReceiver = new BroadcastReceiver() {
         @Override
@@ -115,6 +124,8 @@
         checkNotificationListener();
 
         mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
+        mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
+        mTelecomManager = (TelecomManager) getSystemService(TELECOM_SERVICE);
         mStatusBarService = IStatusBarService.Stub.asInterface(ServiceManager.getService(Context.STATUS_BAR_SERVICE));
         try {
             mLineageHardware = LineageHardwareManager.getInstance(this);
@@ -125,6 +136,9 @@
         registerReceiver(mGamingModeOffReceiver, new IntentFilter(Constants.Broadcasts.SYS_BROADCAST_GAMING_MODE_OFF));
         LocalBroadcastManager.getInstance(this).registerReceiver(mGamingActionReceiver, new IntentFilter(Constants.Broadcasts.BROADCAST_GAMING_ACTION));
 
+        mPhoneStateListener = new GamingPhoneStateListener();
+        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+
         mOverlayServiceIntent = new Intent(this, OverlayService.class);
 
         PendingIntent stopGamingIntent = PendingIntent.getBroadcast(this, 0, new Intent(Constants.Broadcasts.SYS_BROADCAST_GAMING_MODE_OFF), 0);
@@ -142,7 +156,7 @@
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
-        if (!TextUtils.equals(intent.getStringExtra("package"), mCurrentPackage)) {
+        if (intent != null && !TextUtils.equals(intent.getStringExtra("package"), mCurrentPackage)) {
             mCurrentPackage = intent.getStringExtra("package");
             updateConfig();
         }
@@ -289,6 +303,7 @@
     public void onDestroy() {
         unregisterReceiver(mGamingModeOffReceiver);
         stopServiceAsUser(mOverlayServiceIntent, UserHandle.CURRENT);
+        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
         setDisableGesture(false);
         setDisableHwKeys(false, true);
         setDisableAutoBrightness(false, true);
@@ -329,4 +344,35 @@
         }
     }
 
+    private class GamingPhoneStateListener extends PhoneStateListener {
+        private int mPrevState = -1;
+        private int mPrevMode = AudioManager.MODE_NORMAL;
+        private AudioManager mAudioManager = getSystemService(AudioManager.class);
+
+        @Override
+        public void onCallStateChanged(int state, String phoneNumber) {
+            if (Settings.System.getInt(getContentResolver(), Settings.System.GAMING_MODE_AUTO_ANSWER_CALL, 0) != 0) {
+                switch (state) {
+                    case TelephonyManager.CALL_STATE_RINGING:
+                        mTelecomManager.acceptRingingCall();
+                        break;
+                    case TelephonyManager.CALL_STATE_OFFHOOK:
+                        if (mPrevState == TelephonyManager.CALL_STATE_RINGING) {
+                            mPrevMode = mAudioManager.getMode();
+                            mAudioManager.setMode(AudioManager.MODE_IN_CALL);
+                            mAudioManager.setSpeakerphoneOn(!mAudioManager.isWiredHeadsetOn());
+                        }
+                        break;
+                    case TelephonyManager.CALL_STATE_IDLE:
+                        if (mPrevState == TelephonyManager.CALL_STATE_OFFHOOK) {
+                            mAudioManager.setMode(mPrevMode);
+                        }
+                        break;
+                }
+            }
+            mPrevState = state;
+            super.onCallStateChanged(state, phoneNumber);
+        }
+    }
+
 }