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

Commit 956b03d3 authored by Syaoran Kuo's avatar Syaoran Kuo
Browse files

Fix resource id not match issue.

Bug: 187485845
Test: atest com.android.settings.notification.AppNotificationComponentTest
Change-Id: I4b094dd430127046e08cb1b87706906807c28b32
parent 08e42fa9
Loading
Loading
Loading
Loading
+49 −18
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;

import androidx.test.core.app.ActivityScenario;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
@@ -34,21 +34,22 @@ import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.runner.lifecycle.Stage;

import com.android.settings.R;
import com.android.settings.testutils.CommonUtils;
import com.android.settings.testutils.UiUtils;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Arrays;
import java.util.List;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class AppNotificationComponentTest {
    private static final String TAG =
            AppNotificationComponentTest.class.getSimpleName();
    private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
    private final String mNoSlientAppName = "com.google.android.dialer";

    public final String TAG = this.getClass().getName();

    @Rule
    public ActivityScenarioRule<com.android.settings.Settings.AppNotificationSettingsActivity>
@@ -57,35 +58,65 @@ public class AppNotificationComponentTest {
                    .putExtra(Settings.EXTRA_APP_PACKAGE, mNoSlientAppName)
                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

    /**
     * Tests user should not able to modify notification settings for some system apps.
     * In this case, test `phone` app that will disabled notification configuration.
     * Steps:
     * 1. Open notification page of phone app.
     * 2. Checks system privilege notification should not able to be changed.
     */
    @Test
    public void test_special_app_could_not_disable_notification() {
        List<String> disabledList = Arrays.asList("Default", "Incoming calls",
                "Background Processing", "Missed calls",
                "Ongoing calls", "Voicemails");

        ActivityScenario ac = rule.getScenario();
        ac.onActivity(
                activity -> {
                    View rv = activity.findViewById(R.id.recycler_view);
                    View recyclerView = activity.findViewById(
                            CommonUtils.getResId("recycler_view"));

                    if (rv == null) {
                    if (recyclerView == null) {
                        Log.d("UI_UTILS",
                                "Target not found: R.id.recycler_view #" + Integer.toHexString(
                                        R.id.recycler_view));
                                        CommonUtils.getResId("recycler_view")));
                        UiUtils.dumpView(UiUtils.getFirstViewFromActivity(activity));
                        assertThat(Boolean.TRUE).isFalse();
                    }

                    UiUtils.waitUntilCondition(5000,
                            () -> rv.findViewById(R.id.main_switch_bar) != null);
                            () -> recyclerView.findViewById(CommonUtils.getResId("recycler_view"))
                                    != null);

                    View mainSwitchBar = rv.findViewById(R.id.main_switch_bar);
                    View mainSwitchBar = recyclerView.findViewById(
                            CommonUtils.getResId("main_switch_bar"));

                    assertThat(mainSwitchBar.isEnabled()).isEqualTo(false);
                    Log.d(TAG, "main switch bar = " + mainSwitchBar.isEnabled());

                    UiUtils.waitForActivitiesInStage(10000, Stage.RESUMED);
                    Log.d(TAG, "In stage!.");

                    UiUtils.waitForActivitiesInStage(1000, Stage.RESUMED);
                    UiUtils.dumpView(UiUtils.getFirstViewFromActivity(activity));

                    for (int i = 0; i < ((ViewGroup) rv).getChildCount(); i++) {
                        if (((ViewGroup) rv).getChildAt(i) instanceof LinearLayout) {
                            Switch sWidget = rv.findViewById(R.id.switchWidget);
                            if (sWidget != null) {
                                assertThat(sWidget.isEnabled()).isEqualTo(false);
                    // The privileges are under the recycle view. Fetch all of them and check.
                    ViewGroup viewGroup = (ViewGroup) recyclerView;

                    for (int i = 0; i < viewGroup.getChildCount(); i++) {
                        if (viewGroup.getChildAt(i) instanceof LinearLayout) {
                            // A notification in Settings should have both switch_widget and text.
                            // There has another circle pin is no belongs to Settings package.
                            // But belongs to Switch in Android.
                            View sWidget = viewGroup.getChildAt(i).findViewById(
                                    CommonUtils.getResId("switchWidget"));
                            TextView sText = viewGroup.getChildAt(i).findViewById(
                                    android.R.id.title);
                            if (sText != null && sWidget != null
                                    && disabledList.stream().anyMatch(
                                            str -> str.equals(sText.getText().toString().trim()))) {

                                assertThat(sWidget.isEnabled()).isFalse();
                            }
                        }
                    }
+13 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import android.os.Environment;
import android.util.Log;
import android.view.View;

import androidx.test.platform.app.InstrumentationRegistry;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
@@ -93,4 +95,15 @@ public class CommonUtils {
        return false;
    }

    /**
     * Return a resource identifier for the given resource name in Settings app.
     *
     * @param name The name of the desired resource.
     * @return int The associated resource identifier.  Returns 0 if no such resource was found.  (0
     * is not a valid resource ID.)
     */
    public static int getResId(String name) {
        return InstrumentationRegistry.getInstrumentation().getTargetContext().getResources()
                .getIdentifier(name, "id", Constants.SETTINGS_PACKAGE_NAME);
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -20,4 +20,5 @@ public class Constants {
    public static final long ACTIVITY_LAUNCH_WAIT_TIMEOUT = 5000;
    public static final long VIEW_APPEAR_WAIT_MEDIUM_TIMEOUT = 5000;
    public static final long WIFI_CONNECT_WAIT_TIMEOUT = 15000;
    public static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
}