Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a557c59 authored by Steve Elliott's avatar Steve Elliott
Browse files

New toggle for peoplehub in settings

Bug: 146150828
Test: manual, atest
Change-Id: Icbcb9e67cb33823136e2b88a0fcd5394af2a49db
parent c261dd4f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -8409,6 +8409,12 @@ public final class Settings {
         */
        public static final String TAP_GESTURE = "tap_gesture";
        /**
         * Controls whether the people strip is enabled.
         * @hide
         */
        public static final String PEOPLE_STRIP = "people_strip";
        /**
         * Keys we no longer back up under the current schema, but want to continue to
         * process when restoring historical backup datasets.
+2 −1
Original line number Diff line number Diff line
@@ -155,6 +155,7 @@ public class SecureSettings {
        Settings.Secure.GLOBAL_ACTIONS_PANEL_ENABLED,
        Settings.Secure.AWARE_LOCK_ENABLED,
        Settings.Secure.AWARE_TAP_PAUSE_GESTURE_COUNT,
        Settings.Secure.AWARE_TAP_PAUSE_TOUCH_COUNT
        Settings.Secure.AWARE_TAP_PAUSE_TOUCH_COUNT,
        Settings.Secure.PEOPLE_STRIP,
    };
}
+1 −0
Original line number Diff line number Diff line
@@ -234,5 +234,6 @@ public class SecureSettingsValidators {
        VALIDATORS.put(Secure.AWARE_LOCK_ENABLED, BOOLEAN_VALIDATOR);
        VALIDATORS.put(Secure.DISPLAY_DENSITY_FORCED, NON_NEGATIVE_INTEGER_VALIDATOR);
        VALIDATORS.put(Secure.TAP_GESTURE, BOOLEAN_VALIDATOR);
        VALIDATORS.put(Secure.PEOPLE_STRIP, BOOLEAN_VALIDATOR);
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -30,6 +30,11 @@ abstract class PeopleHubModule {
    @Binds
    abstract fun peopleHubDataSource(impl: PeopleHubDataSourceImpl): DataSource<PeopleHubModel>

    @Binds
    abstract fun peopleHubSettingChangeDataSource(
        impl: PeopleHubSettingChangeDataSourceImpl
    ): DataSource<Boolean>

    @Binds
    abstract fun peopleHubViewModelFactoryDataSource(
        impl: PeopleHubViewModelFactoryDataSourceImpl
+84 −13
Original line number Diff line number Diff line
@@ -16,7 +16,14 @@

package com.android.systemui.statusbar.notification.people

import android.content.Context
import android.database.ContentObserver
import android.net.Uri
import android.os.Handler
import android.os.UserHandle
import android.provider.Settings
import android.view.View
import com.android.systemui.dagger.qualifiers.MainHandler
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager
import javax.inject.Inject
@@ -90,29 +97,58 @@ private class PeopleHubDataListenerImpl(
@Singleton
class PeopleHubViewModelFactoryDataSourceImpl @Inject constructor(
    private val activityStarter: ActivityStarter,
    private val dataSource: DataSource<@JvmSuppressWildcards PeopleHubModel>
    private val dataSource: DataSource<@JvmSuppressWildcards PeopleHubModel>,
    private val settingChangeSource: DataSource<@JvmSuppressWildcards Boolean>
) : DataSource<PeopleHubViewModelFactory> {

    override fun registerListener(listener: DataListener<PeopleHubViewModelFactory>) =
            dataSource.registerListener(PeopleHubModelListenerImpl(activityStarter, listener))
    override fun registerListener(listener: DataListener<PeopleHubViewModelFactory>): Subscription {
        var stripEnabled = false
        var model: PeopleHubModel? = null

        fun updateListener() {
            // don't invoke listener until we've received our first model
            model?.let { model ->
                val factory =
                        if (stripEnabled) PeopleHubViewModelFactoryImpl(model, activityStarter)
                        else EmptyViewModelFactory
                listener.onDataChanged(factory)
            }
        }

private class PeopleHubModelListenerImpl(
    private val activityStarter: ActivityStarter,
    private val dataListener: DataListener<PeopleHubViewModelFactory>
) : DataListener<PeopleHubModel> {
        val settingSub = settingChangeSource.registerListener(object : DataListener<Boolean> {
            override fun onDataChanged(data: Boolean) {
                stripEnabled = data
                updateListener()
            }
        })
        val dataSub = dataSource.registerListener(object : DataListener<PeopleHubModel> {
            override fun onDataChanged(data: PeopleHubModel) {
                model = data
                updateListener()
            }
        })
        return object : Subscription {
            override fun unsubscribe() {
                settingSub.unsubscribe()
                dataSub.unsubscribe()
            }
        }
    }
}

    override fun onDataChanged(data: PeopleHubModel) =
            dataListener.onDataChanged(PeopleHubViewModelFactoryImpl(data, activityStarter))
private object EmptyViewModelFactory : PeopleHubViewModelFactory {
    override fun createWithAssociatedClickView(view: View): PeopleHubViewModel {
        return PeopleHubViewModel(emptySequence(), false)
    }
}

private class PeopleHubViewModelFactoryImpl(
    private val data: PeopleHubModel,
    private val model: PeopleHubModel,
    private val activityStarter: ActivityStarter
) : PeopleHubViewModelFactory {

    override fun createWithAssociatedClickView(view: View): PeopleHubViewModel {
        val personViewModels = data.people.asSequence().map { personModel ->
        val personViewModels = model.people.asSequence().map { personModel ->
            val onClick = {
                activityStarter.startPendingIntentDismissingKeyguard(
                        personModel.clickIntent,
@@ -122,7 +158,42 @@ private class PeopleHubViewModelFactoryImpl(
            }
            PersonViewModel(personModel.name, personModel.avatar, onClick)
        }
        return PeopleHubViewModel(personViewModels, data.people.isNotEmpty())
        return PeopleHubViewModel(personViewModels, model.people.isNotEmpty())
    }
}

@Singleton
class PeopleHubSettingChangeDataSourceImpl @Inject constructor(
    @MainHandler private val handler: Handler,
    context: Context
) : DataSource<Boolean> {

    private val settingUri = Settings.Secure.getUriFor(Settings.Secure.PEOPLE_STRIP)
    private val contentResolver = context.contentResolver

    override fun registerListener(listener: DataListener<Boolean>): Subscription {
        // Immediately report current value of setting
        updateListener(listener)
        val observer = object : ContentObserver(handler) {
            override fun onChange(selfChange: Boolean, uri: Uri?, userId: Int) {
                super.onChange(selfChange, uri, userId)
                updateListener(listener)
            }
        }
        contentResolver.registerContentObserver(settingUri, false, observer, UserHandle.USER_ALL)
        return object : Subscription {
            override fun unsubscribe() = contentResolver.unregisterContentObserver(observer)
        }
    }

    private fun updateListener(listener: DataListener<Boolean>) {
        val setting = Settings.Secure.getIntForUser(
                contentResolver,
                Settings.Secure.PEOPLE_STRIP,
                0,
                UserHandle.USER_CURRENT
        )
        listener.onDataChanged(setting != 0)
    }
}

Loading