Skip to content

Commit fd032c8

Browse files
committed
#1394 use system bridge for airplane mode actions
1 parent 84e3cef commit fd032c8

5 files changed

Lines changed: 54 additions & 12 deletions

File tree

sysbridge/src/main/aidl/io/github/sds100/keymapper/sysbridge/ISystemBridge.aidl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,6 @@ interface ISystemBridge {
3333
void setBluetoothEnabled(boolean enable) = 13;
3434

3535
void setNfcEnabled(boolean enable) = 14;
36+
37+
void setAirplaneMode(boolean enable) = 15;
3638
}

sysbridge/src/main/java/io/github/sds100/keymapper/sysbridge/service/SystemBridge.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.content.pm.ApplicationInfo
99
import android.content.pm.IPackageManager
1010
import android.content.pm.PackageManager
1111
import android.hardware.input.IInputManager
12+
import android.net.IConnectivityManager
1213
import android.net.wifi.IWifiManager
1314
import android.nfc.INfcAdapter
1415
import android.nfc.NfcAdapterApis
@@ -165,6 +166,7 @@ internal class SystemBridge : ISystemBridge.Stub() {
165166
private val packageManager: IPackageManager
166167
private val bluetoothManager: IBluetoothManager?
167168
private val nfcAdapter: INfcAdapter?
169+
private val connectivityManager: IConnectivityManager?
168170

169171
private val processPackageName: String = when (Process.myUid()) {
170172
Process.ROOT_UID -> "root"
@@ -225,6 +227,10 @@ internal class SystemBridge : ISystemBridge.Stub() {
225227
nfcAdapter = null
226228
}
227229

230+
waitSystemService(Context.CONNECTIVITY_SERVICE)
231+
connectivityManager =
232+
IConnectivityManager.Stub.asInterface(ServiceManager.getService(Context.CONNECTIVITY_SERVICE))
233+
228234
val applicationInfo = getKeyMapperPackageInfo()
229235

230236
if (applicationInfo == null) {
@@ -562,4 +568,12 @@ internal class SystemBridge : ISystemBridge.Stub() {
562568
)
563569
}
564570
}
571+
572+
override fun setAirplaneMode(enable: Boolean) {
573+
if (connectivityManager == null) {
574+
throw UnsupportedOperationException("ConnectivityManager not supported")
575+
}
576+
577+
connectivityManager.setAirplaneMode(enable)
578+
}
565579
}

system/src/main/java/io/github/sds100/keymapper/system/airplanemode/AirplaneModeAdapter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ import io.github.sds100.keymapper.common.utils.KMResult
44

55
interface AirplaneModeAdapter {
66
fun isEnabled(): Boolean
7-
fun enable(): KMResult<*>
8-
fun disable(): KMResult<*>
7+
suspend fun enable(): KMResult<*>
8+
suspend fun disable(): KMResult<*>
99
}

system/src/main/java/io/github/sds100/keymapper/system/airplanemode/AndroidAirplaneModeAdapter.kt

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,52 @@
11
package io.github.sds100.keymapper.system.airplanemode
22

33
import android.content.Context
4+
import android.os.Build
45
import android.provider.Settings
56
import dagger.hilt.android.qualifiers.ApplicationContext
7+
import io.github.sds100.keymapper.common.utils.KMError
68
import io.github.sds100.keymapper.common.utils.KMResult
79
import io.github.sds100.keymapper.common.utils.SettingsUtils
8-
import io.github.sds100.keymapper.common.utils.onSuccess
10+
import io.github.sds100.keymapper.common.utils.Success
11+
import io.github.sds100.keymapper.sysbridge.manager.SystemBridgeConnectionManager
912
import io.github.sds100.keymapper.system.root.SuAdapter
1013
import javax.inject.Inject
1114
import javax.inject.Singleton
1215

1316
@Singleton
1417
class AndroidAirplaneModeAdapter @Inject constructor(
15-
@ApplicationContext private val context: Context,
16-
val suAdapter: SuAdapter,
18+
@ApplicationContext private val ctx: Context,
19+
private val systemBridgeConnectionManager: SystemBridgeConnectionManager,
20+
private val suAdapter: SuAdapter
1721
) : AirplaneModeAdapter {
18-
private val ctx = context.applicationContext
1922

20-
override fun enable(): KMResult<*> =
21-
suAdapter.execute("settings put global airplane_mode_on 1").onSuccess {
22-
broadcastAirplaneModeChanged(false)
23+
override suspend fun enable(): KMResult<*> {
24+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
25+
systemBridgeConnectionManager.run { bridge -> bridge.setAirplaneMode(true) }
26+
} else {
27+
val success = SettingsUtils.putGlobalSetting(ctx, Settings.Global.AIRPLANE_MODE_ON, 1)
28+
broadcastAirplaneModeChanged(true)
29+
if (success) {
30+
Success(Unit)
31+
} else {
32+
KMError.FailedToModifySystemSetting(Settings.Global.AIRPLANE_MODE_ON)
33+
}
2334
}
35+
}
2436

25-
override fun disable(): KMResult<*> =
26-
suAdapter.execute("settings put global airplane_mode_on 0").onSuccess {
27-
broadcastAirplaneModeChanged(false)
37+
override suspend fun disable(): KMResult<*> {
38+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
39+
systemBridgeConnectionManager.run { bridge -> bridge.setAirplaneMode(false) }
40+
} else {
41+
val success = SettingsUtils.putGlobalSetting(ctx, Settings.Global.AIRPLANE_MODE_ON, 0)
42+
if (success) {
43+
broadcastAirplaneModeChanged(false)
44+
Success(Unit)
45+
} else {
46+
KMError.FailedToModifySystemSetting(Settings.Global.AIRPLANE_MODE_ON)
47+
}
2848
}
49+
}
2950

3051
override fun isEnabled(): Boolean =
3152
SettingsUtils.getGlobalSetting<Int>(ctx, Settings.Global.AIRPLANE_MODE_ON) == 1
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package android.net;
2+
3+
interface IConnectivityManager {
4+
void setAirplaneMode(boolean enable);
5+
}

0 commit comments

Comments
 (0)