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

Commit 17fe3ebe authored by YK Hung's avatar YK Hung Committed by Android (Google) Code Review
Browse files

Merge "Add getA11yPackageNames() into SettingsLib for other modules" into main

parents 9c4fc066 5cbe08dc
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -16,9 +16,16 @@

package com.android.settingslib.fuelgauge;

import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.provider.Settings;
import android.util.ArraySet;
import android.view.accessibility.AccessibilityManager;

import java.util.List;

public final class BatteryUtils {

@@ -30,4 +37,35 @@ public final class BatteryUtils {
        return context.registerReceiver(
                /*receiver=*/ null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    }

    /** Gets the current active accessibility related packages. */
    public static ArraySet<String> getA11yPackageNames(Context context) {
        context = context.getApplicationContext();
        final ArraySet<String> packageNames = new ArraySet<>();
        final String defaultTtsPackageName = Settings.Secure.getString(
                context.getContentResolver(), Settings.Secure.TTS_DEFAULT_SYNTH);
        if (defaultTtsPackageName != null) {
            packageNames.add(defaultTtsPackageName);
        }
        // Checks the current active packages.
        final AccessibilityManager accessibilityManager =
                context.getSystemService(AccessibilityManager.class);
        if (!accessibilityManager.isEnabled()) {
            return packageNames;
        }
        final List<AccessibilityServiceInfo> serviceInfoList =
                accessibilityManager.getEnabledAccessibilityServiceList(
                        AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
        if (serviceInfoList == null || serviceInfoList.isEmpty()) {
            return packageNames;
        }
        for (AccessibilityServiceInfo serviceInfo : serviceInfoList) {
            final ComponentName serviceComponent = ComponentName.unflattenFromString(
                    serviceInfo.getId());
            if (serviceComponent != null) {
                packageNames.add(serviceComponent.getPackageName());
            }
        }
        return packageNames;
    }
}
+106 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.settingslib.fuelgauge;

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

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.robolectric.Shadows.shadowOf;

import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.provider.Settings;
import android.view.accessibility.AccessibilityManager;

import androidx.test.core.app.ApplicationProvider;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowAccessibilityManager;

import java.util.Arrays;

@RunWith(RobolectricTestRunner.class)
public class BatteryUtilsTest {
    private static final String DEFAULT_TTS_PACKAGE = "com.abc.talkback";
    private static final String ACCESSIBILITY_PACKAGE = "com.def.talkback";

    private Context mContext;
    private AccessibilityManager mAccessibilityManager;
    private ShadowAccessibilityManager mShadowAccessibilityManager;

    @Mock
    private AccessibilityServiceInfo mAccessibilityServiceInfo1;
    @Mock
    private AccessibilityServiceInfo mAccessibilityServiceInfo2;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = spy(ApplicationProvider.getApplicationContext());
        doReturn(mContext).when(mContext).getApplicationContext();
        mAccessibilityManager = spy(mContext.getSystemService(AccessibilityManager.class));
        mShadowAccessibilityManager = shadowOf(mAccessibilityManager);
        doReturn(mAccessibilityManager).when(mContext)
                .getSystemService(AccessibilityManager.class);

        setTtsPackageName(DEFAULT_TTS_PACKAGE);
        doReturn(Arrays.asList(mAccessibilityServiceInfo1, mAccessibilityServiceInfo2))
                .when(mAccessibilityManager)
                .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
        doReturn(ACCESSIBILITY_PACKAGE + "/.TalkbackService").when(mAccessibilityServiceInfo1)
                .getId();
        doReturn("dummy_package_name").when(mAccessibilityServiceInfo2).getId();
    }

    @Test
    public void getBatteryIntent_registerReceiver() {
        BatteryUtils.getBatteryIntent(mContext);
        verify(mContext).registerReceiver(eq(null), any(IntentFilter.class));
    }

    @Test
    public void getA11yPackageNames_returnDefaultTtsPackageName() {
        mShadowAccessibilityManager.setEnabled(false);

        assertThat(BatteryUtils.getA11yPackageNames(mContext))
                .containsExactly(DEFAULT_TTS_PACKAGE);
    }

    @Test
    public void getA11yPackageNames_returnExpectedPackageNames() {
        mShadowAccessibilityManager.setEnabled(true);

        assertThat(BatteryUtils.getA11yPackageNames(mContext))
                .containsExactly(DEFAULT_TTS_PACKAGE, ACCESSIBILITY_PACKAGE);
    }

    private void setTtsPackageName(String defaultTtsPackageName) {
        Settings.Secure.putString(mContext.getContentResolver(),
                Settings.Secure.TTS_DEFAULT_SYNTH, defaultTtsPackageName);
    }
}