Skip to content

Commit

Permalink
refactor: add PowerStateReceiver
Browse files Browse the repository at this point in the history
  • Loading branch information
timschneeb committed Oct 22, 2023
1 parent 9169874 commit 7271262
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 36 deletions.
10 changes: 10 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,16 @@
</intent-filter>
</receiver>

<receiver
android:name=".receiver.PowerStateReceiver"
android:enabled="true"
android:exported="true"
tools:ignore="ExportedReceiver">
<intent-filter>
<action android:name="me.timschneeberger.rootlessjamesdsp.SET_POWER_STATE" />
</intent-filter>
</receiver>

<!-- Providers -->
<provider
android:name="rikka.shizuku.ShizukuProvider"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package me.timschneeberger.rootlessjamesdsp.receiver

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import me.timschneeberger.rootlessjamesdsp.utils.EngineUtils.toggleEnginePower
import timber.log.Timber

class PowerStateReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
intent ?: return
context ?: return

Timber.d("Received power state broadcast")

context.toggleEnginePower(intent.getBooleanExtra(EXTRA_ENABLED, false))
}

companion object {
const val EXTRA_ENABLED = "rootlessjamesdsp.enabled"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,17 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.SharedPreferences
import android.os.Build
import android.service.quicksettings.Tile
import android.service.quicksettings.TileService
import me.timschneeberger.rootlessjamesdsp.BuildConfig
import me.timschneeberger.rootlessjamesdsp.MainApplication
import me.timschneeberger.rootlessjamesdsp.R
import me.timschneeberger.rootlessjamesdsp.activity.EngineLauncherActivity
import me.timschneeberger.rootlessjamesdsp.utils.Constants
import me.timschneeberger.rootlessjamesdsp.utils.EngineUtils.toggleEnginePower
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.registerLocalReceiver
import me.timschneeberger.rootlessjamesdsp.utils.extensions.ContextExtensions.unregisterLocalReceiver
import me.timschneeberger.rootlessjamesdsp.utils.extensions.PermissionExtensions.hasProjectMediaAppOp
import me.timschneeberger.rootlessjamesdsp.utils.isRoot
import me.timschneeberger.rootlessjamesdsp.utils.isRootless
import me.timschneeberger.rootlessjamesdsp.utils.preferences.Preferences
import me.timschneeberger.rootlessjamesdsp.utils.sdkAbove
import org.koin.android.ext.android.inject
import org.koin.core.component.KoinComponent

Expand Down Expand Up @@ -78,43 +74,17 @@ class QuickTileService : TileService(),
}
}

private fun launchService() {
Intent(this, EngineLauncherActivity::class.java)
.apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
}
.also {
// If projection permission request needs to be shown, collapse status bar
if(isRootless() && app.mediaProjectionStartIntent == null && !hasProjectMediaAppOp())
startActivityAndCollapse(it)
else
startActivity(it)
}
}


// Called when the user taps on your tile in an active or inactive state.
override fun onClick() {
super.onClick()

val toggled = qsTile?.let { it.state != Tile.STATE_ACTIVE } ?: return

// Root/plugin
if(!isRootless()) {
if(isRoot() && BaseAudioProcessorService.activeServices <= 0) {
launchService()
}
preferences.set(R.string.key_powered_on, toggled)
return
}

sdkAbove(Build.VERSION_CODES.Q) {
// Rootless
if (!toggled)
RootlessAudioProcessorService.stop(this)
toggleEnginePower(toggled) { intent ->
// If projection permission request needs to be shown, collapse status bar
if (isRootless() && app.mediaProjectionStartIntent == null && !hasProjectMediaAppOp())
startActivityAndCollapse(intent)
else
launchService()
startActivity(intent)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package me.timschneeberger.rootlessjamesdsp.utils

import android.content.Context
import android.content.Intent
import android.os.Build
import me.timschneeberger.rootlessjamesdsp.R
import me.timschneeberger.rootlessjamesdsp.activity.EngineLauncherActivity
import me.timschneeberger.rootlessjamesdsp.service.BaseAudioProcessorService
import me.timschneeberger.rootlessjamesdsp.service.RootlessAudioProcessorService
import me.timschneeberger.rootlessjamesdsp.utils.preferences.Preferences
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

object EngineUtils : KoinComponent {
private val preferences: Preferences.App by inject()

private fun Context.launchService(activityStarter: (Intent) -> Unit) {
Intent(this, EngineLauncherActivity::class.java)
.apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
}
.also(activityStarter)
}

fun Context.toggleEnginePower(isOn: Boolean, activityStarter: (Intent) -> Unit = { startActivity(it) }) {
// Root/plugin
if(!isRootless()) {
if(isRoot() && BaseAudioProcessorService.activeServices <= 0) {
launchService(activityStarter)
}
preferences.set(R.string.key_powered_on, isOn)
return
}

sdkAbove(Build.VERSION_CODES.Q) {
// Rootless
if (!isOn)
RootlessAudioProcessorService.stop(this)
else
launchService(activityStarter)
}
}
}

0 comments on commit 7271262

Please sign in to comment.