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

Commit b495103c authored by Julia Reynolds's avatar Julia Reynolds Committed by Android (Google) Code Review
Browse files

Merge "Add link to more app settings"

parents 947bf37e 9ef3cf25
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -8024,6 +8024,8 @@
    <string name="notif_listener_excluded_app_summary">Change settings for each app that sends notifications</string>
    <string name="notif_listener_excluded_app_screen_title">Apps shown on device</string>
    <string name="notif_listener_not_migrated">This app doesn\u2019t support enhanced settings</string>
    <string name="notif_listener_more_settings">More settings</string>
    <string name="notif_listener_more_settings_desc">More settings are available inside this app</string>
    <!-- Title for managing VR (virtual reality) helper services. [CHAR LIMIT=50] -->
    <string name="vr_listeners_title">VR helper services</string>
+6 −0
Original line number Diff line number Diff line
@@ -64,6 +64,12 @@
        settings:searchable="false"
        settings:controller="com.android.settings.applications.specialaccess.notificationaccess.BridgedAppsLinkPreferenceController" />

    <Preference
        android:key="more_settings"
        android:title="@string/notif_listener_more_settings"
        android:summary="@string/notif_listener_more_settings_desc"
        settings:controller="com.android.settings.applications.specialaccess.notificationaccess.MoreSettingsPreferenceController" />

    <com.android.settingslib.widget.FooterPreference
        android:key="notif_listener_not_migrated"
        android:title="@string/notif_listener_not_migrated"
+79 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.applications.specialaccess.notificationaccess;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.service.notification.NotificationListenerService;

import androidx.preference.Preference;

import com.android.settings.core.BasePreferenceController;

import java.util.List;

/**
 * Controls link to reach more preference settings inside the app.
 */
public class MoreSettingsPreferenceController extends BasePreferenceController {

    private static final String TAG = "MoreSettingsPrefContr";
    private static final String KEY_MORE_SETTINGS = "more_settings";

    PackageManager mPm;
    String mPackage;
    int mUserId;
    Intent mIntent = new Intent(Intent.ACTION_MAIN)
            .addCategory(NotificationListenerService.INTENT_CATEGORY_SETTINGS_HOME);

    public MoreSettingsPreferenceController(Context context) {
        super(context, KEY_MORE_SETTINGS);
    }

    @Override
    public int getAvailabilityStatus() {
        final List<ResolveInfo> resolveInfos = mPm.queryIntentActivities(
                mIntent,
                PackageManager.ResolveInfoFlags.of(0));
        if (resolveInfos == null || resolveInfos.isEmpty()) {
            return CONDITIONALLY_UNAVAILABLE;
        }
        return AVAILABLE;
    }

    @Override
    public String getPreferenceKey() {
        return KEY_MORE_SETTINGS;
    }

    public MoreSettingsPreferenceController setPackageManager(PackageManager pm) {
        mPm = pm;
        return this;
    }

    public MoreSettingsPreferenceController setPackage(String pkg) {
        mPackage = pkg;
        mIntent.setPackage(mPackage);
        return this;
    }

    public void updateState(Preference preference) {
        preference.setIntent(mIntent);
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -124,6 +124,9 @@ public class NotificationAccessDetails extends DashboardFragment {
                .setCn(mComponentName)
                .setUserId(mUserId)
                .setTargetSdk(listenerTargetSdk);
        use(MoreSettingsPreferenceController.class)
                .setPackage(mComponentName.getPackageName())
                .setPackageManager(mPm);
        final int finalListenerTargetSdk = listenerTargetSdk;
        getPreferenceControllers().forEach(controllers -> {
            controllers.forEach(controller -> {
+99 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.applications.specialaccess.notificationaccess;

import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;

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

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.service.notification.NotificationListenerService;

import androidx.preference.Preference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.google.common.collect.ImmutableList;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

@RunWith(AndroidJUnit4.class)
public class MoreSettingsPreferenceControllerTest {

    Context mContext;
    private MoreSettingsPreferenceController mController;
    @Mock
    PackageManager mPm;
    final String mPkg = "pkg";

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = ApplicationProvider.getApplicationContext();

        mController = new MoreSettingsPreferenceController(mContext);
        mController.setPackage(mPkg);
        mController.setPackageManager(mPm);

    }

    @Test
    public void getAvailabilityStatus_available() {
        ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
        when(mPm.queryIntentActivities(captor.capture(), any())).thenReturn(
                ImmutableList.of(mock(ResolveInfo.class)));

        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
        assertThat(captor.getValue().getPackage()).isEqualTo(mPkg);
        assertThat(captor.getValue().getAction()).isEqualTo(Intent.ACTION_MAIN);
        assertThat(captor.getValue().getCategories()).contains(
                NotificationListenerService.INTENT_CATEGORY_SETTINGS_HOME);
    }

    @Test
    public void getAvailabilityStatus_notAvailable() {
        ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
        when(mPm.queryIntentActivities(captor.capture(), any())).thenReturn(ImmutableList.of());

        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
    }

    @Test
    public void updateState() {
        Preference preference = new Preference(mContext);
        mController.updateState(preference);

        assertThat(preference.getIntent().getPackage()).isEqualTo(mPkg);
        assertThat(preference.getIntent().getAction()).isEqualTo(Intent.ACTION_MAIN);
        assertThat(preference.getIntent().getCategories()).contains(
                NotificationListenerService.INTENT_CATEGORY_SETTINGS_HOME);
    }
}