• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.applications;
18 
19 import static org.junit.Assert.assertFalse;
20 import static org.junit.Assert.assertNull;
21 import static org.junit.Assert.assertTrue;
22 import static org.mockito.ArgumentMatchers.anyInt;
23 import static org.mockito.Mockito.mock;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.when;
26 
27 import android.app.ActivityManager;
28 import android.app.LocaleConfig;
29 import android.content.Context;
30 import android.content.pm.ActivityInfo;
31 import android.content.pm.ApplicationInfo;
32 import android.content.pm.PackageManager;
33 import android.content.pm.ResolveInfo;
34 import android.content.res.Resources;
35 import android.os.LocaleList;
36 import android.util.FeatureFlagUtils;
37 
38 import androidx.test.core.app.ApplicationProvider;
39 import androidx.test.ext.junit.runners.AndroidJUnit4;
40 
41 import org.junit.After;
42 import org.junit.Before;
43 import org.junit.Test;
44 import org.junit.runner.RunWith;
45 import org.mockito.Mock;
46 import org.mockito.MockitoAnnotations;
47 
48 import java.util.ArrayList;
49 import java.util.List;
50 
51 @RunWith(AndroidJUnit4.class)
52 public class AppLocaleUtilTest {
53     @Mock
54     private PackageManager mPackageManager;
55     @Mock
56     private ActivityManager mActivityManager;
57     @Mock
58     private Resources mResources;
59     @Mock
60     private LocaleConfig mLocaleConfig;
61 
62     private Context mContext;
63     private String mDisallowedPackage = "com.disallowed.package";
64     private String mAllowedPackage = "com.allowed.package";
65     private List<ResolveInfo> mListResolveInfo;
66     private ApplicationInfo mAppInfo;
67 
68     @Before
setUp()69     public void setUp() {
70         MockitoAnnotations.initMocks(this);
71         mContext = spy(ApplicationProvider.getApplicationContext());
72         when(mContext.getPackageManager()).thenReturn(mPackageManager);
73         when(mContext.getSystemService(ActivityManager.class)).thenReturn(mActivityManager);
74 
75         FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SETTINGS_APP_LOCALE_OPT_IN_ENABLED,
76                 true);
77         setDisallowedPackageName(mDisallowedPackage);
78         mAppInfo = new ApplicationInfo();
79         mLocaleConfig = mock(LocaleConfig.class);
80     }
81 
82     @After
tearDown()83     public void tearDown() {
84         AppLocaleUtil.sLocaleConfig = null;
85     }
86 
87     @Test
canDisplayLocaleUi_showUI()88     public void canDisplayLocaleUi_showUI() {
89         when(mLocaleConfig.getStatus()).thenReturn(LocaleConfig.STATUS_SUCCESS);
90         when(mLocaleConfig.getSupportedLocales()).thenReturn(LocaleList.forLanguageTags("en-US"));
91         AppLocaleUtil.sLocaleConfig = mLocaleConfig;
92         setActivityInfo(mAllowedPackage);
93         mAppInfo.packageName = mAllowedPackage;
94 
95         assertTrue(AppLocaleUtil.canDisplayLocaleUi(mContext, mAppInfo, mListResolveInfo));
96     }
97 
98     @Test
canDisplayLocaleUi_notShowUI_hasPlatformKey()99     public void canDisplayLocaleUi_notShowUI_hasPlatformKey() {
100         setActivityInfo(mAllowedPackage);
101         mAppInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY;
102         mAppInfo.packageName = mAllowedPackage;
103 
104         assertFalse(AppLocaleUtil.canDisplayLocaleUi(mContext, mAppInfo, mListResolveInfo));
105     }
106 
107     @Test
canDisplayLocaleUi_notShowUI_noLauncherEntry()108     public void canDisplayLocaleUi_notShowUI_noLauncherEntry() {
109         setActivityInfo("");
110 
111         assertFalse(AppLocaleUtil.canDisplayLocaleUi(mContext, mAppInfo, mListResolveInfo));
112     }
113 
114     @Test
canDisplayLocaleUi_notShowUI_matchDisallowedPackageList()115     public void canDisplayLocaleUi_notShowUI_matchDisallowedPackageList() {
116         setActivityInfo("");
117         mAppInfo.packageName = mDisallowedPackage;
118 
119         assertFalse(AppLocaleUtil
120                 .canDisplayLocaleUi(mContext, mAppInfo, mListResolveInfo));
121     }
122 
123     @Test
getPackageLocales_getLocales_success()124     public void getPackageLocales_getLocales_success() {
125         when(mLocaleConfig.getStatus()).thenReturn(LocaleConfig.STATUS_SUCCESS);
126         when(mLocaleConfig.getSupportedLocales()).thenReturn(LocaleList.forLanguageTags("en-US"));
127 
128         LocaleList result = AppLocaleUtil.getPackageLocales(mLocaleConfig);
129 
130         assertFalse(result.isEmpty());
131     }
132 
133     @Test
getPackageLocales_getLocales_failed()134     public void getPackageLocales_getLocales_failed() {
135         when(mLocaleConfig.getStatus()).thenReturn(LocaleConfig.STATUS_PARSING_FAILED);
136 
137         LocaleList result = AppLocaleUtil.getPackageLocales(mLocaleConfig);
138 
139         assertNull(result);
140     }
141 
setDisallowedPackageName(String packageName)142     private void setDisallowedPackageName(String packageName) {
143         when(mContext.getResources()).thenReturn(mResources);
144         when(mResources.getStringArray(anyInt())).thenReturn(new String[]{packageName});
145     }
146 
setActivityInfo(String packageName)147     private void setActivityInfo(String packageName) {
148         ResolveInfo resolveInfo = mock(ResolveInfo.class);
149         ActivityInfo activityInfo = mock(ActivityInfo.class);
150         activityInfo.packageName = packageName;
151         resolveInfo.activityInfo = activityInfo;
152         mListResolveInfo = new ArrayList<>();
153         mListResolveInfo.add(resolveInfo);
154     }
155 }
156