Home | History | Annotate | Download | only in tips
      1 /*
      2  * Copyright (C) 2018 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 package com.android.settings.fuelgauge.batterytip.tips;
     17 
     18 import static com.google.common.truth.Truth.assertThat;
     19 
     20 import static org.mockito.Matchers.any;
     21 import static org.mockito.Matchers.anyInt;
     22 import static org.mockito.Matchers.anyString;
     23 import static org.mockito.Mockito.doReturn;
     24 import static org.mockito.Mockito.never;
     25 import static org.mockito.Mockito.spy;
     26 import static org.mockito.Mockito.verify;
     27 
     28 import android.content.Context;
     29 import android.content.pm.ApplicationInfo;
     30 import android.content.pm.PackageManager;
     31 import android.os.Parcel;
     32 import android.util.Pair;
     33 
     34 import com.android.internal.logging.nano.MetricsProto;
     35 import com.android.settings.R;
     36 import com.android.settings.fuelgauge.batterytip.AppInfo;
     37 import com.android.settings.testutils.SettingsRobolectricTestRunner;
     38 import com.android.settings.testutils.shadow.ShadowUtils;
     39 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
     40 
     41 import org.junit.Before;
     42 import org.junit.Test;
     43 import org.junit.runner.RunWith;
     44 import org.mockito.Mock;
     45 import org.mockito.MockitoAnnotations;
     46 import org.robolectric.RuntimeEnvironment;
     47 
     48 import java.util.ArrayList;
     49 import java.util.List;
     50 
     51 @RunWith(SettingsRobolectricTestRunner.class)
     52 public class RestrictAppTipTest {
     53     private static final String PACKAGE_NAME = "com.android.app";
     54     private static final String DISPLAY_NAME = "app";
     55     private static final int ANOMALY_WAKEUP = 0;
     56     private static final int ANOMALY_WAKELOCK = 1;
     57 
     58     private Context mContext;
     59     private RestrictAppTip mNewBatteryTip;
     60     private RestrictAppTip mHandledBatteryTip;
     61     private RestrictAppTip mInvisibleBatteryTip;
     62     private List<AppInfo> mUsageAppList;
     63     private AppInfo mAppInfo;
     64     @Mock
     65     private ApplicationInfo mApplicationInfo;
     66     @Mock
     67     private PackageManager mPackageManager;
     68     @Mock
     69     private MetricsFeatureProvider mMetricsFeatureProvider;
     70 
     71     @Before
     72     public void setUp() throws Exception {
     73         MockitoAnnotations.initMocks(this);
     74 
     75         mContext = spy(RuntimeEnvironment.application);
     76         doReturn(mPackageManager).when(mContext).getPackageManager();
     77         doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME,
     78                 PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER);
     79         doReturn(DISPLAY_NAME).when(mApplicationInfo).loadLabel(mPackageManager);
     80 
     81         mAppInfo = new AppInfo.Builder()
     82                 .setPackageName(PACKAGE_NAME)
     83                 .addAnomalyType(ANOMALY_WAKEUP)
     84                 .addAnomalyType(ANOMALY_WAKELOCK)
     85                 .build();
     86         mUsageAppList = new ArrayList<>();
     87         mUsageAppList.add(mAppInfo);
     88         mNewBatteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, mUsageAppList);
     89         mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList);
     90         mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
     91     }
     92 
     93     @Test
     94     public void parcelable() {
     95         Parcel parcel = Parcel.obtain();
     96         mNewBatteryTip.writeToParcel(parcel, mNewBatteryTip.describeContents());
     97         parcel.setDataPosition(0);
     98 
     99         final RestrictAppTip parcelTip = new RestrictAppTip(parcel);
    100 
    101         assertThat(parcelTip.getType()).isEqualTo(BatteryTip.TipType.APP_RESTRICTION);
    102         assertThat(parcelTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
    103         final AppInfo app = parcelTip.getRestrictAppList().get(0);
    104         assertThat(app.packageName).isEqualTo(PACKAGE_NAME);
    105     }
    106 
    107     @Test
    108     public void getTitle_stateNew_showRestrictTitle() {
    109         assertThat(mNewBatteryTip.getTitle(mContext)).isEqualTo("Restrict 1 app");
    110     }
    111 
    112     @Test
    113     public void getTitle_oneAppHandled_showHandledTitle() {
    114         assertThat(mHandledBatteryTip.getTitle(mContext)).isEqualTo("app recently restricted");
    115     }
    116 
    117     @Test
    118     public void getTitle_moreAppsHandled_showHandledTitle() {
    119         mUsageAppList.add(new AppInfo.Builder().build());
    120         mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList);
    121         assertThat(mHandledBatteryTip.getTitle(mContext)).isEqualTo("2 apps recently restricted");
    122     }
    123 
    124     @Test
    125     public void getSummary_stateNew_showRestrictSummary() {
    126         assertThat(mNewBatteryTip.getSummary(mContext))
    127             .isEqualTo("app has high background battery usage");
    128     }
    129 
    130     @Test
    131     public void getSummary_oneAppHandled_showHandledSummary() {
    132         assertThat(mHandledBatteryTip.getSummary(mContext).toString())
    133                 .isEqualTo(mContext.getResources().getQuantityString(
    134                         R.plurals.battery_tip_restrict_handled_summary, 1));
    135     }
    136 
    137     @Test
    138     public void getSummary_moreAppsHandled_showHandledSummary() {
    139         mUsageAppList.add(new AppInfo.Builder().build());
    140         mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList);
    141         assertThat(mHandledBatteryTip.getSummary(mContext))
    142                 .isEqualTo(mContext.getResources().getQuantityString(
    143                         R.plurals.battery_tip_restrict_handled_summary, 2));
    144     }
    145 
    146     @Test
    147     public void update_anomalyBecomeInvisible_stateHandled() {
    148         mNewBatteryTip.updateState(mInvisibleBatteryTip);
    149 
    150         assertThat(mNewBatteryTip.getState()).isEqualTo(BatteryTip.StateType.HANDLED);
    151     }
    152 
    153     @Test
    154     public void update_handledAnomlayBecomeInvisible_stateInvisible() {
    155         mHandledBatteryTip.updateState(mInvisibleBatteryTip);
    156 
    157         assertThat(mHandledBatteryTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE);
    158     }
    159 
    160     @Test
    161     public void update_newAnomalyComes_stateNew() {
    162         mInvisibleBatteryTip.updateState(mNewBatteryTip);
    163         assertThat(mInvisibleBatteryTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
    164 
    165         mHandledBatteryTip.updateState(mNewBatteryTip);
    166         assertThat(mHandledBatteryTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
    167     }
    168 
    169     @Test
    170     public void update_newHandledAnomalyComes_containHandledAnomaly() {
    171         mInvisibleBatteryTip.updateState(mHandledBatteryTip);
    172         assertThat(mInvisibleBatteryTip.getState()).isEqualTo(BatteryTip.StateType.HANDLED);
    173         assertThat(mInvisibleBatteryTip.getRestrictAppList()).containsExactly(mAppInfo);
    174     }
    175 
    176     @Test
    177     public void toString_containsAppData() {
    178         assertThat(mNewBatteryTip.toString()).isEqualTo(
    179                 "type=1 state=0 { packageName=com.android.app,anomalyTypes={0, 1},screenTime=0 }");
    180     }
    181 
    182     @Test
    183     public void testLog_stateNew_logAppInfo() {
    184         mNewBatteryTip.log(mContext, mMetricsFeatureProvider);
    185 
    186         verify(mMetricsFeatureProvider).action(mContext,
    187                 MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.NEW);
    188         verify(mMetricsFeatureProvider).action(mContext,
    189                 MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
    190                 PACKAGE_NAME,
    191                 Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP));
    192         verify(mMetricsFeatureProvider).action(mContext,
    193                 MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
    194                 PACKAGE_NAME,
    195                 Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKELOCK));
    196     }
    197 
    198     @Test
    199     public void testLog_stateHandled_doNotLogAppInfo() {
    200         mHandledBatteryTip.log(mContext, mMetricsFeatureProvider);
    201 
    202         verify(mMetricsFeatureProvider).action(mContext,
    203                 MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.HANDLED);
    204         verify(mMetricsFeatureProvider, never()).action(any(), anyInt(), anyString(), any());
    205 
    206     }
    207 }
    208