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

Commit da4a874d authored by Steve Elliott's avatar Steve Elliott Committed by Android (Google) Code Review
Browse files

Merge "New toggle for peoplehub in Notification settings"

parents 79c698f8 bcfdbf49
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -7909,6 +7909,9 @@
    <!-- Configure Notifications: Title for the notification badging option. [CHAR LIMIT=30 BACKUP_MESSAGE_ID=5125022693565388760] -->
    <string name="notification_badging_title">Allow notification dots</string>
    <!-- Configure Notifications: Title for the people notification strip option. [CHAR LIMIT=60] -->
    <string name="notification_people_strip_title">Show strip of recent conversations</string>
    <!-- Configure Notifications: Title for the notification bubbles option. [CHAR LIMIT=60] -->
    <string name="notification_bubbles_title">Bubbles</string>
    <!-- Developer setting summary for bubbles [CHAR LIMIT=NONE] -->
+5 −0
Original line number Diff line number Diff line
@@ -118,6 +118,11 @@
            android:summary="@string/summary_placeholder"
            android:ringtoneType="notification"/>

        <SwitchPreference
            android:key="notification_people_strip"
            android:title="@string/notification_people_strip_title"
            settings:controller="com.android.settings.notification.NotificationPeopleStripPreferenceController"/>

        <Preference
            android:key="gesture_swipe_down_fingerprint_notifications"
            android:title="@string/fingerprint_swipe_for_notifications_title"
+117 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.notification;


import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;

import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;

import com.google.common.annotations.VisibleForTesting;

/** Controls toggle setting for people strip in system ui. */
public class NotificationPeopleStripPreferenceController extends TogglePreferenceController
        implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener,
        LifecycleObserver, OnResume, OnPause {

    @VisibleForTesting
    static final int ON = 1;
    @VisibleForTesting
    static final int OFF = 0;

    private final Uri mPeopleStripUri =
            Settings.Secure.getUriFor(Settings.Secure.PEOPLE_STRIP);

    private Preference mPreference;
    private Runnable mUnregisterOnPropertiesChangedListener;

    public NotificationPeopleStripPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPreference = screen.findPreference("notification_people_strip");
    }

    @Override
    public void onResume() {
        if (mPreference == null) {
            return;
        }
        ContentObserver observer = new ContentObserver(new Handler(Looper.getMainLooper())) {
            @Override
            public void onChange(boolean selfChange) {
                super.onChange(selfChange);
                updateState(mPreference);
            }
        };
        ContentResolver contentResolver = mContext.getContentResolver();
        mUnregisterOnPropertiesChangedListener =
                () -> contentResolver.unregisterContentObserver(observer);
        contentResolver.registerContentObserver(mPeopleStripUri, false, observer);
    }

    @Override
    public void onPause() {
        if (mUnregisterOnPropertiesChangedListener != null) {
            mUnregisterOnPropertiesChangedListener.run();
            mUnregisterOnPropertiesChangedListener = null;
        }
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }

    @Override
    public boolean isSliceable() {
        return false;
    }

    @Override
    public boolean isChecked() {
        int value = Settings.Secure.getInt(
                mContext.getContentResolver(),
                Settings.Secure.PEOPLE_STRIP,
                OFF);
        return value != OFF;
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        return Settings.Secure.putInt(
                mContext.getContentResolver(),
                Settings.Secure.PEOPLE_STRIP,
                isChecked ? ON : OFF);
    }
}
+124 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.notification;

import static android.provider.Settings.Secure.PEOPLE_STRIP;

import static com.android.settings.notification.NotificationPeopleStripPreferenceController.OFF;
import static com.android.settings.notification.NotificationPeopleStripPreferenceController.ON;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.provider.Settings;

import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

@RunWith(RobolectricTestRunner.class)
public class NotificationPeopleStripPreferenceControllerTest {

    private static final String KEY_PEOPLE_STRIP = "notification_people_strip";

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private Context mContext;
    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private PreferenceScreen mScreen;

    private NotificationPeopleStripPreferenceController mController;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mController = new NotificationPeopleStripPreferenceController(mContext, KEY_PEOPLE_STRIP);
        Preference preference = new Preference(RuntimeEnvironment.application);
        preference.setKey(mController.getPreferenceKey());
        when(mScreen.findPreference(preference.getKey())).thenReturn(preference);
    }

    @Test
    public void updateState_preferenceSetCheckedWhenSettingIsOn() {
        final TwoStatePreference preference = mock(TwoStatePreference.class);
        final Context context = RuntimeEnvironment.application;
        Settings.Secure.putInt(context.getContentResolver(), PEOPLE_STRIP, ON);

        mController = new NotificationPeopleStripPreferenceController(context, KEY_PEOPLE_STRIP);
        mController.updateState(preference);

        verify(preference).setChecked(true);
    }

    @Test
    public void updateState_preferenceSetUncheckedWhenSettingIsOff() {
        final TwoStatePreference preference = mock(TwoStatePreference.class);
        final Context context = RuntimeEnvironment.application;
        Settings.Secure.putInt(context.getContentResolver(), PEOPLE_STRIP, OFF);

        mController = new NotificationPeopleStripPreferenceController(context, KEY_PEOPLE_STRIP);
        mController.updateState(preference);

        verify(preference).setChecked(false);
    }

    @Test
    public void isChecked_settingIsOff_shouldReturnFalse() {
        Settings.Secure.putInt(mContext.getContentResolver(), PEOPLE_STRIP, OFF);

        assertThat(mController.isChecked()).isFalse();
    }

    @Test
    public void isChecked_settingIsOn_shouldReturnTrue() {
        Settings.Secure.putInt(mContext.getContentResolver(), PEOPLE_STRIP, ON);

        assertThat(mController.isChecked()).isTrue();
    }

    @Test
    public void setChecked_setFalse_disablesSetting() {
        Settings.Secure.putInt(mContext.getContentResolver(), PEOPLE_STRIP, ON);

        mController.setChecked(false);
        int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(), PEOPLE_STRIP, -1);

        assertThat(updatedValue).isEqualTo(OFF);
    }

    @Test
    public void setChecked_setTrue_enablesSetting() {
        Settings.Secure.putInt(mContext.getContentResolver(), PEOPLE_STRIP, OFF);

        mController.setChecked(true);
        int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(), PEOPLE_STRIP, -1);

        assertThat(updatedValue).isEqualTo(ON);
    }
}