Skip to content

Commit 00f470a

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents cf9f0a8 + 868b22e commit 00f470a

15 files changed

+152
-174
lines changed

app/src/androidTest/java/com/jmstudios/redmoon/ApplicationTest.kt

-8
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,3 @@
1414
** SOFTWARE.
1515
*/
1616
package com.jmstudios.redmoon
17-
18-
import android.app.Application
19-
import android.test.ApplicationTestCase
20-
21-
/**
22-
* [Testing Fundamentals](http://d.android.com/tools/testing/testing_android.html)
23-
*/
24-
class ApplicationTest : ApplicationTestCase<Application>(Application::class.java)

app/src/main/AndroidManifest.xml

+13
Original file line numberDiff line numberDiff line change
@@ -153,5 +153,18 @@
153153
<action android:name="android.service.quicksettings.action.QS_TILE" />
154154
</intent-filter>
155155
</service>
156+
157+
<service
158+
android:name=".service.AccessibilityFilterService"
159+
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
160+
android:label="@string/overlay_accessibility_service_label"
161+
android:exported="true">
162+
<intent-filter>
163+
<action android:name="android.accessibilityservice.AccessibilityService" />
164+
</intent-filter>
165+
<meta-data android:name="android.accessibilityservice"
166+
android:resource="@xml/accessibility_service_config" />
167+
168+
</service>
156169
</application>
157170
</manifest>

app/src/main/java/com/jmstudios/redmoon/Command.kt

-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ enum class Command(val time: Float) {
105105

106106
fun getCommand(intent: Intent): Command {
107107
val commandName = intent.getStringExtra(EXTRA_COMMAND) ?: ""
108-
Log.i("Recieved flag: $commandName")
109108
return valueOf(commandName)
110109
}
111110

app/src/main/java/com/jmstudios/redmoon/CommandAnimatorListener.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@
2525
package com.jmstudios.redmoon
2626

2727
import android.animation.Animator
28+
import android.app.Service
29+
import com.jmstudios.redmoon.service.AccessibilityFilterService
2830
import com.jmstudios.redmoon.service.FilterService
2931

3032
class CommandAnimatorListener(
31-
private val cmd: Command,
32-
private val svc: FilterService)
33+
private val cmd: Command,
34+
private val svc: FilterService,
35+
)
3336
: Animator.AnimatorListener {
3437

3538
override fun onAnimationStart (a: Animator?) = cmd.onAnimationStart (svc)

app/src/main/java/com/jmstudios/redmoon/EventBus.kt

+2
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,6 @@ class overlayPermissionDenied : Event
3838
class locationAccessDenied : Event
3939
class changeBrightnessDenied : Event
4040

41+
class accessibilityServiceCommand(val command: Command) : Event
42+
4143
data class locationService(val isSearching: Boolean, val isRunning: Boolean = true) : Event

app/src/main/java/com/jmstudios/redmoon/Overlay.kt

+37-15
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@
2525
package com.jmstudios.redmoon
2626

2727
import android.content.Context
28+
import android.content.res.Resources
2829
import android.graphics.Canvas
30+
import android.graphics.PixelFormat
31+
import android.os.Build
2932
import android.view.View
33+
import android.view.WindowInsets
3034
import android.view.WindowManager
3135

3236
import com.jmstudios.redmoon.helper.Logger
3337
import com.jmstudios.redmoon.manager.BrightnessManager
34-
import com.jmstudios.redmoon.manager.ScreenManager
3538
import com.jmstudios.redmoon.receiver.OrientationChangeReceiver
3639

3740
import kotlin.properties.Delegates
@@ -42,7 +45,6 @@ class Overlay(context: Context) : View(context), Filter,
4245
OrientationChangeReceiver.OnOrientationChangeListener {
4346

4447
private val mWindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
45-
private val mScreenManager = ScreenManager(context, mWindowManager)
4648
private val mOrientationReceiver = OrientationChangeReceiver(context, this)
4749
private val mBrightnessManager = BrightnessManager(context)
4850

@@ -71,7 +73,6 @@ class Overlay(context: Context) : View(context), Filter,
7173
}
7274

7375
private fun show() {
74-
updateLayoutParams()
7576
mWindowManager.addView(this, mLayoutParams)
7677
mBrightnessManager.brightnessLowered = profile.lowerBrightness
7778
mOrientationReceiver.register()
@@ -93,26 +94,47 @@ class Overlay(context: Context) : View(context), Filter,
9394
mBrightnessManager.brightnessLowered = profile.lowerBrightness
9495
}
9596

96-
private var mLayoutParams = mScreenManager.layoutParams
97-
get() = field.apply {
98-
buttonBrightness = Config.buttonBacklightLevel
99-
type = if (atLeastAPI(26)) {
100-
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
101-
} else {
102-
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
103-
}
97+
val mLayoutParams = WindowManager.LayoutParams().apply {
98+
buttonBrightness = Config.buttonBacklightLevel
99+
// TODO: why is cutout always null?
100+
// if(atLeastAPI(Build.VERSION_CODES.P)) {
101+
// val cutout = WindowInsets.Builder().build().displayCutout
102+
// val top = cutout?.boundingRectTop?.height() ?: 0
103+
// val bottom = cutout?.boundingRectBottom?.height() ?: 0
104+
// val left = cutout?.boundingRectLeft?.width() ?: 0
105+
// val right = cutout?.boundingRectRight?.width() ?: 0
106+
// height = Resources.getSystem().displayMetrics.heightPixels + top + bottom
107+
// width = Resources.getSystem().displayMetrics.widthPixels + left + right
108+
// x = -left
109+
// y = -top
110+
// } else {
111+
height = Resources.getSystem().displayMetrics.heightPixels + 4000
112+
width = Resources.getSystem().displayMetrics.widthPixels + 4000
113+
x = -1000
114+
y = -1000
115+
// }
116+
format = PixelFormat.TRANSLUCENT
117+
type = if (isAccessibilityServiceOn(context) && atLeastAPI(Build.VERSION_CODES.M)) {
118+
WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
119+
} else if (atLeastAPI(Build.VERSION_CODES.O)) {
120+
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
121+
} else {
122+
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
123+
}
124+
flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
125+
.or(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
126+
.or(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
127+
.or(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
128+
if (atLeastAPI(Build.VERSION_CODES.P)) {
129+
layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
104130
}
105-
106-
private fun updateLayoutParams() {
107-
mLayoutParams = mScreenManager.layoutParams
108131
}
109132

110133
private fun reLayout() = mWindowManager.updateViewLayout(this, mLayoutParams)
111134

112135
override fun onDraw(canvas: Canvas) = canvas.drawColor(profile.filterColor)
113136

114137
override fun onOrientationChanged() {
115-
updateLayoutParams()
116138
reLayout()
117139
}
118140

app/src/main/java/com/jmstudios/redmoon/Util.kt

+7
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
*/
2525
package com.jmstudios.redmoon
2626

27+
import android.content.Context
2728
import android.content.Intent
29+
import android.provider.Settings
2830
import androidx.preference.Preference
2931
import androidx.core.content.ContextCompat
3032
import androidx.preference.PreferenceFragmentCompat
@@ -60,6 +62,11 @@ var filterIsOn: Boolean = false
6062
Config.filterIsOn = value
6163
}
6264

65+
fun isAccessibilityServiceOn(context: Context?): Boolean {
66+
val prefString = Settings.Secure.getString(context?.contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES)
67+
return prefString != null && prefString.contains("com.jmstudios.redmoon.service.AccessibilityFilterService")
68+
}
69+
6370
fun inActivePeriod(Log: KLog? = null): Boolean {
6471
val now = Calendar.getInstance()
6572

app/src/main/java/com/jmstudios/redmoon/fragment/SettingsFragment.kt

+11-13
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
*/
66
package com.jmstudios.redmoon.fragment
77

8+
import android.content.Intent
89
import android.os.Bundle
10+
import android.provider.Settings
911
import android.view.ViewGroup
1012
import android.widget.TextView
1113
import android.widget.Toast
@@ -14,23 +16,11 @@ import androidx.preference.Preference
1416
import androidx.preference.PreferenceFragmentCompat
1517
import androidx.preference.SwitchPreference
1618
import com.google.android.material.snackbar.Snackbar
17-
import com.jmstudios.redmoon.Command
19+
import com.jmstudios.redmoon.*
1820

19-
import com.jmstudios.redmoon.Config
20-
import com.jmstudios.redmoon.EventBus
21-
import com.jmstudios.redmoon.filterIsOn
22-
import com.jmstudios.redmoon.getColor
2321
import com.jmstudios.redmoon.helper.Logger
2422
import com.jmstudios.redmoon.helper.Permission
25-
import com.jmstudios.redmoon.inActivePeriod
26-
import com.jmstudios.redmoon.locationAccessDenied
27-
import com.jmstudios.redmoon.locationChanged
28-
import com.jmstudios.redmoon.locationService
29-
import com.jmstudios.redmoon.pref
30-
import com.jmstudios.redmoon.R
31-
import com.jmstudios.redmoon.scheduleChanged
3223
import com.jmstudios.redmoon.service.LocationUpdateService
33-
import com.jmstudios.redmoon.useLocationChanged
3424

3525
import com.topjohnwu.superuser.Shell
3626
import org.greenrobot.eventbus.Subscribe
@@ -57,6 +47,9 @@ class SettingsFragment : PreferenceFragmentCompat() {
5747
private val rootPref: SwitchPreference
5848
get() = pref(R.string.pref_key_use_root) as SwitchPreference
5949

50+
private val accessibilityServicePref: Preference
51+
get() = pref(R.string.pref_key_use_accessibility_service) as Preference
52+
6053
private var mSnackbar: Snackbar? = null
6154

6255
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@@ -121,6 +114,11 @@ class SettingsFragment : PreferenceFragmentCompat() {
121114
return@setOnPreferenceChangeListener true
122115
}
123116

117+
accessibilityServicePref.setOnPreferenceClickListener { _ ->
118+
startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS))
119+
return@setOnPreferenceClickListener true
120+
}
121+
124122
updatePrefs()
125123
}
126124

app/src/main/java/com/jmstudios/redmoon/manager/ScreenManager.kt

-119
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.jmstudios.redmoon.service
2+
3+
import android.accessibilityservice.AccessibilityService
4+
import android.animation.ValueAnimator
5+
import android.graphics.PixelFormat
6+
import android.view.View
7+
import android.view.ViewGroup
8+
import android.view.WindowManager
9+
import android.view.accessibility.AccessibilityEvent
10+
import com.jmstudios.redmoon.*
11+
import com.jmstudios.redmoon.helper.Logger
12+
import org.greenrobot.eventbus.Subscribe
13+
14+
15+
class AccessibilityFilterService : AccessibilityService() {
16+
lateinit var mFilter: Overlay
17+
18+
override fun onAccessibilityEvent(event: AccessibilityEvent) {}
19+
override fun onInterrupt() {}
20+
21+
override fun onServiceConnected() {
22+
mFilter = Overlay(applicationContext)
23+
(getSystemService(WINDOW_SERVICE) as WindowManager).addView(mFilter, mFilter.mLayoutParams)
24+
mFilter.visibility = View.GONE;
25+
EventBus.register(this)
26+
}
27+
28+
override fun onDestroy() {
29+
EventBus.unregister(this);
30+
(getSystemService(WINDOW_SERVICE) as WindowManager).removeView(mFilter)
31+
super.onDestroy()
32+
}
33+
34+
@Subscribe
35+
fun turnOnOrOff(cmd: accessibilityServiceCommand) {
36+
mFilter.setBackgroundColor(activeProfile.filterColor)
37+
mFilter.visibility = if (cmd.command.turnOn) View.VISIBLE else View.GONE
38+
}
39+
}

0 commit comments

Comments
 (0)