blob: 8fee1071ba87f3bff712a521c6c77b7e961885c7 [file] [log] [blame]
Selim Cinek2b6eb8032016-12-29 14:22:21 +01001/*
2 * Copyright (C) 2016 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
17package com.android.systemui.statusbar;
18
Lucas Dupin83519da2017-06-21 11:58:31 -070019import static junit.framework.Assert.assertEquals;
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080020import static junit.framework.Assert.assertFalse;
21import static junit.framework.Assert.assertNull;
Lucas Dupin83519da2017-06-21 11:58:31 -070022import static junit.framework.Assert.assertTrue;
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080023
24import static org.mockito.ArgumentMatchers.any;
25import static org.mockito.ArgumentMatchers.anyInt;
26import static org.mockito.ArgumentMatchers.argThat;
27import static org.mockito.ArgumentMatchers.eq;
28import static org.mockito.Mockito.doReturn;
29import static org.mockito.Mockito.mock;
30import static org.mockito.Mockito.spy;
31import static org.mockito.Mockito.when;
32
33import android.content.Context;
34import android.content.ContextWrapper;
35import android.content.pm.ApplicationInfo;
36import android.content.pm.PackageManager;
37import android.content.res.Resources;
Lucas Dupin83519da2017-06-21 11:58:31 -070038import android.graphics.Color;
Selim Cinek2b6eb8032016-12-29 14:22:21 +010039import android.graphics.drawable.Icon;
Selim Cinek2b6eb8032016-12-29 14:22:21 +010040import android.os.UserHandle;
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080041import android.support.test.filters.SmallTest;
Selim Cinek2b6eb8032016-12-29 14:22:21 +010042import android.support.test.runner.AndroidJUnit4;
Selim Cinek2b6eb8032016-12-29 14:22:21 +010043
44import com.android.internal.statusbar.StatusBarIcon;
Lucas Dupina291d192018-06-07 13:59:42 -070045import com.android.internal.util.ContrastColorUtil;
Selim Cinek2b6eb8032016-12-29 14:22:21 +010046import com.android.systemui.R;
47import com.android.systemui.SysuiTestCase;
48
49import org.junit.Before;
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080050import org.junit.Rule;
Selim Cinek2b6eb8032016-12-29 14:22:21 +010051import org.junit.Test;
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080052import org.junit.rules.ExpectedException;
Selim Cinek2b6eb8032016-12-29 14:22:21 +010053import org.junit.runner.RunWith;
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080054import org.mockito.ArgumentMatcher;
Selim Cinek2b6eb8032016-12-29 14:22:21 +010055
56@SmallTest
57@RunWith(AndroidJUnit4.class)
58public class StatusBarIconViewTest extends SysuiTestCase {
59
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080060 @Rule
61 public ExpectedException mThrown = ExpectedException.none();
62
Selim Cinek2b6eb8032016-12-29 14:22:21 +010063 private StatusBarIconView mIconView;
64 private StatusBarIcon mStatusBarIcon = mock(StatusBarIcon.class);
65
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080066 private PackageManager mPackageManagerSpy;
67 private Context mContext;
68 private Resources mMockResources;
69
Selim Cinek2b6eb8032016-12-29 14:22:21 +010070 @Before
Adrian Roosfb2d0cc2017-01-31 15:10:00 -080071 public void setUp() throws Exception {
72 // Set up context such that asking for "mockPackage" resources returns mMockResources.
73 mMockResources = mock(Resources.class);
74 mPackageManagerSpy = spy(getContext().getPackageManager());
75 doReturn(mMockResources).when(mPackageManagerSpy)
76 .getResourcesForApplicationAsUser(eq("mockPackage"), anyInt());
77 doReturn(mMockResources).when(mPackageManagerSpy)
78 .getResourcesForApplication(eq("mockPackage"));
79 doReturn(mMockResources).when(mPackageManagerSpy).getResourcesForApplication(argThat(
80 (ArgumentMatcher<ApplicationInfo>) o -> "mockPackage".equals(o.packageName)));
81 mContext = new ContextWrapper(getContext()) {
82 @Override
83 public PackageManager getPackageManager() {
84 return mPackageManagerSpy;
85 }
86 };
87
88 mIconView = new StatusBarIconView(mContext, "test_slot", null);
89 mStatusBarIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage",
90 Icon.createWithResource(mContext, R.drawable.ic_android), 0, 0, "");
Selim Cinek2b6eb8032016-12-29 14:22:21 +010091 }
92
93 @Test
94 public void testSetClearsGrayscale() {
95 mIconView.setTag(R.id.icon_is_grayscale, true);
96 mIconView.set(mStatusBarIcon);
97 assertNull(mIconView.getTag(R.id.icon_is_grayscale));
98 }
99
Adrian Roosfb2d0cc2017-01-31 15:10:00 -0800100 @Test
101 public void testSettingOomingIconDoesNotThrowOom() {
102 when(mMockResources.getDrawable(anyInt(), any())).thenThrow(new OutOfMemoryError("mocked"));
103 mStatusBarIcon.icon = Icon.createWithResource("mockPackage", R.drawable.ic_android);
104
105 assertFalse(mIconView.set(mStatusBarIcon));
106 }
Lucas Dupin83519da2017-06-21 11:58:31 -0700107
108 @Test
109 public void testGetContrastedStaticDrawableColor() {
110 mIconView.setStaticDrawableColor(Color.DKGRAY);
111 int color = mIconView.getContrastedStaticDrawableColor(Color.WHITE);
112 assertEquals("Color should not change when we have enough contrast",
113 Color.DKGRAY, color);
114
115 mIconView.setStaticDrawableColor(Color.WHITE);
116 color = mIconView.getContrastedStaticDrawableColor(Color.WHITE);
117 assertTrue("Similar colors should be shifted to satisfy contrast",
Lucas Dupina291d192018-06-07 13:59:42 -0700118 ContrastColorUtil.satisfiesTextContrast(Color.WHITE, color));
Lucas Dupinddbaf842017-06-23 09:30:49 -0700119
120 mIconView.setStaticDrawableColor(Color.GREEN);
121 color = mIconView.getContrastedStaticDrawableColor(0xcc000000);
122 assertEquals("Transparent backgrounds should fallback to drawable color",
123 color, mIconView.getStaticDrawableColor());
Lucas Dupin83519da2017-06-21 11:58:31 -0700124 }
Selim Cinek2b6eb8032016-12-29 14:22:21 +0100125}