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);
+ }
+ }
+
}