Update action bar style in app header UI.

- Update background color of actionbar
- Remove elevation of actionbar so it appears to be the same entity as
  app header.
- Add a shadow below app header view. We can't set elevation on app
  header unfortunately because that will add shadow all round the view,
  but we only want shadow below it.
- Updated app icon size/text size per to match UI spec.

Change-Id: I63d7fa42b859a008fa662aaf19848cd40529c2ff
Fix: 37207527
Fix: 37079248
Test: visual && make RunSettingsRoboTests
This commit is contained in:
Fan Zhang
2017-04-14 12:31:02 -07:00
parent a0e617f96d
commit be6fab0135
14 changed files with 194 additions and 157 deletions

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2017 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.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#4D000000"
android:endColor="@android:color/transparent"
android:type="linear" />
<size android:height="8dp" />
</shape>

View File

@@ -17,30 +17,24 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/app_snippet"
style="@style/EntityHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top"
android:orientation="vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingTop="24dp"
android:paddingBottom="24dp"
android:clipChildren="false"
android:clipToPadding="false">
android:orientation="vertical">
<!-- App snippet with buttons -->
<RelativeLayout
android:id="@+id/app_snippet"
style="@style/EntityHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="8dp"
android:clipChildren="false"
android:clipToPadding="false">
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="0dp"
android:paddingTop="24dp"
android:paddingBottom="24dp">
<FrameLayout android:id="@+id/app_icon_frame"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_width="56dp"
android:layout_height="56dp"
android:clipChildren="false"
android:clipToPadding="false">
<ImageView
@@ -54,8 +48,7 @@
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_gravity="end|bottom"
android:layout_margin="8dp"
android:visibility="gone"
android:layout_margin="4dp"
android:elevation="20dp"
android:background="@drawable/ic_instant_apps_badge_bg"
android:src="@drawable/ic_instant_apps_badge" />
@@ -70,19 +63,22 @@
<ImageButton
android:id="@+id/right_button"
style="@android:style/Widget.Material.Button.Borderless"
style="?android:attr/actionOverflowButtonStyle"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="0dp"
android:minWidth="@dimen/min_tap_target_size"
android:src="@drawable/ic_settings_24dp"
android:tint="?android:attr/colorAccent"/>
<ImageButton
android:id="@+id/left_button"
style="@android:style/Widget.Material.Button.Borderless"
style="?android:attr/actionOverflowButtonStyle"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="0dp"
android:minWidth="@dimen/min_tap_target_size"
android:src="@null"
android:tint="?android:attr/colorAccent"/>
</LinearLayout>
@@ -131,4 +127,9 @@
</RelativeLayout>
<!-- Drop shadow -->
<View android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@drawable/action_bar_dropshadow"/>
</LinearLayout>

View File

@@ -22,6 +22,7 @@
<dimen name="action_bar_switch_padding">16dip</dimen>
<dimen name="app_icon_size">40dip</dimen>
<dimen name="min_tap_target_size">48dp</dimen>
<dimen name="screen_margin_sides">64dip</dimen>
<dimen name="screen_margin_top">72dip</dimen>
<dimen name="screen_margin_bottom">48dip</dimen>

View File

@@ -416,7 +416,7 @@
<style name="TextAppearance.EntityHeaderTitle"
parent="@android:style/TextAppearance.Material.Subhead">
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textSize">24sp</item>
<item name="android:textSize">16sp</item>
</style>
<style name="AppActionPrimaryButton" parent="android:Widget.Material.Button.Colored"/>

View File

@@ -18,25 +18,25 @@ package com.android.settings.applications;
import android.annotation.IdRes;
import android.annotation.UserIdInt;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.graphics.Outline;
import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.support.annotation.IntDef;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewOutlineProvider;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.settings.AppHeader;
import com.android.settings.R;
import com.android.settings.Utils;
@@ -69,7 +69,6 @@ public class AppHeaderController {
private final Fragment mFragment;
private final int mMetricsCategory;
private final View mAppHeader;
private final int mIconElevation;
private Drawable mIcon;
private CharSequence mLabel;
@@ -96,8 +95,6 @@ public class AppHeaderController {
mAppHeader = LayoutInflater.from(fragment.getContext())
.inflate(R.layout.app_details, null /* root */);
}
mIconElevation = mContext.getResources()
.getDimensionPixelSize(R.dimen.launcher_icon_elevation);
}
public AppHeaderController setIcon(Drawable icon) {
@@ -163,58 +160,23 @@ public class AppHeaderController {
return this;
}
/**
* Binds app header view and data from {@code PackageInfo} and {@code AppEntry}.
*/
public void bindAppHeader(PackageInfo packageInfo, ApplicationsState.AppEntry appEntry) {
final String versionName = packageInfo == null ? null : packageInfo.versionName;
final Resources res = mAppHeader.getResources();
// Set Icon
final ImageView iconView = (ImageView) mAppHeader.findViewById(R.id.app_detail_icon);
if (appEntry.icon != null) {
iconView.setImageDrawable(appEntry.icon.getConstantState().newDrawable(res));
}
// Set application name.
final TextView labelView = (TextView) mAppHeader.findViewById(R.id.app_detail_title);
labelView.setText(appEntry.label);
// Version number of application
final TextView appVersion = (TextView) mAppHeader.findViewById(R.id.app_detail_summary);
if (!TextUtils.isEmpty(versionName)) {
appVersion.setSelected(true);
appVersion.setVisibility(View.VISIBLE);
appVersion.setText(res.getString(R.string.version_text, String.valueOf(versionName)));
} else {
appVersion.setVisibility(View.INVISIBLE);
}
}
/**
* Done mutating appheader, rebinds everything and return a new {@link LayoutPreference}.
*/
public LayoutPreference done(Context context) {
final LayoutPreference pref = new LayoutPreference(context, done());
public LayoutPreference done(Activity activity, Context uiContext) {
final LayoutPreference pref = new LayoutPreference(uiContext, done(activity));
// Makes sure it's the first preference onscreen.
pref.setOrder(-1000);
pref.setKey(PREF_KEY_APP_HEADER);
return pref;
}
/**
* Done mutating appheader, rebinds everything.
*/
public View done() {
return done(true);
}
/**
* Done mutating appheader, rebinds everything (optionally skip rebinding buttons).
*/
public View done(boolean rebindActions) {
ImageView iconView = (ImageView) mAppHeader.findViewById(R.id.app_detail_icon);
public View done(Activity activity, boolean rebindActions) {
styleActionBar(activity);
ImageView iconView = mAppHeader.findViewById(R.id.app_detail_icon);
if (iconView != null) {
iconView.setImageDrawable(mIcon);
ImageView badgeView = mAppHeader.findViewById(R.id.app_icon_instant_apps_badge);
@@ -239,12 +201,39 @@ public class AppHeaderController {
/**
* Only binds app header with button actions.
*/
public void bindAppHeaderButtons() {
ImageButton leftButton = (ImageButton) mAppHeader.findViewById(R.id.left_button);
ImageButton rightButton = (ImageButton) mAppHeader.findViewById(R.id.right_button);
public AppHeaderController bindAppHeaderButtons() {
ImageButton leftButton = mAppHeader.findViewById(R.id.left_button);
ImageButton rightButton = mAppHeader.findViewById(R.id.right_button);
bindButton(leftButton, mLeftAction);
bindButton(rightButton, mRightAction);
return this;
}
public AppHeaderController styleActionBar(Activity activity) {
if (activity == null) {
Log.w(TAG, "No activity, cannot style actionbar.");
return this;
}
final ActionBar actionBar = activity.getActionBar();
if (actionBar == null) {
Log.w(TAG, "No actionbar, cannot style actionbar.");
return this;
}
final Drawable appHeaderBackground =
mAppHeader.findViewById(R.id.app_snippet).getBackground();
actionBar.setBackgroundDrawable(appHeaderBackground);
actionBar.setElevation(0);
return this;
}
/**
* Done mutating appheader, rebinds everything.
*/
@VisibleForTesting
View done(Activity activity) {
return done(activity, true /* rebindActions */);
}
private void bindButton(ImageButton button, @ActionType int action) {
@@ -328,7 +317,7 @@ public class AppHeaderController {
}
private void setText(@IdRes int id, CharSequence text) {
TextView textView = (TextView) mAppHeader.findViewById(id);
TextView textView = mAppHeader.findViewById(id);
if (textView != null) {
textView.setText(text);
textView.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE);

View File

@@ -16,6 +16,8 @@
package com.android.settings.applications;
import static com.android.settings.applications.AppHeaderController.ActionType;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.preference.Preference;
@@ -24,8 +26,6 @@ import android.util.Log;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.AppUtils;
import static com.android.settings.applications.AppHeaderController.ActionType;
public abstract class AppInfoWithHeader extends AppInfoBase {
private boolean mCreated;
@@ -41,16 +41,16 @@ public abstract class AppInfoWithHeader extends AppInfoBase {
if (mPackageInfo == null) return;
final Activity activity = getActivity();
final Preference pref = FeatureFactory.getFactory(activity)
.getApplicationFeatureProvider(activity)
.newAppHeaderController(this, null /* appHeader */)
.setIcon(mPackageInfo.applicationInfo.loadIcon(mPm))
.setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
.setSummary(mPackageInfo)
.setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
.setPackageName(mPackageName)
.setUid(mPackageInfo.applicationInfo.uid)
.setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE)
.done(getPrefContext());
.getApplicationFeatureProvider(activity)
.newAppHeaderController(this, null /* appHeader */)
.setIcon(mPackageInfo.applicationInfo.loadIcon(mPm))
.setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
.setSummary(mPackageInfo)
.setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
.setPackageName(mPackageName)
.setUid(mPackageInfo.applicationInfo.uid)
.setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE)
.done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
}
}

View File

@@ -16,8 +16,9 @@
package com.android.settings.applications;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import android.Manifest.permission;
import android.annotation.IdRes;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
@@ -115,8 +116,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
/**
* Activity to display application information from Settings. This activity presents
* extended information associated with a package like code, data, total size, permissions
@@ -413,12 +412,13 @@ public class InstalledAppDetails extends AppInfoBase
mHeader = (LayoutPreference) findPreference(KEY_HEADER);
mActionButtons = (LayoutPreference) findPreference(KEY_ACTION_BUTTONS);
FeatureFactory.getFactory(activity)
.getApplicationFeatureProvider(activity)
.newAppHeaderController(this, mHeader.findViewById(R.id.app_snippet))
.setPackageName(mPackageName)
.setButtonActions(AppHeaderController.ActionType.ACTION_STORE_DEEP_LINK,
AppHeaderController.ActionType.ACTION_APP_PREFERENCE)
.bindAppHeaderButtons();
.getApplicationFeatureProvider(activity)
.newAppHeaderController(this, mHeader.findViewById(R.id.app_snippet))
.setPackageName(mPackageName)
.setButtonActions(AppHeaderController.ActionType.ACTION_STORE_DEEP_LINK,
AppHeaderController.ActionType.ACTION_APP_PREFERENCE)
.styleActionBar(activity)
.bindAppHeaderButtons();
prepareUninstallAndStop();
mNotificationPreference = findPreference(KEY_NOTIFICATION);
@@ -590,7 +590,7 @@ public class InstalledAppDetails extends AppInfoBase
.setIcon(mAppEntry)
.setSummary(summary)
.setIsInstantApp(isInstantApp)
.done(false /* rebindActions */);
.done(activity, false /* rebindActions */);
mVersionPreference.setSummary(getString(R.string.version_text, pkgInfo.versionName));
}

View File

@@ -16,6 +16,8 @@
package com.android.settings.applications;
import static com.android.settings.applications.AppHeaderController.ActionType;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
@@ -58,8 +60,6 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import static com.android.settings.applications.AppHeaderController.ActionType;
public class ProcessStatsDetail extends SettingsPreferenceFragment {
private static final String TAG = "ProcessStatsDetail";
@@ -137,7 +137,7 @@ public class ProcessStatsDetail extends SettingsPreferenceFragment {
? mApp.mUiTargetApp.uid
: UserHandle.USER_NULL)
.setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE)
.done(getPrefContext());
.done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
}

View File

@@ -14,6 +14,8 @@
package com.android.settings.datausage;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
import android.app.Activity;
import android.app.LoaderManager;
import android.content.Context;
@@ -57,8 +59,6 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
public class AppDataUsage extends DataUsageBase implements Preference.OnPreferenceChangeListener,
DataSaverBackend.Listener {
@@ -362,7 +362,7 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
.setUid(uid)
.setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NONE)
.done(getPrefContext());
.done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
}

View File

@@ -17,16 +17,12 @@
package com.android.settings.fuelgauge;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.BatteryStats;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
@@ -179,7 +175,7 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase implements
@VisibleForTesting
void initHeader() {
final View appSnippet = mHeaderPreference.findViewById(R.id.app_snippet);
final Context context = getContext();
final Activity context = getActivity();
final Bundle bundle = getArguments();
AppHeaderController controller = FeatureFactory.getFactory(context)
.getApplicationFeatureProvider(context)
@@ -203,7 +199,7 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase implements
controller.setSummary(getString(Utils.getInstallationStatus(mAppEntry.info)));
}
controller.done(true /* rebindActions */);
controller.done(context, true /* rebindActions */);
}
@Override

View File

@@ -49,7 +49,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
/** These settings are per app, so should not be returned in global search results. */
public class AppNotificationSettings extends NotificationSettingsBase {
@@ -109,8 +108,9 @@ public class AppNotificationSettings extends NotificationSettingsBase {
}
}.execute();
final Preference pref = FeatureFactory.getFactory(getActivity())
.getApplicationFeatureProvider(getActivity())
final Activity activity = getActivity();
final Preference pref = FeatureFactory.getFactory(activity)
.getApplicationFeatureProvider(activity)
.newAppHeaderController(this /* fragment */, null /* appHeader */)
.setIcon(mAppRow.icon)
.setLabel(mAppRow.label)
@@ -118,7 +118,7 @@ public class AppNotificationSettings extends NotificationSettingsBase {
.setUid(mAppRow.uid)
.setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
.done(getPrefContext());
.done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) {

View File

@@ -21,6 +21,7 @@ import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -111,8 +112,9 @@ public class ChannelNotificationSettings extends NotificationSettingsBase {
setupBlockAndImportance();
updateDependents();
}
final Preference pref = FeatureFactory.getFactory(getActivity())
.getApplicationFeatureProvider(getActivity())
final Activity activity = getActivity();
final Preference pref = FeatureFactory.getFactory(activity)
.getApplicationFeatureProvider(activity)
.newAppHeaderController(this /* fragment */, null /* appHeader */)
.setIcon(mAppRow.icon)
.setLabel(mChannel.getName())
@@ -121,7 +123,7 @@ public class ChannelNotificationSettings extends NotificationSettingsBase {
.setUid(mAppRow.uid)
.setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
.done(getPrefContext());
.done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
if (mAppRow.settingsIntent != null) {

View File

@@ -17,6 +17,15 @@
package com.android.settings.applications;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
@@ -24,6 +33,7 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.support.v7.preference.Preference;
import android.view.LayoutInflater;
@@ -34,7 +44,6 @@ import android.widget.TextView;
import com.android.settings.R;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before;
import org.junit.Test;
@@ -45,14 +54,6 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AppHeaderControllerTest {
@@ -60,11 +61,9 @@ public class AppHeaderControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ApplicationsState.AppEntry mAppEntry;
private Activity mActivity;
@Mock
private Fragment mFragment;
@Mock
private View mAppHeader;
private Context mShadowContext;
private LayoutInflater mLayoutInflater;
@@ -85,7 +84,7 @@ public class AppHeaderControllerTest {
@Test
public void testBuildView_constructedWithoutView_shouldCreateNewView() {
mController = new AppHeaderController(mShadowContext, mFragment, null);
View view = mController.done();
View view = mController.done(mActivity);
assertThat(view).isNotNull();
}
@@ -93,7 +92,7 @@ public class AppHeaderControllerTest {
@Test
public void testBuildView_withContext_shouldBuildPreference() {
mController = new AppHeaderController(mShadowContext, mFragment, null);
Preference preference = mController.done(mShadowContext);
Preference preference = mController.done(mActivity, mShadowContext);
assertThat(preference instanceof LayoutPreference).isTrue();
}
@@ -102,7 +101,7 @@ public class AppHeaderControllerTest {
public void testBuildView_constructedWithView_shouldReturnSameView() {
View inputView = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
mController = new AppHeaderController(mShadowContext, mFragment, inputView);
View view = mController.done();
View view = mController.done(mActivity);
assertThat(view).isSameAs(inputView);
}
@@ -111,14 +110,14 @@ public class AppHeaderControllerTest {
public void bindViews_shouldBindAllData() {
final String testString = "test";
final View appHeader = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
final TextView label = (TextView) appHeader.findViewById(R.id.app_detail_title);
final TextView version = (TextView) appHeader.findViewById(R.id.app_detail_summary);
final TextView label = appHeader.findViewById(R.id.app_detail_title);
final TextView version = appHeader.findViewById(R.id.app_detail_summary);
mController = new AppHeaderController(mShadowContext, mFragment, appHeader);
mController.setLabel(testString);
mController.setSummary(testString);
mController.setIcon(mShadowContext.getDrawable(R.drawable.ic_add));
mController.done();
mController.done(mActivity);
assertThat(label.getText()).isEqualTo(testString);
assertThat(version.getText()).isEqualTo(testString);
@@ -139,7 +138,7 @@ public class AppHeaderControllerTest {
mController.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_PREFERENCE,
AppHeaderController.ActionType.ACTION_NONE);
mController.done();
mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.VISIBLE);
@@ -164,7 +163,7 @@ public class AppHeaderControllerTest {
mController.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_PREFERENCE,
AppHeaderController.ActionType.ACTION_NONE);
mController.done();
mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.GONE);
@@ -183,7 +182,7 @@ public class AppHeaderControllerTest {
mController.setButtonActions(
AppHeaderController.ActionType.ACTION_STORE_DEEP_LINK,
AppHeaderController.ActionType.ACTION_NONE);
mController.done();
mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.GONE);
@@ -201,7 +200,7 @@ public class AppHeaderControllerTest {
.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NONE);
mController.done();
mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.GONE);
@@ -221,7 +220,7 @@ public class AppHeaderControllerTest {
.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE);
mController.done();
mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.VISIBLE);
@@ -242,7 +241,7 @@ public class AppHeaderControllerTest {
.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE);
mController.done();
mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getContentDescription())
.isEqualTo("App Info");
@@ -258,7 +257,7 @@ public class AppHeaderControllerTest {
.setButtonActions(
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE,
AppHeaderController.ActionType.ACTION_NONE);
mController.done();
mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.VISIBLE);
@@ -272,7 +271,7 @@ public class AppHeaderControllerTest {
public void instantApps_normalAppsDontGetLabel() {
final View appHeader = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
mController = new AppHeaderController(mContext, mFragment, appHeader);
mController.done();
mController.done(mActivity);
assertThat(appHeader.findViewById(R.id.install_type).getVisibility())
.isEqualTo(View.GONE);
}
@@ -283,7 +282,7 @@ public class AppHeaderControllerTest {
public void instantApps_normalAppsDontGetInstantAppsBadge() {
final View appHeader = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
mController = new AppHeaderController(mContext, mFragment, appHeader);
mController.done();
mController.done(mActivity);
assertThat(appHeader.findViewById(R.id.app_icon_instant_apps_badge).getVisibility())
.isEqualTo(View.GONE);
}
@@ -294,8 +293,8 @@ public class AppHeaderControllerTest {
final View appHeader = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
mController = new AppHeaderController(mContext, mFragment, appHeader);
mController.setIsInstantApp(true);
mController.done();
TextView label = (TextView)appHeader.findViewById(R.id.install_type);
mController.done(mActivity);
TextView label = appHeader.findViewById(R.id.install_type);
ImageView badgeView = appHeader.findViewById(R.id.app_icon_instant_apps_badge);
assertThat(badgeView.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(label.getVisibility()).isEqualTo(View.VISIBLE);
@@ -305,6 +304,29 @@ public class AppHeaderControllerTest {
.isEqualTo(View.GONE);
}
@Test
public void styleActionBar_invalidObjects_shouldNotCrash() {
mController = new AppHeaderController(mShadowContext, mFragment, null);
mController.styleActionBar(null);
when(mActivity.getActionBar()).thenReturn(null);
mController.styleActionBar(mActivity);
verify(mActivity).getActionBar();
}
@Test
public void styleActionBar_setElevationAndBackground() {
final ActionBar actionBar = mActivity.getActionBar();
mController = new AppHeaderController(mShadowContext, mFragment, null);
mController.styleActionBar(mActivity);
verify(actionBar).setElevation(0);
verify(actionBar).setBackgroundDrawable(any(Drawable.class));
}
@Test
public void initAppHeaderController_appHeaderNull_useFragmentContext() {
mController = new AppHeaderController(mContext, mFragment, null);

View File

@@ -17,7 +17,18 @@
package com.android.settings.fuelgauge;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -25,12 +36,12 @@ import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.BatteryStats;
import android.os.Bundle;
import android.os.UserHandle;
import android.view.View;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.SettingsActivity;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.applications.AppHeaderController;
import com.android.settings.applications.LayoutPreference;
@@ -46,22 +57,10 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@RunWith(RobolectricTestRunner.class)
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AdvancedPowerUsageDetailTest {
private static final String APP_LABEL = "app label";
@@ -77,6 +76,8 @@ public class AdvancedPowerUsageDetailTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Activity mActivity;
@Mock
private AppHeaderController mAppHeaderController;
@Mock
@@ -86,8 +87,6 @@ public class AdvancedPowerUsageDetailTest {
@Mock
private ApplicationsState.AppEntry mAppEntry;
@Mock
private Drawable mIconDrawable;
@Mock
private Bundle mBundle;
@Mock
private BatteryEntry mBatteryEntry;
@@ -111,6 +110,7 @@ public class AdvancedPowerUsageDetailTest {
mFragment = spy(new AdvancedPowerUsageDetail());
doReturn(mContext).when(mFragment).getContext();
doReturn(mActivity).when(mFragment).getActivity();
doReturn(SUMMARY).when(mFragment).getString(anyInt());
doReturn(APP_LABEL).when(mBundle).getString(anyString());
doReturn(mBundle).when(mFragment).getArguments();