Snap for 9830776 from 509f94a8c3 to udc-release
Change-Id: I1e583e8efd751684ec33ec2bed43ce0ea113dd69
This commit is contained in:
@@ -710,4 +710,9 @@
|
|||||||
<item></item>
|
<item></item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<!-- List of packages that should be hidden for MVNO. Do not translate -->
|
||||||
|
<string-array name="datausage_hiding_carrier_service_package_names" translatable="false"/>
|
||||||
|
|
||||||
|
<!-- List of MVNO. Do not translate -->
|
||||||
|
<integer-array name="datausage_hiding_carrier_service_carrier_id" translatable="false"/>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -412,10 +412,10 @@
|
|||||||
<dimen name="sfps_enroll_find_sensor_lottie_margin">0dp</dimen>
|
<dimen name="sfps_enroll_find_sensor_lottie_margin">0dp</dimen>
|
||||||
|
|
||||||
<!-- Flash notifications dimensions -->
|
<!-- Flash notifications dimensions -->
|
||||||
<dimen name="screen_flash_color_button_frame_size">38dp</dimen>
|
<dimen name="screen_flash_color_button_frame_size">48dp</dimen>
|
||||||
<dimen name="screen_flash_color_button_outer_circle_size">38dp</dimen>
|
<dimen name="screen_flash_color_button_outer_circle_size">48dp</dimen>
|
||||||
<dimen name="screen_flash_color_button_outer_circle_stroke_width">2dp</dimen>
|
<dimen name="screen_flash_color_button_outer_circle_stroke_width">2dp</dimen>
|
||||||
<dimen name="screen_flash_color_button_inner_circle_size">32dp</dimen>
|
<dimen name="screen_flash_color_button_inner_circle_size">42dp</dimen>
|
||||||
<dimen name="screen_flash_color_button_inner_circle_padding">3dp</dimen>
|
<dimen name="screen_flash_color_button_inner_circle_padding">3dp</dimen>
|
||||||
<dimen name="screen_flash_color_button_inner_circle_stroke">1dp</dimen>
|
<dimen name="screen_flash_color_button_inner_circle_stroke">1dp</dimen>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -22,9 +22,9 @@
|
|||||||
android:title="@string/account_dashboard_title"
|
android:title="@string/account_dashboard_title"
|
||||||
settings:keywords="@string/keywords_accounts">
|
settings:keywords="@string/keywords_accounts">
|
||||||
|
|
||||||
<com.android.settings.widget.WorkOnlyCategory
|
<PreferenceCategory
|
||||||
android:key="autofill_work_app_defaults"
|
android:key="default_service_category"
|
||||||
android:order="30"
|
android:order="10"
|
||||||
android:title="@string/default_autofill_app">
|
android:title="@string/default_autofill_app">
|
||||||
|
|
||||||
<com.android.settings.widget.GearPreference
|
<com.android.settings.widget.GearPreference
|
||||||
@@ -36,11 +36,11 @@
|
|||||||
android:name="for_work"
|
android:name="for_work"
|
||||||
android:value="true" />
|
android:value="true" />
|
||||||
</com.android.settings.widget.GearPreference>
|
</com.android.settings.widget.GearPreference>
|
||||||
</com.android.settings.widget.WorkOnlyCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:key="credman_category"
|
android:key="credman_category"
|
||||||
android:order="20"
|
android:order="50"
|
||||||
android:persistent="false"
|
android:persistent="false"
|
||||||
android:title="@string/credman_credentials"
|
android:title="@string/credman_credentials"
|
||||||
settings:controller="com.android.settings.applications.credentials.CredentialManagerPreferenceController"
|
settings:controller="com.android.settings.applications.credentials.CredentialManagerPreferenceController"
|
||||||
|
|||||||
@@ -58,15 +58,20 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
import com.android.settings.datausage.CycleAdapter.SpinnerInterface;
|
import com.android.settings.datausage.CycleAdapter.SpinnerInterface;
|
||||||
import com.android.settings.network.MobileDataEnabledListener;
|
import com.android.settings.network.MobileDataEnabledListener;
|
||||||
|
import com.android.settings.network.MobileNetworkRepository;
|
||||||
import com.android.settings.network.ProxySubscriptionManager;
|
import com.android.settings.network.ProxySubscriptionManager;
|
||||||
import com.android.settings.widget.LoadingViewController;
|
import com.android.settings.widget.LoadingViewController;
|
||||||
import com.android.settingslib.AppItem;
|
import com.android.settingslib.AppItem;
|
||||||
|
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
|
||||||
import com.android.settingslib.net.NetworkCycleChartData;
|
import com.android.settingslib.net.NetworkCycleChartData;
|
||||||
import com.android.settingslib.net.NetworkCycleChartDataLoader;
|
import com.android.settingslib.net.NetworkCycleChartDataLoader;
|
||||||
import com.android.settingslib.net.NetworkStatsSummaryLoader;
|
import com.android.settingslib.net.NetworkStatsSummaryLoader;
|
||||||
|
import com.android.settingslib.net.UidDetail;
|
||||||
import com.android.settingslib.net.UidDetailProvider;
|
import com.android.settingslib.net.UidDetailProvider;
|
||||||
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -118,6 +123,8 @@ public class DataUsageList extends DataUsageBaseFragment
|
|||||||
private Preference mUsageAmount;
|
private Preference mUsageAmount;
|
||||||
private PreferenceGroup mApps;
|
private PreferenceGroup mApps;
|
||||||
private View mHeader;
|
private View mHeader;
|
||||||
|
private MobileNetworkRepository mMobileNetworkRepository;
|
||||||
|
private SubscriptionInfoEntity mSubscriptionInfoEntity;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
@@ -146,6 +153,11 @@ public class DataUsageList extends DataUsageBaseFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
processArgument();
|
processArgument();
|
||||||
|
mMobileNetworkRepository = MobileNetworkRepository.getInstance(getContext());
|
||||||
|
ThreadUtils.postOnBackgroundThread(() -> {
|
||||||
|
mSubscriptionInfoEntity = mMobileNetworkRepository.getSubInfoById(
|
||||||
|
String.valueOf(mSubId));
|
||||||
|
});
|
||||||
mDataStateListener = new MobileDataEnabledListener(activity, this);
|
mDataStateListener = new MobileDataEnabledListener(activity, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -451,7 +463,23 @@ public class DataUsageList extends DataUsageBaseFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
Collections.sort(items);
|
Collections.sort(items);
|
||||||
|
final List<String> packageNames = Arrays.asList(getContext().getResources().getStringArray(
|
||||||
|
R.array.datausage_hiding_carrier_service_package_names));
|
||||||
|
boolean shouldHidePackageName = mSubscriptionInfoEntity != null
|
||||||
|
? Arrays.stream(getContext().getResources().getIntArray(
|
||||||
|
R.array.datausage_hiding_carrier_service_carrier_id))
|
||||||
|
.anyMatch(carrierId -> (carrierId == mSubscriptionInfoEntity.carrierId))
|
||||||
|
: false;
|
||||||
|
|
||||||
for (int i = 0; i < items.size(); i++) {
|
for (int i = 0; i < items.size(); i++) {
|
||||||
|
UidDetail detail = mUidDetailProvider.getUidDetail(items.get(i).key, true);
|
||||||
|
// Do not show carrier service package in data usage list if it should be hidden for
|
||||||
|
// the carrier.
|
||||||
|
if (detail != null && shouldHidePackageName && packageNames.contains(
|
||||||
|
detail.packageName)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
final int percentTotal = largest != 0 ? (int) (items.get(i).total * 100 / largest) : 0;
|
final int percentTotal = largest != 0 ? (int) (items.get(i).total * 100 / largest) : 0;
|
||||||
final AppDataUsagePreference preference = new AppDataUsagePreference(getContext(),
|
final AppDataUsagePreference preference = new AppDataUsagePreference(getContext(),
|
||||||
items.get(i), percentTotal, mUidDetailProvider);
|
items.get(i), percentTotal, mUidDetailProvider);
|
||||||
|
|||||||
@@ -204,8 +204,7 @@ public class BatteryHistEntry {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
final String recordAtDateTime =
|
final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(mTimestamp);
|
||||||
ConvertUtils.utcToLocalTime(/*context=*/ null, mTimestamp);
|
|
||||||
final StringBuilder builder = new StringBuilder()
|
final StringBuilder builder = new StringBuilder()
|
||||||
.append("\nBatteryHistEntry{")
|
.append("\nBatteryHistEntry{")
|
||||||
.append(String.format("\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b",
|
.append(String.format("\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b",
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ public class BatteryUsageStatsLoader extends AsyncLoaderCompat<BatteryUsageStats
|
|||||||
builder.includeBatteryHistory();
|
builder.includeBatteryHistory();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return mBatteryStatsManager.getBatteryUsageStats(builder.build());
|
return mBatteryStatsManager.getBatteryUsageStats(
|
||||||
|
builder.includeProcessStateData().build());
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
Log.e(TAG, "loadInBackground() for getBatteryUsageStats()", e);
|
Log.e(TAG, "loadInBackground() for getBatteryUsageStats()", e);
|
||||||
// Use default BatteryUsageStats.
|
// Use default BatteryUsageStats.
|
||||||
|
|||||||
@@ -237,9 +237,10 @@ public final class ConvertUtils {
|
|||||||
return eventBuilder.build();
|
return eventBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Converts UTC timestamp to human readable local time string. */
|
/** Converts UTC timestamp to local time string for logging only, so use the US locale for
|
||||||
public static String utcToLocalTime(Context context, long timestamp) {
|
* better readability in debugging. */
|
||||||
final Locale locale = getLocale(context);
|
public static String utcToLocalTimeForLogging(long timestamp) {
|
||||||
|
final Locale locale = Locale.US;
|
||||||
final String pattern =
|
final String pattern =
|
||||||
DateFormat.getBestDateTimePattern(locale, "MMM dd,yyyy HH:mm:ss");
|
DateFormat.getBestDateTimePattern(locale, "MMM dd,yyyy HH:mm:ss");
|
||||||
return DateFormat.format(pattern, timestamp).toString();
|
return DateFormat.format(pattern, timestamp).toString();
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
package com.android.settings.fuelgauge.batteryusage;
|
package com.android.settings.fuelgauge.batteryusage;
|
||||||
|
|
||||||
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.getEffectivePackageName;
|
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.getEffectivePackageName;
|
||||||
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.utcToLocalTime;
|
|
||||||
|
|
||||||
import android.app.usage.IUsageStatsManager;
|
import android.app.usage.IUsageStatsManager;
|
||||||
import android.app.usage.UsageEvents;
|
import android.app.usage.UsageEvents;
|
||||||
@@ -1357,7 +1356,7 @@ public final class DataProcessor {
|
|||||||
final Map<String, BatteryHistEntry> entryMap = processedBatteryHistoryMap.get(timestamp);
|
final Map<String, BatteryHistEntry> entryMap = processedBatteryHistoryMap.get(timestamp);
|
||||||
if (entryMap == null || entryMap.isEmpty()) {
|
if (entryMap == null || entryMap.isEmpty()) {
|
||||||
Log.e(TAG, "abnormal entry list in the timestamp:"
|
Log.e(TAG, "abnormal entry list in the timestamp:"
|
||||||
+ utcToLocalTime(context, timestamp));
|
+ ConvertUtils.utcToLocalTimeForLogging(timestamp));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// The current time battery history hasn't been loaded yet, returns the current battery
|
// The current time battery history hasn't been loaded yet, returns the current battery
|
||||||
@@ -1934,7 +1933,7 @@ public final class DataProcessor {
|
|||||||
final BatteryHistEntry entry) {
|
final BatteryHistEntry entry) {
|
||||||
if (sDebug) {
|
if (sDebug) {
|
||||||
Log.d(TAG, String.format(entry != null ? "%s %s:\n%s" : "%s %s:%s",
|
Log.d(TAG, String.format(entry != null ? "%s %s:\n%s" : "%s %s:%s",
|
||||||
utcToLocalTime(context, timestamp), content, entry));
|
ConvertUtils.utcToLocalTimeForLogging(timestamp), content, entry));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,15 +39,12 @@ import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
|
|||||||
import com.android.settingslib.fuelgauge.BatteryStatus;
|
import com.android.settingslib.fuelgauge.BatteryStatus;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.time.Clock;
|
import java.time.Clock;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -134,9 +131,10 @@ public final class DatabaseUtils {
|
|||||||
.build();
|
.build();
|
||||||
final long latestTimestamp =
|
final long latestTimestamp =
|
||||||
loadAppUsageLatestTimestampFromContentProvider(context, appUsageLatestTimestampUri);
|
loadAppUsageLatestTimestampFromContentProvider(context, appUsageLatestTimestampUri);
|
||||||
|
final String latestTimestampString = ConvertUtils.utcToLocalTimeForLogging(latestTimestamp);
|
||||||
Log.d(TAG, String.format(
|
Log.d(TAG, String.format(
|
||||||
"getAppUsageStartTimestampOfUser() userId=%d latestTimestamp=%d in %d/ms",
|
"getAppUsageStartTimestampOfUser() userId=%d latestTimestamp=%s in %d/ms",
|
||||||
userId, latestTimestamp, (System.currentTimeMillis() - startTime)));
|
userId, latestTimestampString, (System.currentTimeMillis() - startTime)));
|
||||||
// Use (latestTimestamp + 1) here to avoid loading the events of the latestTimestamp
|
// Use (latestTimestamp + 1) here to avoid loading the events of the latestTimestamp
|
||||||
// repeatedly.
|
// repeatedly.
|
||||||
return Math.max(latestTimestamp + 1, earliestTimestamp);
|
return Math.max(latestTimestamp + 1, earliestTimestamp);
|
||||||
@@ -154,7 +152,8 @@ public final class DatabaseUtils {
|
|||||||
// sure the app usage calculation near the boundaries is correct.
|
// sure the app usage calculation near the boundaries is correct.
|
||||||
final long queryTimestamp =
|
final long queryTimestamp =
|
||||||
Math.max(rawStartTimestamp, sixDaysAgoTimestamp) - USAGE_QUERY_BUFFER_HOURS;
|
Math.max(rawStartTimestamp, sixDaysAgoTimestamp) - USAGE_QUERY_BUFFER_HOURS;
|
||||||
Log.d(TAG, "sixDayAgoTimestamp: " + sixDaysAgoTimestamp);
|
Log.d(TAG, "sixDayAgoTimestamp: " + ConvertUtils.utcToLocalTimeForLogging(
|
||||||
|
sixDaysAgoTimestamp));
|
||||||
final String queryUserIdString = userIds.stream()
|
final String queryUserIdString = userIds.stream()
|
||||||
.map(userId -> String.valueOf(userId))
|
.map(userId -> String.valueOf(userId))
|
||||||
.collect(Collectors.joining(","));
|
.collect(Collectors.joining(","));
|
||||||
@@ -182,7 +181,8 @@ public final class DatabaseUtils {
|
|||||||
Context context, Calendar calendar) {
|
Context context, Calendar calendar) {
|
||||||
final long startTime = System.currentTimeMillis();
|
final long startTime = System.currentTimeMillis();
|
||||||
final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar);
|
final long sixDaysAgoTimestamp = getTimestampSixDaysAgo(calendar);
|
||||||
Log.d(TAG, "sixDayAgoTimestamp: " + sixDaysAgoTimestamp);
|
Log.d(TAG, "sixDayAgoTimestamp: " + ConvertUtils.utcToLocalTimeForLogging(
|
||||||
|
sixDaysAgoTimestamp));
|
||||||
// Builds the content uri everytime to avoid cache.
|
// Builds the content uri everytime to avoid cache.
|
||||||
final Uri batteryStateUri =
|
final Uri batteryStateUri =
|
||||||
new Uri.Builder()
|
new Uri.Builder()
|
||||||
@@ -410,7 +410,9 @@ public final class DatabaseUtils {
|
|||||||
static void recordDateTime(Context context, String preferenceKey) {
|
static void recordDateTime(Context context, String preferenceKey) {
|
||||||
final SharedPreferences sharedPreferences = getSharedPreferences(context);
|
final SharedPreferences sharedPreferences = getSharedPreferences(context);
|
||||||
if (sharedPreferences != null) {
|
if (sharedPreferences != null) {
|
||||||
sharedPreferences.edit().putString(preferenceKey, getCurrentDateTime()).apply();
|
final String currentTime = ConvertUtils.utcToLocalTimeForLogging(
|
||||||
|
System.currentTimeMillis());
|
||||||
|
sharedPreferences.edit().putString(preferenceKey, currentTime).apply();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,9 +521,4 @@ public final class DatabaseUtils {
|
|||||||
Log.w(TAG, "invoke clearMemory()");
|
Log.w(TAG, "invoke clearMemory()");
|
||||||
}, CLEAR_MEMORY_DELAYED_MS);
|
}, CLEAR_MEMORY_DELAYED_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getCurrentDateTime() {
|
|
||||||
return new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.getDefault())
|
|
||||||
.format(new Date(System.currentTimeMillis()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,11 +26,8 @@ import androidx.annotation.VisibleForTesting;
|
|||||||
|
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.time.Clock;
|
import java.time.Clock;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/** Manages the periodic job to schedule or cancel the next job. */
|
/** Manages the periodic job to schedule or cancel the next job. */
|
||||||
public final class PeriodicJobManager {
|
public final class PeriodicJobManager {
|
||||||
@@ -41,8 +38,6 @@ public final class PeriodicJobManager {
|
|||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final AlarmManager mAlarmManager;
|
private final AlarmManager mAlarmManager;
|
||||||
private final SimpleDateFormat mSimpleDateFormat =
|
|
||||||
new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.ENGLISH);
|
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final int DATA_FETCH_INTERVAL_MINUTE = 60;
|
static final int DATA_FETCH_INTERVAL_MINUTE = 60;
|
||||||
@@ -69,7 +64,6 @@ public final class PeriodicJobManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Schedules the next alarm job if it is available. */
|
/** Schedules the next alarm job if it is available. */
|
||||||
@SuppressWarnings("JavaUtilDate")
|
|
||||||
public void refreshJob(final boolean fromBoot) {
|
public void refreshJob(final boolean fromBoot) {
|
||||||
if (mAlarmManager == null) {
|
if (mAlarmManager == null) {
|
||||||
Log.e(TAG, "cannot schedule next alarm job");
|
Log.e(TAG, "cannot schedule next alarm job");
|
||||||
@@ -83,7 +77,7 @@ public final class PeriodicJobManager {
|
|||||||
mAlarmManager.setExactAndAllowWhileIdle(
|
mAlarmManager.setExactAndAllowWhileIdle(
|
||||||
AlarmManager.RTC_WAKEUP, triggerAtMillis, pendingIntent);
|
AlarmManager.RTC_WAKEUP, triggerAtMillis, pendingIntent);
|
||||||
Log.d(TAG, "schedule next alarm job at "
|
Log.d(TAG, "schedule next alarm job at "
|
||||||
+ mSimpleDateFormat.format(new Date(triggerAtMillis)));
|
+ ConvertUtils.utcToLocalTimeForLogging(triggerAtMillis));
|
||||||
}
|
}
|
||||||
|
|
||||||
void cancelJob(PendingIntent pendingIntent) {
|
void cancelJob(PendingIntent pendingIntent) {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.settings.fuelgauge.batteryusage.bugreport;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
|
||||||
import com.android.settings.fuelgauge.batteryusage.DatabaseUtils;
|
import com.android.settings.fuelgauge.batteryusage.DatabaseUtils;
|
||||||
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventDao;
|
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventDao;
|
||||||
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
|
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
|
||||||
@@ -27,12 +28,9 @@ import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDao;
|
|||||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
|
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.time.Clock;
|
import java.time.Clock;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/** A utility class to aggregate and provide required log data. */
|
/** A utility class to aggregate and provide required log data. */
|
||||||
public final class LogUtils {
|
public final class LogUtils {
|
||||||
@@ -40,7 +38,6 @@ public final class LogUtils {
|
|||||||
private static final Duration DUMP_TIME_OFFSET = Duration.ofHours(24);
|
private static final Duration DUMP_TIME_OFFSET = Duration.ofHours(24);
|
||||||
private static final Duration DUMP_TIME_OFFSET_FOR_ENTRY = Duration.ofHours(4);
|
private static final Duration DUMP_TIME_OFFSET_FOR_ENTRY = Duration.ofHours(4);
|
||||||
|
|
||||||
@SuppressWarnings("JavaUtilDate")
|
|
||||||
static void dumpBatteryUsageDatabaseHist(Context context, PrintWriter writer) {
|
static void dumpBatteryUsageDatabaseHist(Context context, PrintWriter writer) {
|
||||||
DatabaseUtils.dump(context, writer);
|
DatabaseUtils.dump(context, writer);
|
||||||
writer.flush();
|
writer.flush();
|
||||||
@@ -60,10 +57,8 @@ public final class LogUtils {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Dumps all distinct timestamps.
|
// Dumps all distinct timestamps.
|
||||||
final SimpleDateFormat formatter =
|
|
||||||
new SimpleDateFormat("MMM dd, HH:mm:ss", Locale.US);
|
|
||||||
timestamps.forEach(timestamp -> {
|
timestamps.forEach(timestamp -> {
|
||||||
final String formattedTimestamp = formatter.format(new Date(timestamp));
|
final String formattedTimestamp = ConvertUtils.utcToLocalTimeForLogging(timestamp);
|
||||||
writer.println("\t" + formattedTimestamp);
|
writer.println("\t" + formattedTimestamp);
|
||||||
Log.w(TAG, "\t" + formattedTimestamp);
|
Log.w(TAG, "\t" + formattedTimestamp);
|
||||||
});
|
});
|
||||||
@@ -74,7 +69,6 @@ public final class LogUtils {
|
|||||||
stateList.stream().forEach(state -> writer.println(state));
|
stateList.stream().forEach(state -> writer.println(state));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("JavaUtilDate")
|
|
||||||
static void dumpAppUsageDatabaseHist(Context context, PrintWriter writer) {
|
static void dumpAppUsageDatabaseHist(Context context, PrintWriter writer) {
|
||||||
final AppUsageEventDao dao =
|
final AppUsageEventDao dao =
|
||||||
BatteryStateDatabase
|
BatteryStateDatabase
|
||||||
|
|||||||
@@ -21,19 +21,15 @@ import android.content.ContentValues;
|
|||||||
import androidx.room.Entity;
|
import androidx.room.Entity;
|
||||||
import androidx.room.PrimaryKey;
|
import androidx.room.PrimaryKey;
|
||||||
|
|
||||||
|
import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
|
||||||
|
|
||||||
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
/** A {@link Entity} class to save app usage events into database. */
|
/** A {@link Entity} class to save app usage events into database. */
|
||||||
@Entity
|
@Entity
|
||||||
public class AppUsageEventEntity {
|
public class AppUsageEventEntity {
|
||||||
private static String sCacheZoneId;
|
|
||||||
private static SimpleDateFormat sCacheSimpleDateFormat;
|
|
||||||
|
|
||||||
/** Keys for accessing {@link ContentValues}. */
|
/** Keys for accessing {@link ContentValues}. */
|
||||||
public static final String KEY_UID = "uid";
|
public static final String KEY_UID = "uid";
|
||||||
public static final String KEY_USER_ID = "userId";
|
public static final String KEY_USER_ID = "userId";
|
||||||
@@ -83,14 +79,8 @@ public class AppUsageEventEntity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("JavaUtilDate")
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
final String currentZoneId = TimeZone.getDefault().getID();
|
final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(timestamp);
|
||||||
if (!currentZoneId.equals(sCacheZoneId) || sCacheSimpleDateFormat == null) {
|
|
||||||
sCacheZoneId = currentZoneId;
|
|
||||||
sCacheSimpleDateFormat = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.US);
|
|
||||||
}
|
|
||||||
final String recordAtDateTime = sCacheSimpleDateFormat.format(new Date(timestamp));
|
|
||||||
final StringBuilder builder = new StringBuilder()
|
final StringBuilder builder = new StringBuilder()
|
||||||
.append("\nAppUsageEvent{")
|
.append("\nAppUsageEvent{")
|
||||||
.append(String.format(Locale.US,
|
.append(String.format(Locale.US,
|
||||||
|
|||||||
@@ -23,20 +23,15 @@ import androidx.room.PrimaryKey;
|
|||||||
|
|
||||||
import com.android.settings.fuelgauge.BatteryUtils;
|
import com.android.settings.fuelgauge.BatteryUtils;
|
||||||
import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
|
import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
|
||||||
|
import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
|
||||||
|
|
||||||
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
/** A {@link Entity} class to save battery states snapshot into database. */
|
/** A {@link Entity} class to save battery states snapshot into database. */
|
||||||
@Entity
|
@Entity
|
||||||
public class BatteryState {
|
public class BatteryState {
|
||||||
private static String sCacheZoneId;
|
|
||||||
private static SimpleDateFormat sCacheSimpleDateFormat;
|
|
||||||
|
|
||||||
@PrimaryKey(autoGenerate = true)
|
@PrimaryKey(autoGenerate = true)
|
||||||
private long mId;
|
private long mId;
|
||||||
|
|
||||||
@@ -91,14 +86,8 @@ public class BatteryState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("JavaUtilDate")
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
final String currentZoneId = TimeZone.getDefault().getID();
|
final String recordAtDateTime = ConvertUtils.utcToLocalTimeForLogging(timestamp);
|
||||||
if (!currentZoneId.equals(sCacheZoneId) || sCacheSimpleDateFormat == null) {
|
|
||||||
sCacheZoneId = currentZoneId;
|
|
||||||
sCacheSimpleDateFormat = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.US);
|
|
||||||
}
|
|
||||||
final String recordAtDateTime = sCacheSimpleDateFormat.format(new Date(timestamp));
|
|
||||||
final BatteryInformation batteryInformationInstance =
|
final BatteryInformation batteryInformationInstance =
|
||||||
BatteryUtils.parseProtoFromString(
|
BatteryUtils.parseProtoFromString(
|
||||||
batteryInformation, BatteryInformation.getDefaultInstance());
|
batteryInformation, BatteryInformation.getDefaultInstance());
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.android.settings.notification;
|
package com.android.settings.notification;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.UserManager;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.TogglePreferenceController;
|
import com.android.settings.core.TogglePreferenceController;
|
||||||
@@ -51,7 +52,7 @@ public class SilentStatusBarPreferenceController extends TogglePreferenceControl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAvailabilityStatus() {
|
public int getAvailabilityStatus() {
|
||||||
return AVAILABLE;
|
return UserManager.get(mContext).isGuestUser() ? DISABLED_FOR_USER : AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -16,14 +16,21 @@
|
|||||||
|
|
||||||
package com.android.settings.notification;
|
package com.android.settings.notification;
|
||||||
|
|
||||||
|
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
|
||||||
|
import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static org.robolectric.Shadows.shadowOf;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.UserInfo;
|
||||||
|
import android.os.UserHandle;
|
||||||
|
import android.os.UserManager;
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
@@ -35,6 +42,7 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
import org.robolectric.shadows.ShadowUserManager;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class SilentStatusBarPreferenceControllerTest {
|
public class SilentStatusBarPreferenceControllerTest {
|
||||||
@@ -59,6 +67,27 @@ public class SilentStatusBarPreferenceControllerTest {
|
|||||||
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
|
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isAvailable_systemUser_available() {
|
||||||
|
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isAvailable_extraUser_available() {
|
||||||
|
ShadowUserManager um = shadowOf(mContext.getSystemService(UserManager.class));
|
||||||
|
um.addUser(UserHandle.myUserId(), "Another User", UserInfo.FLAG_FULL);
|
||||||
|
|
||||||
|
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isAvailable_guestUser_disabled() {
|
||||||
|
ShadowUserManager um = shadowOf(mContext.getSystemService(UserManager.class));
|
||||||
|
um.addUser(UserHandle.myUserId(), "Guest", UserInfo.FLAG_GUEST);
|
||||||
|
|
||||||
|
assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void isChecked_settingIsOff() {
|
public void isChecked_settingIsOff() {
|
||||||
when(mBackend.shouldHideSilentStatusBarIcons(any())).thenReturn(false);
|
when(mBackend.shouldHideSilentStatusBarIcons(any())).thenReturn(false);
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ public class AutoPinConfirmPreferenceControllerTest {
|
|||||||
"true", /* makeDefault */ false);
|
"true", /* makeDefault */ false);
|
||||||
when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID))
|
when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID))
|
||||||
.thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN);
|
.thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN);
|
||||||
when(mLockPatternUtils.getPinLength(TEST_USER_ID)).thenReturn(5L);
|
when(mLockPatternUtils.getPinLength(TEST_USER_ID)).thenReturn(5);
|
||||||
|
|
||||||
assertThat(mController.isAvailable()).isFalse();
|
assertThat(mController.isAvailable()).isFalse();
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@ public class AutoPinConfirmPreferenceControllerTest {
|
|||||||
when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true);
|
when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true);
|
||||||
when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID))
|
when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID))
|
||||||
.thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN);
|
.thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN);
|
||||||
when(mLockPatternUtils.getPinLength(TEST_USER_ID)).thenReturn(6L);
|
when(mLockPatternUtils.getPinLength(TEST_USER_ID)).thenReturn(6);
|
||||||
|
|
||||||
assertThat(mController.isAvailable()).isTrue();
|
assertThat(mController.isAvailable()).isTrue();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user