Snap for 9830776 from 509f94a8c3 to udc-release

Change-Id: I1e583e8efd751684ec33ec2bed43ce0ea113dd69
This commit is contained in:
Android Build Coastguard Worker
2023-03-28 01:32:23 +00:00
16 changed files with 101 additions and 74 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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);

View File

@@ -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",

View File

@@ -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.

View File

@@ -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();

View File

@@ -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));
} }
} }
} }

View File

@@ -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()));
}
} }

View File

@@ -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) {

View File

@@ -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

View File

@@ -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,

View File

@@ -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());

View File

@@ -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

View File

@@ -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);

View File

@@ -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();
} }