diff --git a/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt b/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt index 5cb9887a1b..4de9c6c896 100644 --- a/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt +++ b/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt @@ -24,6 +24,8 @@ import android.content.ComponentName import android.content.Context import android.content.Intent import android.os.Build +import android.os.PowerManager +import android.os.SystemClock import android.provider.Settings import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.requiredWidth @@ -43,6 +45,8 @@ import app.lawnchair.util.requireSystemService import app.lawnchair.views.ComposeBottomSheet import com.android.launcher3.R import com.android.launcher3.Utilities +import com.android.launcher3.util.PackageManagerHelper +import java.lang.reflect.InvocationTargetException class SleepGestureHandler(context: Context) : GestureHandler(context) { @@ -51,6 +55,7 @@ class SleepGestureHandler(context: Context) : GestureHandler(context) { } private val methods = listOf( + SleepMethodSystem(context), SleepMethodRoot(context), SleepMethodPieAccessibility(context), SleepMethodDeviceAdmin(context) @@ -62,6 +67,29 @@ class SleepGestureHandler(context: Context) : GestureHandler(context) { } } +/** + * Allows Lawnchair to sleep the device without any extra permissions when it is installed as a system app. + */ +class SleepMethodSystem(context: Context) : SleepGestureHandler.SleepMethod(context) { + override suspend fun isSupported() = PackageManagerHelper.isSystemApp(context, context.packageName) + + override suspend fun sleep(launcher: LawnchairLauncher) { + val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager + try { + powerManager.javaClass.getMethod( + "goToSleep", + *arrayOf?>(Long::class.javaPrimitiveType) + ).invoke(powerManager, SystemClock.uptimeMillis()) + } catch (e: IllegalAccessException) { + e.printStackTrace() + } catch (e: InvocationTargetException) { + e.printStackTrace() + } catch (e: NoSuchMethodException) { + e.printStackTrace() + } + } +} + class SleepMethodRoot(context: Context) : SleepGestureHandler.SleepMethod(context) { private val rootHelperManager = RootHelperManager.INSTANCE.get(context)