mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-03-24 23:09:02 +03:00
Rageshake: settings for sensitivity
This commit is contained in:
parent
5a24f78c05
commit
5c26f66523
7 changed files with 158 additions and 98 deletions
vector/src/main
java/im/vector/riotx
core/platform
features
res
|
@ -54,6 +54,7 @@ import im.vector.riotx.features.rageshake.BugReportActivity
|
||||||
import im.vector.riotx.features.rageshake.BugReporter
|
import im.vector.riotx.features.rageshake.BugReporter
|
||||||
import im.vector.riotx.features.rageshake.RageShake
|
import im.vector.riotx.features.rageshake.RageShake
|
||||||
import im.vector.riotx.features.session.SessionListener
|
import im.vector.riotx.features.session.SessionListener
|
||||||
|
import im.vector.riotx.features.settings.VectorPreferences
|
||||||
import im.vector.riotx.features.themes.ActivityOtherThemes
|
import im.vector.riotx.features.themes.ActivityOtherThemes
|
||||||
import im.vector.riotx.features.themes.ThemeUtils
|
import im.vector.riotx.features.themes.ThemeUtils
|
||||||
import im.vector.riotx.receivers.DebugReceiver
|
import im.vector.riotx.receivers.DebugReceiver
|
||||||
|
@ -88,9 +89,11 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector {
|
||||||
private lateinit var configurationViewModel: ConfigurationViewModel
|
private lateinit var configurationViewModel: ConfigurationViewModel
|
||||||
private lateinit var sessionListener: SessionListener
|
private lateinit var sessionListener: SessionListener
|
||||||
protected lateinit var bugReporter: BugReporter
|
protected lateinit var bugReporter: BugReporter
|
||||||
private lateinit var rageShake: RageShake
|
lateinit var rageShake: RageShake
|
||||||
|
private set
|
||||||
protected lateinit var navigator: Navigator
|
protected lateinit var navigator: Navigator
|
||||||
private lateinit var activeSessionHolder: ActiveSessionHolder
|
private lateinit var activeSessionHolder: ActiveSessionHolder
|
||||||
|
private lateinit var vectorPreferences: VectorPreferences
|
||||||
|
|
||||||
// Filter for multiple invalid token error
|
// Filter for multiple invalid token error
|
||||||
private var mainActivityStarted = false
|
private var mainActivityStarted = false
|
||||||
|
@ -135,7 +138,8 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
screenComponent = DaggerScreenComponent.factory().create(getVectorComponent(), this)
|
val vectorComponent = getVectorComponent()
|
||||||
|
screenComponent = DaggerScreenComponent.factory().create(vectorComponent, this)
|
||||||
val timeForInjection = measureTimeMillis {
|
val timeForInjection = measureTimeMillis {
|
||||||
injectWith(screenComponent)
|
injectWith(screenComponent)
|
||||||
}
|
}
|
||||||
|
@ -150,6 +154,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector {
|
||||||
rageShake = screenComponent.rageShake()
|
rageShake = screenComponent.rageShake()
|
||||||
navigator = screenComponent.navigator()
|
navigator = screenComponent.navigator()
|
||||||
activeSessionHolder = screenComponent.activeSessionHolder()
|
activeSessionHolder = screenComponent.activeSessionHolder()
|
||||||
|
vectorPreferences = vectorComponent.vectorPreferences()
|
||||||
configurationViewModel.activityRestarter.observe(this, Observer {
|
configurationViewModel.activityRestarter.observe(this, Observer {
|
||||||
if (!it.hasBeenHandled) {
|
if (!it.hasBeenHandled) {
|
||||||
// Recreate the Activity because configuration has changed
|
// Recreate the Activity because configuration has changed
|
||||||
|
@ -226,7 +231,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector {
|
||||||
|
|
||||||
configurationViewModel.onActivityResumed()
|
configurationViewModel.onActivityResumed()
|
||||||
|
|
||||||
if (this !is BugReportActivity) {
|
if (this !is BugReportActivity && vectorPreferences.useRageshake()) {
|
||||||
rageShake.start()
|
rageShake.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,33 +19,28 @@ package im.vector.riotx.features.rageshake
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.hardware.Sensor
|
import android.hardware.Sensor
|
||||||
import android.hardware.SensorManager
|
import android.hardware.SensorManager
|
||||||
import android.preference.PreferenceManager
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.content.edit
|
|
||||||
import com.squareup.seismic.ShakeDetector
|
import com.squareup.seismic.ShakeDetector
|
||||||
import im.vector.riotx.R
|
import im.vector.riotx.R
|
||||||
|
import im.vector.riotx.features.settings.VectorPreferences
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class RageShake @Inject constructor(private val activity: AppCompatActivity,
|
class RageShake @Inject constructor(private val activity: AppCompatActivity,
|
||||||
private val bugReporter: BugReporter) : ShakeDetector.Listener {
|
private val bugReporter: BugReporter,
|
||||||
|
private val vectorPreferences: VectorPreferences) : ShakeDetector.Listener {
|
||||||
|
|
||||||
private var shakeDetector: ShakeDetector? = null
|
private var shakeDetector: ShakeDetector? = null
|
||||||
|
|
||||||
private var dialogDisplayed = false
|
private var dialogDisplayed = false
|
||||||
|
|
||||||
|
var interceptor: (() -> Unit)? = null
|
||||||
|
|
||||||
fun start() {
|
fun start() {
|
||||||
if (!isEnable(activity)) {
|
val sensorManager = activity.getSystemService(AppCompatActivity.SENSOR_SERVICE) as? SensorManager ?: return
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val sensorManager = activity.getSystemService(AppCompatActivity.SENSOR_SERVICE) as? SensorManager
|
|
||||||
|
|
||||||
if (sensorManager == null) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
shakeDetector = ShakeDetector(this).apply {
|
shakeDetector = ShakeDetector(this).apply {
|
||||||
|
setSensitivity(vectorPreferences.getRageshakeSensitivity())
|
||||||
start(sensorManager)
|
start(sensorManager)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,29 +49,15 @@ class RageShake @Inject constructor(private val activity: AppCompatActivity,
|
||||||
shakeDetector?.stop()
|
shakeDetector?.stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
fun setSensitivity(sensitivity: Int) {
|
||||||
* Enable the feature, and start it
|
shakeDetector?.setSensitivity(sensitivity)
|
||||||
*/
|
|
||||||
fun enable() {
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(activity).edit {
|
|
||||||
putBoolean(SETTINGS_USE_RAGE_SHAKE_KEY, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
start()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable the feature, and stop it
|
|
||||||
*/
|
|
||||||
fun disable() {
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(activity).edit {
|
|
||||||
putBoolean(SETTINGS_USE_RAGE_SHAKE_KEY, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
stop()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun hearShake() {
|
override fun hearShake() {
|
||||||
|
val i = interceptor
|
||||||
|
if (i != null) {
|
||||||
|
i.invoke()
|
||||||
|
} else {
|
||||||
if (dialogDisplayed) {
|
if (dialogDisplayed) {
|
||||||
// Filtered!
|
// Filtered!
|
||||||
return
|
return
|
||||||
|
@ -87,19 +68,22 @@ class RageShake @Inject constructor(private val activity: AppCompatActivity,
|
||||||
AlertDialog.Builder(activity)
|
AlertDialog.Builder(activity)
|
||||||
.setMessage(R.string.send_bug_report_alert_message)
|
.setMessage(R.string.send_bug_report_alert_message)
|
||||||
.setPositiveButton(R.string.yes) { _, _ -> openBugReportScreen() }
|
.setPositiveButton(R.string.yes) { _, _ -> openBugReportScreen() }
|
||||||
.setNeutralButton(R.string.disable) { _, _ -> disable() }
|
.setNeutralButton(R.string.settings) { _, _ -> openSettings() }
|
||||||
.setOnDismissListener { dialogDisplayed = false }
|
.setOnDismissListener { dialogDisplayed = false }
|
||||||
.setNegativeButton(R.string.no, null)
|
.setNegativeButton(R.string.no, null)
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun openBugReportScreen() {
|
private fun openBugReportScreen() {
|
||||||
bugReporter.openBugReportScreen(activity)
|
bugReporter.openBugReportScreen(activity)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
private fun openSettings() {
|
||||||
private const val SETTINGS_USE_RAGE_SHAKE_KEY = "SETTINGS_USE_RAGE_SHAKE_KEY"
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
/**
|
/**
|
||||||
* Check if the feature is available
|
* Check if the feature is available
|
||||||
*/
|
*/
|
||||||
|
@ -107,12 +91,5 @@ class RageShake @Inject constructor(private val activity: AppCompatActivity,
|
||||||
return (context.getSystemService(AppCompatActivity.SENSOR_SERVICE) as? SensorManager)
|
return (context.getSystemService(AppCompatActivity.SENSOR_SERVICE) as? SensorManager)
|
||||||
?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null
|
?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the feature is enable (enabled by default)
|
|
||||||
*/
|
|
||||||
private fun isEnable(context: Context): Boolean {
|
|
||||||
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SETTINGS_USE_RAGE_SHAKE_KEY, true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import android.net.Uri
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
|
import com.squareup.seismic.ShakeDetector
|
||||||
import im.vector.riotx.R
|
import im.vector.riotx.R
|
||||||
import im.vector.riotx.features.homeserver.ServerUrlsRepository
|
import im.vector.riotx.features.homeserver.ServerUrlsRepository
|
||||||
import im.vector.riotx.features.themes.ThemeUtils
|
import im.vector.riotx.features.themes.ThemeUtils
|
||||||
|
@ -153,7 +154,10 @@ class VectorPreferences @Inject constructor(private val context: Context) {
|
||||||
|
|
||||||
// analytics
|
// analytics
|
||||||
const val SETTINGS_USE_ANALYTICS_KEY = "SETTINGS_USE_ANALYTICS_KEY"
|
const val SETTINGS_USE_ANALYTICS_KEY = "SETTINGS_USE_ANALYTICS_KEY"
|
||||||
|
|
||||||
|
// Rageshake
|
||||||
const val SETTINGS_USE_RAGE_SHAKE_KEY = "SETTINGS_USE_RAGE_SHAKE_KEY"
|
const val SETTINGS_USE_RAGE_SHAKE_KEY = "SETTINGS_USE_RAGE_SHAKE_KEY"
|
||||||
|
const val SETTINGS_RAGE_SHAKE_DETECTION_THRESHOLD_KEY = "SETTINGS_RAGE_SHAKE_DETECTION_THRESHOLD_KEY"
|
||||||
|
|
||||||
// other
|
// other
|
||||||
const val SETTINGS_MEDIA_SAVING_PERIOD_KEY = "SETTINGS_MEDIA_SAVING_PERIOD_KEY"
|
const val SETTINGS_MEDIA_SAVING_PERIOD_KEY = "SETTINGS_MEDIA_SAVING_PERIOD_KEY"
|
||||||
|
@ -732,6 +736,13 @@ class VectorPreferences @Inject constructor(private val context: Context) {
|
||||||
return defaultPrefs.getBoolean(SETTINGS_USE_RAGE_SHAKE_KEY, true)
|
return defaultPrefs.getBoolean(SETTINGS_USE_RAGE_SHAKE_KEY, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the rage shake sensitivity.
|
||||||
|
*/
|
||||||
|
fun getRageshakeSensitivity(): Int {
|
||||||
|
return defaultPrefs.getInt(SETTINGS_RAGE_SHAKE_DETECTION_THRESHOLD_KEY, ShakeDetector.SENSITIVITY_MEDIUM)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the rage shake status.
|
* Update the rage shake status.
|
||||||
*
|
*
|
||||||
|
|
|
@ -16,14 +16,63 @@
|
||||||
|
|
||||||
package im.vector.riotx.features.settings
|
package im.vector.riotx.features.settings
|
||||||
|
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.SeekBarPreference
|
||||||
import im.vector.riotx.R
|
import im.vector.riotx.R
|
||||||
|
import im.vector.riotx.core.platform.VectorBaseActivity
|
||||||
|
import im.vector.riotx.core.preference.VectorSwitchPreference
|
||||||
|
import im.vector.riotx.features.rageshake.RageShake
|
||||||
|
|
||||||
class VectorSettingsDeveloperModeFragment : VectorSettingsBaseFragment() {
|
class VectorSettingsDeveloperModeFragment : VectorSettingsBaseFragment() {
|
||||||
|
|
||||||
override var titleRes = R.string.settings_developer_mode
|
override var titleRes = R.string.settings_developer_mode
|
||||||
override val preferenceXmlRes = R.xml.vector_settings_developer_mode
|
override val preferenceXmlRes = R.xml.vector_settings_developer_mode
|
||||||
|
|
||||||
|
private var rageshake: RageShake? = null
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
|
||||||
|
rageshake = (activity as? VectorBaseActivity)?.rageShake
|
||||||
|
rageshake?.interceptor = {
|
||||||
|
(activity as? VectorBaseActivity)?.showSnackbar(getString(R.string.rageshake_detected))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
rageshake?.interceptor = null
|
||||||
|
rageshake = null
|
||||||
|
}
|
||||||
|
|
||||||
override fun bindPref() {
|
override fun bindPref() {
|
||||||
// Nothing to do
|
val isRageShakeAvailable = RageShake.isAvailable(requireContext())
|
||||||
|
|
||||||
|
if (isRageShakeAvailable) {
|
||||||
|
findPreference<VectorSwitchPreference>(VectorPreferences.SETTINGS_USE_RAGE_SHAKE_KEY)!!
|
||||||
|
.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
|
||||||
|
if (newValue as? Boolean == true) {
|
||||||
|
rageshake?.start()
|
||||||
|
} else {
|
||||||
|
rageshake?.stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
findPreference<SeekBarPreference>(VectorPreferences.SETTINGS_RAGE_SHAKE_DETECTION_THRESHOLD_KEY)!!
|
||||||
|
.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
(activity as? VectorBaseActivity)?.let {
|
||||||
|
val newValueAsInt = newValue as? Int ?: return@OnPreferenceChangeListener true
|
||||||
|
|
||||||
|
rageshake?.setSensitivity(newValueAsInt)
|
||||||
|
}
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
findPreference<VectorSwitchPreference>("SETTINGS_RAGE_SHAKE_CATEGORY_KEY")!!.isVisible = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,5 +10,9 @@
|
||||||
<string name="settings_developer_mode">Developer mode</string>
|
<string name="settings_developer_mode">Developer mode</string>
|
||||||
<string name="settings_developer_mode_summary">The developer mode activates hidden features and may also make the application less stable. For developers only!</string>
|
<string name="settings_developer_mode_summary">The developer mode activates hidden features and may also make the application less stable. For developers only!</string>
|
||||||
<string name="settings_rageshake">Rageshake</string>
|
<string name="settings_rageshake">Rageshake</string>
|
||||||
|
<string name="settings_rageshake_detection_threshold">Detection threshold</string>
|
||||||
|
<string name="settings_rageshake_detection_threshold_summary">Shake your phone to test the detection threshold</string>
|
||||||
|
<string name="rageshake_detected">Shake detected!</string>
|
||||||
|
<string name="settings">Settings</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -2,6 +2,27 @@
|
||||||
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<im.vector.riotx.core.preference.VectorPreferenceCategory
|
||||||
|
android:key="SETTINGS_RAGE_SHAKE_CATEGORY_KEY"
|
||||||
|
android:title="@string/settings_rageshake">
|
||||||
|
|
||||||
|
<im.vector.riotx.core.preference.VectorSwitchPreference
|
||||||
|
android:key="SETTINGS_USE_RAGE_SHAKE_KEY"
|
||||||
|
android:title="@string/send_bug_report_rage_shake" />
|
||||||
|
|
||||||
|
<SeekBarPreference
|
||||||
|
android:defaultValue="13"
|
||||||
|
android:dependency="SETTINGS_USE_RAGE_SHAKE_KEY"
|
||||||
|
android:key="SETTINGS_RAGE_SHAKE_DETECTION_THRESHOLD_KEY"
|
||||||
|
android:max="17"
|
||||||
|
android:summary="@string/settings_rageshake_detection_threshold_summary"
|
||||||
|
android:title="@string/settings_rageshake_detection_threshold"
|
||||||
|
app:min="9" />
|
||||||
|
|
||||||
|
</im.vector.riotx.core.preference.VectorPreferenceCategory>
|
||||||
|
|
||||||
|
<im.vector.riotx.core.preference.VectorPreferenceCategory android:title="@string/settings_developer_mode">
|
||||||
|
|
||||||
<im.vector.riotx.core.preference.VectorSwitchPreference
|
<im.vector.riotx.core.preference.VectorSwitchPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY"
|
android:key="SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY"
|
||||||
|
@ -39,4 +60,6 @@
|
||||||
|
|
||||||
</im.vector.riotx.core.preference.VectorPreferenceCategory>
|
</im.vector.riotx.core.preference.VectorPreferenceCategory>
|
||||||
|
|
||||||
|
</im.vector.riotx.core.preference.VectorPreferenceCategory>
|
||||||
|
|
||||||
</androidx.preference.PreferenceScreen>
|
</androidx.preference.PreferenceScreen>
|
|
@ -81,13 +81,4 @@
|
||||||
|
|
||||||
</im.vector.riotx.core.preference.VectorPreferenceCategory>
|
</im.vector.riotx.core.preference.VectorPreferenceCategory>
|
||||||
|
|
||||||
<im.vector.riotx.core.preference.VectorPreferenceDivider />
|
|
||||||
|
|
||||||
<im.vector.riotx.core.preference.VectorPreferenceCategory android:title="@string/settings_rageshake">
|
|
||||||
|
|
||||||
<im.vector.riotx.core.preference.VectorSwitchPreference
|
|
||||||
android:key="SETTINGS_USE_RAGE_SHAKE_KEY"
|
|
||||||
android:title="@string/send_bug_report_rage_shake" />
|
|
||||||
|
|
||||||
</im.vector.riotx.core.preference.VectorPreferenceCategory>
|
|
||||||
</androidx.preference.PreferenceScreen>
|
</androidx.preference.PreferenceScreen>
|
Loading…
Add table
Reference in a new issue