Skip to content

Commit 84e3cef

Browse files
committed
#1394 use system bridge for NFC actions
1 parent 1030ece commit 84e3cef

7 files changed

Lines changed: 96 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
- #761 Detect keys with scancodes. Key Mapper will do this automatically if the key code is unknown
88
or you record different physical keys from the same device with the same key code.
9+
- Redesign the Settings screen
910

1011
## Removed
1112

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
@@ -31,4 +31,6 @@ interface ISystemBridge {
3131
void setDataEnabled(int subId, boolean enable) = 12;
3232

3333
void setBluetoothEnabled(boolean enable) = 13;
34+
35+
void setNfcEnabled(boolean enable) = 14;
3436
}

sysbridge/src/main/java/io/github/sds100/keymapper/sysbridge/adb/AdbMdns.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,7 @@ internal class AdbMdns(
124124
private suspend fun discoverPortInternal(): Int? {
125125
var port: Int? = null
126126

127-
if (isDiscovering.value) {
128-
cleanup()
129-
}
127+
cleanup()
130128

131129
// Wait for it to stop discovering
132130
isDiscovering.first { !it }

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import android.content.pm.IPackageManager
1010
import android.content.pm.PackageManager
1111
import android.hardware.input.IInputManager
1212
import android.net.wifi.IWifiManager
13+
import android.nfc.INfcAdapter
14+
import android.nfc.NfcAdapterApis
1315
import android.os.Build
1416
import android.os.Bundle
1517
import android.os.Handler
@@ -162,6 +164,7 @@ internal class SystemBridge : ISystemBridge.Stub() {
162164
private val telephonyManager: ITelephony?
163165
private val packageManager: IPackageManager
164166
private val bluetoothManager: IBluetoothManager?
167+
private val nfcAdapter: INfcAdapter?
165168

166169
private val processPackageName: String = when (Process.myUid()) {
167170
Process.ROOT_UID -> "root"
@@ -214,6 +217,14 @@ internal class SystemBridge : ISystemBridge.Stub() {
214217
bluetoothManager = null
215218
}
216219

220+
if (hasSystemFeature(PackageManager.FEATURE_NFC)) {
221+
waitSystemService(Context.NFC_SERVICE)
222+
nfcAdapter =
223+
INfcAdapter.Stub.asInterface(ServiceManager.getService(Context.NFC_SERVICE))
224+
} else {
225+
nfcAdapter = null
226+
}
227+
217228
val applicationInfo = getKeyMapperPackageInfo()
218229

219230
if (applicationInfo == null) {
@@ -535,4 +546,20 @@ internal class SystemBridge : ISystemBridge.Stub() {
535546
bluetoothManager.disable(attributionSource, true)
536547
}
537548
}
549+
550+
override fun setNfcEnabled(enable: Boolean) {
551+
if (nfcAdapter == null) {
552+
throw UnsupportedOperationException("NFC not supported")
553+
}
554+
555+
if (enable) {
556+
NfcAdapterApis.enable(nfcAdapter, processPackageName)
557+
} else {
558+
NfcAdapterApis.disable(
559+
adapter = nfcAdapter,
560+
saveState = true,
561+
packageName = processPackageName
562+
)
563+
}
564+
}
538565
}

system/src/main/java/io/github/sds100/keymapper/system/nfc/AndroidNfcAdapter.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,40 @@ package io.github.sds100.keymapper.system.nfc
22

33
import android.content.Context
44
import android.nfc.NfcManager
5+
import android.os.Build
56
import androidx.core.content.getSystemService
7+
import dagger.hilt.android.qualifiers.ApplicationContext
68
import io.github.sds100.keymapper.common.utils.KMResult
9+
import io.github.sds100.keymapper.sysbridge.manager.SystemBridgeConnectionManager
710
import io.github.sds100.keymapper.system.root.SuAdapter
8-
import dagger.hilt.android.qualifiers.ApplicationContext
911
import javax.inject.Inject
1012
import javax.inject.Singleton
1113

1214
@Singleton
1315
class AndroidNfcAdapter @Inject constructor(
1416
@ApplicationContext private val context: Context,
1517
private val suAdapter: SuAdapter,
18+
private val systemBridgeConnectionManager: SystemBridgeConnectionManager
1619
) : NfcAdapter {
1720
private val ctx = context.applicationContext
1821

19-
private val nfcManager: NfcManager by lazy { ctx.getSystemService()!! }
22+
private val nfcManager: NfcManager? by lazy { ctx.getSystemService() }
2023

21-
override fun isEnabled(): Boolean = nfcManager.defaultAdapter.isEnabled
24+
override fun isEnabled(): Boolean = nfcManager?.defaultAdapter?.isEnabled ?: false
2225

23-
override fun enable(): KMResult<*> = suAdapter.execute("svc nfc enable")
26+
override fun enable(): KMResult<*> {
27+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
28+
return systemBridgeConnectionManager.run { bridge -> bridge.setNfcEnabled(true) }
29+
} else {
30+
return suAdapter.execute("svc nfc enable")
31+
}
32+
}
2433

25-
override fun disable(): KMResult<*> = suAdapter.execute("svc nfc disable")
34+
override fun disable(): KMResult<*> {
35+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
36+
return systemBridgeConnectionManager.run { bridge -> bridge.setNfcEnabled(false) }
37+
} else {
38+
return suAdapter.execute("svc nfc disable")
39+
}
40+
}
2641
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package android.nfc;
2+
3+
import android.os.Build;
4+
import android.os.IBinder;
5+
6+
import androidx.annotation.RequiresApi;
7+
8+
public interface INfcAdapter extends android.os.IInterface {
9+
boolean enable();
10+
11+
boolean disable(boolean saveState);
12+
13+
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
14+
boolean enable(String pkg);
15+
16+
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
17+
boolean disable(boolean saveState, String pkg);
18+
19+
abstract class Stub extends android.os.Binder implements INfcAdapter {
20+
public static INfcAdapter asInterface(IBinder obj) {
21+
throw new RuntimeException("Stub!");
22+
}
23+
}
24+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package android.nfc
2+
3+
import android.os.Build
4+
5+
object NfcAdapterApis {
6+
fun enable(adapter: INfcAdapter, packageName: String) {
7+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
8+
adapter.enable(packageName)
9+
} else {
10+
adapter.enable()
11+
}
12+
}
13+
14+
fun disable(adapter: INfcAdapter, saveState: Boolean, packageName: String) {
15+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
16+
adapter.disable(saveState, packageName)
17+
} else {
18+
adapter.disable(saveState)
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)