Skip to content

Commit 835e7a9

Browse files
author
Android Build Coastguard Worker
committed
Snap for 10316917 from 46cd9d9 to tm-platform-release
Change-Id: Id9a40fb63d02d19a35d9aa941db456eaac582a26
2 parents 8fc1aa1 + 46cd9d9 commit 835e7a9

30 files changed

Lines changed: 873 additions & 217 deletions

File tree

core/java/android/app/ActivityOptions.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
2222
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
2323
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
24+
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
25+
import static android.content.Intent.FLAG_RECEIVER_FOREGROUND;
2426
import static android.view.Display.INVALID_DISPLAY;
2527

2628
import android.annotation.IntDef;
@@ -1727,7 +1729,9 @@ public void setPendingIntentLaunchFlags(@android.content.Intent.Flags int flags)
17271729
* @hide
17281730
*/
17291731
public int getPendingIntentLaunchFlags() {
1730-
return mPendingIntentLaunchFlags;
1732+
// b/243794108: Ignore all flags except the new task flag, to be reconsidered in b/254490217
1733+
return mPendingIntentLaunchFlags &
1734+
(FLAG_ACTIVITY_NEW_TASK | FLAG_RECEIVER_FOREGROUND);
17311735
}
17321736

17331737
/**

core/java/android/app/Notification.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2807,6 +2807,10 @@ private static void visitIconUri(@NonNull Consumer<Uri> visitor, @Nullable Icon
28072807
* @hide
28082808
*/
28092809
public void visitUris(@NonNull Consumer<Uri> visitor) {
2810+
if (publicVersion != null) {
2811+
publicVersion.visitUris(visitor);
2812+
}
2813+
28102814
visitor.accept(sound);
28112815

28122816
if (tickerView != null) tickerView.visitUris(visitor);
@@ -2853,6 +2857,17 @@ public void visitUris(@NonNull Consumer<Uri> visitor) {
28532857
if (person != null) {
28542858
visitor.accept(person.getIconUri());
28552859
}
2860+
2861+
final RemoteInputHistoryItem[] history = (RemoteInputHistoryItem[])
2862+
extras.getParcelableArray(Notification.EXTRA_REMOTE_INPUT_HISTORY_ITEMS);
2863+
if (history != null) {
2864+
for (int i = 0; i < history.length; i++) {
2865+
RemoteInputHistoryItem item = history[i];
2866+
if (item.getUri() != null) {
2867+
visitor.accept(item.getUri());
2868+
}
2869+
}
2870+
}
28562871
}
28572872

28582873
if (isStyle(MessagingStyle.class) && extras != null) {
@@ -2881,6 +2896,16 @@ public void visitUris(@NonNull Consumer<Uri> visitor) {
28812896
}
28822897
}
28832898
}
2899+
2900+
visitIconUri(visitor, extras.getParcelable(EXTRA_CONVERSATION_ICON));
2901+
}
2902+
2903+
if (isStyle(CallStyle.class) & extras != null) {
2904+
Person callPerson = extras.getParcelable(EXTRA_CALL_PERSON);
2905+
if (callPerson != null) {
2906+
visitor.accept(callPerson.getIconUri());
2907+
}
2908+
visitIconUri(visitor, extras.getParcelable(EXTRA_VERIFICATION_ICON));
28842909
}
28852910

28862911
if (mBubbleMetadata != null) {

core/java/android/app/admin/DevicePolicyManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12402,7 +12402,8 @@ public CharSequence getShortSupportMessage(@NonNull ComponentName admin) {
1240212402

1240312403
/**
1240412404
* Called by a device admin to set the long support message. This will be displayed to the user
12405-
* in the device administators settings screen.
12405+
* in the device administrators settings screen. If the message is longer than 20000 characters
12406+
* it may be truncated.
1240612407
* <p>
1240712408
* If the long support message needs to be localized, it is the responsibility of the
1240812409
* {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast

core/java/android/content/pm/ShortcutInfo.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,12 @@ public final class ShortcutInfo implements Parcelable {
283283
*/
284284
public static final int DISABLED_REASON_OTHER_RESTORE_ISSUE = 103;
285285

286+
/**
287+
* The maximum length of Shortcut ID. IDs will be truncated at this limit.
288+
* @hide
289+
*/
290+
public static final int MAX_ID_LENGTH = 1000;
291+
286292
/** @hide */
287293
@IntDef(prefix = { "DISABLED_REASON_" }, value = {
288294
DISABLED_REASON_NOT_DISABLED,
@@ -475,8 +481,7 @@ public static boolean isDisabledForRestoreIssue(@DisabledReason int disabledReas
475481

476482
private ShortcutInfo(Builder b) {
477483
mUserId = b.mContext.getUserId();
478-
479-
mId = Preconditions.checkStringNotEmpty(b.mId, "Shortcut ID must be provided");
484+
mId = getSafeId(Preconditions.checkStringNotEmpty(b.mId, "Shortcut ID must be provided"));
480485

481486
// Note we can't do other null checks here because SM.updateShortcuts() takes partial
482487
// information.
@@ -582,6 +587,14 @@ private static Person[] clonePersons(Person[] persons) {
582587
return ret;
583588
}
584589

590+
@NonNull
591+
private static String getSafeId(@NonNull String id) {
592+
if (id.length() > MAX_ID_LENGTH) {
593+
return id.substring(0, MAX_ID_LENGTH);
594+
}
595+
return id;
596+
}
597+
585598
/**
586599
* Throws if any of the mandatory fields is not set.
587600
*
@@ -2336,7 +2349,8 @@ private ShortcutInfo(Parcel source) {
23362349
final ClassLoader cl = getClass().getClassLoader();
23372350

23382351
mUserId = source.readInt();
2339-
mId = source.readString8();
2352+
mId = getSafeId(Preconditions.checkStringNotEmpty(source.readString8(),
2353+
"Shortcut ID must be provided"));
23402354
mPackageName = source.readString8();
23412355
mActivity = source.readParcelable(cl, android.content.ComponentName.class);
23422356
mFlags = source.readInt();

core/java/android/permission/IPermissionManager.aidl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ interface IPermissionManager {
7777
List<SplitPermissionInfoParcelable> getSplitPermissions();
7878

7979
void startOneTimePermissionSession(String packageName, int userId, long timeout,
80-
long revokeAfterKilledDelay, int importanceToResetTimer,
81-
int importanceToKeepSessionAlive);
80+
long revokeAfterKilledDelay);
8281

8382
void stopOneTimePermissionSession(String packageName, int userId);
8483

core/java/android/permission/PermissionManager.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,8 +1371,7 @@ public void startOneTimePermissionSession(@NonNull String packageName,
13711371
@ActivityManager.RunningAppProcessInfo.Importance int importanceToKeepSessionAlive) {
13721372
try {
13731373
mPermissionManager.startOneTimePermissionSession(packageName, mContext.getUserId(),
1374-
timeoutMillis, revokeAfterKilledDelayMillis, importanceToResetTimer,
1375-
importanceToKeepSessionAlive);
1374+
timeoutMillis, revokeAfterKilledDelayMillis);
13761375
} catch (RemoteException e) {
13771376
e.rethrowFromSystemServer();
13781377
}

core/java/android/widget/RemoteViews.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,17 @@ public void visitUris(@NonNull Consumer<Uri> visitor) {
726726
mActions.get(i).visitUris(visitor);
727727
}
728728
}
729+
if (mSizedRemoteViews != null) {
730+
for (int i = 0; i < mSizedRemoteViews.size(); i++) {
731+
mSizedRemoteViews.get(i).visitUris(visitor);
732+
}
733+
}
734+
if (mLandscape != null) {
735+
mLandscape.visitUris(visitor);
736+
}
737+
if (mPortrait != null) {
738+
mPortrait.visitUris(visitor);
739+
}
729740
}
730741

731742
private static void visitIconUri(Icon icon, @NonNull Consumer<Uri> visitor) {
@@ -1824,7 +1835,7 @@ public final boolean prefersAsyncApply() {
18241835
}
18251836

18261837
@Override
1827-
public final void visitUris(@NonNull Consumer<Uri> visitor) {
1838+
public void visitUris(@NonNull Consumer<Uri> visitor) {
18281839
switch (this.type) {
18291840
case URI:
18301841
final Uri uri = (Uri) getParameterValue(null);
@@ -2287,6 +2298,14 @@ protected Object getParameterValue(@Nullable View view) throws ActionException {
22872298
public int getActionTag() {
22882299
return NIGHT_MODE_REFLECTION_ACTION_TAG;
22892300
}
2301+
2302+
@Override
2303+
public void visitUris(@NonNull Consumer<Uri> visitor) {
2304+
if (this.type == ICON) {
2305+
visitIconUri((Icon) mDarkValue, visitor);
2306+
visitIconUri((Icon) mLightValue, visitor);
2307+
}
2308+
}
22902309
}
22912310

22922311
/**
@@ -2577,6 +2596,11 @@ public boolean prefersAsyncApply() {
25772596
public int getActionTag() {
25782597
return VIEW_GROUP_ACTION_ADD_TAG;
25792598
}
2599+
2600+
@Override
2601+
public final void visitUris(@NonNull Consumer<Uri> visitor) {
2602+
mNestedViews.visitUris(visitor);
2603+
}
25802604
}
25812605

25822606
/**

core/tests/coretests/src/android/widget/RemoteViewsTest.java

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
import static org.junit.Assert.assertNull;
2525
import static org.junit.Assert.assertSame;
2626
import static org.junit.Assert.assertTrue;
27+
import static org.mockito.ArgumentMatchers.eq;
28+
import static org.mockito.Mockito.spy;
29+
import static org.mockito.Mockito.times;
30+
import static org.mockito.Mockito.verify;
2731

2832
import android.app.ActivityOptions;
2933
import android.app.PendingIntent;
@@ -33,6 +37,8 @@
3337
import android.graphics.Bitmap;
3438
import android.graphics.drawable.BitmapDrawable;
3539
import android.graphics.drawable.Drawable;
40+
import android.graphics.drawable.Icon;
41+
import android.net.Uri;
3642
import android.os.AsyncTask;
3743
import android.os.Binder;
3844
import android.os.Looper;
@@ -57,7 +63,9 @@
5763
import java.util.ArrayList;
5864
import java.util.Arrays;
5965
import java.util.Map;
66+
import java.util.HashMap;
6067
import java.util.concurrent.CountDownLatch;
68+
import java.util.function.Consumer;
6169

6270
/**
6371
* Tests for RemoteViews.
@@ -690,4 +698,137 @@ public ActivityOptions createSharedElementActivityOptions(
690698
return null;
691699
}
692700
}
701+
702+
@Test
703+
public void visitUris() {
704+
RemoteViews views = new RemoteViews(mPackage, R.layout.remote_views_test);
705+
706+
final Uri imageUri = Uri.parse("content://media/image");
707+
final Icon icon1 = Icon.createWithContentUri("content://media/icon1");
708+
final Icon icon2 = Icon.createWithContentUri("content://media/icon2");
709+
final Icon icon3 = Icon.createWithContentUri("content://media/icon3");
710+
final Icon icon4 = Icon.createWithContentUri("content://media/icon4");
711+
views.setImageViewUri(R.id.image, imageUri);
712+
views.setTextViewCompoundDrawables(R.id.text, icon1, icon2, icon3, icon4);
713+
714+
Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
715+
views.visitUris(visitor);
716+
verify(visitor, times(1)).accept(eq(imageUri));
717+
verify(visitor, times(1)).accept(eq(icon1.getUri()));
718+
verify(visitor, times(1)).accept(eq(icon2.getUri()));
719+
verify(visitor, times(1)).accept(eq(icon3.getUri()));
720+
verify(visitor, times(1)).accept(eq(icon4.getUri()));
721+
}
722+
723+
@Test
724+
public void visitUris_themedIcons() {
725+
RemoteViews views = new RemoteViews(mPackage, R.layout.remote_views_test);
726+
final Icon iconLight = Icon.createWithContentUri("content://light/icon");
727+
final Icon iconDark = Icon.createWithContentUri("content://dark/icon");
728+
views.setIcon(R.id.layout, "setLargeIcon", iconLight, iconDark);
729+
730+
Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
731+
views.visitUris(visitor);
732+
verify(visitor, times(1)).accept(eq(iconLight.getUri()));
733+
verify(visitor, times(1)).accept(eq(iconDark.getUri()));
734+
}
735+
736+
@Test
737+
public void visitUris_nestedViews() {
738+
final RemoteViews outer = new RemoteViews(mPackage, R.layout.remote_views_test);
739+
740+
final RemoteViews inner = new RemoteViews(mPackage, 33);
741+
final Uri imageUriI = Uri.parse("content://inner/image");
742+
final Icon icon1 = Icon.createWithContentUri("content://inner/icon1");
743+
final Icon icon2 = Icon.createWithContentUri("content://inner/icon2");
744+
final Icon icon3 = Icon.createWithContentUri("content://inner/icon3");
745+
final Icon icon4 = Icon.createWithContentUri("content://inner/icon4");
746+
inner.setImageViewUri(R.id.image, imageUriI);
747+
inner.setTextViewCompoundDrawables(R.id.text, icon1, icon2, icon3, icon4);
748+
749+
outer.addView(R.id.layout, inner);
750+
751+
Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
752+
outer.visitUris(visitor);
753+
verify(visitor, times(1)).accept(eq(imageUriI));
754+
verify(visitor, times(1)).accept(eq(icon1.getUri()));
755+
verify(visitor, times(1)).accept(eq(icon2.getUri()));
756+
verify(visitor, times(1)).accept(eq(icon3.getUri()));
757+
verify(visitor, times(1)).accept(eq(icon4.getUri()));
758+
}
759+
760+
@Test
761+
public void visitUris_separateOrientation() {
762+
final RemoteViews landscape = new RemoteViews(mPackage, R.layout.remote_views_test);
763+
final Uri imageUriL = Uri.parse("content://landscape/image");
764+
final Icon icon1L = Icon.createWithContentUri("content://landscape/icon1");
765+
final Icon icon2L = Icon.createWithContentUri("content://landscape/icon2");
766+
final Icon icon3L = Icon.createWithContentUri("content://landscape/icon3");
767+
final Icon icon4L = Icon.createWithContentUri("content://landscape/icon4");
768+
landscape.setImageViewUri(R.id.image, imageUriL);
769+
landscape.setTextViewCompoundDrawables(R.id.text, icon1L, icon2L, icon3L, icon4L);
770+
771+
final RemoteViews portrait = new RemoteViews(mPackage, 33);
772+
final Uri imageUriP = Uri.parse("content://portrait/image");
773+
final Icon icon1P = Icon.createWithContentUri("content://portrait/icon1");
774+
final Icon icon2P = Icon.createWithContentUri("content://portrait/icon2");
775+
final Icon icon3P = Icon.createWithContentUri("content://portrait/icon3");
776+
final Icon icon4P = Icon.createWithContentUri("content://portrait/icon4");
777+
portrait.setImageViewUri(R.id.image, imageUriP);
778+
portrait.setTextViewCompoundDrawables(R.id.text, icon1P, icon2P, icon3P, icon4P);
779+
780+
RemoteViews views = new RemoteViews(landscape, portrait);
781+
782+
Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
783+
views.visitUris(visitor);
784+
verify(visitor, times(1)).accept(eq(imageUriL));
785+
verify(visitor, times(1)).accept(eq(icon1L.getUri()));
786+
verify(visitor, times(1)).accept(eq(icon2L.getUri()));
787+
verify(visitor, times(1)).accept(eq(icon3L.getUri()));
788+
verify(visitor, times(1)).accept(eq(icon4L.getUri()));
789+
verify(visitor, times(1)).accept(eq(imageUriP));
790+
verify(visitor, times(1)).accept(eq(icon1P.getUri()));
791+
verify(visitor, times(1)).accept(eq(icon2P.getUri()));
792+
verify(visitor, times(1)).accept(eq(icon3P.getUri()));
793+
verify(visitor, times(1)).accept(eq(icon4P.getUri()));
794+
}
795+
796+
@Test
797+
public void visitUris_sizedViews() {
798+
final RemoteViews large = new RemoteViews(mPackage, R.layout.remote_views_test);
799+
final Uri imageUriL = Uri.parse("content://large/image");
800+
final Icon icon1L = Icon.createWithContentUri("content://large/icon1");
801+
final Icon icon2L = Icon.createWithContentUri("content://large/icon2");
802+
final Icon icon3L = Icon.createWithContentUri("content://large/icon3");
803+
final Icon icon4L = Icon.createWithContentUri("content://large/icon4");
804+
large.setImageViewUri(R.id.image, imageUriL);
805+
large.setTextViewCompoundDrawables(R.id.text, icon1L, icon2L, icon3L, icon4L);
806+
807+
final RemoteViews small = new RemoteViews(mPackage, 33);
808+
final Uri imageUriS = Uri.parse("content://small/image");
809+
final Icon icon1S = Icon.createWithContentUri("content://small/icon1");
810+
final Icon icon2S = Icon.createWithContentUri("content://small/icon2");
811+
final Icon icon3S = Icon.createWithContentUri("content://small/icon3");
812+
final Icon icon4S = Icon.createWithContentUri("content://small/icon4");
813+
small.setImageViewUri(R.id.image, imageUriS);
814+
small.setTextViewCompoundDrawables(R.id.text, icon1S, icon2S, icon3S, icon4S);
815+
816+
HashMap<SizeF, RemoteViews> sizedViews = new HashMap<>();
817+
sizedViews.put(new SizeF(300, 300), large);
818+
sizedViews.put(new SizeF(100, 100), small);
819+
RemoteViews views = new RemoteViews(sizedViews);
820+
821+
Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
822+
views.visitUris(visitor);
823+
verify(visitor, times(1)).accept(eq(imageUriL));
824+
verify(visitor, times(1)).accept(eq(icon1L.getUri()));
825+
verify(visitor, times(1)).accept(eq(icon2L.getUri()));
826+
verify(visitor, times(1)).accept(eq(icon3L.getUri()));
827+
verify(visitor, times(1)).accept(eq(icon4L.getUri()));
828+
verify(visitor, times(1)).accept(eq(imageUriS));
829+
verify(visitor, times(1)).accept(eq(icon1S.getUri()));
830+
verify(visitor, times(1)).accept(eq(icon2S.getUri()));
831+
verify(visitor, times(1)).accept(eq(icon3S.getUri()));
832+
verify(visitor, times(1)).accept(eq(icon4S.getUri()));
833+
}
693834
}

libs/androidfw/CursorWindow.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ status_t CursorWindow::maybeInflate() {
108108

109109
{
110110
// Migrate existing contents into new ashmem region
111-
uint32_t slotsSize = mSize - mSlotsOffset;
111+
uint32_t slotsSize = sizeOfSlots();
112112
uint32_t newSlotsOffset = mInflatedSize - slotsSize;
113113
memcpy(static_cast<uint8_t*>(newData),
114114
static_cast<uint8_t*>(mData), mAllocOffset);
@@ -216,11 +216,9 @@ status_t CursorWindow::writeToParcel(Parcel* parcel) {
216216
if (parcel->writeDupFileDescriptor(mAshmemFd)) goto fail;
217217
} else {
218218
// Since we know we're going to be read-only on the remote side,
219-
// we can compact ourselves on the wire, with just enough padding
220-
// to ensure our slots stay aligned
221-
size_t slotsSize = mSize - mSlotsOffset;
222-
size_t compactedSize = mAllocOffset + slotsSize;
223-
compactedSize = (compactedSize + 3) & ~3;
219+
// we can compact ourselves on the wire.
220+
size_t slotsSize = sizeOfSlots();
221+
size_t compactedSize = sizeInUse();
224222
if (parcel->writeUint32(compactedSize)) goto fail;
225223
if (parcel->writeBool(false)) goto fail;
226224
void* dest = parcel->writeInplace(compactedSize);

libs/androidfw/include/androidfw/CursorWindow.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ class CursorWindow {
9090
inline uint32_t getNumRows() { return mNumRows; }
9191
inline uint32_t getNumColumns() { return mNumColumns; }
9292

93+
inline size_t sizeOfSlots() const { return mSize - mSlotsOffset; }
94+
inline size_t sizeInUse() const { return mAllocOffset + sizeOfSlots(); }
95+
9396
status_t clear();
9497
status_t setNumColumns(uint32_t numColumns);
9598

0 commit comments

Comments
 (0)