Skip to content

Commit 108d6cb

Browse files
committed
feat: allow enabling screen-off functionality on Android
the call will fail on iOS
1 parent 85a9f2d commit 108d6cb

File tree

5 files changed

+70
-16
lines changed

5 files changed

+70
-16
lines changed

android/src/main/kotlin/dev/jeremyko/proximity_sensor/ProximitySensorPlugin.kt

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,40 @@ package dev.jeremyko.proximity_sensor
33

44
import io.flutter.embedding.engine.plugins.FlutterPlugin
55
import io.flutter.plugin.common.EventChannel
6+
import io.flutter.plugin.common.MethodCall
7+
import io.flutter.plugin.common.MethodChannel
8+
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
9+
import io.flutter.plugin.common.MethodChannel.Result
610

711
////////////////////////////////////////////////////////////////////////////////////////////////////
8-
class ProximitySensorPlugin: FlutterPlugin {
9-
private lateinit var channel : EventChannel
12+
class ProximitySensorPlugin: FlutterPlugin, MethodCallHandler {
13+
private lateinit var methodChannel: MethodChannel
14+
private lateinit var eventChannel : EventChannel
1015
private lateinit var streamHandler : ProximityStreamHandler
1116

1217
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
13-
channel = EventChannel(flutterPluginBinding.binaryMessenger, "proximity_sensor")
18+
methodChannel = MethodChannel(flutterPluginBinding.binaryMessenger, "proximity_sensor_enable")
19+
methodChannel.setMethodCallHandler(this)
20+
21+
eventChannel = EventChannel(flutterPluginBinding.binaryMessenger, "proximity_sensor")
1422
streamHandler = ProximityStreamHandler( flutterPluginBinding.applicationContext)
15-
channel.setStreamHandler(streamHandler)
23+
eventChannel.setStreamHandler(streamHandler)
1624
}
1725

1826
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
19-
channel.setStreamHandler(null)
27+
eventChannel.setStreamHandler(null)
28+
}
29+
30+
override fun onMethodCall(call: MethodCall, result: Result) {
31+
if (call.method == "enableProximityScreenOff") {
32+
val enabled: Boolean? = call.argument("enabled")
33+
if (enabled == null) {
34+
result.error("INVALID_ARGUMENTS", "'enabled' cannot be null", null)
35+
} else {
36+
streamHandler.setScreenOffEnabled(enabled)
37+
result.success(null);
38+
}
39+
}
2040
}
2141
}
2242

android/src/main/kotlin/dev/jeremyko/proximity_sensor/ProximityStreamHandler.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ class ProximityStreamHandler(
2121
private var proximitySensor: Sensor? = null
2222

2323
private lateinit var powerManager: PowerManager
24-
private lateinit var wakeLock: PowerManager.WakeLock
24+
private var wakeLock: PowerManager.WakeLock? = null;
25+
private var enableScreenOff: Boolean = false;
2526

2627
@SuppressLint("WakelockTimeout")
2728
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
@@ -34,18 +35,20 @@ class ProximityStreamHandler(
3435
powerManager = applicationContext.getSystemService(Context.POWER_SERVICE) as
3536
PowerManager
3637

37-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
38-
wakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "dev.jeremyko.proximity_sensor:lock")
39-
if (!wakeLock.isHeld) {
40-
wakeLock.acquire()
38+
if (enableScreenOff && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
39+
if (wakeLock == null) {
40+
wakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "dev.jeremyko.proximity_sensor:lock")
41+
}
42+
if (!wakeLock!!.isHeld) {
43+
wakeLock!!.acquire()
4144
}
4245
}
4346
}
4447

4548
override fun onCancel(arguments: Any?) {
4649
sensorManager.unregisterListener(this, proximitySensor)
47-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
48-
wakeLock.release()
50+
if (wakeLock != null && wakeLock!!.isHeld) {
51+
wakeLock!!.release()
4952
}
5053
}
5154

@@ -65,4 +68,11 @@ class ProximityStreamHandler(
6568
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
6669
//do nothing
6770
}
71+
72+
fun setScreenOffEnabled(enabled: Boolean) {
73+
enableScreenOff = enabled;
74+
if (!enabled && wakeLock != null && wakeLock!!.isHeld) {
75+
wakeLock!!.release()
76+
}
77+
}
6878
}

example/lib/main.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ class _MyAppState extends State<MyApp> {
3737
FlutterError.dumpErrorToConsole(details);
3838
}
3939
};
40+
await ProximitySensor.setProximityScreenOff(true).onError((error, stackTrace) {
41+
print("could not enable screen off functionality");
42+
return null;
43+
});
4044
_streamSubscription = ProximitySensor.events.listen((int event) {
4145
setState(() {
4246
_isNear = (event > 0) ? true : false;

ios/Classes/SwiftProximitySensorPlugin.swift

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,21 @@ public class SwiftProximityStreamHandler : NSObject,FlutterStreamHandler
4141
public class SwiftProximitySensorPlugin: NSObject, FlutterPlugin
4242
{
4343
static var stream_handler:SwiftProximityStreamHandler = SwiftProximityStreamHandler()
44-
static var channel:FlutterEventChannel = FlutterEventChannel()
44+
static var eventChannel:FlutterEventChannel = FlutterEventChannel()
45+
static var methodChannel:FlutterMethodChannel = FlutterMethodChannel()
4546

4647
public static func register(with registrar: FlutterPluginRegistrar) {
47-
let channel = FlutterEventChannel.init(name: "proximity_sensor", binaryMessenger: registrar.messenger())
48-
channel.setStreamHandler(stream_handler)
49-
}
48+
let eventChannel = FlutterEventChannel.init(name: "proximity_sensor", binaryMessenger: registrar.messenger())
49+
eventChannel.setStreamHandler(stream_handler)
50+
51+
let methodChannel = FlutterMethodChannel(name: "proximity_sensor_enable", binaryMessenger: registrar.messenger())
52+
53+
let instance = SwiftProximitySensorPlugin()
54+
registrar.addMethodCallDelegate(instance, channel: channel)
55+
}
56+
57+
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
58+
result(FlutterMethodNotImplemented)
59+
}
5060
}
5161

lib/proximity_sensor.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,19 @@ import 'package:flutter/services.dart';
44
////////////////////////////////////////////////////////////////////////////////
55
class ProximitySensor {
66
static EventChannel _streamChannel = EventChannel('proximity_sensor');
7+
static MethodChannel _methodChannel =
8+
MethodChannel('proximity_sensor_enable');
9+
710
static Stream<int> get events {
811
return _streamChannel.receiveBroadcastStream().map((event) {
912
return event;
1013
});
1114
}
15+
16+
static Future<void> setProximityScreenOff(bool enabled) async {
17+
await _methodChannel
18+
.invokeMethod<void>('enableProximityScreenOff', <String, dynamic>{
19+
'enabled': enabled,
20+
});
21+
}
1222
}

0 commit comments

Comments
 (0)