diff options
22 files changed, 325 insertions, 98 deletions
diff --git a/api/current.txt b/api/current.txt index d8ec7780230a..3ba0dd267c85 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4447,7 +4447,7 @@ package android.app { public final class AutomaticZenRule implements android.os.Parcelable { ctor @Deprecated public AutomaticZenRule(String, android.content.ComponentName, android.net.Uri, int, boolean); - ctor public AutomaticZenRule(String, android.content.ComponentName, android.content.ComponentName, android.net.Uri, android.service.notification.ZenPolicy, int, boolean); + ctor public AutomaticZenRule(@NonNull String, @Nullable android.content.ComponentName, @Nullable android.content.ComponentName, @NonNull android.net.Uri, @Nullable android.service.notification.ZenPolicy, int, boolean); ctor public AutomaticZenRule(android.os.Parcel); method public int describeContents(); method public android.net.Uri getConditionId(); @@ -23053,7 +23053,7 @@ package android.media { ctor public AudioAttributes.Builder(); ctor public AudioAttributes.Builder(android.media.AudioAttributes); method public android.media.AudioAttributes build(); - method public android.media.AudioAttributes.Builder setAllowCapture(boolean); + method @NonNull public android.media.AudioAttributes.Builder setAllowCapture(boolean); method public android.media.AudioAttributes.Builder setContentType(int); method public android.media.AudioAttributes.Builder setFlags(int); method public android.media.AudioAttributes.Builder setLegacyStreamType(int); @@ -23392,11 +23392,11 @@ package android.media { public static final class AudioPlaybackCaptureConfiguration.Builder { ctor public AudioPlaybackCaptureConfiguration.Builder(@NonNull android.media.projection.MediaProjection); - method public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUid(int); - method public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUsage(@NonNull android.media.AudioAttributes); - method public android.media.AudioPlaybackCaptureConfiguration build(); - method public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUid(int); - method public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUsage(@NonNull android.media.AudioAttributes); + method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUid(int); + method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUsage(@NonNull android.media.AudioAttributes); + method @NonNull public android.media.AudioPlaybackCaptureConfiguration build(); + method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUid(int); + method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUsage(@NonNull android.media.AudioAttributes); } public final class AudioPlaybackConfiguration implements android.os.Parcelable { @@ -23497,7 +23497,7 @@ package android.media { ctor public AudioRecord.Builder(); method public android.media.AudioRecord build() throws java.lang.UnsupportedOperationException; method public android.media.AudioRecord.Builder setAudioFormat(@NonNull android.media.AudioFormat) throws java.lang.IllegalArgumentException; - method public android.media.AudioRecord.Builder setAudioPlaybackCaptureConfig(@NonNull android.media.AudioPlaybackCaptureConfiguration); + method @NonNull public android.media.AudioRecord.Builder setAudioPlaybackCaptureConfig(@NonNull android.media.AudioPlaybackCaptureConfiguration); method public android.media.AudioRecord.Builder setAudioSource(int) throws java.lang.IllegalArgumentException; method public android.media.AudioRecord.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException; } @@ -25137,7 +25137,7 @@ package android.media { field public static final long POSITION_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL } - public static class MediaItem2.Builder { + public static final class MediaItem2.Builder { ctor public MediaItem2.Builder(); method @NonNull public android.media.MediaItem2 build(); method @NonNull public android.media.MediaItem2.Builder setEndPosition(long); @@ -41869,26 +41869,26 @@ package android.service.notification { public static class ZenPolicy.Builder { ctor public ZenPolicy.Builder(); - method public android.service.notification.ZenPolicy.Builder allowAlarms(boolean); - method public android.service.notification.ZenPolicy.Builder allowAllSounds(); - method public android.service.notification.ZenPolicy.Builder allowCalls(int); - method public android.service.notification.ZenPolicy.Builder allowEvents(boolean); - method public android.service.notification.ZenPolicy.Builder allowMedia(boolean); - method public android.service.notification.ZenPolicy.Builder allowMessages(int); - method public android.service.notification.ZenPolicy.Builder allowReminders(boolean); - method public android.service.notification.ZenPolicy.Builder allowRepeatCallers(boolean); - method public android.service.notification.ZenPolicy.Builder allowSystem(boolean); - method public android.service.notification.ZenPolicy build(); - method public android.service.notification.ZenPolicy.Builder disallowAllSounds(); - method public android.service.notification.ZenPolicy.Builder hideAllVisualEffects(); - method public android.service.notification.ZenPolicy.Builder showAllVisualEffects(); - method public android.service.notification.ZenPolicy.Builder showBadges(boolean); - method public android.service.notification.ZenPolicy.Builder showFullScreenIntent(boolean); - method public android.service.notification.ZenPolicy.Builder showInAmbientDisplay(boolean); - method public android.service.notification.ZenPolicy.Builder showInNotificationList(boolean); - method public android.service.notification.ZenPolicy.Builder showLights(boolean); - method public android.service.notification.ZenPolicy.Builder showPeeking(boolean); - method public android.service.notification.ZenPolicy.Builder showStatusBarIcons(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder allowAlarms(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder allowAllSounds(); + method @NonNull public android.service.notification.ZenPolicy.Builder allowCalls(int); + method @NonNull public android.service.notification.ZenPolicy.Builder allowEvents(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder allowMedia(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder allowMessages(int); + method @NonNull public android.service.notification.ZenPolicy.Builder allowReminders(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder allowRepeatCallers(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder allowSystem(boolean); + method @NonNull public android.service.notification.ZenPolicy build(); + method @NonNull public android.service.notification.ZenPolicy.Builder disallowAllSounds(); + method @NonNull public android.service.notification.ZenPolicy.Builder hideAllVisualEffects(); + method @NonNull public android.service.notification.ZenPolicy.Builder showAllVisualEffects(); + method @NonNull public android.service.notification.ZenPolicy.Builder showBadges(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder showFullScreenIntent(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder showInAmbientDisplay(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder showInNotificationList(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder showLights(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder showPeeking(boolean); + method @NonNull public android.service.notification.ZenPolicy.Builder showStatusBarIcons(boolean); } } diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp index da720021512d..7298da6f6835 100644 --- a/cmds/statsd/Android.bp +++ b/cmds/statsd/Android.bp @@ -219,6 +219,7 @@ cc_test { "tests/anomaly/AnomalyTracker_test.cpp", "tests/ConfigManager_test.cpp", "tests/external/puller_util_test.cpp", + "tests/external/IncidentReportArgs_test.cpp", "tests/external/StatsPuller_test.cpp", "tests/indexed_priority_queue_test.cpp", "tests/LogEntryMatcher_test.cpp", diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index a983b2705d14..5968fa8c2b06 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -1568,7 +1568,7 @@ message WatchdogRollbackOccurred { ROLLBACK_INITIATE = 1; ROLLBACK_SUCCESS = 2; ROLLBACK_FAILURE = 3; - ROLLBACK_ROOT_TRIGGERED = 4; + ROLLBACK_BOOT_TRIGGERED = 4; } optional RollbackType rollback_type = 1; diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto index 5c6d548ad13a..0e91f527083a 100644 --- a/cmds/statsd/src/statsd_config.proto +++ b/cmds/statsd/src/statsd_config.proto @@ -324,6 +324,12 @@ message IncidentdDetails { EXPLICIT = 1; } optional Destination dest = 2; + + // Package name of the incident report receiver. + optional string receiver_pkg = 3; + + // Class name of the incident report receiver. + optional string receiver_cls = 4; } message PerfettoDetails { diff --git a/cmds/statsd/src/subscriber/IncidentdReporter.cpp b/cmds/statsd/src/subscriber/IncidentdReporter.cpp index 0ed2d75802da..7c2d2420528c 100644 --- a/cmds/statsd/src/subscriber/IncidentdReporter.cpp +++ b/cmds/statsd/src/subscriber/IncidentdReporter.cpp @@ -162,6 +162,10 @@ bool GenerateIncidentReport(const IncidentdDetails& config, int64_t rule_id, int } incidentReport.setDest(dest); + incidentReport.setReceiverPkg(config.receiver_pkg()); + + incidentReport.setReceiverCls(config.receiver_cls()); + sp<IIncidentManager> service = interface_cast<IIncidentManager>( defaultServiceManager()->getService(android::String16("incident"))); if (service == nullptr) { diff --git a/cmds/statsd/tests/external/IncidentReportArgs_test.cpp b/cmds/statsd/tests/external/IncidentReportArgs_test.cpp new file mode 100644 index 000000000000..c170b12dc242 --- /dev/null +++ b/cmds/statsd/tests/external/IncidentReportArgs_test.cpp @@ -0,0 +1,72 @@ +// 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. + +#include <android/os/IncidentReportArgs.h> + +#include <gtest/gtest.h> + +namespace android { +namespace os { +namespace statsd { + +TEST(IncidentReportArgsTest, testSerialization) { + IncidentReportArgs args; + args.setAll(0); + args.addSection(1000); + args.addSection(1001); + + vector<uint8_t> header1; + header1.push_back(0x1); + header1.push_back(0x2); + vector<uint8_t> header2; + header1.push_back(0x22); + header1.push_back(0x33); + + args.addHeader(header1); + args.addHeader(header2); + + args.setDest(1); + + args.setReceiverPkg("com.android.os"); + args.setReceiverCls("com.android.os.Receiver"); + + Parcel out; + status_t err = args.writeToParcel(&out); + EXPECT_EQ(NO_ERROR, err); + + out.setDataPosition(0); + + IncidentReportArgs args2; + err = args2.readFromParcel(&out); + EXPECT_EQ(NO_ERROR, err); + + EXPECT_EQ(0, args2.all()); + set<int> sections; + sections.insert(1000); + sections.insert(1001); + EXPECT_EQ(sections, args2.sections()); + EXPECT_EQ(1, args2.dest()); + + EXPECT_EQ(String16("com.android.os"), args2.receiverPkg()); + EXPECT_EQ(String16("com.android.os.Receiver"), args2.receiverCls()); + + vector<vector<uint8_t>> headers; + headers.push_back(header1); + headers.push_back(header2); + EXPECT_EQ(headers, args2.headers()); +} + +} // namespace statsd +} // namespace os +} // namespace android
\ No newline at end of file diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java index 4a826d1faf90..010a900b9d96 100644 --- a/core/java/android/app/AutomaticZenRule.java +++ b/core/java/android/app/AutomaticZenRule.java @@ -16,18 +16,15 @@ package android.app; -import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY; - +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.NotificationManager.InterruptionFilter; import android.content.ComponentName; -import android.content.Intent; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; -import android.service.notification.ZenPolicy; import android.service.notification.Condition; - -import com.android.internal.util.Preconditions; +import android.service.notification.ZenPolicy; import java.util.Objects; @@ -92,8 +89,9 @@ public final class AutomaticZenRule implements Parcelable { * action ({@link Condition#STATE_TRUE}). * @param enabled Whether the rule is enabled. */ - public AutomaticZenRule(String name, ComponentName owner, ComponentName configurationActivity, - Uri conditionId, ZenPolicy policy, int interruptionFilter, boolean enabled) { + public AutomaticZenRule(@NonNull String name, @Nullable ComponentName owner, + @Nullable ComponentName configurationActivity, @NonNull Uri conditionId, + @Nullable ZenPolicy policy, int interruptionFilter, boolean enabled) { this.name = name; this.owner = owner; this.configurationActivity = configurationActivity; diff --git a/core/java/android/os/IncidentReportArgs.java b/core/java/android/os/IncidentReportArgs.java index 1bdfd945c5b0..a1f2430f4ee3 100644 --- a/core/java/android/os/IncidentReportArgs.java +++ b/core/java/android/os/IncidentReportArgs.java @@ -36,6 +36,8 @@ public final class IncidentReportArgs implements Parcelable { private final ArrayList<byte[]> mHeaders = new ArrayList<byte[]>(); private boolean mAll; private int mPrivacyPolicy; + private String mReceiverPkg; + private String mReceiverCls; /** * Construct an incident report args with no fields. @@ -73,6 +75,10 @@ public final class IncidentReportArgs implements Parcelable { } out.writeInt(mPrivacyPolicy); + + out.writeString(mReceiverPkg); + + out.writeString(mReceiverCls); } public void readFromParcel(Parcel in) { @@ -91,6 +97,10 @@ public final class IncidentReportArgs implements Parcelable { } mPrivacyPolicy = in.readInt(); + + mReceiverPkg = in.readString(); + + mReceiverCls = in.readString(); } public static final @android.annotation.NonNull Parcelable.Creator<IncidentReportArgs> CREATOR @@ -126,6 +136,8 @@ public final class IncidentReportArgs implements Parcelable { sb.append(mHeaders.size()); sb.append(" headers), "); sb.append("privacy: ").append(mPrivacyPolicy); + sb.append("receiver pkg: ").append(mReceiverPkg); + sb.append("receiver cls: ").append(mReceiverCls); return sb.toString(); } diff --git a/core/java/android/service/notification/ZenPolicy.java b/core/java/android/service/notification/ZenPolicy.java index 74e6c6e29e00..7ef40cd20895 100644 --- a/core/java/android/service/notification/ZenPolicy.java +++ b/core/java/android/service/notification/ZenPolicy.java @@ -17,6 +17,7 @@ package android.service.notification; import android.annotation.IntDef; +import android.annotation.NonNull; import android.app.Notification; import android.app.NotificationChannel; import android.os.Parcel; @@ -378,14 +379,14 @@ public final class ZenPolicy implements Parcelable { /** * Builds the current ZenPolicy. */ - public ZenPolicy build() { + public @NonNull ZenPolicy build() { return mZenPolicy.copy(); } /** * Allows all notifications to bypass DND and unmutes all streams. */ - public Builder allowAllSounds() { + public @NonNull Builder allowAllSounds() { for (int i = 0; i < mZenPolicy.mPriorityCategories.size(); i++) { mZenPolicy.mPriorityCategories.set(i, STATE_ALLOW); } @@ -401,7 +402,7 @@ public final class ZenPolicy implements Parcelable { * {@link NotificationChannel#canBypassDnd can bypass DND}. If no channels can bypass DND, * the ringer stream is also muted. */ - public Builder disallowAllSounds() { + public @NonNull Builder disallowAllSounds() { for (int i = 0; i < mZenPolicy.mPriorityCategories.size(); i++) { mZenPolicy.mPriorityCategories.set(i, STATE_DISALLOW); } @@ -413,7 +414,7 @@ public final class ZenPolicy implements Parcelable { /** * Allows notifications intercepted by DND to show on all surfaces when DND is active. */ - public Builder showAllVisualEffects() { + public @NonNull Builder showAllVisualEffects() { for (int i = 0; i < mZenPolicy.mVisualEffects.size(); i++) { mZenPolicy.mVisualEffects.set(i, STATE_ALLOW); } @@ -423,7 +424,7 @@ public final class ZenPolicy implements Parcelable { /** * Disallows notifications intercepted by DND from showing when DND is active. */ - public Builder hideAllVisualEffects() { + public @NonNull Builder hideAllVisualEffects() { for (int i = 0; i < mZenPolicy.mVisualEffects.size(); i++) { mZenPolicy.mVisualEffects.set(i, STATE_DISALLOW); } @@ -435,7 +436,7 @@ public final class ZenPolicy implements Parcelable { * unset categories will default to the current applied policy. * @hide */ - public Builder unsetPriorityCategory(@PriorityCategory int category) { + public @NonNull Builder unsetPriorityCategory(@PriorityCategory int category) { mZenPolicy.mPriorityCategories.set(category, STATE_UNSET); if (category == PRIORITY_CATEGORY_MESSAGES) { @@ -452,7 +453,7 @@ public final class ZenPolicy implements Parcelable { * unset effects will default to the current applied policy. * @hide */ - public Builder unsetVisualEffect(@VisualEffect int effect) { + public @NonNull Builder unsetVisualEffect(@VisualEffect int effect) { mZenPolicy.mVisualEffects.set(effect, STATE_UNSET); return this; } @@ -461,7 +462,7 @@ public final class ZenPolicy implements Parcelable { * Whether to allow notifications with category {@link Notification#CATEGORY_REMINDER} * to play sounds and visually appear or to intercept them when DND is active. */ - public Builder allowReminders(boolean allow) { + public @NonNull Builder allowReminders(boolean allow) { mZenPolicy.mPriorityCategories.set(PRIORITY_CATEGORY_REMINDERS, allow ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -471,7 +472,7 @@ public final class ZenPolicy implements Parcelable { * Whether to allow notifications with category {@link Notification#CATEGORY_EVENT} * to play sounds and visually appear or to intercept them when DND is active. */ - public Builder allowEvents(boolean allow) { + public @NonNull Builder allowEvents(boolean allow) { mZenPolicy.mPriorityCategories.set(PRIORITY_CATEGORY_EVENTS, allow ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -483,7 +484,7 @@ public final class ZenPolicy implements Parcelable { * them when DND is active. * @param audienceType message senders that are allowed to bypass DND */ - public Builder allowMessages(@PeopleType int audienceType) { + public @NonNull Builder allowMessages(@PeopleType int audienceType) { if (audienceType == STATE_UNSET) { return unsetPriorityCategory(PRIORITY_CATEGORY_MESSAGES); } @@ -507,7 +508,7 @@ public final class ZenPolicy implements Parcelable { * them when DND is active. * @param audienceType callers that are allowed to bypass DND */ - public Builder allowCalls(@PeopleType int audienceType) { + public @NonNull Builder allowCalls(@PeopleType int audienceType) { if (audienceType == STATE_UNSET) { return unsetPriorityCategory(PRIORITY_CATEGORY_CALLS); } @@ -530,7 +531,7 @@ public final class ZenPolicy implements Parcelable { * {@link Notification#CATEGORY_CALL} that have recently called * to play sounds and visually appear. */ - public Builder allowRepeatCallers(boolean allow) { + public @NonNull Builder allowRepeatCallers(boolean allow) { mZenPolicy.mPriorityCategories.set(PRIORITY_CATEGORY_REPEAT_CALLERS, allow ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -542,7 +543,7 @@ public final class ZenPolicy implements Parcelable { * to play sounds and visually appear or to intercept them when DND is active. * Disallowing alarms will mute the alarm stream when DND is active. */ - public Builder allowAlarms(boolean allow) { + public @NonNull Builder allowAlarms(boolean allow) { mZenPolicy.mPriorityCategories.set(PRIORITY_CATEGORY_ALARMS, allow ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -553,7 +554,7 @@ public final class ZenPolicy implements Parcelable { * appear or to intercept them when DND is active. * Disallowing media will mute the media stream when DND is active. */ - public Builder allowMedia(boolean allow) { + public @NonNull Builder allowMedia(boolean allow) { mZenPolicy.mPriorityCategories.set(PRIORITY_CATEGORY_MEDIA, allow ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -563,7 +564,7 @@ public final class ZenPolicy implements Parcelable { * Whether to allow system sounds to play when DND is active. * Disallowing system sounds will mute the system stream when DND is active. */ - public Builder allowSystem(boolean allow) { + public @NonNull Builder allowSystem(boolean allow) { mZenPolicy.mPriorityCategories.set(PRIORITY_CATEGORY_SYSTEM, allow ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -573,7 +574,7 @@ public final class ZenPolicy implements Parcelable { * Whether to allow {@link PriorityCategory} sounds to play when DND is active. * @hide */ - public Builder allowCategory(@PriorityCategory int category, boolean allow) { + public @NonNull Builder allowCategory(@PriorityCategory int category, boolean allow) { switch (category) { case PRIORITY_CATEGORY_ALARMS: allowAlarms(allow); @@ -601,7 +602,7 @@ public final class ZenPolicy implements Parcelable { * Whether {@link Notification#fullScreenIntent full screen intents} that are intercepted * by DND are shown. */ - public Builder showFullScreenIntent(boolean show) { + public @NonNull Builder showFullScreenIntent(boolean show) { mZenPolicy.mVisualEffects.set(VISUAL_EFFECT_FULL_SCREEN_INTENT, show ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -611,7 +612,7 @@ public final class ZenPolicy implements Parcelable { * Whether {@link NotificationChannel#shouldShowLights() notification lights} from * notifications intercepted by DND are blocked. */ - public Builder showLights(boolean show) { + public @NonNull Builder showLights(boolean show) { mZenPolicy.mVisualEffects.set(VISUAL_EFFECT_LIGHTS, show ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -620,7 +621,7 @@ public final class ZenPolicy implements Parcelable { /** * Whether notifications intercepted by DND are prevented from peeking. */ - public Builder showPeeking(boolean show) { + public @NonNull Builder showPeeking(boolean show) { mZenPolicy.mVisualEffects.set(VISUAL_EFFECT_PEEK, show ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -630,7 +631,7 @@ public final class ZenPolicy implements Parcelable { * Whether notifications intercepted by DND are prevented from appearing in the status bar * on devices that support status bars. */ - public Builder showStatusBarIcons(boolean show) { + public @NonNull Builder showStatusBarIcons(boolean show) { mZenPolicy.mVisualEffects.set(VISUAL_EFFECT_STATUS_BAR, show ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -640,7 +641,7 @@ public final class ZenPolicy implements Parcelable { * Whether {@link NotificationChannel#canShowBadge() badges} from * notifications intercepted by DND are allowed on devices that support badging. */ - public Builder showBadges(boolean show) { + public @NonNull Builder showBadges(boolean show) { mZenPolicy.mVisualEffects.set(VISUAL_EFFECT_BADGE, show ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -650,7 +651,7 @@ public final class ZenPolicy implements Parcelable { * Whether notification intercepted by DND are prevented from appearing on ambient displays * on devices that support ambient display. */ - public Builder showInAmbientDisplay(boolean show) { + public @NonNull Builder showInAmbientDisplay(boolean show) { mZenPolicy.mVisualEffects.set(VISUAL_EFFECT_AMBIENT, show ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -661,7 +662,7 @@ public final class ZenPolicy implements Parcelable { * list views like the notification shade or lockscreen on devices that support those * views. */ - public Builder showInNotificationList(boolean show) { + public @NonNull Builder showInNotificationList(boolean show) { mZenPolicy.mVisualEffects.set(VISUAL_EFFECT_NOTIFICATION_LIST, show ? STATE_ALLOW : STATE_DISALLOW); return this; @@ -672,7 +673,7 @@ public final class ZenPolicy implements Parcelable { * {@link VisualEffect} * @hide */ - public Builder showVisualEffect(@VisualEffect int effect, boolean show) { + public @NonNull Builder showVisualEffect(@VisualEffect int effect, boolean show) { switch (effect) { case VISUAL_EFFECT_FULL_SCREEN_INTENT: showFullScreenIntent(show); @@ -1001,7 +1002,7 @@ public final class ZenPolicy implements Parcelable { * Makes deep copy of this ZenPolicy. * @hide */ - public ZenPolicy copy() { + public @NonNull ZenPolicy copy() { final Parcel parcel = Parcel.obtain(); try { writeToParcel(parcel, 0); diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java index 42b6acd3b25a..02449429c796 100644 --- a/graphics/java/android/graphics/RenderNode.java +++ b/graphics/java/android/graphics/RenderNode.java @@ -62,7 +62,7 @@ import java.lang.annotation.RetentionPolicy; * * <h3>Creating a RenderNode</h3> * <pre class="prettyprint"> - * RenderNode renderNode = RenderNode.create("myRenderNode"); + * RenderNode renderNode = new RenderNode("myRenderNode"); * renderNode.setLeftTopRightBottom(0, 0, 50, 50); // Set the size to 50x50 * RecordingCanvas canvas = renderNode.beginRecording(); * try { @@ -106,7 +106,7 @@ import java.lang.annotation.RetentionPolicy; * * <pre class="prettyprint"> * private void createDisplayList() { - * mRenderNode = RenderNode.create("MyRenderNode"); + * mRenderNode = new RenderNode("MyRenderNode"); * mRenderNode.setLeftTopRightBottom(0, 0, width, height); * RecordingCanvas canvas = mRenderNode.beginRecording(); * try { diff --git a/libs/incident/include/android/os/IncidentReportArgs.h b/libs/incident/include/android/os/IncidentReportArgs.h index 5e8eac1833ce..f056d3b6c9e8 100644 --- a/libs/incident/include/android/os/IncidentReportArgs.h +++ b/libs/incident/include/android/os/IncidentReportArgs.h @@ -47,12 +47,16 @@ public: void setAll(bool all); void setDest(int dest); void addSection(int section); + void setReceiverPkg(const string& pkg); + void setReceiverCls(const string& cls); void addHeader(const vector<uint8_t>& headerProto); inline bool all() const { return mAll; } bool containsSection(int section) const; inline int dest() const { return mDest; } inline const set<int>& sections() const { return mSections; } + inline const String16& receiverPkg() const { return mReceiverPkg; } + inline const String16& receiverCls() const { return mReceiverCls; } inline const vector<vector<uint8_t>>& headers() const { return mHeaders; } void merge(const IncidentReportArgs& that); @@ -62,6 +66,8 @@ private: vector<vector<uint8_t>> mHeaders; bool mAll; int mDest; + String16 mReceiverPkg; + String16 mReceiverCls; }; } diff --git a/libs/incident/src/IncidentReportArgs.cpp b/libs/incident/src/IncidentReportArgs.cpp index 06b7a5b682b1..46c8dcf967d7 100644 --- a/libs/incident/src/IncidentReportArgs.cpp +++ b/libs/incident/src/IncidentReportArgs.cpp @@ -81,6 +81,16 @@ IncidentReportArgs::writeToParcel(Parcel* out) const return err; } + err = out->writeString16(mReceiverPkg); + if (err != NO_ERROR) { + return err; + } + + err = out->writeString16(mReceiverCls); + if (err != NO_ERROR) { + return err; + } + return NO_ERROR; } @@ -134,6 +144,9 @@ IncidentReportArgs::readFromParcel(const Parcel* in) } mDest = dest; + mReceiverPkg = in->readString16(); + mReceiverCls = in->readString16(); + return OK; } @@ -161,6 +174,18 @@ IncidentReportArgs::addSection(int section) } void +IncidentReportArgs::setReceiverPkg(const string& pkg) +{ + mReceiverPkg = String16(pkg.c_str()); +} + +void +IncidentReportArgs::setReceiverCls(const string& cls) +{ + mReceiverCls = String16(cls.c_str()); +} + +void IncidentReportArgs::addHeader(const vector<uint8_t>& headerProto) { mHeaders.push_back(headerProto); diff --git a/media/apex/java/android/media/MediaItem2.java b/media/apex/java/android/media/MediaItem2.java index fc0f08ead46e..ff0d43e41350 100644 --- a/media/apex/java/android/media/MediaItem2.java +++ b/media/apex/java/android/media/MediaItem2.java @@ -245,7 +245,7 @@ public final class MediaItem2 implements Parcelable { /** * Builder for {@link MediaItem2}. */ - public static class Builder { + public static final class Builder { @SuppressWarnings("WeakerAccess") /* synthetic access */ MediaMetadata mMetadata; @SuppressWarnings("WeakerAccess") /* synthetic access */ diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index 46d4204b4d5e..aed8e4ede1c4 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -630,7 +630,7 @@ public final class AudioAttributes implements Parcelable { * true to allow apps to capture the audio * @return the same Builder instance */ - public Builder setAllowCapture(boolean allowCapture) { + public @NonNull Builder setAllowCapture(boolean allowCapture) { if (allowCapture) { mFlags &= ~FLAG_NO_CAPTURE; } else { diff --git a/media/java/android/media/AudioPlaybackCaptureConfiguration.java b/media/java/android/media/AudioPlaybackCaptureConfiguration.java index 9a16aea1e052..333cd2d4f0cf 100644 --- a/media/java/android/media/AudioPlaybackCaptureConfiguration.java +++ b/media/java/android/media/AudioPlaybackCaptureConfiguration.java @@ -72,7 +72,7 @@ public final class AudioPlaybackCaptureConfiguration { * * @param audioFormat The format in which to capture the audio. */ - AudioMix createAudioMix(AudioFormat audioFormat) { + @NonNull AudioMix createAudioMix(@NonNull AudioFormat audioFormat) { return new AudioMix.Builder(mAudioMixingRule) .setFormat(audioFormat) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK | AudioMix.ROUTE_FLAG_RENDER) @@ -123,7 +123,7 @@ public final class AudioPlaybackCaptureConfiguration { * @throws IllegalStateException if called in conjunction with * {@link #excludeUsage(AudioAttributes)}. */ - public Builder addMatchingUsage(@NonNull AudioAttributes audioAttributes) { + public @NonNull Builder addMatchingUsage(@NonNull AudioAttributes audioAttributes) { Preconditions.checkNotNull(audioAttributes); Preconditions.checkState( mUsageMatchType != MATCH_TYPE_EXCLUSIVE, ERROR_MESSAGE_MISMATCHED_RULES); @@ -141,7 +141,7 @@ public final class AudioPlaybackCaptureConfiguration { * * @throws IllegalStateException if called in conjunction with {@link #excludeUid(int)}. */ - public Builder addMatchingUid(int uid) { + public @NonNull Builder addMatchingUid(int uid) { Preconditions.checkState( mUidMatchType != MATCH_TYPE_EXCLUSIVE, ERROR_MESSAGE_MISMATCHED_RULES); mAudioMixingRuleBuilder.addMixRule(AudioMixingRule.RULE_MATCH_UID, uid); @@ -158,7 +158,7 @@ public final class AudioPlaybackCaptureConfiguration { * @throws IllegalStateException if called in conjunction with * {@link #addMatchingUsage(AudioAttributes)}. */ - public Builder excludeUsage(@NonNull AudioAttributes audioAttributes) { + public @NonNull Builder excludeUsage(@NonNull AudioAttributes audioAttributes) { Preconditions.checkNotNull(audioAttributes); Preconditions.checkState( mUsageMatchType != MATCH_TYPE_INCLUSIVE, ERROR_MESSAGE_MISMATCHED_RULES); @@ -176,7 +176,7 @@ public final class AudioPlaybackCaptureConfiguration { * * @throws IllegalStateException if called in conjunction with {@link #addMatchingUid(int)}. */ - public Builder excludeUid(int uid) { + public @NonNull Builder excludeUid(int uid) { Preconditions.checkState( mUidMatchType != MATCH_TYPE_INCLUSIVE, ERROR_MESSAGE_MISMATCHED_RULES); mAudioMixingRuleBuilder.excludeMixRule(AudioMixingRule.RULE_MATCH_UID, uid); @@ -189,7 +189,7 @@ public final class AudioPlaybackCaptureConfiguration { * * @throws UnsupportedOperationException if the parameters set are incompatible. */ - public AudioPlaybackCaptureConfiguration build() { + public @NonNull AudioPlaybackCaptureConfiguration build() { return new AudioPlaybackCaptureConfiguration(mAudioMixingRuleBuilder.build(), mProjection); } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 3d5120f86db3..28937a65ad0d 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -618,7 +618,7 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, * @throws IllegalStateException if called in conjunction with {@link #setAudioSource(int)}. * @throws NullPointerException if {@code config} is null. */ - public Builder setAudioPlaybackCaptureConfig( + public @NonNull Builder setAudioPlaybackCaptureConfig( @NonNull AudioPlaybackCaptureConfiguration config) { Preconditions.checkNotNull( config, "Illegal null AudioPlaybackCaptureConfiguration argument"); @@ -647,7 +647,7 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, return this; } - private AudioRecord buildAudioPlaybackCaptureRecord() { + private @NonNull AudioRecord buildAudioPlaybackCaptureRecord() { AudioMix audioMix = mAudioPlaybackCaptureConfiguration.createAudioMix(mFormat); MediaProjection projection = mAudioPlaybackCaptureConfiguration.getMediaProjection(); AudioPolicy audioPolicy = new AudioPolicy.Builder(/*context=*/ null) diff --git a/packages/DynamicAndroidInstallationService/src/com/android/dynandroid/DynamicAndroidInstallationService.java b/packages/DynamicAndroidInstallationService/src/com/android/dynandroid/DynamicAndroidInstallationService.java index 7755cbc9ca3b..719417e96015 100644 --- a/packages/DynamicAndroidInstallationService/src/com/android/dynandroid/DynamicAndroidInstallationService.java +++ b/packages/DynamicAndroidInstallationService/src/com/android/dynandroid/DynamicAndroidInstallationService.java @@ -114,6 +114,7 @@ public class DynamicAndroidInstallationService extends Service private NotificationManager mNM; private long mSystemSize; + private long mUserdataSize; private long mInstalledSize; private boolean mJustCancelledByUser; @@ -220,9 +221,11 @@ public class DynamicAndroidInstallationService extends Service String url = intent.getStringExtra(DynamicAndroidClient.KEY_SYSTEM_URL); mSystemSize = intent.getLongExtra(DynamicAndroidClient.KEY_SYSTEM_SIZE, 0); - long userdata = intent.getLongExtra(DynamicAndroidClient.KEY_USERDATA_SIZE, 0); + mUserdataSize = intent.getLongExtra(DynamicAndroidClient.KEY_USERDATA_SIZE, 0); + + mInstallTask = new InstallationAsyncTask( + url, mSystemSize, mUserdataSize, mDynAndroid, this); - mInstallTask = new InstallationAsyncTask(url, mSystemSize, userdata, mDynAndroid, this); mInstallTask.execute(); // start fore ground @@ -332,8 +335,8 @@ public class DynamicAndroidInstallationService extends Service case STATUS_IN_PROGRESS: builder.setContentText(getString(R.string.notification_install_inprogress)); - int max = (int) Math.max(mSystemSize >> 20, 1); - int progress = (int) mInstalledSize >> 20; + int max = (int) Math.max((mSystemSize + mUserdataSize) >> 20, 1); + int progress = (int) (mInstalledSize >> 20); builder.setProgress(max, progress, false); diff --git a/packages/DynamicAndroidInstallationService/src/com/android/dynandroid/InstallationAsyncTask.java b/packages/DynamicAndroidInstallationService/src/com/android/dynandroid/InstallationAsyncTask.java index 3c759e948b4e..03fc7739fcce 100644 --- a/packages/DynamicAndroidInstallationService/src/com/android/dynandroid/InstallationAsyncTask.java +++ b/packages/DynamicAndroidInstallationService/src/com/android/dynandroid/InstallationAsyncTask.java @@ -16,6 +16,7 @@ package com.android.dynandroid; +import android.gsi.GsiProgress; import android.os.AsyncTask; import android.os.DynamicAndroidManager; import android.util.Log; @@ -63,8 +64,6 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> { private final InstallStatusListener mListener; private DynamicAndroidManager.Session mInstallationSession; - private long mInstalledSize; - private long mReportedInstalledSize; private int mResult = NO_RESULT; private InputStream mStream; @@ -89,8 +88,40 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> { Log.d(TAG, "Start doInBackground(), URL: " + mUrl); try { - // call start in background - mInstallationSession = mDynamicAndroid.startInstallation(mSystemSize, mUserdataSize); + long installedSize = 0; + long reportedInstalledSize = 0; + + long minStepToReport = (mSystemSize + mUserdataSize) / 100; + + // init input stream before calling startInstallation(), which takes 90 seconds. + initInputStream(); + + Thread thread = new Thread(() -> { + mInstallationSession = + mDynamicAndroid.startInstallation(mSystemSize, mUserdataSize); + }); + + + thread.start(); + + while (thread.isAlive()) { + if (isCancelled()) { + boolean aborted = mDynamicAndroid.abort(); + Log.d(TAG, "Called DynamicAndroidManager.abort(), result = " + aborted); + return RESULT_OK; + } + + GsiProgress progress = mDynamicAndroid.getInstallationProgress(); + installedSize = progress.bytes_processed; + + if (installedSize > reportedInstalledSize + minStepToReport) { + publishProgress(installedSize); + reportedInstalledSize = installedSize; + } + + Thread.sleep(10); + } + if (mInstallationSession == null) { Log.e(TAG, "Failed to start installation with requested size: " @@ -99,12 +130,11 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> { return RESULT_ERROR_IO; } - initInputStream(); + installedSize = mUserdataSize; byte[] bytes = new byte[READ_BUFFER_SIZE]; int numBytesRead; - long minStepToReport = mSystemSize / 100; Log.d(TAG, "Start installation loop"); while ((numBytesRead = mStream.read(bytes, 0, READ_BUFFER_SIZE)) != -1) { @@ -119,11 +149,11 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> { throw new IOException("Failed write() to DynamicAndroid"); } - mInstalledSize += numBytesRead; + installedSize += numBytesRead; - if (mInstalledSize > mReportedInstalledSize + minStepToReport) { - publishProgress(mInstalledSize); - mReportedInstalledSize = mInstalledSize; + if (installedSize > reportedInstalledSize + minStepToReport) { + publishProgress(installedSize); + reportedInstalledSize = installedSize; } } diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java index 18c272202990..d26663520850 100644 --- a/services/core/java/com/android/server/RescueParty.java +++ b/services/core/java/com/android/server/RescueParty.java @@ -38,9 +38,11 @@ import android.util.StatsLog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; +import com.android.server.am.SettingsToPropertiesMapper; import com.android.server.utils.FlagNamespaceUtils; import java.io.File; +import java.util.Arrays; /** * Utilities to help rescue the system from crash loops. Callers are expected to @@ -158,6 +160,7 @@ public class RescueParty { * opportunity to reset any settings depending on our rescue level. */ public static void onSettingsProviderPublished(Context context) { + handleNativeRescuePartyResets(); executeRescueLevel(context); } @@ -176,6 +179,13 @@ public class RescueParty { return SystemClock.elapsedRealtime(); } + private static void handleNativeRescuePartyResets() { + if (SettingsToPropertiesMapper.isNativeFlagsResetPerformed()) { + FlagNamespaceUtils.resetDeviceConfig(Settings.RESET_MODE_TRUSTED_DEFAULTS, + Arrays.asList(SettingsToPropertiesMapper.getResetNativeCategories())); + } + } + /** * Escalate to the next rescue level. After incrementing the level you'll * probably want to call {@link #executeRescueLevel(Context)}. diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java index 5da1ce610079..194549f15ecf 100644 --- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java @@ -16,6 +16,7 @@ package com.android.server.am; +import android.annotation.NonNull; import android.content.ContentResolver; import android.database.ContentObserver; import android.net.Uri; @@ -167,7 +168,7 @@ public class SettingsToPropertiesMapper { * booting. * @return */ - public static String[] getResetNativeCategories() { + public static @NonNull String[] getResetNativeCategories() { if (!isNativeFlagsResetPerformed()) { return new String[0]; } diff --git a/services/core/java/com/android/server/utils/FlagNamespaceUtils.java b/services/core/java/com/android/server/utils/FlagNamespaceUtils.java index f26121eac939..f8c7447fc55d 100644 --- a/services/core/java/com/android/server/utils/FlagNamespaceUtils.java +++ b/services/core/java/com/android/server/utils/FlagNamespaceUtils.java @@ -19,6 +19,7 @@ package com.android.server.utils; import android.annotation.Nullable; import android.provider.DeviceConfig; +import com.android.internal.annotations.VisibleForTesting; import com.android.server.RescueParty; import java.util.ArrayList; @@ -41,20 +42,23 @@ public final class FlagNamespaceUtils { /** * Name of the special namespace in DeviceConfig table used for communicating resets. */ - private static final String NAMESPACE_RESCUE_PARTY = "rescue_party_namespace"; + @VisibleForTesting + public static final String NAMESPACE_RESCUE_PARTY = "rescue_party_namespace"; /** * Flag in the {@link DeviceConfig} in {@link #NAMESPACE_RESCUE_PARTY}, holding all known {@link * DeviceConfig} namespaces, as a {@link #DELIMITER} separated String. It's updated after the * first time flags are written to the new namespace in the {@link DeviceConfig}. */ - private static final String ALL_KNOWN_NAMESPACES_FLAG = "all_known_namespaces"; + @VisibleForTesting + public static final String ALL_KNOWN_NAMESPACES_FLAG = "all_known_namespaces"; /** * Flag in the {@link DeviceConfig} in {@link #NAMESPACE_RESCUE_PARTY} with integer counter * suffix added to it, holding {@link DeviceConfig} namespace value whose flags were recently * reset by the {@link RescueParty}. It's updated by {@link RescueParty} every time given * namespace flags are reset. */ - private static final String RESET_PLATFORM_PACKAGE_FLAG = "reset_platform_package"; + @VisibleForTesting + public static final String RESET_PLATFORM_PACKAGE_FLAG = "reset_platform_package"; private static final String DELIMITER = ":"; /** * Maximum value of the counter used in combination with {@link #RESET_PLATFORM_PACKAGE_FLAG} @@ -97,11 +101,25 @@ public final class FlagNamespaceUtils { * Reset all namespaces in DeviceConfig with consumed resetMode. */ public static void resetDeviceConfig(int resetMode) { - List<String> allKnownNamespaces = getAllKnownDeviceConfigNamespacesList(); - for (String namespace : allKnownNamespaces) { + resetDeviceConfig(resetMode, getAllKnownDeviceConfigNamespacesList()); + } + + /** + * Reset all consumed namespaces in DeviceConfig with consumed resetMode. + */ + public static void resetDeviceConfig(int resetMode, List<String> namespacesList) { + for (String namespace : namespacesList) { DeviceConfig.resetToDefaults(resetMode, namespace); } - addToKnownResetNamespaces(allKnownNamespaces); + addToKnownResetNamespaces(namespacesList); + } + + /** + * Resets known reset namespaces flag counter for tests only. + */ + @VisibleForTesting + public static void resetKnownResetNamespacesFlagCounterForTest() { + sKnownResetNamespacesFlagCounter = -1; } /** diff --git a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java index b13735cbf3b7..36825af527b1 100644 --- a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java @@ -35,9 +35,12 @@ import android.content.Context; import android.os.RecoverySystem; import android.os.SystemProperties; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; import com.android.dx.mockito.inline.extended.ExtendedMockito; +import com.android.server.am.SettingsToPropertiesMapper; +import com.android.server.utils.FlagNamespaceUtils; import org.junit.After; import org.junit.Before; @@ -56,6 +59,10 @@ import java.util.HashMap; public class RescuePartyTest { private static final int PERSISTENT_APP_UID = 12; private static final long CURRENT_NETWORK_TIME_MILLIS = 0L; + private static final String FAKE_NATIVE_NAMESPACE1 = "native1"; + private static final String FAKE_NATIVE_NAMESPACE2 = "native2"; + private static final String[] FAKE_RESET_NATIVE_NAMESPACES = + {FAKE_NATIVE_NAMESPACE1, FAKE_NATIVE_NAMESPACE2}; private MockitoSession mSession; @@ -73,9 +80,11 @@ public class RescuePartyTest { ExtendedMockito.mockitoSession().initMocks( this) .strictness(Strictness.LENIENT) + .spyStatic(DeviceConfig.class) .spyStatic(SystemProperties.class) .spyStatic(Settings.Global.class) .spyStatic(Settings.Secure.class) + .spyStatic(SettingsToPropertiesMapper.class) .spyStatic(RecoverySystem.class) .spyStatic(RescueParty.class) .startMocking(); @@ -121,8 +130,17 @@ public class RescuePartyTest { } ).when(() -> SystemProperties.getLong(anyString(), anyLong())); + // Mock DeviceConfig + doAnswer((Answer<Boolean>) invocationOnMock -> true) + .when(() -> DeviceConfig.setProperty(anyString(), anyString(), anyString(), + anyBoolean())); + doAnswer((Answer<Void>) invocationOnMock -> null) + .when(() -> DeviceConfig.resetToDefaults(anyInt(), anyString())); + + doReturn(CURRENT_NETWORK_TIME_MILLIS).when(() -> RescueParty.getElapsedRealtime()); RescueParty.resetAllThresholds(); + FlagNamespaceUtils.resetKnownResetNamespacesFlagCounterForTest(); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString(RescueParty.LEVEL_NONE)); @@ -278,10 +296,32 @@ public class RescuePartyTest { SystemProperties.getInt(RescueParty.PROP_RESCUE_LEVEL, RescueParty.LEVEL_NONE)); } + @Test + public void testNativeRescuePartyResets() { + doReturn(true).when(() -> SettingsToPropertiesMapper.isNativeFlagsResetPerformed()); + doReturn(FAKE_RESET_NATIVE_NAMESPACES).when( + () -> SettingsToPropertiesMapper.getResetNativeCategories()); + + RescueParty.onSettingsProviderPublished(mMockContext); + + verify(() -> DeviceConfig.resetToDefaults(Settings.RESET_MODE_TRUSTED_DEFAULTS, + FAKE_NATIVE_NAMESPACE1)); + verify(() -> DeviceConfig.resetToDefaults(Settings.RESET_MODE_TRUSTED_DEFAULTS, + FAKE_NATIVE_NAMESPACE2)); + + ExtendedMockito.verify( + () -> DeviceConfig.setProperty(FlagNamespaceUtils.NAMESPACE_RESCUE_PARTY, + FlagNamespaceUtils.RESET_PLATFORM_PACKAGE_FLAG + 0, + FAKE_NATIVE_NAMESPACE1, /*makeDefault=*/true)); + ExtendedMockito.verify( + () -> DeviceConfig.setProperty(FlagNamespaceUtils.NAMESPACE_RESCUE_PARTY, + FlagNamespaceUtils.RESET_PLATFORM_PACKAGE_FLAG + 1, + FAKE_NATIVE_NAMESPACE2, /*makeDefault=*/true)); + } + private void verifySettingsResets(int resetMode) { verify(() -> Settings.Global.resetToDefaultsAsUser(mMockContentResolver, null, - resetMode, - UserHandle.USER_SYSTEM)); + resetMode, UserHandle.USER_SYSTEM)); verify(() -> Settings.Secure.resetToDefaultsAsUser(eq(mMockContentResolver), isNull(), eq(resetMode), anyInt())); } |