Move HapticSettingObserver to companion object.
MagnetizedObject used to register setting observer for each instance, but it's never unregistered. MagnetizedObject doesn't have explicit lifecycle calls, so there isn't a good place to unregister the observer. Without unregistration MagnetizedObject will always be referenced by a JNI global reference so that it can be called when the remote calls it. It's not necessary to have an observer per instance, so let's do it in the companion object instead then we don't need to worry about unregistering it because it's long standing. Bug: 149918957 Test: MagnetizedObject isn't referenced by any JNI global references. Test: Device still vibrates when bubble stack is attracted by the removal place when settings is on, and doesn't vibrate when settings is off. Change-Id: Ie9719baa3ff76bd08180b9ab32662eb1ca43de3a
This commit is contained in:
@@ -245,9 +245,6 @@ abstract class MagnetizedObject<T : Any>(
|
||||
*/
|
||||
var hapticsEnabled = true
|
||||
|
||||
/** Whether the HAPTIC_FEEDBACK_ENABLED setting is true. */
|
||||
private var systemHapticsEnabled = false
|
||||
|
||||
/** Default spring configuration to use for animating the object into a target. */
|
||||
var springConfig = PhysicsAnimator.SpringConfig(
|
||||
SpringForce.STIFFNESS_MEDIUM, SpringForce.DAMPING_RATIO_NO_BOUNCY)
|
||||
@@ -259,24 +256,7 @@ abstract class MagnetizedObject<T : Any>(
|
||||
var flungIntoTargetSpringConfig = springConfig
|
||||
|
||||
init {
|
||||
val hapticSettingObserver =
|
||||
object : ContentObserver(Handler.getMain()) {
|
||||
override fun onChange(selfChange: Boolean) {
|
||||
systemHapticsEnabled =
|
||||
Settings.System.getIntForUser(
|
||||
context.contentResolver,
|
||||
Settings.System.HAPTIC_FEEDBACK_ENABLED,
|
||||
0,
|
||||
UserHandle.USER_CURRENT) != 0
|
||||
}
|
||||
}
|
||||
|
||||
context.contentResolver.registerContentObserver(
|
||||
Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_ENABLED),
|
||||
true /* notifyForDescendants */, hapticSettingObserver)
|
||||
|
||||
// Trigger the observer once to initialize systemHapticsEnabled.
|
||||
hapticSettingObserver.onChange(false /* selfChange */)
|
||||
initHapticSettingObserver(context)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -622,6 +602,43 @@ abstract class MagnetizedObject<T : Any>(
|
||||
|
||||
companion object {
|
||||
|
||||
/**
|
||||
* Whether the HAPTIC_FEEDBACK_ENABLED setting is true.
|
||||
*
|
||||
* We put it in the companion object because we need to register a settings observer and
|
||||
* [MagnetizedObject] doesn't have an obvious lifecycle so we don't have a good time to
|
||||
* remove that observer. Since this settings is shared among all instances we just let all
|
||||
* instances read from this value.
|
||||
*/
|
||||
private var systemHapticsEnabled = false
|
||||
private var hapticSettingObserverInitialized = false
|
||||
|
||||
private fun initHapticSettingObserver(context: Context) {
|
||||
if (hapticSettingObserverInitialized) {
|
||||
return
|
||||
}
|
||||
|
||||
val hapticSettingObserver =
|
||||
object : ContentObserver(Handler.getMain()) {
|
||||
override fun onChange(selfChange: Boolean) {
|
||||
systemHapticsEnabled =
|
||||
Settings.System.getIntForUser(
|
||||
context.contentResolver,
|
||||
Settings.System.HAPTIC_FEEDBACK_ENABLED,
|
||||
0,
|
||||
UserHandle.USER_CURRENT) != 0
|
||||
}
|
||||
}
|
||||
|
||||
context.contentResolver.registerContentObserver(
|
||||
Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_ENABLED),
|
||||
true /* notifyForDescendants */, hapticSettingObserver)
|
||||
|
||||
// Trigger the observer once to initialize systemHapticsEnabled.
|
||||
hapticSettingObserver.onChange(false /* selfChange */)
|
||||
hapticSettingObserverInitialized = true
|
||||
}
|
||||
|
||||
/**
|
||||
* Magnetizes the given view. Magnetized views are attracted to one or more magnetic
|
||||
* targets. Magnetic targets attract objects that are dragged near them, and hold them there
|
||||
|
||||
Reference in New Issue
Block a user