Snap for 4656203 from eb029cffaf to pi-release
Change-Id: Ic8b6b9ba9a3250425f27a285513e9d2876dc2f21
This commit is contained in:
45
res/drawable/data_usage_progress.xml
Normal file
45
res/drawable/data_usage_progress.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2018 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.
|
||||
-->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@android:id/background">
|
||||
<shape android:shape="rectangle"
|
||||
android:tint="?android:attr/colorControlActivated">
|
||||
<corners android:radius="5dp" />
|
||||
<size android:height="10dp" />
|
||||
<solid android:color="@color/white_disabled" />
|
||||
</shape>
|
||||
</item>
|
||||
<item android:id="@android:id/secondaryProgress">
|
||||
<scale android:scaleWidth="100%">
|
||||
<shape android:shape="rectangle"
|
||||
android:tint="?android:attr/colorControlActivated">
|
||||
<corners android:radius="5dp" />
|
||||
<size android:height="10dp" />
|
||||
<solid android:color="@color/white_disabled" />
|
||||
</shape>
|
||||
</scale>
|
||||
</item>
|
||||
<item android:id="@android:id/progress">
|
||||
<scale android:scaleWidth="100%">
|
||||
<shape android:shape="rectangle"
|
||||
android:tint="?android:attr/colorControlActivated">
|
||||
<corners android:radius="5dp" />
|
||||
<size android:height="10dp" />
|
||||
<solid android:color="@android:color/black" />
|
||||
</shape>
|
||||
</scale>
|
||||
</item>
|
||||
</layer-list>
|
||||
@@ -18,6 +18,8 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="24dp"
|
||||
android:paddingBottom="32dp"
|
||||
android:paddingStart="@dimen/preference_no_icon_padding_start"
|
||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||
android:orientation="vertical"
|
||||
@@ -31,36 +33,31 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
android:paddingBottom="5dp"
|
||||
android:text="@string/data_usage_title" />
|
||||
|
||||
<TextView
|
||||
android:id="@android:id/title"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingBottom="4dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:fontFamily="@*android:string/config_headlineFontFamily"
|
||||
android:textColor="?android:attr/colorAccent"
|
||||
android:textAppearance="@android:style/TextAppearance.Material.Large" />
|
||||
|
||||
<TextView
|
||||
android:id="@android:id/summary"
|
||||
<android.widget.ProgressBar
|
||||
android:id="@+id/determinateBar"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
android:paddingBottom="5dp" />
|
||||
|
||||
<com.android.settings.widget.LinearColorBar
|
||||
android:id="@+id/color_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="28dp" />
|
||||
android:layout_height="10dp"
|
||||
android:progressDrawable="@drawable/data_usage_progress"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/label_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="2dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingBottom="8dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView android:id="@android:id/text1"
|
||||
@@ -84,18 +81,18 @@
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cycle_left_time"
|
||||
android:paddingTop="4dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="5dp" />
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/carrier_and_update"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="5dp" />
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/launch_mdp_app_button"
|
||||
android:paddingTop="12dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="left"
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
android:scrollIndicators="top|bottom">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/l_wifidialog"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
|
||||
@@ -8657,6 +8657,9 @@
|
||||
<!-- Label for cellular data usage in data usage screen [CHAR LIMIT=60] -->
|
||||
<string name="cellular_data_usage">Mobile data usage</string>
|
||||
|
||||
<!-- App data usage, as seen from the platform, in data usage screen [CHAR LIMIT=60] -->
|
||||
<string name="app_cellular_data_usage">App data usage</string>
|
||||
|
||||
<!-- Label for wifi data usage in data usage screen [CHAR LIMIT=60] -->
|
||||
<string name="wifi_data_usage">Wi-Fi data usage</string>
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.VectorDrawable;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.LinkProperties;
|
||||
@@ -929,7 +930,7 @@ public final class Utils extends com.android.settingslib.Utils {
|
||||
*/
|
||||
public static void setSafeIcon(Preference pref, Drawable icon) {
|
||||
Drawable safeIcon = icon;
|
||||
if (icon != null) {
|
||||
if ((icon != null) && !(icon instanceof VectorDrawable)) {
|
||||
safeIcon = getSafeDrawable(icon, 500, 500);
|
||||
}
|
||||
pref.setIcon(safeIcon);
|
||||
|
||||
@@ -26,7 +26,9 @@ import android.app.Fragment;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Binder;
|
||||
import android.os.Bundle;
|
||||
@@ -34,7 +36,6 @@ import android.os.IBinder;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.IconDrawableFactory;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
|
||||
import com.android.internal.accessibility.AccessibilityShortcutController;
|
||||
@@ -45,7 +46,6 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settings.widget.RadioButtonPickerFragment;
|
||||
import com.android.settings.widget.RadioButtonPreference;
|
||||
import com.android.settingslib.accessibility.AccessibilityUtils;
|
||||
import com.android.settingslib.applications.DefaultAppInfo;
|
||||
import com.android.settingslib.widget.CandidateInfo;
|
||||
import com.android.settingslib.wrapper.PackageManagerWrapper;
|
||||
|
||||
@@ -71,13 +71,11 @@ public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
|
||||
@Override
|
||||
protected List<? extends CandidateInfo> getCandidates() {
|
||||
final Context context = getContext();
|
||||
final PackageManager pm = context.getPackageManager();
|
||||
final AccessibilityManager accessibilityManager = context
|
||||
.getSystemService(AccessibilityManager.class);
|
||||
final List<AccessibilityServiceInfo> installedServices =
|
||||
accessibilityManager.getInstalledAccessibilityServiceList();
|
||||
final int numInstalledServices = installedServices.size();
|
||||
final PackageManagerWrapper pmw = new PackageManagerWrapper(context.getPackageManager());
|
||||
|
||||
final List<CandidateInfo> candidates = new ArrayList<>(numInstalledServices);
|
||||
Map<ComponentName, ToggleableFrameworkFeatureInfo> frameworkFeatureInfoMap =
|
||||
@@ -95,10 +93,7 @@ public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
|
||||
iconId, componentName.flattenToString()));
|
||||
}
|
||||
for (int i = 0; i < numInstalledServices; i++) {
|
||||
final AccessibilityServiceInfo installedServiceInfo = installedServices.get(i);
|
||||
candidates.add(new DefaultAppInfo(context, pmw, UserHandle.myUserId(),
|
||||
installedServiceInfo.getComponentName(),
|
||||
(String) installedServiceInfo.loadSummary(pm), true /* enabled */));
|
||||
candidates.add(new ServiceCandidateInfo(installedServices.get(i)));
|
||||
}
|
||||
|
||||
return candidates;
|
||||
@@ -196,9 +191,9 @@ public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
|
||||
}
|
||||
|
||||
private class FrameworkCandidateInfo extends CandidateInfo {
|
||||
ToggleableFrameworkFeatureInfo mToggleableFrameworkFeatureInfo;
|
||||
int mIconResId;
|
||||
String mKey;
|
||||
final ToggleableFrameworkFeatureInfo mToggleableFrameworkFeatureInfo;
|
||||
final int mIconResId;
|
||||
final String mKey;
|
||||
|
||||
public FrameworkCandidateInfo(
|
||||
ToggleableFrameworkFeatureInfo frameworkFeatureInfo, int iconResId, String key) {
|
||||
@@ -223,4 +218,49 @@ public class ShortcutServicePickerFragment extends RadioButtonPickerFragment {
|
||||
return mKey;
|
||||
}
|
||||
}
|
||||
|
||||
private class ServiceCandidateInfo extends CandidateInfo {
|
||||
final AccessibilityServiceInfo mServiceInfo;
|
||||
|
||||
public ServiceCandidateInfo(AccessibilityServiceInfo serviceInfo) {
|
||||
super(true /* enabled */);
|
||||
mServiceInfo = serviceInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence loadLabel() {
|
||||
final PackageManagerWrapper pmw =
|
||||
new PackageManagerWrapper(getContext().getPackageManager());
|
||||
final CharSequence label =
|
||||
mServiceInfo.getResolveInfo().serviceInfo.loadLabel(pmw.getPackageManager());
|
||||
if (label != null) {
|
||||
return label;
|
||||
}
|
||||
|
||||
final ComponentName componentName = mServiceInfo.getComponentName();
|
||||
if (componentName != null) {
|
||||
try {
|
||||
final ApplicationInfo appInfo = pmw.getApplicationInfoAsUser(
|
||||
componentName.getPackageName(), 0, UserHandle.myUserId());
|
||||
return appInfo.loadLabel(pmw.getPackageManager());
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Drawable loadIcon() {
|
||||
final ResolveInfo resolveInfo = mServiceInfo.getResolveInfo();
|
||||
return (resolveInfo.getIconResource() == 0)
|
||||
? getContext().getDrawable(R.mipmap.ic_accessibility_generic)
|
||||
: resolveInfo.loadIcon(getContext().getPackageManager());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
return mServiceInfo.getComponentName().flattenToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,9 +23,11 @@ import android.support.v4.content.res.TypedArrayUtils;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.text.format.Formatter;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.FeatureFlagUtils;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.FeatureFlags;
|
||||
import com.android.settings.core.SubSettingLauncher;
|
||||
import com.android.settingslib.net.DataUsageController;
|
||||
|
||||
@@ -53,8 +55,13 @@ public class DataUsagePreference extends Preference implements TemplatePreferenc
|
||||
mSubId = subId;
|
||||
DataUsageController controller = new DataUsageController(getContext());
|
||||
DataUsageController.DataUsageInfo usageInfo = controller.getDataUsageInfo(mTemplate);
|
||||
setSummary(getContext().getString(R.string.data_usage_template,
|
||||
Formatter.formatFileSize(getContext(), usageInfo.usageLevel), usageInfo.period));
|
||||
if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.DATA_USAGE_SETTINGS_V2)) {
|
||||
setTitle(getContext().getString(R.string.app_cellular_data_usage));
|
||||
} else {
|
||||
setTitle(getContext().getString(R.string.cellular_data_usage));
|
||||
setSummary(getContext().getString(R.string.data_usage_template,
|
||||
Formatter.formatFileSize(getContext(), usageInfo.usageLevel), usageInfo.period));
|
||||
}
|
||||
setIntent(getIntent());
|
||||
}
|
||||
|
||||
@@ -67,10 +74,14 @@ public class DataUsagePreference extends Preference implements TemplatePreferenc
|
||||
.setArguments(args)
|
||||
.setDestination(DataUsageList.class.getName())
|
||||
.setSourceMetricsCategory(MetricsProto.MetricsEvent.VIEW_UNKNOWN);
|
||||
if (mTitleRes > 0) {
|
||||
launcher.setTitle(mTitleRes);
|
||||
if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.DATA_USAGE_SETTINGS_V2)) {
|
||||
launcher.setTitle(getContext().getString(R.string.app_cellular_data_usage));
|
||||
} else {
|
||||
if (mTitleRes > 0) {
|
||||
launcher.setTitle(mTitleRes);
|
||||
} else {
|
||||
launcher.setTitle(getTitle());
|
||||
}
|
||||
}
|
||||
return launcher.toIntent();
|
||||
}
|
||||
|
||||
@@ -18,14 +18,16 @@ package com.android.settings.datausage;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceViewHolder;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SummaryPreference;
|
||||
import com.android.settingslib.utils.StringUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
@@ -33,7 +35,11 @@ import java.util.Objects;
|
||||
/**
|
||||
* Provides a summary of data usage.
|
||||
*/
|
||||
public class DataUsageSummaryPreference extends SummaryPreference {
|
||||
public class DataUsageSummaryPreference extends Preference {
|
||||
|
||||
private boolean mChartEnabled = true;
|
||||
private String mStartLabel;
|
||||
private String mEndLabel;
|
||||
|
||||
private int mNumPlans;
|
||||
/** The ending time of the billing cycle in milliseconds since epoch. */
|
||||
@@ -45,6 +51,9 @@ public class DataUsageSummaryPreference extends SummaryPreference {
|
||||
private String mLimitInfoText;
|
||||
private Intent mLaunchIntent;
|
||||
|
||||
/** Progress to display on ProgressBar */
|
||||
private float mProgress;
|
||||
|
||||
public DataUsageSummaryPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setLayoutResource(R.layout.data_usage_summary_preference);
|
||||
@@ -57,6 +66,11 @@ public class DataUsageSummaryPreference extends SummaryPreference {
|
||||
}
|
||||
}
|
||||
|
||||
public void setProgress(float progress) {
|
||||
mProgress = progress;
|
||||
notifyChanged();
|
||||
}
|
||||
|
||||
public void setUsageInfo(long cycleEnd, long snapshotTime, CharSequence carrierName,
|
||||
int numPlans, Intent launchIntent) {
|
||||
mCycleEndTimeMs = cycleEnd;
|
||||
@@ -67,10 +81,33 @@ public class DataUsageSummaryPreference extends SummaryPreference {
|
||||
notifyChanged();
|
||||
}
|
||||
|
||||
public void setChartEnabled(boolean enabled) {
|
||||
if (mChartEnabled != enabled) {
|
||||
mChartEnabled = enabled;
|
||||
notifyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public void setLabels(String start, String end) {
|
||||
mStartLabel = start;
|
||||
mEndLabel = end;
|
||||
notifyChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
||||
super.onBindViewHolder(holder);
|
||||
|
||||
if (mChartEnabled && (!TextUtils.isEmpty(mStartLabel) || !TextUtils.isEmpty(mEndLabel))) {
|
||||
holder.findViewById(R.id.label_bar).setVisibility(View.VISIBLE);
|
||||
ProgressBar bar = (ProgressBar) holder.findViewById(R.id.determinateBar);
|
||||
bar.setProgress((int) (mProgress * 100));
|
||||
((TextView) holder.findViewById(android.R.id.text1)).setText(mStartLabel);
|
||||
((TextView) holder.findViewById(android.R.id.text2)).setText(mEndLabel);
|
||||
} else {
|
||||
holder.findViewById(R.id.label_bar).setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
TextView usageTitle = (TextView) holder.findViewById(R.id.usage_title);
|
||||
usageTitle.setVisibility(mNumPlans > 1 ? View.VISIBLE : View.GONE);
|
||||
|
||||
|
||||
@@ -194,8 +194,7 @@ public class DataUsageSummaryPreferenceController extends BasePreferenceControll
|
||||
summaryPreference.setChartEnabled(true);
|
||||
summaryPreference.setLabels(Formatter.formatFileSize(mContext, 0 /* sizeBytes */),
|
||||
Formatter.formatFileSize(mContext, mDataplanSize));
|
||||
summaryPreference.setRatios(mDataplanUse / (float) mDataplanSize, 0 /* middle */,
|
||||
(mDataplanSize - mDataplanUse) / (float) mDataplanSize);
|
||||
summaryPreference.setProgress(mDataplanUse / (float) mDataplanSize);
|
||||
}
|
||||
summaryPreference.setUsageInfo(mCycleEnd, mSnapshotTime, mCarrierName,
|
||||
mDataplanCount, mManageSubscriptionIntent);
|
||||
|
||||
@@ -31,8 +31,9 @@ import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Process;
|
||||
import android.os.StatsDimensionsValue;
|
||||
import android.os.SystemPropertiesProto;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.provider.Settings;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
@@ -122,7 +123,8 @@ public class AnomalyDetectionJobService extends JobService {
|
||||
final boolean smartBatteryOn = Settings.Global.getInt(contentResolver,
|
||||
Settings.Global.APP_STANDBY_ENABLED, ON) == ON;
|
||||
final String packageName = batteryUtils.getPackageName(uid);
|
||||
if (!powerWhitelistBackend.isSysWhitelisted(packageName)) {
|
||||
if (!powerWhitelistBackend.isSysWhitelistedExceptIdle(packageName)
|
||||
&& !isSystemUid(uid)) {
|
||||
if (anomalyType == StatsManagerConfig.AnomalyType.EXCESSIVE_BG) {
|
||||
// TODO(b/72385333): check battery percentage draining in batterystats
|
||||
if (batteryUtils.isLegacyApp(packageName) && batteryUtils.isAppHeavilyUsed(
|
||||
@@ -156,7 +158,7 @@ public class AnomalyDetectionJobService extends JobService {
|
||||
* 3. Bluetooth anomaly: 3:{1:{1:{1:10140|}|}|}
|
||||
*/
|
||||
@VisibleForTesting
|
||||
final int extractUidFromStatsDimensionsValue(StatsDimensionsValue statsDimensionsValue) {
|
||||
int extractUidFromStatsDimensionsValue(StatsDimensionsValue statsDimensionsValue) {
|
||||
//TODO(b/73172999): Add robo test for this method
|
||||
if (statsDimensionsValue == null) {
|
||||
return UID_NULL;
|
||||
@@ -178,4 +180,9 @@ public class AnomalyDetectionJobService extends JobService {
|
||||
|
||||
return UID_NULL;
|
||||
}
|
||||
|
||||
private boolean isSystemUid(int uid) {
|
||||
final int appUid = UserHandle.getAppId(uid);
|
||||
return appUid >= Process.ROOT_UID && appUid < Process.FIRST_APPLICATION_UID;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,9 @@ import android.widget.LinearLayout;
|
||||
|
||||
import com.android.settings.Utils;
|
||||
|
||||
/**
|
||||
* @Deprecated Use {@link android.widget.ProgressBar} instead.
|
||||
*/
|
||||
public class LinearColorBar extends LinearLayout {
|
||||
|
||||
static final int RIGHT_COLOR = 0xffced7db;
|
||||
|
||||
@@ -363,6 +363,9 @@ public class WifiConfigController implements TextWatcher,
|
||||
if (mConfigUi.getSubmitButton() != null) {
|
||||
enableSubmitIfAppropriate();
|
||||
}
|
||||
|
||||
// After done view show and hide, request focus from parent view
|
||||
mView.findViewById(R.id.l_wifidialog).requestFocus();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -1216,6 +1219,11 @@ public class WifiConfigController implements TextWatcher,
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
KeyStore getKeyStore() {
|
||||
return KeyStore.getInstance();
|
||||
}
|
||||
|
||||
private void loadCertificates(
|
||||
Spinner spinner,
|
||||
String prefix,
|
||||
@@ -1232,8 +1240,12 @@ public class WifiConfigController implements TextWatcher,
|
||||
if (showUsePreinstalledCertOption) {
|
||||
certs.add(mUseSystemCertsString);
|
||||
}
|
||||
certs.addAll(
|
||||
Arrays.asList(KeyStore.getInstance().list(prefix, android.os.Process.WIFI_UID)));
|
||||
try {
|
||||
certs.addAll(
|
||||
Arrays.asList(getKeyStore().list(prefix, android.os.Process.WIFI_UID)));
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "can't get the certificate list from KeyStore");
|
||||
}
|
||||
certs.add(noCertificateString);
|
||||
|
||||
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
|
||||
|
||||
@@ -24,6 +24,8 @@ import android.support.v7.preference.PreferenceViewHolder;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.settings.R;
|
||||
@@ -54,6 +56,10 @@ public class DataUsageSummaryPreferenceTest {
|
||||
private TextView mCarrierInfo;
|
||||
private TextView mDataLimits;
|
||||
private Button mLaunchButton;
|
||||
private LinearLayout mLabelBar;
|
||||
private TextView mLabel1;
|
||||
private TextView mLabel2;
|
||||
private ProgressBar mProgressBar;
|
||||
|
||||
private long mCycleEnd;
|
||||
private long mUpdateTime;
|
||||
@@ -159,6 +165,46 @@ public class DataUsageSummaryPreferenceTest {
|
||||
assertThat(mDataLimits.getVisibility()).isEqualTo(View.GONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetChartEnabledFalse_hidesLabelBar() {
|
||||
setValidLabels();
|
||||
mSummaryPreference.setChartEnabled(false);
|
||||
|
||||
bindViewHolder();
|
||||
assertThat(mLabelBar.getVisibility()).isEqualTo(View.GONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetEmptyLabels_hidesLabelBar() {
|
||||
mSummaryPreference.setLabels("", "");
|
||||
|
||||
bindViewHolder();
|
||||
assertThat(mLabelBar.getVisibility()).isEqualTo(View.GONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLabelBar_isVisible_whenLabelsSet() {
|
||||
setValidLabels();
|
||||
//mChartEnabled defaults to true
|
||||
|
||||
bindViewHolder();
|
||||
assertThat(mLabelBar.getVisibility()).isEqualTo(View.VISIBLE);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testSetProgress_updatesProgressBar() {
|
||||
setValidLabels();
|
||||
mSummaryPreference.setProgress(.5f);
|
||||
|
||||
bindViewHolder();
|
||||
assertThat(mProgressBar.getProgress()).isEqualTo(50);
|
||||
}
|
||||
|
||||
private void setValidLabels() {
|
||||
mSummaryPreference.setLabels("0.0 GB", "5.0 GB");
|
||||
}
|
||||
|
||||
private void bindViewHolder() {
|
||||
mSummaryPreference.onBindViewHolder(mHolder);
|
||||
mUsageTitle = (TextView) mHolder.findViewById(R.id.usage_title);
|
||||
@@ -166,5 +212,9 @@ public class DataUsageSummaryPreferenceTest {
|
||||
mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update);
|
||||
mDataLimits = (TextView) mHolder.findViewById(R.id.data_limits);
|
||||
mLaunchButton = (Button) mHolder.findViewById(R.id.launch_mdp_app_button);
|
||||
mLabelBar = (LinearLayout) mHolder.findViewById(R.id.label_bar);
|
||||
mLabel1 = (TextView) mHolder.findViewById(R.id.text1);
|
||||
mLabel2 = (TextView) mHolder.findViewById(R.id.text2);
|
||||
mProgressBar = (ProgressBar) mHolder.findViewById(R.id.determinateBar);
|
||||
}
|
||||
}
|
||||
@@ -18,11 +18,13 @@ package com.android.settings.fuelgauge.batterytip;
|
||||
|
||||
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.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.robolectric.RuntimeEnvironment.application;
|
||||
|
||||
@@ -32,6 +34,7 @@ import android.app.job.JobScheduler;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Process;
|
||||
import android.os.StatsDimensionsValue;
|
||||
import android.os.UserManager;
|
||||
|
||||
@@ -84,7 +87,7 @@ public class AnomalyDetectionJobServiceTest {
|
||||
mBundle = new Bundle();
|
||||
mBundle.putParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE, mStatsDimensionsValue);
|
||||
|
||||
mAnomalyDetectionJobService = new AnomalyDetectionJobService();
|
||||
mAnomalyDetectionJobService = spy(new AnomalyDetectionJobService());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -92,13 +95,14 @@ public class AnomalyDetectionJobServiceTest {
|
||||
AnomalyDetectionJobService.scheduleAnomalyDetection(application, new Intent());
|
||||
|
||||
ShadowJobScheduler shadowJobScheduler =
|
||||
Shadows.shadowOf(application.getSystemService(JobScheduler.class));
|
||||
Shadows.shadowOf(application.getSystemService(JobScheduler.class));
|
||||
List<JobInfo> pendingJobs = shadowJobScheduler.getAllPendingJobs();
|
||||
assertThat(pendingJobs).hasSize(1);
|
||||
|
||||
JobInfo pendingJob = pendingJobs.get(0);
|
||||
assertThat(pendingJob.getId()).isEqualTo(R.id.job_anomaly_detection);
|
||||
assertThat(pendingJob.getMaxExecutionDelayMillis())
|
||||
.isEqualTo(TimeUnit.MINUTES.toMillis(30));
|
||||
.isEqualTo(TimeUnit.MINUTES.toMillis(30));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -114,10 +118,25 @@ public class AnomalyDetectionJobServiceTest {
|
||||
anyInt(), anyLong());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSaveAnomalyToDatabase_systemUid_doNotSave() {
|
||||
doReturn(Process.SYSTEM_UID).when(
|
||||
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
|
||||
|
||||
mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
|
||||
mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
|
||||
mContext.getContentResolver(), mBundle);
|
||||
|
||||
verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
|
||||
anyInt(), anyLong());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSaveAnomalyToDatabase_normalApp_save() {
|
||||
doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
|
||||
doReturn(false).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
|
||||
doReturn(Process.FIRST_APPLICATION_UID).when(
|
||||
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
|
||||
|
||||
mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
|
||||
mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
|
||||
|
||||
@@ -20,11 +20,14 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.anyBoolean;
|
||||
import static org.mockito.Mockito.anyInt;
|
||||
import static org.mockito.Mockito.anyString;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.ServiceSpecificException;
|
||||
import android.security.KeyStore;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -56,6 +59,8 @@ public class WifiConfigControllerTest {
|
||||
private View mView;
|
||||
@Mock
|
||||
private AccessPoint mAccessPoint;
|
||||
@Mock
|
||||
private KeyStore mKeyStore;
|
||||
|
||||
public WifiConfigController mController;
|
||||
private static final String HEX_PSK = "01234567012345670123456701234567012345670123456701234567"
|
||||
@@ -210,6 +215,37 @@ public class WifiConfigControllerTest {
|
||||
assertThat(mView.findViewById(R.id.eap).getVisibility()).isEqualTo(View.GONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadCertificates_keyStoreListFail_shouldNotCrash() {
|
||||
// Set up
|
||||
when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
|
||||
when(mKeyStore.list(anyString()))
|
||||
.thenThrow(new ServiceSpecificException(-1, "permission error"));
|
||||
|
||||
mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
|
||||
WifiConfigUiBase.MODE_CONNECT);
|
||||
|
||||
// Verify that the EAP method menu is visible.
|
||||
assertThat(mView.findViewById(R.id.eap).getVisibility()).isEqualTo(View.VISIBLE);
|
||||
// No Crash
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ssidGetFocus_addNewNetwork_shouldReturnTrue() {
|
||||
mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
|
||||
WifiConfigUiBase.MODE_CONNECT);
|
||||
final TextView ssid = mView.findViewById(R.id.ssid);
|
||||
// Verify ssid text get focus when add new network (accesspoint is null)
|
||||
assertThat(ssid.isFocused()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void passwordGetFocus_connectSecureWifi_shouldReturnTrue() {
|
||||
final TextView password = mView.findViewById(R.id.password);
|
||||
// Verify password get focus when connect to secure wifi without eap type
|
||||
assertThat(password.isFocused()).isTrue();
|
||||
}
|
||||
|
||||
public class TestWifiConfigController extends WifiConfigController {
|
||||
|
||||
private TestWifiConfigController(
|
||||
@@ -221,5 +257,8 @@ public class WifiConfigControllerTest {
|
||||
boolean isSplitSystemUser() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
KeyStore getKeyStore() { return mKeyStore; }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user