Home | History | Annotate | Download | only in phone
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
      5  * except in compliance with the License. You may obtain a copy of the License at
      6  *
      7  *      http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the
     10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     11  * KIND, either express or implied. See the License for the specific language governing
     12  * permissions and limitations under the License.
     13  */
     14 
     15 package com.android.systemui.statusbar.phone;
     16 
     17 import static junit.framework.Assert.assertEquals;
     18 import static junit.framework.Assert.assertTrue;
     19 
     20 import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_ICON;
     21 import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE;
     22 import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI;
     23 import static org.mockito.ArgumentMatchers.eq;
     24 import static org.mockito.Mockito.mock;
     25 import static org.mockito.Mockito.verify;
     26 
     27 import android.graphics.Rect;
     28 import android.support.test.filters.SmallTest;
     29 import android.testing.AndroidTestingRunner;
     30 import android.testing.TestableLooper.RunWithLooper;
     31 import android.view.ViewGroup;
     32 import android.widget.LinearLayout;
     33 
     34 import com.android.internal.statusbar.StatusBarIcon;
     35 import com.android.systemui.statusbar.StatusIconDisplayable;
     36 import com.android.systemui.statusbar.StatusBarIconView;
     37 import com.android.systemui.statusbar.StatusBarMobileView;
     38 import com.android.systemui.statusbar.StatusBarWifiView;
     39 import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
     40 import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager;
     41 import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
     42 import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
     43 import com.android.systemui.statusbar.policy.DarkIconDispatcher;
     44 import com.android.systemui.utils.leaks.LeakCheckedTest;
     45 
     46 import org.junit.Before;
     47 import org.junit.Test;
     48 import org.junit.runner.RunWith;
     49 
     50 @RunWith(AndroidTestingRunner.class)
     51 @RunWithLooper
     52 @SmallTest
     53 public class StatusBarIconControllerTest extends LeakCheckedTest {
     54 
     55     @Before
     56     public void setup() {
     57         injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
     58         mDependency.injectMockDependency(DarkIconDispatcher.class);
     59     }
     60 
     61     @Test
     62     public void testSetCalledOnAdd_IconManager() {
     63         LinearLayout layout = new LinearLayout(mContext);
     64         TestIconManager manager = new TestIconManager(layout);
     65         testCallOnAdd_forManager(manager);
     66     }
     67 
     68     @Test
     69     public void testSetCalledOnAdd_DarkIconManager() {
     70         LinearLayout layout = new LinearLayout(mContext);
     71         TestDarkIconManager manager = new TestDarkIconManager(layout);
     72         testCallOnAdd_forManager(manager);
     73     }
     74 
     75 
     76     private <T extends IconManager & TestableIconManager> void testCallOnAdd_forManager(T manager) {
     77         StatusBarIconHolder holder = holderForType(TYPE_ICON);
     78         manager.onIconAdded(0, "test_slot", false, holder);
     79         assertTrue("Expected StatusBarIconView",
     80                 (manager.getViewAt(0) instanceof StatusBarIconView));
     81 
     82         holder = holderForType(TYPE_WIFI);
     83         manager.onIconAdded(1, "test_wifi", false, holder);
     84         assertTrue(manager.getViewAt(1) instanceof StatusBarWifiView);
     85 
     86         holder = holderForType(TYPE_MOBILE);
     87         manager.onIconAdded(2, "test_mobile", false, holder);
     88         assertTrue(manager.getViewAt(2) instanceof StatusBarMobileView);
     89     }
     90 
     91     private StatusBarIconHolder holderForType(int type) {
     92         switch (type) {
     93             case TYPE_MOBILE:
     94                 return StatusBarIconHolder.fromMobileIconState(mock(MobileIconState.class));
     95 
     96             case TYPE_WIFI:
     97                 return StatusBarIconHolder.fromWifiIconState(mock(WifiIconState.class));
     98 
     99             case TYPE_ICON:
    100             default:
    101                 return StatusBarIconHolder.fromIcon(mock(StatusBarIcon.class));
    102         }
    103     }
    104 
    105     private static class TestDarkIconManager extends DarkIconManager
    106             implements TestableIconManager {
    107 
    108         public TestDarkIconManager(LinearLayout group) {
    109             super(group);
    110         }
    111 
    112         @Override
    113         public StatusIconDisplayable getViewAt(int index) {
    114             return (StatusIconDisplayable) mGroup.getChildAt(index);
    115         }
    116 
    117         @Override
    118         protected StatusBarIconView addIcon(int index, String slot, boolean blocked,
    119                 StatusBarIcon icon) {
    120             StatusBarIconView mock = mock(StatusBarIconView.class);
    121             mGroup.addView(mock, index);
    122 
    123             return mock;
    124         }
    125 
    126         @Override
    127         protected StatusBarWifiView addSignalIcon(int index, String slot, WifiIconState state) {
    128             StatusBarWifiView mock = mock(StatusBarWifiView.class);
    129             mGroup.addView(mock, index);
    130             return mock;
    131         }
    132 
    133         @Override
    134         protected StatusBarMobileView addMobileIcon(int index, String slot, MobileIconState state) {
    135             StatusBarMobileView mock = mock(StatusBarMobileView.class);
    136             mGroup.addView(mock, index);
    137 
    138             return mock;
    139         }
    140     }
    141 
    142     private static class TestIconManager extends IconManager implements TestableIconManager {
    143         public TestIconManager(ViewGroup group) {
    144             super(group);
    145         }
    146 
    147         @Override
    148         public StatusIconDisplayable getViewAt(int index) {
    149             return (StatusIconDisplayable) mGroup.getChildAt(index);
    150         }
    151 
    152         @Override
    153         protected StatusBarIconView addIcon(int index, String slot, boolean blocked,
    154                 StatusBarIcon icon) {
    155             StatusBarIconView mock = mock(StatusBarIconView.class);
    156             mGroup.addView(mock, index);
    157 
    158             return mock;
    159         }
    160 
    161         @Override
    162         protected StatusBarWifiView addSignalIcon(int index, String slot, WifiIconState state) {
    163             StatusBarWifiView mock = mock(StatusBarWifiView.class);
    164             mGroup.addView(mock, index);
    165             return mock;
    166         }
    167 
    168         @Override
    169         protected StatusBarMobileView addMobileIcon(int index, String slot, MobileIconState state) {
    170             StatusBarMobileView mock = mock(StatusBarMobileView.class);
    171             mGroup.addView(mock, index);
    172 
    173             return mock;
    174         }
    175     }
    176 
    177     private interface TestableIconManager {
    178         StatusIconDisplayable getViewAt(int index);
    179     }
    180 }
    181