diff options
103 files changed, 1718 insertions, 1032 deletions
diff --git a/apct-tests/perftests/multiuser/Android.bp b/apct-tests/perftests/multiuser/Android.bp new file mode 100644 index 000000000000..825b3e4f8543 --- /dev/null +++ b/apct-tests/perftests/multiuser/Android.bp @@ -0,0 +1,25 @@ +// Copyright (C) 2016 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. + +android_test { + name: "MultiUserPerfTests", + srcs: ["src/**/*.java"], + static_libs: [ + "android-support-test", + "ub-uiautomator", + ], + platform_apis: true, + test_suites: ["device-tests"], + certificate: "platform", +} diff --git a/apct-tests/perftests/multiuser/Android.mk b/apct-tests/perftests/multiuser/Android.mk deleted file mode 100644 index 9bc7d051121a..000000000000 --- a/apct-tests/perftests/multiuser/Android.mk +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 2016 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. - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android-support-test \ - ub-uiautomator - -LOCAL_PACKAGE_NAME := MultiUserPerfTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_COMPATIBILITY_SUITE += device-tests - -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) - diff --git a/apct-tests/perftests/utils/Android.bp b/apct-tests/perftests/utils/Android.bp new file mode 100644 index 000000000000..4cd2008de859 --- /dev/null +++ b/apct-tests/perftests/utils/Android.bp @@ -0,0 +1,6 @@ +java_library { + name: "apct-perftests-utils", + static_libs: ["android-support-test"], + // Build all java files in the java subdirectory + srcs: ["**/*.java"], +} diff --git a/apct-tests/perftests/utils/Android.mk b/apct-tests/perftests/utils/Android.mk deleted file mode 100644 index 55c13b087626..000000000000 --- a/apct-tests/perftests/utils/Android.mk +++ /dev/null @@ -1,13 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_STATIC_JAVA_LIBRARIES := android-support-test - -# Build all java files in the java subdirectory -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -# The name of the jar file to create -LOCAL_MODULE := apct-perftests-utils - -# Build a static jar file. -include $(BUILD_STATIC_JAVA_LIBRARY)
\ No newline at end of file diff --git a/api/current.txt b/api/current.txt index ebcc1d7584a6..d9d61b5dbeed 100755 --- a/api/current.txt +++ b/api/current.txt @@ -6117,8 +6117,10 @@ package android.app { } public final class UiAutomation { + method public void adoptShellPermissionIdentity(); method public void clearWindowAnimationFrameStats(); method public boolean clearWindowContentFrameStats(int); + method public void dropShellPermissionIdentity(); method public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(Runnable, android.app.UiAutomation.AccessibilityEventFilter, long) throws java.util.concurrent.TimeoutException; method public android.os.ParcelFileDescriptor executeShellCommand(String); method public android.view.accessibility.AccessibilityNodeInfo findFocus(int); @@ -41244,11 +41246,11 @@ package android.telecom { public final class CallIdentification implements android.os.Parcelable { method public int describeContents(); - method @NonNull public String getCallScreeningAppName(); + method @NonNull public CharSequence getCallScreeningAppName(); method @NonNull public String getCallScreeningPackageName(); - method @Nullable public String getDescription(); - method @Nullable public String getDetails(); - method @Nullable public String getName(); + method @Nullable public CharSequence getDescription(); + method @Nullable public CharSequence getDetails(); + method @Nullable public CharSequence getName(); method public int getNuisanceConfidence(); method @Nullable public android.graphics.drawable.Icon getPhoto(); method public void writeToParcel(android.os.Parcel, int); @@ -41263,9 +41265,9 @@ package android.telecom { public static class CallIdentification.Builder { ctor public CallIdentification.Builder(); method public android.telecom.CallIdentification build(); - method public android.telecom.CallIdentification.Builder setDescription(@Nullable String); - method public android.telecom.CallIdentification.Builder setDetails(@Nullable String); - method public android.telecom.CallIdentification.Builder setName(@Nullable String); + method public android.telecom.CallIdentification.Builder setDescription(@Nullable CharSequence); + method public android.telecom.CallIdentification.Builder setDetails(@Nullable CharSequence); + method public android.telecom.CallIdentification.Builder setName(@Nullable CharSequence); method public android.telecom.CallIdentification.Builder setNuisanceConfidence(int); method public android.telecom.CallIdentification.Builder setPhoto(@Nullable android.graphics.drawable.Icon); } @@ -42760,6 +42762,7 @@ package android.telephony { method @Deprecated public int getCdmaDbm(); method @Deprecated public int getCdmaEcio(); method @NonNull public java.util.List<android.telephony.CellSignalStrength> getCellSignalStrengths(); + method public <T extends android.telephony.CellSignalStrength> java.util.List<T> getCellSignalStrengths(@NonNull Class<T>); method @Deprecated public int getEvdoDbm(); method @Deprecated public int getEvdoEcio(); method @Deprecated public int getEvdoSnr(); @@ -43087,6 +43090,7 @@ package android.telephony { method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean isDataEnabled(); method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isDataRoamingEnabled(); method public boolean isHearingAidCompatibilitySupported(); + method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isMultisimSupported(); method public boolean isNetworkRoaming(); method public boolean isRttSupported(); method public boolean isSmsCapable(); @@ -43555,465 +43559,6 @@ package android.telephony.gsm { } -package android.telephony.ims { - - public class Rcs1To1Thread extends android.telephony.ims.RcsThread { - method @WorkerThread public long getFallbackThreadId() throws android.telephony.ims.RcsMessageStoreException; - method @NonNull @WorkerThread public android.telephony.ims.RcsParticipant getRecipient() throws android.telephony.ims.RcsMessageStoreException; - method public boolean isGroup(); - method @WorkerThread public void setFallbackThreadId(long) throws android.telephony.ims.RcsMessageStoreException; - } - - public abstract class RcsEvent { - ctor protected RcsEvent(long); - method public long getTimestamp(); - } - - public final class RcsEventQueryParams implements android.os.Parcelable { - method public int describeContents(); - method @android.telephony.ims.RcsEventQueryParams.EventType public int getEventType(); - method public int getLimit(); - method public boolean getSortDirection(); - method public int getSortingProperty(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int ALL_EVENTS = -1; // 0xffffffff - field public static final int ALL_GROUP_THREAD_EVENTS = 0; // 0x0 - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsEventQueryParams> CREATOR; - field public static final int GROUP_THREAD_ICON_CHANGED_EVENT = 8; // 0x8 - field public static final int GROUP_THREAD_NAME_CHANGED_EVENT = 16; // 0x10 - field public static final int GROUP_THREAD_PARTICIPANT_JOINED_EVENT = 2; // 0x2 - field public static final int GROUP_THREAD_PARTICIPANT_LEFT_EVENT = 4; // 0x4 - field public static final int PARTICIPANT_ALIAS_CHANGED_EVENT = 1; // 0x1 - field public static final int SORT_BY_CREATION_ORDER = 0; // 0x0 - field public static final int SORT_BY_TIMESTAMP = 1; // 0x1 - } - - public static class RcsEventQueryParams.Builder { - ctor public RcsEventQueryParams.Builder(); - method public android.telephony.ims.RcsEventQueryParams build(); - method @CheckResult public android.telephony.ims.RcsEventQueryParams.Builder setEventType(@android.telephony.ims.RcsEventQueryParams.EventType int); - method @CheckResult public android.telephony.ims.RcsEventQueryParams.Builder setGroupThread(@NonNull android.telephony.ims.RcsGroupThread); - method @CheckResult public android.telephony.ims.RcsEventQueryParams.Builder setResultLimit(@IntRange(from=0) int) throws java.security.InvalidParameterException; - method @CheckResult public android.telephony.ims.RcsEventQueryParams.Builder setSortDirection(boolean); - method @CheckResult public android.telephony.ims.RcsEventQueryParams.Builder setSortProperty(@android.telephony.ims.RcsEventQueryParams.SortingProperty int); - } - - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({android.telephony.ims.RcsEventQueryParams.ALL_EVENTS, android.telephony.ims.RcsEventQueryParams.ALL_GROUP_THREAD_EVENTS, android.telephony.ims.RcsEventQueryParams.PARTICIPANT_ALIAS_CHANGED_EVENT, android.telephony.ims.RcsEventQueryParams.GROUP_THREAD_PARTICIPANT_JOINED_EVENT, android.telephony.ims.RcsEventQueryParams.GROUP_THREAD_PARTICIPANT_LEFT_EVENT, android.telephony.ims.RcsEventQueryParams.GROUP_THREAD_NAME_CHANGED_EVENT, android.telephony.ims.RcsEventQueryParams.GROUP_THREAD_ICON_CHANGED_EVENT}) public static @interface RcsEventQueryParams.EventType { - } - - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({android.telephony.ims.RcsEventQueryParams.SORT_BY_CREATION_ORDER, android.telephony.ims.RcsEventQueryParams.SORT_BY_TIMESTAMP}) public static @interface RcsEventQueryParams.SortingProperty { - } - - public class RcsEventQueryResult { - method public android.telephony.ims.RcsQueryContinuationToken getContinuationToken(); - method public java.util.List<android.telephony.ims.RcsEvent> getEvents(); - } - - public final class RcsFileTransferCreationParams implements android.os.Parcelable { - method public int describeContents(); - method public String getContentMimeType(); - method public android.net.Uri getContentUri(); - method public long getFileSize(); - method @android.telephony.ims.RcsFileTransferPart.RcsFileTransferStatus public int getFileTransferStatus(); - method public int getHeight(); - method public long getMediaDuration(); - method public String getPreviewMimeType(); - method public android.net.Uri getPreviewUri(); - method public String getRcsFileTransferSessionId(); - method public long getTransferOffset(); - method public int getWidth(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsFileTransferCreationParams> CREATOR; - } - - public class RcsFileTransferCreationParams.Builder { - ctor public RcsFileTransferCreationParams.Builder(); - method public android.telephony.ims.RcsFileTransferCreationParams build(); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setContentMimeType(String); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setContentUri(android.net.Uri); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setFileSize(long); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setFileTransferSessionId(String); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setFileTransferStatus(@android.telephony.ims.RcsFileTransferPart.RcsFileTransferStatus int); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setHeight(int); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setMediaDuration(long); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setPreviewMimeType(String); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setPreviewUri(android.net.Uri); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setTransferOffset(long); - method @CheckResult public android.telephony.ims.RcsFileTransferCreationParams.Builder setWidth(int); - } - - public class RcsFileTransferPart { - method @WorkerThread @Nullable public String getContentMimeType() throws android.telephony.ims.RcsMessageStoreException; - method @Nullable @WorkerThread public android.net.Uri getContentUri() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public long getFileSize() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public String getFileTransferSessionId() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @android.telephony.ims.RcsFileTransferPart.RcsFileTransferStatus public int getFileTransferStatus() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public int getHeight() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public long getLength() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public String getPreviewMimeType() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public android.net.Uri getPreviewUri() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public long getTransferOffset() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public int getWidth() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setContentMimeType(String) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setContentUri(android.net.Uri) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setFileSize(long) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setFileTransferSessionId(String) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setFileTransferStatus(@android.telephony.ims.RcsFileTransferPart.RcsFileTransferStatus int) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setHeight(int) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setLength(long) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setPreviewMimeType(String) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setPreviewUri(android.net.Uri) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setTransferOffset(long) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setWidth(int) throws android.telephony.ims.RcsMessageStoreException; - field public static final int DOWNLOADING = 6; // 0x6 - field public static final int DOWNLOADING_CANCELLED = 9; // 0x9 - field public static final int DOWNLOADING_FAILED = 8; // 0x8 - field public static final int DOWNLOADING_PAUSED = 7; // 0x7 - field public static final int DRAFT = 1; // 0x1 - field public static final int NOT_SET = 0; // 0x0 - field public static final int SENDING = 2; // 0x2 - field public static final int SENDING_CANCELLED = 5; // 0x5 - field public static final int SENDING_FAILED = 4; // 0x4 - field public static final int SENDING_PAUSED = 3; // 0x3 - field public static final int SUCCEEDED = 10; // 0xa - } - - @IntDef({android.telephony.ims.RcsFileTransferPart.DRAFT, android.telephony.ims.RcsFileTransferPart.SENDING, android.telephony.ims.RcsFileTransferPart.SENDING_PAUSED, android.telephony.ims.RcsFileTransferPart.SENDING_FAILED, android.telephony.ims.RcsFileTransferPart.SENDING_CANCELLED, android.telephony.ims.RcsFileTransferPart.DOWNLOADING, android.telephony.ims.RcsFileTransferPart.DOWNLOADING_PAUSED, android.telephony.ims.RcsFileTransferPart.DOWNLOADING_FAILED, android.telephony.ims.RcsFileTransferPart.DOWNLOADING_CANCELLED, android.telephony.ims.RcsFileTransferPart.SUCCEEDED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RcsFileTransferPart.RcsFileTransferStatus { - } - - public class RcsGroupThread extends android.telephony.ims.RcsThread { - method @WorkerThread public void addParticipant(@NonNull android.telephony.ims.RcsParticipant) throws android.telephony.ims.RcsMessageStoreException; - method @Nullable @WorkerThread public android.net.Uri getConferenceUri() throws android.telephony.ims.RcsMessageStoreException; - method @Nullable public android.net.Uri getGroupIcon() throws android.telephony.ims.RcsMessageStoreException; - method @Nullable @WorkerThread public String getGroupName() throws android.telephony.ims.RcsMessageStoreException; - method @Nullable @WorkerThread public android.telephony.ims.RcsParticipant getOwner() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public java.util.Set<android.telephony.ims.RcsParticipant> getParticipants() throws android.telephony.ims.RcsMessageStoreException; - method public boolean isGroup(); - method @WorkerThread public void removeParticipant(@NonNull android.telephony.ims.RcsParticipant) throws android.telephony.ims.RcsMessageStoreException; - method @Nullable @WorkerThread public void setConferenceUri(android.net.Uri) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setGroupIcon(@Nullable android.net.Uri) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setGroupName(String) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setOwner(@Nullable android.telephony.ims.RcsParticipant) throws android.telephony.ims.RcsMessageStoreException; - } - - public abstract class RcsGroupThreadEvent extends android.telephony.ims.RcsEvent { - method @NonNull public android.telephony.ims.RcsParticipant getOriginatingParticipant(); - method @NonNull public android.telephony.ims.RcsGroupThread getRcsGroupThread(); - } - - public final class RcsGroupThreadIconChangedEvent extends android.telephony.ims.RcsGroupThreadEvent { - ctor public RcsGroupThreadIconChangedEvent(long, @NonNull android.telephony.ims.RcsGroupThread, @NonNull android.telephony.ims.RcsParticipant, @Nullable android.net.Uri); - method @Nullable public android.net.Uri getNewIcon(); - } - - public final class RcsGroupThreadNameChangedEvent extends android.telephony.ims.RcsGroupThreadEvent { - ctor public RcsGroupThreadNameChangedEvent(long, @NonNull android.telephony.ims.RcsGroupThread, @NonNull android.telephony.ims.RcsParticipant, @Nullable String); - method @Nullable public String getNewName(); - } - - public final class RcsGroupThreadParticipantJoinedEvent extends android.telephony.ims.RcsGroupThreadEvent { - ctor public RcsGroupThreadParticipantJoinedEvent(long, @NonNull android.telephony.ims.RcsGroupThread, @NonNull android.telephony.ims.RcsParticipant, @NonNull android.telephony.ims.RcsParticipant); - method public android.telephony.ims.RcsParticipant getJoinedParticipant(); - } - - public final class RcsGroupThreadParticipantLeftEvent extends android.telephony.ims.RcsGroupThreadEvent { - ctor public RcsGroupThreadParticipantLeftEvent(long, @NonNull android.telephony.ims.RcsGroupThread, @NonNull android.telephony.ims.RcsParticipant, @NonNull android.telephony.ims.RcsParticipant); - method @NonNull public android.telephony.ims.RcsParticipant getLeavingParticipant(); - method public void persist() throws android.telephony.ims.RcsMessageStoreException; - } - - public class RcsIncomingMessage extends android.telephony.ims.RcsMessage { - method @WorkerThread public long getArrivalTimestamp() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public long getSeenTimestamp() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public android.telephony.ims.RcsParticipant getSenderParticipant() throws android.telephony.ims.RcsMessageStoreException; - method public boolean isIncoming(); - method @WorkerThread public void setArrivalTimestamp(long) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setSeenTimestamp(long) throws android.telephony.ims.RcsMessageStoreException; - } - - public final class RcsIncomingMessageCreationParams extends android.telephony.ims.RcsMessageCreationParams implements android.os.Parcelable { - method public int describeContents(); - method public long getArrivalTimestamp(); - method public long getSeenTimestamp(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsIncomingMessageCreationParams> CREATOR; - } - - public static class RcsIncomingMessageCreationParams.Builder extends android.telephony.ims.RcsMessageCreationParams.Builder { - ctor public RcsIncomingMessageCreationParams.Builder(long, long, int); - method public android.telephony.ims.RcsIncomingMessageCreationParams build(); - method @CheckResult public android.telephony.ims.RcsIncomingMessageCreationParams.Builder setArrivalTimestamp(long); - method @CheckResult public android.telephony.ims.RcsIncomingMessageCreationParams.Builder setSeenTimestamp(long); - method @CheckResult public android.telephony.ims.RcsIncomingMessageCreationParams.Builder setSenderParticipant(android.telephony.ims.RcsParticipant); - } - - public class RcsManager { - method public android.telephony.ims.RcsMessageStore getRcsMessageStore(); - } - - public abstract class RcsMessage { - method @NonNull @WorkerThread public java.util.Set<android.telephony.ims.RcsFileTransferPart> getFileTransferParts() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public double getLatitude() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public double getLongitude() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public long getOriginationTimestamp() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public String getRcsMessageId() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @android.telephony.ims.RcsMessage.RcsMessageStatus public int getStatus() throws android.telephony.ims.RcsMessageStoreException; - method public int getSubscriptionId() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public String getText() throws android.telephony.ims.RcsMessageStoreException; - method @NonNull @WorkerThread public android.telephony.ims.RcsFileTransferPart insertFileTransfer(android.telephony.ims.RcsFileTransferCreationParams) throws android.telephony.ims.RcsMessageStoreException; - method public abstract boolean isIncoming(); - method @WorkerThread public void removeFileTransferPart(@NonNull android.telephony.ims.RcsFileTransferPart) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setLatitude(double) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setLongitude(double) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setOriginationTimestamp(long) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setRcsMessageId(String) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setStatus(@android.telephony.ims.RcsMessage.RcsMessageStatus int) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setSubscriptionId(int) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setText(String) throws android.telephony.ims.RcsMessageStoreException; - field public static final int DRAFT = 1; // 0x1 - field public static final int FAILED = 6; // 0x6 - field public static final double LOCATION_NOT_SET = 4.9E-324; - field public static final int NOT_SET = 0; // 0x0 - field public static final int QUEUED = 2; // 0x2 - field public static final int RECEIVED = 7; // 0x7 - field public static final int RETRYING = 5; // 0x5 - field public static final int SEEN = 9; // 0x9 - field public static final int SENDING = 3; // 0x3 - field public static final int SENT = 4; // 0x4 - } - - @IntDef({android.telephony.ims.RcsMessage.DRAFT, android.telephony.ims.RcsMessage.QUEUED, android.telephony.ims.RcsMessage.SENDING, android.telephony.ims.RcsMessage.SENT, android.telephony.ims.RcsMessage.RETRYING, android.telephony.ims.RcsMessage.FAILED, android.telephony.ims.RcsMessage.RECEIVED, android.telephony.ims.RcsMessage.SEEN}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RcsMessage.RcsMessageStatus { - } - - public class RcsMessageCreationParams { - ctor protected RcsMessageCreationParams(android.telephony.ims.RcsMessageCreationParams.Builder); - method public double getLatitude(); - method public double getLongitude(); - method public int getMessageStatus(); - method public long getOriginationTimestamp(); - method @Nullable public String getRcsMessageGlobalId(); - method public int getSubId(); - method @Nullable public String getText(); - } - - public static class RcsMessageCreationParams.Builder { - method public android.telephony.ims.RcsMessageCreationParams build(); - method @CheckResult public android.telephony.ims.RcsMessageCreationParams.Builder setLatitude(double); - method @CheckResult public android.telephony.ims.RcsMessageCreationParams.Builder setLongitude(double); - method @CheckResult public android.telephony.ims.RcsMessageCreationParams.Builder setRcsMessageId(String); - method @CheckResult public android.telephony.ims.RcsMessageCreationParams.Builder setStatus(@android.telephony.ims.RcsMessage.RcsMessageStatus int); - method @CheckResult public android.telephony.ims.RcsMessageCreationParams.Builder setText(String); - } - - public final class RcsMessageQueryParams implements android.os.Parcelable { - method public int describeContents(); - method public int getFileTransferPresence(); - method public int getLimit(); - method public String getMessageLike(); - method public int getMessageType(); - method public boolean getSortDirection(); - method @android.telephony.ims.RcsMessageQueryParams.SortingProperty public int getSortingProperty(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsMessageQueryParams> CREATOR; - field public static final int MESSAGES_WITHOUT_FILE_TRANSFERS = 8; // 0x8 - field public static final int MESSAGES_WITH_FILE_TRANSFERS = 4; // 0x4 - field public static final int MESSAGE_TYPE_INCOMING = 1; // 0x1 - field public static final int MESSAGE_TYPE_OUTGOING = 2; // 0x2 - field public static final int SORT_BY_CREATION_ORDER = 0; // 0x0 - field public static final int SORT_BY_TIMESTAMP = 1; // 0x1 - } - - public static class RcsMessageQueryParams.Builder { - ctor public RcsMessageQueryParams.Builder(); - method public android.telephony.ims.RcsMessageQueryParams build(); - method @CheckResult public android.telephony.ims.RcsMessageQueryParams.Builder setFileTransferPresence(int); - method @CheckResult public android.telephony.ims.RcsMessageQueryParams.Builder setMessageLike(String); - method @CheckResult public android.telephony.ims.RcsMessageQueryParams.Builder setMessageType(int); - method @CheckResult public android.telephony.ims.RcsMessageQueryParams.Builder setResultLimit(@IntRange(from=0) int) throws java.security.InvalidParameterException; - method @CheckResult public android.telephony.ims.RcsMessageQueryParams.Builder setSortDirection(boolean); - method @CheckResult public android.telephony.ims.RcsMessageQueryParams.Builder setSortProperty(@android.telephony.ims.RcsMessageQueryParams.SortingProperty int); - method @CheckResult public android.telephony.ims.RcsMessageQueryParams.Builder setThread(@Nullable android.telephony.ims.RcsThread); - } - - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({android.telephony.ims.RcsMessageQueryParams.SORT_BY_CREATION_ORDER, android.telephony.ims.RcsMessageQueryParams.SORT_BY_TIMESTAMP}) public static @interface RcsMessageQueryParams.SortingProperty { - } - - public final class RcsMessageQueryResult implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.telephony.ims.RcsQueryContinuationToken getContinuationToken(); - method @NonNull public java.util.List<android.telephony.ims.RcsMessage> getMessages(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsMessageQueryResult> CREATOR; - } - - public final class RcsMessageSnippet implements android.os.Parcelable { - method public int describeContents(); - method @android.telephony.ims.RcsMessage.RcsMessageStatus public int getSnippetStatus(); - method @Nullable public String getSnippetText(); - method public long getSnippetTimestamp(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsMessageSnippet> CREATOR; - } - - public class RcsMessageStore { - ctor public RcsMessageStore(); - method @WorkerThread @NonNull public android.telephony.ims.RcsGroupThread createGroupThread(@Nullable java.util.List<android.telephony.ims.RcsParticipant>, @Nullable String, @Nullable android.net.Uri) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.Rcs1To1Thread createRcs1To1Thread(@NonNull android.telephony.ims.RcsParticipant) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsParticipant createRcsParticipant(String, @Nullable String) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void deleteThread(@NonNull android.telephony.ims.RcsThread) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsEventQueryResult getRcsEvents(@Nullable android.telephony.ims.RcsEventQueryParams) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsEventQueryResult getRcsEvents(@NonNull android.telephony.ims.RcsQueryContinuationToken) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsMessageQueryResult getRcsMessages(@Nullable android.telephony.ims.RcsMessageQueryParams) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsMessageQueryResult getRcsMessages(@NonNull android.telephony.ims.RcsQueryContinuationToken) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsParticipantQueryResult getRcsParticipants(@Nullable android.telephony.ims.RcsParticipantQueryParams) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsParticipantQueryResult getRcsParticipants(@NonNull android.telephony.ims.RcsQueryContinuationToken) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsThreadQueryResult getRcsThreads(@Nullable android.telephony.ims.RcsThreadQueryParams) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsThreadQueryResult getRcsThreads(@NonNull android.telephony.ims.RcsQueryContinuationToken) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public void persistRcsEvent(android.telephony.ims.RcsEvent) throws android.telephony.ims.RcsMessageStoreException; - } - - public class RcsMessageStoreException extends java.lang.Exception { - ctor public RcsMessageStoreException(String); - } - - public class RcsOutgoingMessage extends android.telephony.ims.RcsMessage { - method @NonNull @WorkerThread public java.util.List<android.telephony.ims.RcsOutgoingMessageDelivery> getOutgoingDeliveries() throws android.telephony.ims.RcsMessageStoreException; - method public boolean isIncoming(); - } - - public final class RcsOutgoingMessageCreationParams extends android.telephony.ims.RcsMessageCreationParams implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsOutgoingMessageCreationParams> CREATOR; - } - - public static class RcsOutgoingMessageCreationParams.Builder extends android.telephony.ims.RcsMessageCreationParams.Builder { - ctor public RcsOutgoingMessageCreationParams.Builder(long, int); - method public android.telephony.ims.RcsOutgoingMessageCreationParams build(); - } - - public class RcsOutgoingMessageDelivery { - method @WorkerThread public long getDeliveredTimestamp() throws android.telephony.ims.RcsMessageStoreException; - method @NonNull public android.telephony.ims.RcsOutgoingMessage getMessage(); - method @NonNull public android.telephony.ims.RcsParticipant getRecipient(); - method @WorkerThread public long getSeenTimestamp() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @android.telephony.ims.RcsMessage.RcsMessageStatus public int getStatus() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setDeliveredTimestamp(long) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setSeenTimestamp(long) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setStatus(@android.telephony.ims.RcsMessage.RcsMessageStatus int) throws android.telephony.ims.RcsMessageStoreException; - } - - public class RcsParticipant { - method @Nullable @WorkerThread public String getAlias() throws android.telephony.ims.RcsMessageStoreException; - method @Nullable @WorkerThread public String getCanonicalAddress() throws android.telephony.ims.RcsMessageStoreException; - method @Nullable @WorkerThread public String getContactId() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setAlias(String) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void setContactId(String) throws android.telephony.ims.RcsMessageStoreException; - } - - public final class RcsParticipantAliasChangedEvent extends android.telephony.ims.RcsEvent { - ctor public RcsParticipantAliasChangedEvent(long, @NonNull android.telephony.ims.RcsParticipant, @Nullable String); - method @Nullable public String getNewAlias(); - method @NonNull public android.telephony.ims.RcsParticipant getParticipant(); - } - - public final class RcsParticipantQueryParams implements android.os.Parcelable { - method public int describeContents(); - method public String getAliasLike(); - method public String getCanonicalAddressLike(); - method public int getLimit(); - method public boolean getSortDirection(); - method public int getSortingProperty(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsParticipantQueryParams> CREATOR; - field public static final int SORT_BY_ALIAS = 1; // 0x1 - field public static final int SORT_BY_CANONICAL_ADDRESS = 2; // 0x2 - field public static final int SORT_BY_CREATION_ORDER = 0; // 0x0 - } - - public static class RcsParticipantQueryParams.Builder { - ctor public RcsParticipantQueryParams.Builder(); - method public android.telephony.ims.RcsParticipantQueryParams build(); - method @CheckResult public android.telephony.ims.RcsParticipantQueryParams.Builder setAliasLike(String); - method @CheckResult public android.telephony.ims.RcsParticipantQueryParams.Builder setCanonicalAddressLike(String); - method @CheckResult public android.telephony.ims.RcsParticipantQueryParams.Builder setResultLimit(@IntRange(from=0) int) throws java.security.InvalidParameterException; - method @CheckResult public android.telephony.ims.RcsParticipantQueryParams.Builder setSortDirection(boolean); - method @CheckResult public android.telephony.ims.RcsParticipantQueryParams.Builder setSortProperty(@android.telephony.ims.RcsParticipantQueryParams.SortingProperty int); - method @CheckResult public android.telephony.ims.RcsParticipantQueryParams.Builder setThread(android.telephony.ims.RcsThread); - } - - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({android.telephony.ims.RcsParticipantQueryParams.SORT_BY_CREATION_ORDER, android.telephony.ims.RcsParticipantQueryParams.SORT_BY_ALIAS, android.telephony.ims.RcsParticipantQueryParams.SORT_BY_CANONICAL_ADDRESS}) public static @interface RcsParticipantQueryParams.SortingProperty { - } - - public final class RcsParticipantQueryResult implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.telephony.ims.RcsQueryContinuationToken getContinuationToken(); - method @NonNull public java.util.List<android.telephony.ims.RcsParticipant> getParticipants(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsParticipantQueryResult> CREATOR; - } - - public final class RcsQueryContinuationToken implements android.os.Parcelable { - method public int describeContents(); - method @android.telephony.ims.RcsQueryContinuationToken.ContinuationTokenType public int getQueryType(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsQueryContinuationToken> CREATOR; - field public static final int EVENT_QUERY_CONTINUATION_TOKEN_TYPE = 0; // 0x0 - field public static final int MESSAGE_QUERY_CONTINUATION_TOKEN_TYPE = 1; // 0x1 - field public static final int PARTICIPANT_QUERY_CONTINUATION_TOKEN_TYPE = 2; // 0x2 - field public static final int THREAD_QUERY_CONTINUATION_TOKEN_TYPE = 3; // 0x3 - } - - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({android.telephony.ims.RcsQueryContinuationToken.EVENT_QUERY_CONTINUATION_TOKEN_TYPE, android.telephony.ims.RcsQueryContinuationToken.MESSAGE_QUERY_CONTINUATION_TOKEN_TYPE, android.telephony.ims.RcsQueryContinuationToken.PARTICIPANT_QUERY_CONTINUATION_TOKEN_TYPE, android.telephony.ims.RcsQueryContinuationToken.THREAD_QUERY_CONTINUATION_TOKEN_TYPE}) public static @interface RcsQueryContinuationToken.ContinuationTokenType { - } - - public abstract class RcsThread { - method @WorkerThread @NonNull public android.telephony.ims.RcsIncomingMessage addIncomingMessage(@NonNull android.telephony.ims.RcsIncomingMessageCreationParams) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsOutgoingMessage addOutgoingMessage(@NonNull android.telephony.ims.RcsOutgoingMessageCreationParams) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread public void deleteMessage(@NonNull android.telephony.ims.RcsMessage) throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsMessageQueryResult getMessages() throws android.telephony.ims.RcsMessageStoreException; - method @WorkerThread @NonNull public android.telephony.ims.RcsMessageSnippet getSnippet() throws android.telephony.ims.RcsMessageStoreException; - method public abstract boolean isGroup(); - } - - public final class RcsThreadQueryParams implements android.os.Parcelable { - method public int describeContents(); - method public int getLimit(); - method public boolean getSortDirection(); - method @android.telephony.ims.RcsThreadQueryParams.SortingProperty public int getSortingProperty(); - method public int getThreadType(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsThreadQueryParams> CREATOR; - field public static final int SORT_BY_CREATION_ORDER = 0; // 0x0 - field public static final int SORT_BY_TIMESTAMP = 1; // 0x1 - field public static final int THREAD_TYPE_1_TO_1 = 2; // 0x2 - field public static final int THREAD_TYPE_GROUP = 1; // 0x1 - } - - public static class RcsThreadQueryParams.Builder { - ctor public RcsThreadQueryParams.Builder(); - method public android.telephony.ims.RcsThreadQueryParams build(); - method @CheckResult public android.telephony.ims.RcsThreadQueryParams.Builder setParticipant(@NonNull android.telephony.ims.RcsParticipant); - method @CheckResult public android.telephony.ims.RcsThreadQueryParams.Builder setParticipants(@NonNull java.util.List<android.telephony.ims.RcsParticipant>); - method @CheckResult public android.telephony.ims.RcsThreadQueryParams.Builder setResultLimit(@IntRange(from=0) int) throws java.security.InvalidParameterException; - method @CheckResult public android.telephony.ims.RcsThreadQueryParams.Builder setSortDirection(boolean); - method @CheckResult public android.telephony.ims.RcsThreadQueryParams.Builder setSortProperty(@android.telephony.ims.RcsThreadQueryParams.SortingProperty int); - method @CheckResult public android.telephony.ims.RcsThreadQueryParams.Builder setThreadType(int); - } - - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({android.telephony.ims.RcsThreadQueryParams.SORT_BY_CREATION_ORDER, android.telephony.ims.RcsThreadQueryParams.SORT_BY_TIMESTAMP}) public static @interface RcsThreadQueryParams.SortingProperty { - } - - public final class RcsThreadQueryResult implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.telephony.ims.RcsQueryContinuationToken getContinuationToken(); - method @NonNull public java.util.List<android.telephony.ims.RcsThread> getThreads(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telephony.ims.RcsThreadQueryResult> CREATOR; - } - -} - package android.telephony.mbms { public class DownloadProgressListener { diff --git a/api/system-current.txt b/api/system-current.txt index 9c45fb4ee5c4..cb2434b05a6f 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4015,6 +4015,7 @@ package android.os { method public void onError(int); method public void onFinished(); method public void onProgress(float); + field public static final int BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS = 5; // 0x5 field public static final int BUGREPORT_ERROR_INVALID_INPUT = 1; // 0x1 field public static final int BUGREPORT_ERROR_RUNTIME = 2; // 0x2 field public static final int BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT = 4; // 0x4 @@ -5917,7 +5918,7 @@ package android.telephony { field public static final int VSNCP_TIMEOUT = 2236; // 0x8bc } - public class DisconnectCause { + public final class DisconnectCause { field public static final int ALREADY_DIALING = 72; // 0x48 field public static final int ANSWERED_ELSEWHERE = 52; // 0x34 field public static final int BUSY = 4; // 0x4 @@ -6095,18 +6096,18 @@ package android.telephony { public class PhoneStateListener { method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes); - method public void onCallDisconnectCauseChanged(int, int); - method public void onImsCallDisconnectCauseChanged(@NonNull android.telephony.ims.ImsReasonInfo); - method public void onPreciseCallStateChanged(android.telephony.PreciseCallState); - method public void onPreciseDataConnectionStateChanged(android.telephony.PreciseDataConnectionState); + method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onCallDisconnectCauseChanged(int, int); + method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onImsCallDisconnectCauseChanged(@NonNull android.telephony.ims.ImsReasonInfo); + method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState); + method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseDataConnectionStateChanged(android.telephony.PreciseDataConnectionState); method public void onRadioPowerStateChanged(int); method public void onSrvccStateChanged(int); method public void onVoiceActivationStateChanged(int); field public static final int LISTEN_CALL_ATTRIBUTES_CHANGED = 67108864; // 0x4000000 - field public static final int LISTEN_CALL_DISCONNECT_CAUSES = 33554432; // 0x2000000 - field public static final int LISTEN_IMS_CALL_DISCONNECT_CAUSES = 134217728; // 0x8000000 - field public static final int LISTEN_PRECISE_CALL_STATE = 2048; // 0x800 - field public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 4096; // 0x1000 + field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_CALL_DISCONNECT_CAUSES = 33554432; // 0x2000000 + field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_IMS_CALL_DISCONNECT_CAUSES = 134217728; // 0x8000000 + field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_PRECISE_CALL_STATE = 2048; // 0x800 + field @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 4096; // 0x1000 field public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000 field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int LISTEN_SRVCC_STATE_CHANGED = 16384; // 0x4000 field public static final int LISTEN_VOICE_ACTIVATION_STATE = 131072; // 0x20000 @@ -6141,7 +6142,7 @@ package android.telephony { field public static final android.os.Parcelable.Creator<android.telephony.PreciseDataConnectionState> CREATOR; } - public class PreciseDisconnectCause { + public final class PreciseDisconnectCause { field public static final int ACCESS_CLASS_BLOCKED = 260; // 0x104 field public static final int ACCESS_INFORMATION_DISCARDED = 43; // 0x2b field public static final int ACM_LIMIT_EXCEEDED = 68; // 0x44 @@ -6369,7 +6370,6 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCurrentPotentialEmergencyNumber(@NonNull String); method public boolean isDataConnectivityPossible(); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isIdle(); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isMultisimCarrierRestricted(); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isOffhook(); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRadioOn(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isRebootRequiredForModemConfigChange(); @@ -7667,7 +7667,7 @@ package android.telephony.mbms { package android.telephony.mbms.vendor { - public class MbmsDownloadServiceBase extends android.os.Binder { + public class MbmsDownloadServiceBase extends android.os.Binder implements android.os.IInterface { ctor public MbmsDownloadServiceBase(); method public int addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException; method public int addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException; @@ -7700,7 +7700,7 @@ package android.telephony.mbms.vendor { method public void updateGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>); } - public class MbmsStreamingServiceBase extends android.os.Binder { + public class MbmsStreamingServiceBase extends android.os.Binder implements android.os.IInterface { ctor public MbmsStreamingServiceBase(); method public android.os.IBinder asBinder(); method public void dispose(int) throws android.os.RemoteException; diff --git a/api/test-current.txt b/api/test-current.txt index dc97dd061578..62ef0b013cb9 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -263,7 +263,9 @@ package android.content.pm { method public abstract String getPermissionControllerPackageName(); method @NonNull public abstract String getServicesSystemSharedLibraryPackageName(); method @NonNull public abstract String getSharedSystemSharedLibraryPackageName(); + method @RequiresPermission("android.permission.GRANT_RUNTIME_PERMISSIONS") public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); method public abstract boolean isPermissionReviewModeEnabled(); + method @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") public abstract void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption"; field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000 @@ -1517,7 +1519,7 @@ package android.telephony.mbms { package android.telephony.mbms.vendor { - public class MbmsDownloadServiceBase extends android.os.Binder { + public class MbmsDownloadServiceBase extends android.os.Binder implements android.os.IInterface { ctor public MbmsDownloadServiceBase(); method public int addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException; method public int addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException; @@ -1550,7 +1552,7 @@ package android.telephony.mbms.vendor { method public void updateGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>); } - public class MbmsStreamingServiceBase extends android.os.Binder { + public class MbmsStreamingServiceBase extends android.os.Binder implements android.os.IInterface { ctor public MbmsStreamingServiceBase(); method public android.os.IBinder asBinder(); method public void dispose(int) throws android.os.RemoteException; diff --git a/cmds/bootanimation/bootanim.rc b/cmds/bootanimation/bootanim.rc index 469c9646a4aa..3666d6af29f5 100644 --- a/cmds/bootanimation/bootanim.rc +++ b/cmds/bootanimation/bootanim.rc @@ -2,6 +2,9 @@ service bootanim /system/bin/bootanimation class core animation user graphics group graphics audio + # bootanimation depends on libandroidicu in the Runtime APEX. + # TODO(b/124939955): Remove this dependency on libandroidicu + updatable disabled oneshot writepid /dev/stune/top-app/tasks diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt index e166c31d578a..4a43616974c9 100644 --- a/config/hiddenapi-greylist.txt +++ b/config/hiddenapi-greylist.txt @@ -3018,15 +3018,8 @@ Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->logd(Ljava/lang/S Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->loge(Ljava/lang/String;)V Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mAdnCache:Lcom/android/internal/telephony/uicc/AdnRecordCache; Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mBaseHandler:Landroid/os/Handler; -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mCurrentApp:Lcom/android/internal/telephony/uicc/UiccCardApplication; -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mIs3gCard:Z -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mLock:Ljava/lang/Object; Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mPhone:Lcom/android/internal/telephony/Phone; -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mRecords:Ljava/util/List; -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mRecordSize:[I -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->mSuccess:Z Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->updateEfForIccType(I)I -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager;->waitForResult(Ljava/util/concurrent/atomic/AtomicBoolean;)V Lcom/android/internal/telephony/IccProvider;-><init>()V Lcom/android/internal/telephony/IccProvider;->ADDRESS_BOOK_COLUMN_NAMES:[Ljava/lang/String; Lcom/android/internal/telephony/IccProvider;->DBG:Z diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index de84281328b2..398b4064d15a 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -2513,7 +2513,7 @@ public class AppOpsManager { */ public int noteProxyOpNoThrow(int op, String proxiedPackageName) { try { - return mService.noteProxyOperation(op, mContext.getOpPackageName(), + return mService.noteProxyOperation(op, Process.myUid(), mContext.getOpPackageName(), Binder.getCallingUid(), proxiedPackageName); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java index 24c5d234c120..f5d5e6e9a950 100644 --- a/core/java/android/app/AppOpsManagerInternal.java +++ b/core/java/android/app/AppOpsManagerInternal.java @@ -18,12 +18,55 @@ package android.app; import android.util.SparseIntArray; +import com.android.internal.util.function.QuadFunction; +import com.android.internal.util.function.TriFunction; + /** * App ops service local interface. * * @hide Only for use within the system server. */ public abstract class AppOpsManagerInternal { + /** Interface to override app ops checks via composition */ + public interface CheckOpsDelegate { + /** + * Allows overriding check operation behavior. + * + * @param code The op code to check. + * @param uid The UID for which to check. + * @param packageName The package for which to check. + * @param superImpl The super implementation. + * @return The app op check result. + */ + int checkOperation(int code, int uid, String packageName, + TriFunction<Integer, Integer, String, Integer> superImpl); + + /** + * Allows overriding check audio operation behavior. + * + * @param code The op code to check. + * @param usage The audio op usage. + * @param uid The UID for which to check. + * @param packageName The package for which to check. + * @param superImpl The super implementation. + * @return The app op check result. + */ + int checkAudioOperation(int code, int usage, int uid, String packageName, + QuadFunction<Integer, Integer, Integer, String, Integer> superImpl); + + /** + * Allows overriding note operation behavior. + * + * @param code The op code to note. + * @param uid The UID for which to note. + * @param packageName The package for which to note. + * @param superImpl The super implementation. + * @return The app op note result. + */ + int noteOperation(int code, int uid, String packageName, + TriFunction<Integer, Integer, String, Integer> superImpl); + } + /** * Set the currently configured device and profile owners. Specifies the package uid (value) * that has been configured for each user (key) that has one. These will be allowed privileged diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index b192021f821b..52fd84113fdf 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -714,4 +714,19 @@ interface IActivityManager { /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */ void alwaysShowUnsupportedCompileSdkWarning(in ComponentName activity); + + /** + * Method for the shell UID to start deletating its permission identity to an + * active instrumenation. The shell can delegate permissions only to one active + * instrumentation at a time. An active instrumentation is one running and + * started from the shell. + */ + void startDelegateShellPermissionIdentity(int uid); + + /** + * Method for the shell UID to stop deletating its permission identity to an + * active instrumenation. An active instrumentation is one running and + * started from the shell. + */ + void stopDelegateShellPermissionIdentity(); } diff --git a/core/java/android/app/IUiAutomationConnection.aidl b/core/java/android/app/IUiAutomationConnection.aidl index d01938b123b1..ac4bf7d9c2c5 100644 --- a/core/java/android/app/IUiAutomationConnection.aidl +++ b/core/java/android/app/IUiAutomationConnection.aidl @@ -47,7 +47,8 @@ interface IUiAutomationConnection { in ParcelFileDescriptor source); void grantRuntimePermission(String packageName, String permission, int userId); void revokeRuntimePermission(String packageName, String permission, int userId); - + void adoptShellPermissionIdentity(int uid); + void dropShellPermissionIdentity(); // Called from the system process. oneway void shutdown(); } diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java index c850c85b6e5b..c0903b65737c 100644 --- a/core/java/android/app/UiAutomation.java +++ b/core/java/android/app/UiAutomation.java @@ -35,6 +35,7 @@ import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; @@ -52,6 +53,7 @@ import android.view.accessibility.AccessibilityWindowInfo; import android.view.accessibility.IAccessibilityInteractionConnection; import com.android.internal.util.function.pooled.PooledLambda; + import libcore.io.IoUtils; import java.io.IOException; @@ -352,6 +354,46 @@ public final class UiAutomation { } /** + * Adopt the permission identity of the shell UID. This allows you to call APIs protected + * permissions which normal apps cannot hold but are granted to the shell UID. If you + * already adopted the shell permission identity this method would be a no-op. + * Note that your permission state becomes that of the shell UID and it is not a + * combination of your and the shell UID permissions. + * + * @see #dropShellPermissionIdentity() + */ + public void adoptShellPermissionIdentity() { + synchronized (mLock) { + throwIfNotConnectedLocked(); + } + try { + // Calling out without a lock held. + mUiAutomationConnection.adoptShellPermissionIdentity(Process.myUid()); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error executing adopting shell permission identity!", re); + } + } + + /** + * Drop the shell permission identity adopted by a previous call to + * {@link #adoptShellPermissionIdentity()}. If you did not adopt the shell permission + * identity this method would be a no-op. + * + * @see #adoptShellPermissionIdentity() + */ + public void dropShellPermissionIdentity() { + synchronized (mLock) { + throwIfNotConnectedLocked(); + } + try { + // Calling out without a lock held. + mUiAutomationConnection.dropShellPermissionIdentity(); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error executing dropping shell permission identity!", re); + } + } + + /** * Performs a global action. Such an action can be performed at any moment * regardless of the current application or user location in that application. * For example going back, going home, opening recents, etc. @@ -1004,6 +1046,8 @@ public final class UiAutomation { * * @param command The command to execute. * @return A file descriptor to the standard output stream. + * + * @see #adoptShellPermissionIdentity() */ public ParcelFileDescriptor executeShellCommand(String command) { synchronized (mLock) { @@ -1086,22 +1130,6 @@ public final class UiAutomation { return result; } - private static float getDegreesForRotation(int value) { - switch (value) { - case Surface.ROTATION_90: { - return 360f - 90f; - } - case Surface.ROTATION_180: { - return 360f - 180f; - } - case Surface.ROTATION_270: { - return 360f - 270f; - } default: { - return 0; - } - } - } - private boolean isConnectedLocked() { return mConnectionId != CONNECTION_ID_UNDEFINED; } diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java index e6347354b723..b406d9e30a53 100644 --- a/core/java/android/app/UiAutomationConnection.java +++ b/core/java/android/app/UiAutomationConnection.java @@ -31,6 +31,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.util.Log; import android.view.IWindowManager; import android.view.InputEvent; import android.view.SurfaceControl; @@ -38,7 +39,6 @@ import android.view.WindowAnimationFrameStats; import android.view.WindowContentFrameStats; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.IAccessibilityManager; -import android.util.Log; import libcore.io.IoUtils; @@ -72,6 +72,9 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { private final IPackageManager mPackageManager = IPackageManager.Stub .asInterface(ServiceManager.getService("package")); + private final IActivityManager mActivityManager = IActivityManager.Stub + .asInterface(ServiceManager.getService("activity")); + private final Object mLock = new Object(); private final Binder mToken = new Binder(); @@ -275,6 +278,36 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { } } + @Override + public void adoptShellPermissionIdentity(int uid) throws RemoteException { + synchronized (mLock) { + throwIfCalledByNotTrustedUidLocked(); + throwIfShutdownLocked(); + throwIfNotConnectedLocked(); + } + final long identity = Binder.clearCallingIdentity(); + try { + mActivityManager.startDelegateShellPermissionIdentity(uid); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + public void dropShellPermissionIdentity() throws RemoteException { + synchronized (mLock) { + throwIfCalledByNotTrustedUidLocked(); + throwIfShutdownLocked(); + throwIfNotConnectedLocked(); + } + final long identity = Binder.clearCallingIdentity(); + try { + mActivityManager.stopDelegateShellPermissionIdentity(); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + public class Repeater implements Runnable { // Continuously read readFrom and write back to writeTo until EOF is encountered private final InputStream readFrom; diff --git a/core/java/android/app/timezone/RulesState.java b/core/java/android/app/timezone/RulesState.java index e86d348a85fa..38dd1ebf1c45 100644 --- a/core/java/android/app/timezone/RulesState.java +++ b/core/java/android/app/timezone/RulesState.java @@ -33,7 +33,7 @@ import java.lang.annotation.RetentionPolicy; * * <p>The following properties are included: * <dl> - * <dt>systemRulesVersion</dt> + * <dt>baseRulesVersion</dt> * <dd>the IANA rules version that shipped with the OS. Always present. e.g. "2017a".</dd> * <dt>distroFormatVersionSupported</dt> * <dd>the distro format version supported by this device. Always present.</dd> @@ -98,7 +98,7 @@ public final class RulesState implements Parcelable { private static final byte BYTE_FALSE = 0; private static final byte BYTE_TRUE = 1; - private final String mSystemRulesVersion; + private final String mBaseRulesVersion; private final DistroFormatVersion mDistroFormatVersionSupported; private final boolean mOperationInProgress; @StagedOperationType private final int mStagedOperationType; @@ -106,13 +106,13 @@ public final class RulesState implements Parcelable { @DistroStatus private final int mDistroStatus; @Nullable private final DistroRulesVersion mInstalledDistroRulesVersion; - public RulesState(String systemRulesVersion, DistroFormatVersion distroFormatVersionSupported, + public RulesState(String baseRulesVersion, DistroFormatVersion distroFormatVersionSupported, boolean operationInProgress, @StagedOperationType int stagedOperationType, @Nullable DistroRulesVersion stagedDistroRulesVersion, @DistroStatus int distroStatus, @Nullable DistroRulesVersion installedDistroRulesVersion) { - this.mSystemRulesVersion = validateRulesVersion("systemRulesVersion", systemRulesVersion); + this.mBaseRulesVersion = validateRulesVersion("baseRulesVersion", baseRulesVersion); this.mDistroFormatVersionSupported = validateNotNull("distroFormatVersionSupported", distroFormatVersionSupported); this.mOperationInProgress = operationInProgress; @@ -132,8 +132,8 @@ public final class RulesState implements Parcelable { "installedDistroRulesVersion", installedDistroRulesVersion); } - public String getSystemRulesVersion() { - return mSystemRulesVersion; + public String getBaseRulesVersion() { + return mBaseRulesVersion; } public boolean isOperationInProgress() { @@ -172,14 +172,14 @@ public final class RulesState implements Parcelable { } /** - * Returns true if the system image data files contain IANA rules data that are newer than the + * Returns true if the base data files contain IANA rules data that are newer than the * distro IANA rules version supplied, i.e. true when the version specified would be "worse" - * than the one that is in the system image. Returns false if the system image version is the + * than the one that is in the base data. Returns false if the base version is the * same or older, i.e. false when the version specified would be "better" than the one that is - * in the system image. + * in the base set. */ - public boolean isSystemVersionNewerThan(DistroRulesVersion distroRulesVersion) { - return mSystemRulesVersion.compareTo(distroRulesVersion.getRulesVersion()) > 0; + public boolean isBaseVersionNewerThan(DistroRulesVersion distroRulesVersion) { + return mBaseRulesVersion.compareTo(distroRulesVersion.getRulesVersion()) > 0; } public static final Parcelable.Creator<RulesState> CREATOR = @@ -194,14 +194,14 @@ public final class RulesState implements Parcelable { }; private static RulesState createFromParcel(Parcel in) { - String systemRulesVersion = in.readString(); + String baseRulesVersion = in.readString(); DistroFormatVersion distroFormatVersionSupported = in.readParcelable(null); boolean operationInProgress = in.readByte() == BYTE_TRUE; int distroStagedState = in.readByte(); DistroRulesVersion stagedDistroRulesVersion = in.readParcelable(null); int installedDistroStatus = in.readByte(); DistroRulesVersion installedDistroRulesVersion = in.readParcelable(null); - return new RulesState(systemRulesVersion, distroFormatVersionSupported, operationInProgress, + return new RulesState(baseRulesVersion, distroFormatVersionSupported, operationInProgress, distroStagedState, stagedDistroRulesVersion, installedDistroStatus, installedDistroRulesVersion); } @@ -213,7 +213,7 @@ public final class RulesState implements Parcelable { @Override public void writeToParcel(Parcel out, int flags) { - out.writeString(mSystemRulesVersion); + out.writeString(mBaseRulesVersion); out.writeParcelable(mDistroFormatVersionSupported, 0); out.writeByte(mOperationInProgress ? BYTE_TRUE : BYTE_FALSE); out.writeByte((byte) mStagedOperationType); @@ -242,7 +242,7 @@ public final class RulesState implements Parcelable { if (mDistroStatus != that.mDistroStatus) { return false; } - if (!mSystemRulesVersion.equals(that.mSystemRulesVersion)) { + if (!mBaseRulesVersion.equals(that.mBaseRulesVersion)) { return false; } if (!mDistroFormatVersionSupported.equals(that.mDistroFormatVersionSupported)) { @@ -259,7 +259,7 @@ public final class RulesState implements Parcelable { @Override public int hashCode() { - int result = mSystemRulesVersion.hashCode(); + int result = mBaseRulesVersion.hashCode(); result = 31 * result + mDistroFormatVersionSupported.hashCode(); result = 31 * result + (mOperationInProgress ? 1 : 0); result = 31 * result + mStagedOperationType; @@ -275,7 +275,7 @@ public final class RulesState implements Parcelable { @Override public String toString() { return "RulesState{" - + "mSystemRulesVersion='" + mSystemRulesVersion + '\'' + + "mBaseRulesVersion='" + mBaseRulesVersion + '\'' + ", mDistroFormatVersionSupported=" + mDistroFormatVersionSupported + ", mOperationInProgress=" + mOperationInProgress + ", mStagedOperationType=" + mStagedOperationType diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 92c757ceaa29..72981a773277 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3623,6 +3623,7 @@ public abstract class PackageManager { * * @hide */ + @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String packageName, @@ -3649,6 +3650,7 @@ public abstract class PackageManager { * * @hide */ + @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public abstract void revokeRuntimePermission(@NonNull String packageName, diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 755232c6a6b6..7c9943b61ea4 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -29,9 +29,12 @@ import android.os.Bundle; import android.os.PersistableBundle; import android.util.SparseArray; +import com.android.internal.util.function.TriFunction; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; +import java.util.function.BiFunction; /** * Package manager local system service interface. @@ -64,6 +67,32 @@ public abstract class PackageManagerInternal { void onPackageRemoved(@NonNull String packageName); } + /** Interface to override permission checks via composition */ + public interface CheckPermissionDelegate { + /** + * Allows overriding check permission behavior. + * + * @param permName The permission to check. + * @param pkgName The package for which to check. + * @param userId The user for which to check. + * @param superImpl The super implementation. + * @return The check permission result. + */ + int checkPermission(String permName, String pkgName, int userId, + TriFunction<String, String, Integer, Integer> superImpl); + + /** + * Allows overriding check UID permission behavior. + * + * @param permName The permission to check. + * @param uid The UID for which to check. + * @param superImpl The super implementation. + * @return The check permission result. + */ + int checkUidPermission(String permName, int uid, + BiFunction<String, Integer, Integer> superImpl); + } + /** * Provider for package names. */ @@ -633,4 +662,18 @@ public abstract class PackageManagerInternal { * Ask the package manager to compile layouts in the given package. */ public abstract boolean compileLayouts(String packageName); + + /** + * Get the delegate to influence permission checking. + * + * @return The delegate instance or null to clear. + */ + public abstract @Nullable CheckPermissionDelegate getCheckPermissionDelegate(); + + /** + * Set a delegate to influence permission checking. + * + * @param delegate A delegate instance or null to clear. + */ + public abstract void setCheckPermissionDelegate(@Nullable CheckPermissionDelegate delegate); } diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java index 27f7e2296e7f..684369a6f720 100644 --- a/core/java/android/os/BugreportManager.java +++ b/core/java/android/os/BugreportManager.java @@ -59,7 +59,8 @@ public class BugreportManager { BUGREPORT_ERROR_INVALID_INPUT, BUGREPORT_ERROR_RUNTIME, BUGREPORT_ERROR_USER_DENIED_CONSENT, - BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT + BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT, + BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS }) /** Possible error codes taking a bugreport can encounter */ @@ -81,6 +82,10 @@ public class BugreportManager { public static final int BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT = IDumpstateListener.BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT; + /** There is currently a bugreport running. The caller should try again later. */ + public static final int BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS = + IDumpstateListener.BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS; + /** * Called when there is a progress update. * @param progress the progress in [0.0, 100.0] @@ -96,6 +101,9 @@ public class BugreportManager { * <p>If {@code BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT} is passed, then the consent timed * out, but the bugreport could be available in the internal directory of dumpstate for * manual retrieval. + * + * <p> If {@code BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS} is passed, then the + * caller should try later, as only one bugreport can be in progress at a time. */ public void onError(@BugreportErrorCode int errorCode) {} diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java index f63c0adbdf4b..44adc1c5cba4 100644 --- a/core/java/android/provider/CallLog.java +++ b/core/java/android/provider/CallLog.java @@ -783,7 +783,7 @@ public class CallLog { String postDialDigits, String viaNumber, int presentation, int callType, int features, PhoneAccountHandle accountHandle, long start, int duration, Long dataUsage, boolean addForAllUsers, UserHandle userToBeInsertedTo, - boolean isRead, int callBlockReason, String callScreeningAppName, + boolean isRead, int callBlockReason, CharSequence callScreeningAppName, String callScreeningComponentName, CallIdentification callIdentification) { if (VERBOSE_LOG) { Log.v(LOG_TAG, String.format("Add call: number=%s, user=%s, for all=%s", @@ -836,15 +836,19 @@ public class CallLog { } values.put(BLOCK_REASON, callBlockReason); - values.put(CALL_SCREENING_APP_NAME, callScreeningAppName); + values.put(CALL_SCREENING_APP_NAME, charSequenceToString(callScreeningAppName)); values.put(CALL_SCREENING_COMPONENT_NAME, callScreeningComponentName); if (callIdentification != null) { values.put(CALL_ID_PACKAGE_NAME, callIdentification.getCallScreeningPackageName()); - values.put(CALL_ID_APP_NAME, callIdentification.getCallScreeningAppName()); - values.put(CALL_ID_NAME, callIdentification.getName()); - values.put(CALL_ID_DESCRIPTION, callIdentification.getDescription()); - values.put(CALL_ID_DETAILS, callIdentification.getDetails()); + values.put(CALL_ID_APP_NAME, + charSequenceToString(callIdentification.getCallScreeningAppName())); + values.put(CALL_ID_NAME, + charSequenceToString(callIdentification.getName())); + values.put(CALL_ID_DESCRIPTION, + charSequenceToString(callIdentification.getDescription())); + values.put(CALL_ID_DETAILS, + charSequenceToString(callIdentification.getDetails())); values.put(CALL_ID_NUISANCE_CONFIDENCE, callIdentification.getNuisanceConfidence()); } else { values.putNull(CALL_ID_PACKAGE_NAME); @@ -987,6 +991,10 @@ public class CallLog { return result; } + private static String charSequenceToString(CharSequence sequence) { + return sequence == null ? null : sequence.toString(); + } + /** @hide */ public static boolean shouldHaveSharedCallLogEntries(Context context, UserManager userManager, int userId) { diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index 32866c5c785a..ff69bcb2e7bb 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -47,6 +47,7 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put("settings_data_usage_v2", "true"); DEFAULT_FLAGS.put("settings_audio_switcher", "true"); DEFAULT_FLAGS.put("settings_systemui_theme", "true"); + DEFAULT_FLAGS.put("settings_dynamic_android", "false"); DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false"); DEFAULT_FLAGS.put(SAFETY_HUB, "false"); } diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index 0ed972477123..768dddd35a6d 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -33,7 +33,7 @@ interface IAppOpsService { void stopWatchingMode(IAppOpsCallback callback); IBinder getToken(IBinder clientToken); int permissionToOpCode(String permission); - int noteProxyOperation(int code, String proxyPackageName, + int noteProxyOperation(int code, int proxyUid, String proxyPackageName, int callingUid, String callingPackageName); // Remaining methods are only used in Java. diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 8b06c47c60d1..4ad454514532 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -230,6 +230,15 @@ public class BatteryStatsImpl extends BatteryStats { public boolean mPerProcStateCpuTimesAvailable = true; /** + * When per process state cpu times tracking is off, cpu times in KernelSingleUidTimeReader are + * not updated. So, when the setting is turned on later, we would end up with huge cpu time + * deltas. This flag tracks the case where tracking is turned on from off so that we won't + * end up attributing the huge deltas to wrong buckets. + */ + @GuardedBy("this") + private boolean mIsPerProcessStateCpuDataStale; + + /** * Uids for which per-procstate cpu times need to be updated. * * Contains uid -> procState mappings. @@ -402,7 +411,7 @@ public class BatteryStatsImpl extends BatteryStats { } // If the KernelSingleUidTimeReader has stale cpu times, then we shouldn't try to // compute deltas since it might result in mis-attributing cpu times to wrong states. - if (mKernelSingleUidTimeReader.hasStaleData()) { + if (mIsPerProcessStateCpuDataStale) { mPendingUids.clear(); return; } @@ -485,9 +494,9 @@ public class BatteryStatsImpl extends BatteryStats { mKernelUidCpuFreqTimeReader.getAllUidCpuFreqTimeMs(); // If the KernelSingleUidTimeReader has stale cpu times, then we shouldn't try to // compute deltas since it might result in mis-attributing cpu times to wrong states. - if (mKernelSingleUidTimeReader.hasStaleData()) { + if (mIsPerProcessStateCpuDataStale) { mKernelSingleUidTimeReader.setAllUidsCpuTimesMs(allUidCpuFreqTimesMs); - mKernelSingleUidTimeReader.markDataAsStale(false); + mIsPerProcessStateCpuDataStale = false; mPendingUids.clear(); return; } @@ -13430,7 +13439,7 @@ public class BatteryStatsImpl extends BatteryStats { private void updateTrackCpuTimesByProcStateLocked(boolean wasEnabled, boolean isEnabled) { TRACK_CPU_TIMES_BY_PROC_STATE = isEnabled; if (isEnabled && !wasEnabled) { - mKernelSingleUidTimeReader.markDataAsStale(true); + mIsPerProcessStateCpuDataStale = true; mExternalSync.scheduleCpuSyncDueToSettingChange(); mNumSingleUidCpuTimeReads = 0; diff --git a/core/java/com/android/internal/os/KernelSingleUidTimeReader.java b/core/java/com/android/internal/os/KernelSingleUidTimeReader.java index 42839171dc53..ad628524f443 100644 --- a/core/java/com/android/internal/os/KernelSingleUidTimeReader.java +++ b/core/java/com/android/internal/os/KernelSingleUidTimeReader.java @@ -53,8 +53,6 @@ public class KernelSingleUidTimeReader { private int mReadErrorCounter; @GuardedBy("this") private boolean mSingleUidCpuTimesAvailable = true; - @GuardedBy("this") - private boolean mHasStaleData; // We use the freq count obtained from /proc/uid_time_in_state to decide how many longs // to read from each /proc/uid/<uid>/time_in_state. On the first read, verify if this is // correct and if not, set {@link #mSingleUidCpuTimesAvailable} to false. This flag will @@ -196,18 +194,6 @@ public class KernelSingleUidTimeReader { return deltaTimesMs; } - public void markDataAsStale(boolean hasStaleData) { - synchronized (this) { - mHasStaleData = hasStaleData; - } - } - - public boolean hasStaleData() { - synchronized (this) { - return mHasStaleData; - } - } - public void setAllUidsCpuTimesMs(SparseArray<long[]> allUidsCpuTimesMs) { synchronized (this) { mLastUidCpuTimeMs.clear(); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 4876da747e08..8d712c311fb4 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3195,6 +3195,10 @@ <!-- True if home app should be pinned via Pinner Service --> <bool name="config_pinnerHomeApp">false</bool> + <!-- List of files pinned by the Pinner Service with the apex boot image b/119800099 --> + <string-array translatable="false" name="config_apexBootImagePinnerServiceFiles"> + </string-array> + <!-- Number of days preloaded file cache should be preserved on a device before it can be deleted --> <integer name="config_keepPreloadsMinDays">7</integer> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 2c14992fdbb4..76791fdef758 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2904,6 +2904,7 @@ <java-symbol type="array" name="config_defaultPinnerServiceFiles" /> <java-symbol type="bool" name="config_pinnerCameraApp" /> <java-symbol type="bool" name="config_pinnerHomeApp" /> + <java-symbol type="array" name="config_apexBootImagePinnerServiceFiles" /> <java-symbol type="string" name="config_doubleTouchGestureEnableFile" /> diff --git a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java index dd462403ed82..e22cb8919594 100644 --- a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java +++ b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java @@ -16,8 +16,6 @@ package android.app.timezone; -import static junit.framework.Assert.fail; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -47,11 +45,11 @@ public class RulesStateTest { RulesState.DISTRO_STATUS_INSTALLED, rulesVersion("2016b", 2)); assertEqualsContract(one, two); - RulesState differentSystemRules = new RulesState( + RulesState differentBaseRules = new RulesState( "2016b", formatVersion(1, 2), false /* operationInProgress */, RulesState.STAGED_OPERATION_INSTALL, rulesVersion("2016a", 3), RulesState.DISTRO_STATUS_INSTALLED, rulesVersion("2016b", 2)); - assertFalse(one.equals(differentSystemRules)); + assertFalse(one.equals(differentBaseRules)); RulesState differentFormatVersion = new RulesState( "2016a", formatVersion(1, 1), false /* operationInProgress */, @@ -122,14 +120,14 @@ public class RulesStateTest { } @Test - public void isSystemVersionNewerThan() { + public void isBaseVersionNewerThan() { RulesState rulesState = new RulesState( "2016b", formatVersion(1, 1), false /* operationInProgress */, RulesState.STAGED_OPERATION_NONE, null /* stagedDistroRulesVersion */, RulesState.DISTRO_STATUS_INSTALLED, rulesVersion("2016b", 3)); - assertTrue(rulesState.isSystemVersionNewerThan(rulesVersion("2016a", 1))); - assertFalse(rulesState.isSystemVersionNewerThan(rulesVersion("2016b", 1))); - assertFalse(rulesState.isSystemVersionNewerThan(rulesVersion("2016c", 1))); + assertTrue(rulesState.isBaseVersionNewerThan(rulesVersion("2016a", 1))); + assertFalse(rulesState.isBaseVersionNewerThan(rulesVersion("2016b", 1))); + assertFalse(rulesState.isBaseVersionNewerThan(rulesVersion("2016c", 1))); } private static void assertEqualsContract(RulesState one, RulesState two) { diff --git a/packages/NetworkStack/Android.bp b/packages/NetworkStack/Android.bp index b700bf324817..5f1f26d88171 100644 --- a/packages/NetworkStack/Android.bp +++ b/packages/NetworkStack/Android.bp @@ -28,6 +28,7 @@ java_library { static_libs: [ "netd_aidl_interface-java", "networkstack-aidl-interfaces-java", + "datastallprotosnano", ] } @@ -43,4 +44,4 @@ android_app { jarjar_rules: "jarjar-rules-shared.txt", manifest: "AndroidManifest.xml", required: ["NetworkStackPermissionStub"], -}
\ No newline at end of file +} diff --git a/packages/NetworkStack/src/android/net/metrics/DataStallDetectionStats.java b/packages/NetworkStack/src/android/net/metrics/DataStallDetectionStats.java new file mode 100644 index 000000000000..6ea1e3d49dd4 --- /dev/null +++ b/packages/NetworkStack/src/android/net/metrics/DataStallDetectionStats.java @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2019 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. + */ + +package android.net.metrics; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.net.util.NetworkStackUtils; +import android.net.wifi.WifiInfo; + +import com.android.internal.util.HexDump; +import com.android.server.connectivity.nano.CellularData; +import com.android.server.connectivity.nano.DataStallEventProto; +import com.android.server.connectivity.nano.DnsEvent; +import com.android.server.connectivity.nano.WifiData; + +import com.google.protobuf.nano.MessageNano; + +import java.util.ArrayList; +import java.util.List; + +/** + * Class to record the stats of detection level information for data stall. + * + * @hide + */ +public final class DataStallDetectionStats { + private static final int UNKNOWN_SIGNAL_STRENGTH = -1; + @NonNull + final byte[] mCellularInfo; + @NonNull + final byte[] mWifiInfo; + @NonNull + final byte[] mDns; + final int mEvaluationType; + final int mNetworkType; + + public DataStallDetectionStats(@Nullable byte[] cell, @Nullable byte[] wifi, + @NonNull int[] returnCode, @NonNull long[] dnsTime, int evalType, int netType) { + mCellularInfo = emptyCellDataIfNull(cell); + mWifiInfo = emptyWifiInfoIfNull(wifi); + + DnsEvent dns = new DnsEvent(); + dns.dnsReturnCode = returnCode; + dns.dnsTime = dnsTime; + mDns = MessageNano.toByteArray(dns); + mEvaluationType = evalType; + mNetworkType = netType; + } + + private byte[] emptyCellDataIfNull(@Nullable byte[] cell) { + if (cell != null) return cell; + + CellularData data = new CellularData(); + data.ratType = DataStallEventProto.RADIO_TECHNOLOGY_UNKNOWN; + data.networkMccmnc = ""; + data.simMccmnc = ""; + data.signalStrength = UNKNOWN_SIGNAL_STRENGTH; + return MessageNano.toByteArray(data); + } + + private byte[] emptyWifiInfoIfNull(@Nullable byte[] wifi) { + if (wifi != null) return wifi; + + WifiData data = new WifiData(); + data.wifiBand = DataStallEventProto.AP_BAND_UNKNOWN; + data.signalStrength = UNKNOWN_SIGNAL_STRENGTH; + return MessageNano.toByteArray(data); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("type: ").append(mNetworkType) + .append(", evaluation type: ") + .append(mEvaluationType) + .append(", wifi info: ") + .append(HexDump.toHexString(mWifiInfo)) + .append(", cell info: ") + .append(HexDump.toHexString(mCellularInfo)) + .append(", dns: ") + .append(HexDump.toHexString(mDns)); + return sb.toString(); + } + + /** + * Utility to create an instance of {@Link DataStallDetectionStats} + * + * @hide + */ + public static class Builder { + @Nullable + private byte[] mCellularInfo; + @Nullable + private byte[] mWifiInfo; + @NonNull + private final List<Integer> mDnsReturnCode = new ArrayList<Integer>(); + @NonNull + private final List<Long> mDnsTimeStamp = new ArrayList<Long>(); + private int mEvaluationType; + private int mNetworkType; + + /** + * Add a dns event into Builder. + * + * @param code the return code of the dns event. + * @param timeMs the elapsedRealtime in ms that the the dns event was received from netd. + * @return {@code this} {@link Builder} instance. + */ + public Builder addDnsEvent(int code, long timeMs) { + mDnsReturnCode.add(code); + mDnsTimeStamp.add(timeMs); + return this; + } + + /** + * Set the dns evaluation type into Builder. + * + * @param type the return code of the dns event. + * @return {@code this} {@link Builder} instance. + */ + public Builder setEvaluationType(int type) { + mEvaluationType = type; + return this; + } + + /** + * Set the network type into Builder. + * + * @param type the network type of the logged network. + * @return {@code this} {@link Builder} instance. + */ + public Builder setNetworkType(int type) { + mNetworkType = type; + return this; + } + + /** + * Set the wifi data into Builder. + * + * @param info a {@link WifiInfo} of the connected wifi network. + * @return {@code this} {@link Builder} instance. + */ + public Builder setWiFiData(@Nullable final WifiInfo info) { + WifiData data = new WifiData(); + data.wifiBand = getWifiBand(info); + data.signalStrength = (info != null) ? info.getRssi() : UNKNOWN_SIGNAL_STRENGTH; + mWifiInfo = MessageNano.toByteArray(data); + return this; + } + + private static int getWifiBand(@Nullable final WifiInfo info) { + if (info != null) { + int freq = info.getFrequency(); + // Refer to ScanResult.is5GHz() and ScanResult.is24GHz(). + if (freq > 4900 && freq < 5900) { + return DataStallEventProto.AP_BAND_5GHZ; + } else if (freq > 2400 && freq < 2500) { + return DataStallEventProto.AP_BAND_2GHZ; + } + } + return DataStallEventProto.AP_BAND_UNKNOWN; + } + + /** + * Set the cellular data into Builder. + * + * @param radioType the radio technology of the logged cellular network. + * @param roaming a boolean indicates if logged cellular network is roaming or not. + * @param networkMccmnc the mccmnc of the camped network. + * @param simMccmnc the mccmnc of the sim. + * @return {@code this} {@link Builder} instance. + */ + public Builder setCellData(int radioType, boolean roaming, + @NonNull String networkMccmnc, @NonNull String simMccmnc, int ss) { + CellularData data = new CellularData(); + data.ratType = radioType; + data.isRoaming = roaming; + data.networkMccmnc = networkMccmnc; + data.simMccmnc = simMccmnc; + data.signalStrength = ss; + mCellularInfo = MessageNano.toByteArray(data); + return this; + } + + /** + * Create a new {@Link DataStallDetectionStats}. + */ + public DataStallDetectionStats build() { + return new DataStallDetectionStats(mCellularInfo, mWifiInfo, + NetworkStackUtils.convertToIntArray(mDnsReturnCode), + NetworkStackUtils.convertToLongArray(mDnsTimeStamp), + mEvaluationType, mNetworkType); + } + } +} diff --git a/packages/NetworkStack/src/android/net/metrics/DataStallStatsUtils.java b/packages/NetworkStack/src/android/net/metrics/DataStallStatsUtils.java new file mode 100644 index 000000000000..17a36ad4e6d2 --- /dev/null +++ b/packages/NetworkStack/src/android/net/metrics/DataStallStatsUtils.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2019 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. + */ + +package android.net.metrics; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.net.captiveportal.CaptivePortalProbeResult; +import android.util.Log; + +import com.android.internal.util.HexDump; +import com.android.server.connectivity.nano.DataStallEventProto; + +/** + * Collection of utilities for data stall metrics. + * + * To see if the logs are properly sent to statsd, execute following command. + * + * $ adb shell cmd stats print-logs + * $ adb logcat | grep statsd OR $ adb logcat -b stats + * + * @hide + */ +public class DataStallStatsUtils { + private static final String TAG = DataStallStatsUtils.class.getSimpleName(); + private static final boolean DBG = false; + + private static int probeResultToEnum(@Nullable final CaptivePortalProbeResult result) { + if (result == null) return DataStallEventProto.INVALID; + + // TODO: Add partial connectivity support. + if (result.isSuccessful()) { + return DataStallEventProto.VALID; + } else if (result.isPortal()) { + return DataStallEventProto.PORTAL; + } else { + return DataStallEventProto.INVALID; + } + } + + /** + * Write the metric to {@link StatsLog}. + */ + public static void write(@NonNull final DataStallDetectionStats stats, + @NonNull final CaptivePortalProbeResult result) { + int validationResult = probeResultToEnum(result); + if (DBG) { + Log.d(TAG, "write: " + stats + " with result: " + validationResult + + ", dns: " + HexDump.toHexString(stats.mDns)); + } + // TODO(b/124613085): Send to Statsd once the public StatsLog API is ready. + } +} diff --git a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java index 98123a5c7261..481dbdadbac0 100644 --- a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java +++ b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java @@ -16,8 +16,11 @@ package android.net.util; +import android.annotation.NonNull; + import java.io.FileDescriptor; import java.io.IOException; +import java.util.List; /** * Collection of utilities for the network stack. @@ -40,4 +43,26 @@ public class NetworkStackUtils { } catch (IOException ignored) { } } + + /** + * Returns an int array from the given Integer list. + */ + public static int[] convertToIntArray(@NonNull List<Integer> list) { + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } + + /** + * Returns a long array from the given long list. + */ + public static long[] convertToLongArray(@NonNull List<Long> list) { + long[] array = new long[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } } diff --git a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java index 4b846b0fb372..3c129ce81b65 100644 --- a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java +++ b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java @@ -33,6 +33,7 @@ import static android.net.metrics.ValidationProbeEvent.PROBE_FALLBACK; import static android.net.metrics.ValidationProbeEvent.PROBE_PRIVDNS; import static android.net.util.NetworkStackUtils.isEmpty; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -50,6 +51,8 @@ import android.net.TrafficStats; import android.net.Uri; import android.net.captiveportal.CaptivePortalProbeResult; import android.net.captiveportal.CaptivePortalProbeSpec; +import android.net.metrics.DataStallDetectionStats; +import android.net.metrics.DataStallStatsUtils; import android.net.metrics.IpConnectivityLog; import android.net.metrics.NetworkEvent; import android.net.metrics.ValidationProbeEvent; @@ -66,8 +69,10 @@ import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.telephony.AccessNetworkConstants; +import android.telephony.CellSignalStrength; import android.telephony.NetworkRegistrationState; import android.telephony.ServiceState; +import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; @@ -126,6 +131,9 @@ public class NetworkMonitor extends StateMachine { private static final int DATA_STALL_EVALUATION_TYPE_DNS = 1; private static final int DEFAULT_DATA_STALL_EVALUATION_TYPES = (1 << DATA_STALL_EVALUATION_TYPE_DNS); + // Reevaluate it as intending to increase the number. Larger log size may cause statsd + // log buffer bust and have stats log lost. + private static final int DEFAULT_DNS_LOG_SIZE = 20; enum EvaluationResult { VALIDATED(true), @@ -244,6 +252,7 @@ public class NetworkMonitor extends StateMachine { private final ConnectivityManager mCm; private final IpConnectivityLog mMetricsLog; private final Dependencies mDependencies; + private final DataStallStatsUtils mDetectionStatsUtils; // Configuration values for captive portal detection probes. private final String mCaptivePortalUserAgent; @@ -302,17 +311,19 @@ public class NetworkMonitor extends StateMachine { private final int mDataStallEvaluationType; private final DnsStallDetector mDnsStallDetector; private long mLastProbeTime; + // Set to true if data stall is suspected and reset to false after metrics are sent to statsd. + private boolean mCollectDataStallMetrics = false; public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network, SharedLog validationLog) { this(context, cb, network, new IpConnectivityLog(), validationLog, - Dependencies.DEFAULT); + Dependencies.DEFAULT, new DataStallStatsUtils()); } @VisibleForTesting protected NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network, IpConnectivityLog logger, SharedLog validationLogs, - Dependencies deps) { + Dependencies deps, DataStallStatsUtils detectionStatsUtils) { // Add suffix indicating which NetworkMonitor we're talking about. super(TAG + "/" + network.toString()); @@ -325,6 +336,7 @@ public class NetworkMonitor extends StateMachine { mValidationLogs = validationLogs; mCallback = cb; mDependencies = deps; + mDetectionStatsUtils = detectionStatsUtils; mNonPrivateDnsBypassNetwork = network; mNetwork = deps.getPrivateDnsBypassNetwork(network); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); @@ -656,6 +668,7 @@ public class NetworkMonitor extends StateMachine { case EVENT_DNS_NOTIFICATION: mDnsStallDetector.accumulateConsecutiveDnsTimeoutCount(message.arg1); if (isDataStall()) { + mCollectDataStallMetrics = true; validationLog("Suspecting data stall, reevaluate"); transitionTo(mEvaluatingState); } @@ -667,6 +680,65 @@ public class NetworkMonitor extends StateMachine { } } + private void writeDataStallStats(@NonNull final CaptivePortalProbeResult result) { + /* + * Collect data stall detection level information for each transport type. Collect type + * specific information for cellular and wifi only currently. Generate + * DataStallDetectionStats for each transport type. E.g., if a network supports both + * TRANSPORT_WIFI and TRANSPORT_VPN, two DataStallDetectionStats will be generated. + */ + final int[] transports = mNetworkCapabilities.getTransportTypes(); + + for (int i = 0; i < transports.length; i++) { + DataStallStatsUtils.write(buildDataStallDetectionStats(transports[i]), result); + } + mCollectDataStallMetrics = false; + } + + @VisibleForTesting + protected DataStallDetectionStats buildDataStallDetectionStats(int transport) { + final DataStallDetectionStats.Builder stats = new DataStallDetectionStats.Builder(); + if (VDBG_STALL) log("collectDataStallMetrics: type=" + transport); + stats.setEvaluationType(DATA_STALL_EVALUATION_TYPE_DNS); + stats.setNetworkType(transport); + switch (transport) { + case NetworkCapabilities.TRANSPORT_WIFI: + // TODO: Update it if status query in dual wifi is supported. + final WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); + stats.setWiFiData(wifiInfo); + break; + case NetworkCapabilities.TRANSPORT_CELLULAR: + final boolean isRoaming = !mNetworkCapabilities.hasCapability( + NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING); + final SignalStrength ss = mTelephonyManager.getSignalStrength(); + // TODO(b/120452078): Support multi-sim. + stats.setCellData( + mTelephonyManager.getDataNetworkType(), + isRoaming, + mTelephonyManager.getNetworkOperator(), + mTelephonyManager.getSimOperator(), + (ss != null) + ? ss.getLevel() : CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN); + break; + default: + // No transport type specific information for the other types. + break; + } + addDnsEvents(stats); + + return stats.build(); + } + + private void addDnsEvents(@NonNull final DataStallDetectionStats.Builder stats) { + final int size = mDnsStallDetector.mResultIndices.size(); + for (int i = 1; i <= DEFAULT_DNS_LOG_SIZE && i <= size; i++) { + final int index = mDnsStallDetector.mResultIndices.indexOf(size - i); + stats.addDnsEvent(mDnsStallDetector.mDnsEvents[index].mReturnCode, + mDnsStallDetector.mDnsEvents[index].mTimeStamp); + } + } + + // Being in the MaybeNotifyState State indicates the user may have been notified that sign-in // is required. This State takes care to clear the notification upon exit from the State. private class MaybeNotifyState extends State { @@ -972,6 +1044,11 @@ public class NetworkMonitor extends StateMachine { final CaptivePortalProbeResult probeResult = (CaptivePortalProbeResult) message.obj; mLastProbeTime = SystemClock.elapsedRealtime(); + + if (mCollectDataStallMetrics) { + writeDataStallStats(probeResult); + } + if (probeResult.isSuccessful()) { // Transit EvaluatingPrivateDnsState to get to Validated // state (even if no Private DNS validation required). @@ -1617,7 +1694,6 @@ public class NetworkMonitor extends StateMachine { */ @VisibleForTesting protected class DnsStallDetector { - private static final int DEFAULT_DNS_LOG_SIZE = 50; private int mConsecutiveTimeoutCount = 0; private int mSize; final DnsResult[] mDnsEvents; diff --git a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java index 9a16bb77182e..beb975d745c2 100644 --- a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java +++ b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java @@ -30,6 +30,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.anyObject; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; @@ -48,6 +49,7 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.captiveportal.CaptivePortalProbeResult; +import android.net.metrics.DataStallStatsUtils; import android.net.metrics.IpConnectivityLog; import android.net.util.SharedLog; import android.net.wifi.WifiManager; @@ -98,6 +100,7 @@ public class NetworkMonitorTest { private @Mock NetworkMonitor.Dependencies mDependencies; private @Mock INetworkMonitorCallbacks mCallbacks; private @Spy Network mNetwork = new Network(TEST_NETID); + private @Mock DataStallStatsUtils mDataStallStatsUtils; private static final int TEST_NETID = 4242; @@ -186,9 +189,9 @@ public class NetworkMonitorTest { private long mProbeTime = 0; WrappedNetworkMonitor(Context context, Network network, IpConnectivityLog logger, - Dependencies deps) { + Dependencies deps, DataStallStatsUtils statsUtils) { super(context, mCallbacks, network, logger, - new SharedLog("test_nm"), deps); + new SharedLog("test_nm"), deps, statsUtils); } @Override @@ -203,7 +206,7 @@ public class NetworkMonitorTest { private WrappedNetworkMonitor makeMeteredWrappedNetworkMonitor() { final WrappedNetworkMonitor nm = new WrappedNetworkMonitor( - mContext, mNetwork, mLogger, mDependencies); + mContext, mNetwork, mLogger, mDependencies, mDataStallStatsUtils); when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES); nm.start(); waitForIdle(nm.getHandler()); @@ -212,7 +215,7 @@ public class NetworkMonitorTest { private WrappedNetworkMonitor makeNotMeteredWrappedNetworkMonitor() { final WrappedNetworkMonitor nm = new WrappedNetworkMonitor( - mContext, mNetwork, mLogger, mDependencies); + mContext, mNetwork, mLogger, mDependencies, mDataStallStatsUtils); when(mCm.getNetworkCapabilities(any())).thenReturn(NOT_METERED_CAPABILITIES); nm.start(); waitForIdle(nm.getHandler()); @@ -222,7 +225,7 @@ public class NetworkMonitorTest { private NetworkMonitor makeMonitor() { final NetworkMonitor nm = new NetworkMonitor( mContext, mCallbacks, mNetwork, mLogger, mValidationLogger, - mDependencies); + mDependencies, mDataStallStatsUtils); nm.start(); waitForIdle(nm.getHandler()); return nm; @@ -505,6 +508,23 @@ public class NetworkMonitorTest { .notifyNetworkTested(NETWORK_TEST_RESULT_VALID, null); } + @Test + public void testDataStall_StallSuspectedAndSendMetrics() throws IOException { + WrappedNetworkMonitor wrappedMonitor = makeNotMeteredWrappedNetworkMonitor(); + wrappedMonitor.setLastProbeTime(SystemClock.elapsedRealtime() - 1000); + makeDnsTimeoutEvent(wrappedMonitor, 5); + assertTrue(wrappedMonitor.isDataStall()); + verify(mDataStallStatsUtils, times(1)).write(eq(anyObject()), eq(anyObject())); + } + + @Test + public void testDataStall_NoStallSuspectedAndSendMetrics() throws IOException { + WrappedNetworkMonitor wrappedMonitor = makeNotMeteredWrappedNetworkMonitor(); + wrappedMonitor.setLastProbeTime(SystemClock.elapsedRealtime() - 1000); + makeDnsTimeoutEvent(wrappedMonitor, 3); + assertFalse(wrappedMonitor.isDataStall()); + verify(mDataStallStatsUtils, times(0)).write(eq(anyObject()), eq(anyObject())); + } private void makeDnsTimeoutEvent(WrappedNetworkMonitor wrappedMonitor, int count) { for (int i = 0; i < count; i++) { wrappedMonitor.getDnsStallDetector().accumulateConsecutiveDnsTimeoutCount( diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index 786d757557d1..5c273de23761 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -22,6 +22,7 @@ import android.app.ActivityThread; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.AppOpsManagerInternal; +import android.app.AppOpsManagerInternal.CheckOpsDelegate; import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; @@ -207,6 +208,8 @@ public class AppOpsService extends IAppOpsService.Stub { SparseIntArray mProfileOwners; + private CheckOpsDelegate mCheckOpsDelegate; + /** * All times are in milliseconds. These constants are kept synchronized with the system * global Settings. Any access to this class or its fields should be done while @@ -1411,15 +1414,39 @@ public class AppOpsService extends IAppOpsService.Stub { } } + public CheckOpsDelegate getAppOpsServiceDelegate() { + synchronized (this) { + return mCheckOpsDelegate; + } + } + + public void setAppOpsServiceDelegate(CheckOpsDelegate delegate) { + synchronized (this) { + mCheckOpsDelegate = delegate; + } + } + @Override public int checkOperation(int code, int uid, String packageName) { - verifyIncomingUid(uid); - verifyIncomingOp(code); - String resolvedPackageName = resolvePackageName(uid, packageName); - if (resolvedPackageName == null) { - return AppOpsManager.MODE_IGNORED; + final CheckOpsDelegate delegate; + synchronized (this) { + if (mCheckOpsDelegate == null) { + return checkOperationImpl(code, uid, packageName); + } + delegate = mCheckOpsDelegate; } + return delegate.checkOperation(code, uid, packageName, + AppOpsService.this::checkOperationImpl); + } + + private int checkOperationImpl(int code, int uid, String packageName) { synchronized (this) { + verifyIncomingUid(uid); + verifyIncomingOp(code); + String resolvedPackageName = resolvePackageName(uid, packageName); + if (resolvedPackageName == null) { + return AppOpsManager.MODE_IGNORED; + } if (isOpRestrictedLocked(uid, code, resolvedPackageName)) { return AppOpsManager.MODE_IGNORED; } @@ -1439,20 +1466,33 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public int checkAudioOperation(int code, int usage, int uid, String packageName) { - boolean suspended; - try { - suspended = isPackageSuspendedForUser(packageName, uid); - } catch (IllegalArgumentException ex) { - // Package not found. - suspended = false; - } - - if (suspended) { - Slog.i(TAG, "Audio disabled for suspended package=" + packageName + " for uid=" + uid); - return AppOpsManager.MODE_IGNORED; + final CheckOpsDelegate delegate; + synchronized (this) { + if (mCheckOpsDelegate == null) { + return checkAudioOperationImpl(code, usage, uid, packageName); + } + delegate = mCheckOpsDelegate; } + return delegate.checkAudioOperation(code, usage, uid, packageName, + AppOpsService.this::checkAudioOperationImpl); + } + private int checkAudioOperationImpl(int code, int usage, int uid, String packageName) { synchronized (this) { + boolean suspended; + try { + suspended = isPackageSuspendedForUser(packageName, uid); + } catch (IllegalArgumentException ex) { + // Package not found. + suspended = false; + } + + if (suspended) { + Slog.i(TAG, "Audio disabled for suspended package=" + packageName + + " for uid=" + uid); + return AppOpsManager.MODE_IGNORED; + } + final int mode = checkRestrictionLocked(code, usage, uid, packageName); if (mode != AppOpsManager.MODE_ALLOWED) { return mode; @@ -1530,10 +1570,10 @@ public class AppOpsService extends IAppOpsService.Stub { } @Override - public int noteProxyOperation(int code, String proxyPackageName, - int proxiedUid, String proxiedPackageName) { + public int noteProxyOperation(int code, int proxyUid, + String proxyPackageName, int proxiedUid, String proxiedPackageName) { + verifyIncomingUid(proxyUid); verifyIncomingOp(code); - final int proxyUid = Binder.getCallingUid(); String resolveProxyPackageName = resolvePackageName(proxyUid, proxyPackageName); if (resolveProxyPackageName == null) { return AppOpsManager.MODE_IGNORED; @@ -1553,6 +1593,18 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public int noteOperation(int code, int uid, String packageName) { + final CheckOpsDelegate delegate; + synchronized (this) { + if (mCheckOpsDelegate == null) { + return noteOperationImpl(code, uid, packageName); + } + delegate = mCheckOpsDelegate; + } + return delegate.noteOperation(code, uid, packageName, + AppOpsService.this::noteOperationImpl); + } + + private int noteOperationImpl(int code, int uid, String packageName) { verifyIncomingUid(uid); verifyIncomingOp(code); String resolvedPackageName = resolvePackageName(uid, packageName); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index b5fcde4bf203..1035efb80366 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2373,6 +2373,11 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.decreaseIndent(); } + + pw.println(); + pw.println("NetworkStackClient logs:"); + pw.increaseIndent(); + NetworkStackClient.getInstance().dump(pw); } private void dumpNetworks(IndentingPrintWriter pw) { diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java index 0deaee7f7878..54a98cedccff 100644 --- a/services/core/java/com/android/server/PinnerService.java +++ b/services/core/java/com/android/server/PinnerService.java @@ -42,6 +42,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RemoteException; +import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.provider.MediaStore; @@ -232,9 +233,17 @@ public final class PinnerService extends SystemService { * Handler for on start pinning message */ private void handlePinOnStart() { - // Files to pin come from the overlay and can be specified per-device config - String[] filesToPin = mContext.getResources().getStringArray( - com.android.internal.R.array.config_defaultPinnerServiceFiles); + final String bootImage = SystemProperties.get("dalvik.vm.boot-image", ""); + String[] filesToPin = null; + if (bootImage.endsWith("apex.art")) { + // Use the files listed for that specific boot image + filesToPin = mContext.getResources().getStringArray( + com.android.internal.R.array.config_apexBootImagePinnerServiceFiles); + } else { + // Files to pin come from the overlay and can be specified per-device config + filesToPin = mContext.getResources().getStringArray( + com.android.internal.R.array.config_defaultPinnerServiceFiles); + } // Continue trying to pin each file even if we fail to pin some of them for (String fileToPin : filesToPin) { PinnedFile pf = pinFile(fileToPin, diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 52a3536e63d4..0eec8e9cb717 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -233,6 +233,7 @@ import android.app.ActivityThread; import android.app.AlertDialog; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.AppOpsManagerInternal.CheckOpsDelegate; import android.app.ApplicationErrorReport; import android.app.ApplicationThreadConstants; import android.app.BroadcastOptions; @@ -296,6 +297,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; +import android.content.pm.PackageManagerInternal.CheckPermissionDelegate; import android.content.pm.ParceledListSlice; import android.content.pm.PathPermission; import android.content.pm.PermissionInfo; @@ -432,6 +434,8 @@ import com.android.internal.util.FastPrintWriter; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.MemInfoReader; import com.android.internal.util.Preconditions; +import com.android.internal.util.function.QuadFunction; +import com.android.internal.util.function.TriFunction; import com.android.server.AlarmManagerInternal; import com.android.server.AppOpsService; import com.android.server.AttributeCache; @@ -516,6 +520,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.BiFunction; public class ActivityManagerService extends IActivityManager.Stub implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { @@ -22177,6 +22182,8 @@ public class ActivityManagerService extends IActivityManager.Stub // Can't call out of the system process with a lock held, so post a message. if (app.instr.mUiAutomationConnection != null) { + mAppOpsService.setAppOpsServiceDelegate(null); + getPackageManagerInternalLocked().setCheckPermissionDelegate(null); mHandler.obtainMessage(SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG, app.instr.mUiAutomationConnection).sendToTarget(); } @@ -27189,4 +27196,143 @@ public class ActivityManagerService extends IActivityManager.Stub } } } + + @Override + public void startDelegateShellPermissionIdentity(int delegateUid) { + if (UserHandle.getCallingAppId() != Process.SHELL_UID + && UserHandle.getCallingAppId() != Process.ROOT_UID) { + throw new SecurityException("Only the shell can delegate its permissions"); + } + + // We allow delegation only to one instrumentation started from the shell + synchronized (ActivityManagerService.this) { + // If there is a delegate it should be the same instance for app ops and permissions. + if (mAppOpsService.getAppOpsServiceDelegate() + != getPackageManagerInternalLocked().getCheckPermissionDelegate()) { + throw new IllegalStateException("Bad shell delegate state"); + } + + // If the delegate is already set up for the target UID, nothing to do. + if (mAppOpsService.getAppOpsServiceDelegate() != null) { + if (!(mAppOpsService.getAppOpsServiceDelegate() instanceof ShellDelegate)) { + throw new IllegalStateException("Bad shell delegate state"); + } + if (((ShellDelegate) mAppOpsService.getAppOpsServiceDelegate()) + .getDelegateUid() != delegateUid) { + throw new SecurityException("Shell can delegate permissions only " + + "to one instrumentation at a time"); + } + return; + } + + final int instrCount = mActiveInstrumentation.size(); + for (int i = 0; i < instrCount; i++) { + final ActiveInstrumentation instr = mActiveInstrumentation.get(i); + if (instr.mTargetInfo.uid != delegateUid) { + continue; + } + // If instrumentation started from the shell the connection is not null + if (instr.mUiAutomationConnection == null) { + throw new SecurityException("Shell can delegate its permissions" + + " only to an instrumentation started from the shell"); + } + + // Hook them up... + final ShellDelegate shellDelegate = new ShellDelegate( + instr.mTargetInfo.packageName, delegateUid); + mAppOpsService.setAppOpsServiceDelegate(shellDelegate); + getPackageManagerInternalLocked().setCheckPermissionDelegate(shellDelegate); + return; + } + } + } + + @Override + public void stopDelegateShellPermissionIdentity() { + if (UserHandle.getCallingAppId() != Process.SHELL_UID + && UserHandle.getCallingAppId() != Process.ROOT_UID) { + throw new SecurityException("Only the shell can delegate its permissions"); + } + synchronized (ActivityManagerService.this) { + mAppOpsService.setAppOpsServiceDelegate(null); + getPackageManagerInternalLocked().setCheckPermissionDelegate(null); + } + } + + private class ShellDelegate implements CheckOpsDelegate, CheckPermissionDelegate { + private final String mTargetPackageName; + private final int mTargetUid; + + ShellDelegate(String targetPacakgeName, int targetUid) { + mTargetPackageName = targetPacakgeName; + mTargetUid = targetUid; + } + + int getDelegateUid() { + return mTargetUid; + } + + @Override + public int checkOperation(int code, int uid, String packageName, + TriFunction<Integer, Integer, String, Integer> superImpl) { + if (uid == mTargetUid) { + final long identity = Binder.clearCallingIdentity(); + try { + return superImpl.apply(code, Process.SHELL_UID, + "com.android.shell"); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + return superImpl.apply(code, uid, packageName); + } + + @Override + public int checkAudioOperation(int code, int usage, int uid, String packageName, + QuadFunction<Integer, Integer, Integer, String, Integer> superImpl) { + if (uid == mTargetUid) { + final long identity = Binder.clearCallingIdentity(); + try { + return superImpl.apply(code, usage, Process.SHELL_UID, + "com.android.shell"); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + return superImpl.apply(code, usage, uid, packageName); + } + + @Override + public int noteOperation(int code, int uid, String packageName, + TriFunction<Integer, Integer, String, Integer> superImpl) { + if (uid == mTargetUid) { + final long identity = Binder.clearCallingIdentity(); + try { + return mAppOpsService.noteProxyOperation(code, Process.SHELL_UID, + "com.android.shell", uid, packageName); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + return superImpl.apply(code, uid, packageName); + } + + @Override + public int checkPermission(String permName, String pkgName, int userId, + TriFunction<String, String, Integer, Integer> superImpl) { + if (mTargetPackageName.equals(pkgName)) { + return superImpl.apply(permName, "com.android.shell", userId); + } + return superImpl.apply(permName, pkgName, userId); + } + + @Override + public int checkUidPermission(String permName, int uid, + BiFunction<String, Integer, Integer> superImpl) { + if (uid == mTargetUid) { + return superImpl.apply(permName, Process.SHELL_UID); + } + return superImpl.apply(permName, uid); + } + } } diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java index 420b23e6a39f..d84a4d2db993 100644 --- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java +++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java @@ -19,10 +19,11 @@ package com.android.server.connectivity; import static android.Manifest.permission.CHANGE_NETWORK_STATE; import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS; +import static android.Manifest.permission.INTERNET; import static android.Manifest.permission.NETWORK_STACK; -import static android.content.pm.ApplicationInfo.FLAG_SYSTEM; -import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; +import static android.Manifest.permission.UPDATE_DEVICE_STATS; import static android.content.pm.PackageManager.GET_PERMISSIONS; +import static android.content.pm.PackageManager.MATCH_ANY_USER; import static android.os.Process.INVALID_UID; import static android.os.Process.SYSTEM_UID; @@ -32,23 +33,31 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PackageManagerInternal; import android.content.pm.UserInfo; -import android.net.Uri; +import android.net.INetd; +import android.net.util.NetdService; import android.os.Build; import android.os.INetworkManagementService; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; +import android.util.Slog; +import android.util.SparseIntArray; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.ArrayUtils; +import com.android.server.LocalServices; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map.Entry; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; /** @@ -75,6 +84,59 @@ public class PermissionMonitor { // Keys are App IDs. Values are true for SYSTEM permission and false for NETWORK permission. private final Map<Integer, Boolean> mApps = new HashMap<>(); + // Keys are App packageNames, Values are app uids. . We need to keep track of this information + // because PackageListObserver#onPackageRemoved does not pass the UID. + @GuardedBy("mPackageNameUidMap") + private final Map<String, Integer> mPackageNameUidMap = new HashMap<>(); + + private class PackageListObserver implements PackageManagerInternal.PackageListObserver { + @Override + public void onPackageAdded(String packageName) { + final PackageInfo app = getPackageInfo(packageName); + if (app == null) { + Slog.wtf(TAG, "Failed to get information of installed package: " + packageName); + return; + } + int uid = (app.applicationInfo != null) ? app.applicationInfo.uid : INVALID_UID; + if (uid == INVALID_UID) { + Slog.wtf(TAG, "Failed to get the uid of installed package: " + packageName + + "uid: " + uid); + return; + } + if (app.requestedPermissions == null) { + return; + } + sendPackagePermissionsForUid(uid, + filterPermission(Arrays.asList(app.requestedPermissions))); + synchronized (mPackageNameUidMap) { + mPackageNameUidMap.put(packageName, uid); + } + } + + @Override + public void onPackageRemoved(String packageName) { + int uid; + synchronized (mPackageNameUidMap) { + if (!mPackageNameUidMap.containsKey(packageName)) { + return; + } + uid = mPackageNameUidMap.get(packageName); + mPackageNameUidMap.remove(packageName); + } + int permission = 0; + String[] packages = mPackageManager.getPackagesForUid(uid); + if (packages != null && packages.length > 0) { + for (String name : packages) { + final PackageInfo app = getPackageInfo(name); + if (app != null && app.requestedPermissions != null) { + permission |= filterPermission(Arrays.asList(app.requestedPermissions)); + } + } + } + sendPackagePermissionsForUid(uid, permission); + } + } + public PermissionMonitor(Context context, INetworkManagementService netd) { mContext = context; mPackageManager = context.getPackageManager(); @@ -87,12 +149,21 @@ public class PermissionMonitor { public synchronized void startMonitoring() { log("Monitoring"); - List<PackageInfo> apps = mPackageManager.getInstalledPackages(GET_PERMISSIONS); + PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); + if (pmi != null) { + pmi.getPackageList(new PackageListObserver()); + } else { + loge("failed to get the PackageManagerInternal service"); + } + List<PackageInfo> apps = mPackageManager.getInstalledPackages(GET_PERMISSIONS + | MATCH_ANY_USER); if (apps == null) { loge("No apps"); return; } + SparseIntArray netdPermsUids = new SparseIntArray(); + for (PackageInfo app : apps) { int uid = app.applicationInfo != null ? app.applicationInfo.uid : INVALID_UID; if (uid < 0) { @@ -110,6 +181,17 @@ public class PermissionMonitor { mApps.put(uid, hasRestrictedPermission); } } + + //TODO: unify the management of the permissions into one codepath. + if (app.requestedPermissions != null) { + int otherNetdPerms = filterPermission(Arrays.asList(app.requestedPermissions)); + if (otherNetdPerms != 0) { + netdPermsUids.put(uid, netdPermsUids.get(uid) | otherNetdPerms); + synchronized (mPackageNameUidMap) { + mPackageNameUidMap.put(app.applicationInfo.packageName, uid); + } + } + } } List<UserInfo> users = mUserManager.getUsers(true); // exclude dying users @@ -121,6 +203,7 @@ public class PermissionMonitor { log("Users: " + mUsers.size() + ", Apps: " + mApps.size()); update(mUsers, mApps, true); + sendPackagePermissionsToNetd(netdPermsUids); } @VisibleForTesting @@ -339,6 +422,107 @@ public class PermissionMonitor { } } + private static int filterPermission(List<String> requestedPermissions) { + int permissions = 0; + if (requestedPermissions.contains(INTERNET)) { + permissions |= INetd.PERMISSION_INTERNET; + } + if (requestedPermissions.contains(UPDATE_DEVICE_STATS)) { + permissions |= INetd.PERMISSION_UPDATE_DEVICE_STATS; + } + return permissions; + } + + private PackageInfo getPackageInfo(String packageName) { + try { + PackageInfo app = mPackageManager.getPackageInfo(packageName, GET_PERMISSIONS + | MATCH_ANY_USER); + return app; + } catch (NameNotFoundException e) { + // App not found. + loge("NameNotFoundException " + packageName); + return null; + } + } + + /** + * Called by PackageListObserver when a package is installed/uninstalled. Send the updated + * permission information to netd. + * + * @param uid the app uid of the package installed + * @param permissions the permissions the app requested and netd cares about. + * + * @hide + */ + private void sendPackagePermissionsForUid(int uid, int permissions) { + SparseIntArray netdPermissionsAppIds = new SparseIntArray(); + netdPermissionsAppIds.put(uid, permissions); + sendPackagePermissionsToNetd(netdPermissionsAppIds); + } + + /** + * Called by packageManagerService to send IPC to netd. Grant or revoke the INTERNET + * and/or UPDATE_DEVICE_STATS permission of the uids in array. + * + * @param netdPermissionsAppIds integer pairs of uids and the permission granted to it. If the + * permission is 0, revoke all permissions of that uid. + * + * @hide + */ + private void sendPackagePermissionsToNetd(SparseIntArray netdPermissionsAppIds) { + INetd netdService = NetdService.getInstance(); + if (netdService == null) { + Log.e(TAG, "Failed to get the netd service"); + return; + } + ArrayList<Integer> allPermissionAppIds = new ArrayList<>(); + ArrayList<Integer> internetPermissionAppIds = new ArrayList<>(); + ArrayList<Integer> updateStatsPermissionAppIds = new ArrayList<>(); + ArrayList<Integer> uninstalledAppIds = new ArrayList<>(); + for (int i = 0; i < netdPermissionsAppIds.size(); i++) { + int permissions = netdPermissionsAppIds.valueAt(i); + switch(permissions) { + case (INetd.PERMISSION_INTERNET | INetd.PERMISSION_UPDATE_DEVICE_STATS): + allPermissionAppIds.add(netdPermissionsAppIds.keyAt(i)); + break; + case INetd.PERMISSION_INTERNET: + internetPermissionAppIds.add(netdPermissionsAppIds.keyAt(i)); + break; + case INetd.PERMISSION_UPDATE_DEVICE_STATS: + updateStatsPermissionAppIds.add(netdPermissionsAppIds.keyAt(i)); + break; + case INetd.NO_PERMISSIONS: + uninstalledAppIds.add(netdPermissionsAppIds.keyAt(i)); + break; + default: + Log.e(TAG, "unknown permission type: " + permissions + "for uid: " + + netdPermissionsAppIds.keyAt(i)); + } + } + try { + // TODO: add a lock inside netd to protect IPC trafficSetNetPermForUids() + if (allPermissionAppIds.size() != 0) { + netdService.trafficSetNetPermForUids( + INetd.PERMISSION_INTERNET | INetd.PERMISSION_UPDATE_DEVICE_STATS, + ArrayUtils.convertToIntArray(allPermissionAppIds)); + } + if (internetPermissionAppIds.size() != 0) { + netdService.trafficSetNetPermForUids(INetd.PERMISSION_INTERNET, + ArrayUtils.convertToIntArray(internetPermissionAppIds)); + } + if (updateStatsPermissionAppIds.size() != 0) { + netdService.trafficSetNetPermForUids(INetd.PERMISSION_UPDATE_DEVICE_STATS, + ArrayUtils.convertToIntArray(updateStatsPermissionAppIds)); + } + if (uninstalledAppIds.size() != 0) { + netdService.trafficSetNetPermForUids(INetd.NO_PERMISSIONS, + ArrayUtils.convertToIntArray(uninstalledAppIds)); + } + } catch (RemoteException e) { + Log.e(TAG, "Pass appId list of special permission failed." + e); + } + } + private static void log(String s) { if (DBG) { Log.d(TAG, s); diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java index 1dada92ab118..f4454ae2a180 100644 --- a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java +++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java @@ -146,8 +146,8 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub { if (isDumpstateBinderServiceRunningLocked()) { Slog.w(TAG, "'dumpstate' is already running. Cannot start a new bugreport" + " while another one is currently in progress."); - // TODO(b/111441001): Use a new error code; add this to the documentation of the API. - reportError(listener, IDumpstateListener.BUGREPORT_ERROR_RUNTIME_ERROR); + reportError(listener, + IDumpstateListener.BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS); return; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 894897705d44..66fc22f39601 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -177,6 +177,7 @@ import android.content.pm.PackageList; import android.content.pm.PackageManager; import android.content.pm.PackageManager.LegacyPackageDeleteObserver; import android.content.pm.PackageManagerInternal; +import android.content.pm.PackageManagerInternal.CheckPermissionDelegate; import android.content.pm.PackageManagerInternal.PackageListObserver; import android.content.pm.PackageParser; import android.content.pm.PackageParser.ActivityIntentInfo; @@ -297,6 +298,8 @@ import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; +import com.android.internal.util.function.QuadFunction; +import com.android.internal.util.function.TriFunction; import com.android.server.AttributeCache; import com.android.server.DeviceIdleController; import com.android.server.EventLogTags; @@ -376,6 +379,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; +import java.util.function.BiFunction; import java.util.function.Predicate; /** @@ -1043,6 +1047,9 @@ public class PackageManagerService extends IPackageManager.Stub void receiveVerificationResponse(int verificationId); } + @GuardedBy("mPackages") + private CheckPermissionDelegate mCheckPermissionDelegate; + private class IntentVerifierProxy implements IntentFilterVerifier<ActivityIntentInfo> { private Context mContext; private ComponentName mIntentFilterVerifierComponent; @@ -5352,11 +5359,35 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int checkPermission(String permName, String pkgName, int userId) { + final CheckPermissionDelegate checkPermissionDelegate; + synchronized (mPackages) { + if (mCheckPermissionDelegate == null) { + return checkPermissionImpl(permName, pkgName, userId); + } + checkPermissionDelegate = mCheckPermissionDelegate; + } + return checkPermissionDelegate.checkPermission(permName, pkgName, userId, + PackageManagerService.this::checkPermissionImpl); + } + + private int checkPermissionImpl(String permName, String pkgName, int userId) { return mPermissionManager.checkPermission(permName, pkgName, getCallingUid(), userId); } @Override public int checkUidPermission(String permName, int uid) { + final CheckPermissionDelegate checkPermissionDelegate; + synchronized (mPackages) { + if (mCheckPermissionDelegate == null) { + return checkUidPermissionImpl(permName, uid); + } + checkPermissionDelegate = mCheckPermissionDelegate; + } + return checkPermissionDelegate.checkUidPermission(permName, uid, + PackageManagerService.this::checkUidPermissionImpl); + } + + private int checkUidPermissionImpl(String permName, int uid) { synchronized (mPackages) { final String[] packageNames = getPackagesForUid(uid); final PackageParser.Package pkg = (packageNames != null && packageNames.length > 0) @@ -9237,6 +9268,16 @@ public class PackageManagerService extends IPackageManager.Stub } @GuardedBy("mPackages") + public CheckPermissionDelegate getCheckPermissionDelegateLocked() { + return mCheckPermissionDelegate; + } + + @GuardedBy("mPackages") + public void setCheckPermissionDelegateLocked(CheckPermissionDelegate delegate) { + mCheckPermissionDelegate = delegate; + } + + @GuardedBy("mPackages") private void notifyPackageUseLocked(String packageName, int reason) { final PackageParser.Package p = mPackages.get(packageName); if (p == null) { @@ -13696,7 +13737,9 @@ public class PackageManagerService extends IPackageManager.Stub if (mPackageListObservers.size() == 0) { return; } - observers = (PackageListObserver[]) mPackageListObservers.toArray(); + final PackageListObserver[] observerArray = + new PackageListObserver[mPackageListObservers.size()]; + observers = mPackageListObservers.toArray(observerArray); } for (int i = observers.length - 1; i >= 0; --i) { observers[i].onPackageAdded(packageName); @@ -13710,7 +13753,9 @@ public class PackageManagerService extends IPackageManager.Stub if (mPackageListObservers.size() == 0) { return; } - observers = (PackageListObserver[]) mPackageListObservers.toArray(); + final PackageListObserver[] observerArray = + new PackageListObserver[mPackageListObservers.size()]; + observers = mPackageListObservers.toArray(observerArray); } for (int i = observers.length - 1; i >= 0; --i) { observers[i].onPackageRemoved(packageName); @@ -24511,6 +24556,20 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } return mArtManagerService.compileLayouts(pkg); } + + @Override + public CheckPermissionDelegate getCheckPermissionDelegate() { + synchronized (mPackages) { + return PackageManagerService.this.getCheckPermissionDelegateLocked(); + } + } + + @Override + public void setCheckPermissionDelegate(CheckPermissionDelegate delegate) { + synchronized (mPackages) { + PackageManagerService.this.setCheckPermissionDelegateLocked(delegate); + } + } } @Override diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java index a042fedf8b47..ec15c16981a8 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java @@ -21,19 +21,11 @@ import android.annotation.Nullable; import android.content.pm.PackageParser; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.PermissionInfoFlags; -import android.content.pm.PackageParser.Permission; - -import com.android.server.pm.SharedUserSetting; -import com.android.server.pm.permission.PermissionManagerInternal.PermissionCallback; import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.Set; /** * Internal interfaces to be used by other components within the system server. diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java index 4b413e5f76bb..296a6526f5a6 100644 --- a/services/core/java/com/android/server/timezone/RulesManagerService.java +++ b/services/core/java/com/android/server/timezone/RulesManagerService.java @@ -16,14 +16,13 @@ package com.android.server.timezone; -import com.android.internal.annotations.VisibleForTesting; -import com.android.server.EventLogTags; -import com.android.server.SystemService; -import com.android.timezone.distro.DistroException; -import com.android.timezone.distro.DistroVersion; -import com.android.timezone.distro.StagedDistroOperation; -import com.android.timezone.distro.TimeZoneDistro; -import com.android.timezone.distro.installer.TimeZoneDistroInstaller; +import static android.app.timezone.RulesState.DISTRO_STATUS_INSTALLED; +import static android.app.timezone.RulesState.DISTRO_STATUS_NONE; +import static android.app.timezone.RulesState.DISTRO_STATUS_UNKNOWN; +import static android.app.timezone.RulesState.STAGED_OPERATION_INSTALL; +import static android.app.timezone.RulesState.STAGED_OPERATION_NONE; +import static android.app.timezone.RulesState.STAGED_OPERATION_UNINSTALL; +import static android.app.timezone.RulesState.STAGED_OPERATION_UNKNOWN; import android.app.timezone.Callback; import android.app.timezone.DistroFormatVersion; @@ -37,6 +36,21 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.Slog; +import com.android.internal.annotations.VisibleForTesting; +import com.android.server.EventLogTags; +import com.android.server.SystemService; +import com.android.timezone.distro.DistroException; +import com.android.timezone.distro.DistroVersion; +import com.android.timezone.distro.StagedDistroOperation; +import com.android.timezone.distro.TimeZoneDistro; +import com.android.timezone.distro.installer.TimeZoneDistroInstaller; + +import libcore.icu.ICU; +import libcore.timezone.TimeZoneDataFiles; +import libcore.timezone.TimeZoneFinder; +import libcore.timezone.TzDataSetVersion; +import libcore.timezone.ZoneInfoDB; + import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; @@ -46,18 +60,6 @@ import java.io.PrintWriter; import java.util.Arrays; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; -import libcore.icu.ICU; -import libcore.timezone.TzDataSetVersion; -import libcore.timezone.TimeZoneFinder; -import libcore.timezone.ZoneInfoDB; - -import static android.app.timezone.RulesState.DISTRO_STATUS_INSTALLED; -import static android.app.timezone.RulesState.DISTRO_STATUS_NONE; -import static android.app.timezone.RulesState.DISTRO_STATUS_UNKNOWN; -import static android.app.timezone.RulesState.STAGED_OPERATION_INSTALL; -import static android.app.timezone.RulesState.STAGED_OPERATION_NONE; -import static android.app.timezone.RulesState.STAGED_OPERATION_UNINSTALL; -import static android.app.timezone.RulesState.STAGED_OPERATION_UNKNOWN; public final class RulesManagerService extends IRulesManager.Stub { @@ -96,8 +98,6 @@ public final class RulesManagerService extends IRulesManager.Stub { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) static final String REQUIRED_QUERY_PERMISSION = android.Manifest.permission.QUERY_TIME_ZONE_RULES; - private static final File SYSTEM_TZ_DATA_FILE = new File("/system/usr/share/zoneinfo/tzdata"); - private static final File TZ_DATA_DIR = new File("/data/misc/zoneinfo"); private final AtomicBoolean mOperationInProgress = new AtomicBoolean(false); private final PermissionHelper mPermissionHelper; @@ -108,12 +108,14 @@ public final class RulesManagerService extends IRulesManager.Stub { private static RulesManagerService create(Context context) { RulesManagerServiceHelperImpl helper = new RulesManagerServiceHelperImpl(context); + File baseVersionFile = new File(TimeZoneDataFiles.getRuntimeModuleTzVersionFile()); + File tzDataDir = new File(TimeZoneDataFiles.getDataTimeZoneRootDir()); return new RulesManagerService( helper /* permissionHelper */, helper /* executor */, helper /* intentHelper */, PackageTracker.create(context), - new TimeZoneDistroInstaller(TAG, SYSTEM_TZ_DATA_FILE, TZ_DATA_DIR)); + new TimeZoneDistroInstaller(TAG, baseVersionFile, tzDataDir)); } // A constructor that can be used by tests to supply mocked / faked dependencies. @@ -143,11 +145,11 @@ public final class RulesManagerService extends IRulesManager.Stub { /** Like {@link #getRulesState()} without the permission check. */ private RulesState getRulesStateInternal() { synchronized(this) { - String systemRulesVersion; + TzDataSetVersion baseVersion; try { - systemRulesVersion = mInstaller.getSystemRulesVersion(); + baseVersion = mInstaller.readBaseVersion(); } catch (IOException e) { - Slog.w(TAG, "Failed to read system rules", e); + Slog.w(TAG, "Failed to read base rules version", e); return null; } @@ -196,7 +198,7 @@ public final class RulesManagerService extends IRulesManager.Stub { Slog.w(TAG, "Failed to read staged distro.", e); } } - return new RulesState(systemRulesVersion, DISTRO_FORMAT_VERSION_SUPPORTED, + return new RulesState(baseVersion.rulesVersion, DISTRO_FORMAT_VERSION_SUPPORTED, operationInProgress, stagedOperationStatus, stagedDistroRulesVersion, distroStatus, installedDistroRulesVersion); } @@ -454,13 +456,13 @@ public final class RulesManagerService extends IRulesManager.Stub { pw.println("Operation in progress: " + value); break; } - case 's': { - // Report system image rules version + case 'b': { + // Report base rules version String value = "Unknown"; if (rulesState != null) { - value = rulesState.getSystemRulesVersion(); + value = rulesState.getBaseRulesVersion(); } - pw.println("System rules version: " + value); + pw.println("Base rules version: " + value); break; } case 'c': { diff --git a/services/net/java/android/net/NetworkStackClient.java b/services/net/java/android/net/NetworkStackClient.java index c09be82cb420..830dbbe8b8c0 100644 --- a/services/net/java/android/net/NetworkStackClient.java +++ b/services/net/java/android/net/NetworkStackClient.java @@ -30,6 +30,7 @@ import android.content.pm.PackageManager; import android.net.dhcp.DhcpServingParamsParcel; import android.net.dhcp.IDhcpServerCallbacks; import android.net.ip.IIpClientCallbacks; +import android.net.util.SharedLog; import android.os.Binder; import android.os.IBinder; import android.os.Process; @@ -40,6 +41,7 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; +import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; @@ -61,6 +63,9 @@ public class NetworkStackClient { @GuardedBy("mPendingNetStackRequests") private INetworkStackConnector mConnector; + @GuardedBy("mLog") + private final SharedLog mLog = new SharedLog(TAG); + private volatile boolean mNetworkStackStartRequested = false; private interface NetworkStackCallback { @@ -129,13 +134,14 @@ public class NetworkStackClient { private class NetworkStackConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { + log("Network stack service connected"); registerNetworkStackService(service); } @Override public void onServiceDisconnected(ComponentName name) { // TODO: crash/reboot the system ? - Slog.wtf(TAG, "Lost network stack connector"); + logWtf("Lost network stack connector", null); } }; @@ -144,6 +150,7 @@ public class NetworkStackClient { ServiceManager.addService(Context.NETWORK_STACK_SERVICE, service, false /* allowIsolated */, DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL); + log("Network stack service registered"); final ArrayList<NetworkStackCallback> requests; synchronized (mPendingNetStackRequests) { @@ -166,6 +173,7 @@ public class NetworkStackClient { * started. */ public void start(Context context) { + log("Starting network stack"); mNetworkStackStartRequested = true; // Try to bind in-process if the library is available IBinder connector = null; @@ -177,7 +185,7 @@ public class NetworkStackClient { connector = (IBinder) service.getMethod("makeConnector", Context.class) .invoke(null, context); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - Slog.wtf(TAG, "Could not create network stack connector from NetworkStackService"); + logWtf("Could not create network stack connector from NetworkStackService", e); // TODO: crash/reboot system here ? return; } catch (ClassNotFoundException e) { @@ -186,17 +194,19 @@ public class NetworkStackClient { // In-process network stack. Add the service to the service manager here. if (connector != null) { + log("Registering in-process network stack connector"); registerNetworkStackService(connector); return; } // Start the network stack process. The service will be added to the service manager in // NetworkStackConnection.onServiceConnected(). + log("Starting network stack process"); final Intent intent = new Intent(INetworkStackConnector.class.getName()); final ComponentName comp = intent.resolveSystemService(context.getPackageManager(), 0); intent.setComponent(comp); if (comp == null) { - Slog.wtf(TAG, "Could not resolve the network stack with " + intent); + logWtf("Could not resolve the network stack with " + intent, null); // TODO: crash/reboot system server ? return; } @@ -205,7 +215,7 @@ public class NetworkStackClient { try { uid = pm.getPackageUidAsUser(comp.getPackageName(), UserHandle.USER_SYSTEM); } catch (PackageManager.NameNotFoundException e) { - Slog.wtf("Network stack package not found", e); + logWtf("Network stack package not found", e); // Fall through } if (uid != Process.NETWORK_STACK_UID) { @@ -221,10 +231,31 @@ public class NetworkStackClient { if (!context.bindServiceAsUser(intent, new NetworkStackConnection(), Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM)) { - Slog.wtf(TAG, - "Could not bind to network stack in-process, or in app with " + intent); + logWtf("Could not bind to network stack in-process, or in app with " + intent, null); + return; // TODO: crash/reboot system server if no network stack after a timeout ? } + + log("Network stack service start requested"); + } + + private void log(@NonNull String message) { + synchronized (mLog) { + mLog.log(message); + } + } + + private void logWtf(@NonNull String message, @Nullable Throwable e) { + Slog.wtf(TAG, message); + synchronized (mLog) { + mLog.e(message, e); + } + } + + private void loge(@NonNull String message, @Nullable Throwable e) { + synchronized (mLog) { + mLog.e(message, e); + } } /** @@ -243,12 +274,12 @@ public class NetworkStackClient { while ((connector = ServiceManager.getService(Context.NETWORK_STACK_SERVICE)) == null) { Thread.sleep(20); if (System.currentTimeMillis() - before > NETWORKSTACK_TIMEOUT_MS) { - Slog.e(TAG, "Timeout waiting for NetworkStack connector"); + loge("Timeout waiting for NetworkStack connector", null); return null; } } } catch (InterruptedException e) { - Slog.e(TAG, "Error waiting for NetworkStack connector", e); + loge("Error waiting for NetworkStack connector", e); return null; } @@ -286,4 +317,20 @@ public class NetworkStackClient { request.onNetworkStackConnected(connector); } + + /** + * Dump NetworkStackClient logs to the specified {@link PrintWriter}. + */ + public void dump(PrintWriter pw) { + // dump is thread-safe on SharedLog + mLog.dump(null, pw, null); + + final int requestsQueueLength; + synchronized (mPendingNetStackRequests) { + requestsQueueLength = mPendingNetStackRequests.size(); + } + + pw.println(); + pw.println("pendingNetStackRequests length: " + requestsQueueLength); + } } diff --git a/services/net/java/android/net/ip/RouterAdvertisementDaemon.java b/services/net/java/android/net/ip/RouterAdvertisementDaemon.java index 8e3023bc08d4..339607bbc73d 100644 --- a/services/net/java/android/net/ip/RouterAdvertisementDaemon.java +++ b/services/net/java/android/net/ip/RouterAdvertisementDaemon.java @@ -275,6 +275,9 @@ public class RouterAdvertisementDaemon { public void stop() { closeSocket(); + // Wake up mMulticastTransmitter thread to interrupt a potential 1 day sleep before + // the thread's termination. + maybeNotifyMulticastTransmitter(); mMulticastTransmitter = null; mUnicastResponder = null; } diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java index 1b106dd37163..5c6fe0fc4cad 100644 --- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java @@ -16,34 +16,9 @@ package com.android.server.timezone; -import com.android.timezone.distro.DistroVersion; -import com.android.timezone.distro.StagedDistroOperation; -import com.android.timezone.distro.TimeZoneDistro; -import com.android.timezone.distro.installer.TimeZoneDistroInstaller; - -import org.junit.Before; -import org.junit.Test; - -import android.app.timezone.Callback; -import android.app.timezone.DistroRulesVersion; -import android.app.timezone.ICallback; -import android.app.timezone.RulesManager; -import android.app.timezone.RulesState; -import android.os.ParcelFileDescriptor; - -import java.io.File; -import java.io.FileDescriptor; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.concurrent.Executor; -import javax.annotation.Nullable; - -import libcore.io.IoUtils; -import libcore.timezone.TzDataSetVersion; - import static com.android.server.timezone.RulesManagerService.REQUIRED_QUERY_PERMISSION; import static com.android.server.timezone.RulesManagerService.REQUIRED_UPDATER_PERMISSION; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -61,11 +36,43 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; +import android.app.timezone.Callback; +import android.app.timezone.DistroRulesVersion; +import android.app.timezone.ICallback; +import android.app.timezone.RulesManager; +import android.app.timezone.RulesState; +import android.os.ParcelFileDescriptor; + +import com.android.timezone.distro.DistroVersion; +import com.android.timezone.distro.StagedDistroOperation; +import com.android.timezone.distro.TimeZoneDistro; +import com.android.timezone.distro.installer.TimeZoneDistroInstaller; + +import libcore.io.IoUtils; +import libcore.timezone.TzDataSetVersion; + +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.concurrent.Executor; + +import javax.annotation.Nullable; + /** * White box interaction / unit testing of the {@link RulesManagerService}. */ public class RulesManagerServiceTest { + private static final int CURRENT_FORMAT_MAJOR_VERSION = + TzDataSetVersion.currentFormatMajorVersion(); + private static final int CURRENT_FORMAT_MINOR_VERSION = + TzDataSetVersion.currentFormatMinorVersion(); + private RulesManagerService mRulesManagerService; private FakeExecutor mFakeExecutor; @@ -116,8 +123,8 @@ public class RulesManagerServiceTest { } @Test - public void getRulesState_systemRulesError() throws Exception { - configureDeviceCannotReadSystemRulesVersion(); + public void getRulesState_baseVersionError() throws Exception { + configureDeviceCannotReadBaseVersion(); assertNull(mRulesManagerService.getRulesState()); } @@ -126,18 +133,18 @@ public class RulesManagerServiceTest { public void getRulesState_stagedInstall() throws Exception { configureCallerHasPermission(); - configureDeviceSystemRulesVersion("2016a"); + configureDeviceBaseVersion("2016a"); DistroVersion stagedDistroVersion = new DistroVersion( - TzDataSetVersion.currentFormatMajorVersion(), - TzDataSetVersion.currentFormatMinorVersion() - 1, + CURRENT_FORMAT_MAJOR_VERSION, + CURRENT_FORMAT_MINOR_VERSION - 1, "2016c", - 3); + 3 /* revision */); configureStagedInstall(stagedDistroVersion); DistroVersion installedDistroVersion = new DistroVersion( - TzDataSetVersion.currentFormatMajorVersion(), - TzDataSetVersion.currentFormatMinorVersion() - 1, + CURRENT_FORMAT_MAJOR_VERSION, + CURRENT_FORMAT_MINOR_VERSION - 1, "2016b", 4); configureInstalledDistroVersion(installedDistroVersion); @@ -158,13 +165,13 @@ public class RulesManagerServiceTest { public void getRulesState_nothingStaged() throws Exception { configureCallerHasPermission(); - configureDeviceSystemRulesVersion("2016a"); + configureDeviceBaseVersion("2016a"); configureNoStagedOperation(); DistroVersion installedDistroVersion = new DistroVersion( - TzDataSetVersion.currentFormatMajorVersion(), - TzDataSetVersion.currentFormatMinorVersion() - 1, + CURRENT_FORMAT_MAJOR_VERSION, + CURRENT_FORMAT_MINOR_VERSION - 1, "2016b", 4); configureInstalledDistroVersion(installedDistroVersion); @@ -183,13 +190,13 @@ public class RulesManagerServiceTest { public void getRulesState_uninstallStaged() throws Exception { configureCallerHasPermission(); - configureDeviceSystemRulesVersion("2016a"); + configureDeviceBaseVersion("2016a"); configureStagedUninstall(); DistroVersion installedDistroVersion = new DistroVersion( - TzDataSetVersion.currentFormatMajorVersion(), - TzDataSetVersion.currentFormatMinorVersion() - 1, + CURRENT_FORMAT_MAJOR_VERSION, + CURRENT_FORMAT_MINOR_VERSION - 1, "2016b", 4); configureInstalledDistroVersion(installedDistroVersion); @@ -208,8 +215,8 @@ public class RulesManagerServiceTest { public void getRulesState_installedRulesError() throws Exception { configureCallerHasPermission(); - String systemRulesVersion = "2016a"; - configureDeviceSystemRulesVersion(systemRulesVersion); + String baseRulesVersion = "2016a"; + configureDeviceBaseVersion(baseRulesVersion); configureStagedUninstall(); configureDeviceCannotReadInstalledDistroVersion(); @@ -226,14 +233,14 @@ public class RulesManagerServiceTest { public void getRulesState_stagedRulesError() throws Exception { configureCallerHasPermission(); - String systemRulesVersion = "2016a"; - configureDeviceSystemRulesVersion(systemRulesVersion); + String baseRulesVersion = "2016a"; + configureDeviceBaseVersion(baseRulesVersion); configureDeviceCannotReadStagedDistroOperation(); DistroVersion installedDistroVersion = new DistroVersion( - TzDataSetVersion.currentFormatMajorVersion(), - TzDataSetVersion.currentFormatMinorVersion() - 1, + CURRENT_FORMAT_MAJOR_VERSION, + CURRENT_FORMAT_MINOR_VERSION - 1, "2016b", 4); configureInstalledDistroVersion(installedDistroVersion); @@ -252,13 +259,13 @@ public class RulesManagerServiceTest { public void getRulesState_noInstalledRules() throws Exception { configureCallerHasPermission(); - String systemRulesVersion = "2016a"; - configureDeviceSystemRulesVersion(systemRulesVersion); + String baseRulesVersion = "2016a"; + configureDeviceBaseVersion(baseRulesVersion); configureNoStagedOperation(); configureInstalledDistroVersion(null); RulesState expectedRuleState = new RulesState( - systemRulesVersion, RulesManagerService.DISTRO_FORMAT_VERSION_SUPPORTED, + baseRulesVersion, RulesManagerService.DISTRO_FORMAT_VERSION_SUPPORTED, false /* operationInProgress */, RulesState.STAGED_OPERATION_NONE, null /* stagedDistroRulesVersion */, RulesState.DISTRO_STATUS_NONE, null /* installedDistroRulesVersion */); @@ -269,15 +276,15 @@ public class RulesManagerServiceTest { public void getRulesState_operationInProgress() throws Exception { configureCallerHasPermission(); - String systemRulesVersion = "2016a"; + String baseRulesVersion = "2016a"; String installedRulesVersion = "2016b"; int revision = 3; - configureDeviceSystemRulesVersion(systemRulesVersion); + configureDeviceBaseVersion(baseRulesVersion); DistroVersion installedDistroVersion = new DistroVersion( - TzDataSetVersion.currentFormatMajorVersion(), - TzDataSetVersion.currentFormatMinorVersion() - 1, + CURRENT_FORMAT_MAJOR_VERSION, + CURRENT_FORMAT_MINOR_VERSION - 1, installedRulesVersion, revision); configureInstalledDistroVersion(installedDistroVersion); @@ -297,7 +304,7 @@ public class RulesManagerServiceTest { DistroRulesVersion expectedInstalledDistroRulesVersion = new DistroRulesVersion(installedRulesVersion, revision); RulesState expectedRuleState = new RulesState( - systemRulesVersion, RulesManagerService.DISTRO_FORMAT_VERSION_SUPPORTED, + baseRulesVersion, RulesManagerService.DISTRO_FORMAT_VERSION_SUPPORTED, true /* operationInProgress */, RulesState.STAGED_OPERATION_UNKNOWN, null /* stagedDistroRulesVersion */, RulesState.DISTRO_STATUS_INSTALLED, expectedInstalledDistroRulesVersion); @@ -858,11 +865,20 @@ public class RulesManagerServiceTest { .thenReturn(true); // Set up the mocks to return (arbitrary) information about the current device state. - when(mMockTimeZoneDistroInstaller.getSystemRulesVersion()).thenReturn("2017a"); - when(mMockTimeZoneDistroInstaller.getInstalledDistroVersion()).thenReturn( - new DistroVersion(2, 3, "2017b", 4)); + TzDataSetVersion baseVersion = new TzDataSetVersion( + CURRENT_FORMAT_MAJOR_VERSION, CURRENT_FORMAT_MINOR_VERSION, "2017a", + 1 /* revision */); + when(mMockTimeZoneDistroInstaller.readBaseVersion()).thenReturn(baseVersion); + DistroVersion installedDistroVersion = new DistroVersion( + CURRENT_FORMAT_MAJOR_VERSION, CURRENT_FORMAT_MINOR_VERSION, "2017b", + 4 /* revision */); + when(mMockTimeZoneDistroInstaller.getInstalledDistroVersion()) + .thenReturn(installedDistroVersion); + DistroVersion stagedDistroVersion = new DistroVersion( + CURRENT_FORMAT_MAJOR_VERSION, CURRENT_FORMAT_MINOR_VERSION, "2017c", + 7 /* revision */); when(mMockTimeZoneDistroInstaller.getStagedDistroOperation()).thenReturn( - StagedDistroOperation.install(new DistroVersion(5, 6, "2017c", 7))); + StagedDistroOperation.install(stagedDistroVersion)); // Do the dump call. String dumpedOutput = doDumpCallAndCapture(rulesManagerService, args); @@ -973,8 +989,11 @@ public class RulesManagerServiceTest { return new CheckToken(1, new PackageVersions(1, 1)); } - private void configureDeviceSystemRulesVersion(String systemRulesVersion) throws Exception { - when(mMockTimeZoneDistroInstaller.getSystemRulesVersion()).thenReturn(systemRulesVersion); + private void configureDeviceBaseVersion(String baseRulesVersion) throws Exception { + TzDataSetVersion tzDataSetVersion = new TzDataSetVersion( + CURRENT_FORMAT_MAJOR_VERSION, CURRENT_FORMAT_MINOR_VERSION, baseRulesVersion, + 1 /* revision */); + when(mMockTimeZoneDistroInstaller.readBaseVersion()).thenReturn(tzDataSetVersion); } private void configureInstalledDistroVersion(@Nullable DistroVersion installedDistroVersion) @@ -1002,8 +1021,8 @@ public class RulesManagerServiceTest { .thenThrow(new IOException("Simulated failure")); } - private void configureDeviceCannotReadSystemRulesVersion() throws Exception { - when(mMockTimeZoneDistroInstaller.getSystemRulesVersion()) + private void configureDeviceCannotReadBaseVersion() throws Exception { + when(mMockTimeZoneDistroInstaller.readBaseVersion()) .thenThrow(new IOException("Simulated failure")); } diff --git a/telecomm/java/android/telecom/CallIdentification.java b/telecomm/java/android/telecom/CallIdentification.java index 87834fd5109d..cde7f608fa6a 100644 --- a/telecomm/java/android/telecom/CallIdentification.java +++ b/telecomm/java/android/telecom/CallIdentification.java @@ -45,13 +45,13 @@ public final class CallIdentification implements Parcelable { * {@link CallIdentification} for a screened call. */ public static class Builder { - private String mName; - private String mDescription; - private String mDetails; + private CharSequence mName; + private CharSequence mDescription; + private CharSequence mDetails; private Icon mPhoto; private int mNuisanceConfidence = CallIdentification.CONFIDENCE_UNKNOWN; private String mPackageName; - private String mAppName; + private CharSequence mAppName; /** * Default builder constructor. @@ -67,7 +67,7 @@ public final class CallIdentification implements Parcelable { * @param callIdAppName The app name. * @hide */ - public Builder(String callIdPackageName, String callIdAppName) { + public Builder(String callIdPackageName, CharSequence callIdAppName) { mPackageName = callIdPackageName; mAppName = callIdAppName; } @@ -80,7 +80,7 @@ public final class CallIdentification implements Parcelable { * @param name The name associated with the call, or {@code null} if none is provided. * @return Builder instance. */ - public Builder setName(@Nullable String name) { + public Builder setName(@Nullable CharSequence name) { mName = name; return this; } @@ -97,7 +97,7 @@ public final class CallIdentification implements Parcelable { * @param description The call description, or {@code null} if none is provided. * @return Builder instance. */ - public Builder setDescription(@Nullable String description) { + public Builder setDescription(@Nullable CharSequence description) { mDescription = description; return this; } @@ -114,7 +114,7 @@ public final class CallIdentification implements Parcelable { * @param details The call details, or {@code null} if none is provided. * @return Builder instance. */ - public Builder setDetails(@Nullable String details) { + public Builder setDetails(@Nullable CharSequence details) { mDetails = details; return this; } @@ -241,10 +241,10 @@ public final class CallIdentification implements Parcelable { * call identification. * @hide */ - private CallIdentification(@Nullable String name, @Nullable String description, - @Nullable String details, @Nullable Icon photo, + private CallIdentification(@Nullable CharSequence name, @Nullable CharSequence description, + @Nullable CharSequence details, @Nullable Icon photo, @NuisanceConfidence int nuisanceConfidence, @NonNull String callScreeningPackageName, - @NonNull String callScreeningAppName) { + @NonNull CharSequence callScreeningAppName) { mName = name; mDescription = description; mDetails = details; @@ -254,13 +254,13 @@ public final class CallIdentification implements Parcelable { mCallScreeningPackageName = callScreeningPackageName; } - private String mName; - private String mDescription; - private String mDetails; + private CharSequence mName; + private CharSequence mDescription; + private CharSequence mDetails; private Icon mPhoto; private int mNuisanceConfidence; private String mCallScreeningPackageName; - private String mCallScreeningAppName; + private CharSequence mCallScreeningAppName; @Override public int describeContents() { @@ -269,13 +269,13 @@ public final class CallIdentification implements Parcelable { @Override public void writeToParcel(Parcel parcel, int i) { - parcel.writeString(mName); - parcel.writeString(mDescription); - parcel.writeString(mDetails); + parcel.writeCharSequence(mName); + parcel.writeCharSequence(mDescription); + parcel.writeCharSequence(mDetails); parcel.writeParcelable(mPhoto, 0); parcel.writeInt(mNuisanceConfidence); parcel.writeString(mCallScreeningPackageName); - parcel.writeString(mCallScreeningAppName); + parcel.writeCharSequence(mCallScreeningAppName); } /** @@ -286,13 +286,13 @@ public final class CallIdentification implements Parcelable { @Override public CallIdentification createFromParcel(Parcel source) { - String name = source.readString(); - String description = source.readString(); - String details = source.readString(); + CharSequence name = source.readCharSequence(); + CharSequence description = source.readCharSequence(); + CharSequence details = source.readCharSequence(); Icon photo = source.readParcelable(ClassLoader.getSystemClassLoader()); int nuisanceConfidence = source.readInt(); String callScreeningPackageName = source.readString(); - String callScreeningAppName = source.readString(); + CharSequence callScreeningAppName = source.readCharSequence(); return new CallIdentification(name, description, details, photo, nuisanceConfidence, callScreeningPackageName, callScreeningAppName); } @@ -311,7 +311,7 @@ public final class CallIdentification implements Parcelable { * * @return The name associated with the number, or {@code null} if none was provided. */ - public final @Nullable String getName() { + public final @Nullable CharSequence getName() { return mName; } @@ -325,7 +325,7 @@ public final class CallIdentification implements Parcelable { * * @return The call description, or {@code null} if none was provided. */ - public final @Nullable String getDescription() { + public final @Nullable CharSequence getDescription() { return mDescription; } @@ -340,7 +340,7 @@ public final class CallIdentification implements Parcelable { * * @return The call details, or {@code null} if none was provided. */ - public final @Nullable String getDetails() { + public final @Nullable CharSequence getDetails() { return mDetails; } @@ -363,8 +363,7 @@ public final class CallIdentification implements Parcelable { * * @return The nuisance confidence. */ - public final @NuisanceConfidence - int getNuisanceConfidence() { + public final @NuisanceConfidence int getNuisanceConfidence() { return mNuisanceConfidence; } @@ -387,7 +386,7 @@ public final class CallIdentification implements Parcelable { * * @return The name of the app. */ - public final @NonNull String getCallScreeningAppName() { + public final @NonNull CharSequence getCallScreeningAppName() { return mCallScreeningAppName; } @@ -407,7 +406,7 @@ public final class CallIdentification implements Parcelable { * @param callScreeningAppName The app name. * @hide */ - public void setCallScreeningAppName(@NonNull String callScreeningAppName) { + public void setCallScreeningAppName(@NonNull CharSequence callScreeningAppName) { mCallScreeningAppName = callScreeningAppName; } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 2c6d2a722bb9..652ac4053fe1 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -2797,9 +2797,9 @@ public class CarrierConfigManager { /* Default value is 1024 kbps */ sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_BANDWIDTH_INT, 1024); /* Default value is 10 seconds */ - sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_ENTRY_OR_EXIT_HYSTERESIS_TIME_LONG, 10000); + sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_ENTRY_OR_EXIT_HYSTERESIS_TIME_LONG, 10000); /* Default value is 10 seconds. */ - sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG, 10000); + sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG, 10000); } /** diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java index f53cb8224706..6e839ab0ad6b 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -26,7 +26,7 @@ import android.annotation.UnsupportedAppUsage; * @hide */ @SystemApi -public class DisconnectCause { +public final class DisconnectCause { /** The disconnect cause is not valid (Not received a disconnect cause) */ public static final int NOT_VALID = -1; diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 3ce646cb400b..da92730383d0 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -176,26 +176,21 @@ public class PhoneStateListener { /** * Listen for {@link PreciseCallState.State} of ringing, background and foreground calls. - * {@more} - * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE - * READ_PRECISE_PHONE_STATE} * * @hide */ + @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi public static final int LISTEN_PRECISE_CALL_STATE = 0x00000800; /** * Listen for {@link PreciseDataConnectionState} on the data connection (cellular). * - * {@more} - * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE - * READ_PRECISE_PHONE_STATE} - * * @see #onPreciseDataConnectionStateChanged * * @hide */ + @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 0x00001000; @@ -328,12 +323,10 @@ public class PhoneStateListener { /** * Listen for call disconnect causes which contains {@link DisconnectCause} and * {@link PreciseDisconnectCause}. - * {@more} - * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE - * READ_PRECISE_PHONE_STATE} * * @hide */ + @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi public static final int LISTEN_CALL_DISCONNECT_CAUSES = 0x02000000; @@ -353,13 +346,10 @@ public class PhoneStateListener { * Listen for IMS call disconnect causes which contains * {@link android.telephony.ims.ImsReasonInfo} * - * {@more} - * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE - * READ_PRECISE_PHONE_STATE} - * * @see #onImsCallDisconnectCauseChanged(ImsReasonInfo) * @hide */ + @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi public static final int LISTEN_IMS_CALL_DISCONNECT_CAUSES = 0x08000000; @@ -576,8 +566,9 @@ public class PhoneStateListener { * @param callState {@link PreciseCallState} * @hide */ + @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi - public void onPreciseCallStateChanged(PreciseCallState callState) { + public void onPreciseCallStateChanged(@NonNull PreciseCallState callState) { // default implementation empty } @@ -588,6 +579,7 @@ public class PhoneStateListener { * * @hide */ + @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi public void onCallDisconnectCauseChanged(int disconnectCause, int preciseDisconnectCause) { // default implementation empty @@ -599,6 +591,7 @@ public class PhoneStateListener { * * @hide */ + @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi public void onImsCallDisconnectCauseChanged(@NonNull ImsReasonInfo imsReasonInfo) { // default implementation empty @@ -610,6 +603,7 @@ public class PhoneStateListener { * * @hide */ + @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi public void onPreciseDataConnectionStateChanged( PreciseDataConnectionState dataConnectionState) { diff --git a/telephony/java/android/telephony/PreciseDisconnectCause.java b/telephony/java/android/telephony/PreciseDisconnectCause.java index af88748af9e6..54980a29c0a6 100644 --- a/telephony/java/android/telephony/PreciseDisconnectCause.java +++ b/telephony/java/android/telephony/PreciseDisconnectCause.java @@ -23,7 +23,7 @@ import android.annotation.SystemApi; * @hide */ @SystemApi -public class PreciseDisconnectCause { +public final class PreciseDisconnectCause { /** The disconnect cause is not valid (Not received a disconnect cause).*/ public static final int NOT_VALID = -1; diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index a1aee6d8217f..3dc119950a59 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -1569,6 +1569,17 @@ public class ServiceState implements Parcelable { /** @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) public @TelephonyManager.NetworkType int getDataNetworkType() { + final NetworkRegistrationState iwlanRegState = getNetworkRegistrationState( + NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WLAN); + if (iwlanRegState != null + && iwlanRegState.getRegState() == NetworkRegistrationState.REG_STATE_HOME) { + // If the device is on IWLAN, return IWLAN as the network type. This is to simulate the + // behavior of legacy mode device. In the future caller should use + // getNetworkRegistrationState() to retrieve the actual data network type on cellular + // or on IWLAN. + return iwlanRegState.getAccessNetworkTechnology(); + } + final NetworkRegistrationState regState = getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN); if (regState != null) { diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java index d2ae106b5545..d461bd0fee8a 100644 --- a/telephony/java/android/telephony/SignalStrength.java +++ b/telephony/java/android/telephony/SignalStrength.java @@ -215,13 +215,52 @@ public class SignalStrength implements Parcelable { * @see android.telephony#CellSignalStrengthGsm */ public @NonNull List<CellSignalStrength> getCellSignalStrengths() { - List<CellSignalStrength> cssList = new ArrayList<>(2); // Usually have 2 or fewer elems - if (mLte.isValid()) cssList.add(mLte); - if (mCdma.isValid()) cssList.add(mCdma); - if (mTdscdma.isValid()) cssList.add(mTdscdma); - if (mWcdma.isValid()) cssList.add(mWcdma); - if (mGsm.isValid()) cssList.add(mGsm); - if (mNr.isValid()) cssList.add(mNr); + return getCellSignalStrengths(CellSignalStrength.class); + } + + /** + * Returns a List of CellSignalStrength Components of this SignalStrength Report. + * + * Use this API to access underlying + * {@link android.telephony#CellSignalStrength CellSignalStrength} objects that provide more + * granular information about the SignalStrength report. Only valid (non-empty) + * CellSignalStrengths will be returned. The order of any returned elements is not guaranteed, + * and the list may contain more than one instance of a CellSignalStrength type. + * + * @param clazz a class type that extends + * {@link android.telephony.CellSignalStrength CellSignalStrength} to filter possible + * return values. + * @return a List of CellSignalStrength or an empty List if there are no valid measurements. + * + * @see android.telephony#CellSignalStrength + * @see android.telephony#CellSignalStrengthNr + * @see android.telephony#CellSignalStrengthLte + * @see android.telephony#CellSignalStrengthTdscdma + * @see android.telephony#CellSignalStrengthWcdma + * @see android.telephony#CellSignalStrengthCdma + * @see android.telephony#CellSignalStrengthGsm + */ + public <T extends CellSignalStrength> @NonNull List<T> getCellSignalStrengths( + @NonNull Class<T> clazz) { + List<T> cssList = new ArrayList<>(2); // Usually have 2 or fewer elems + if (mLte.isValid() && clazz.isAssignableFrom(CellSignalStrengthLte.class)) { + cssList.add((T) mLte); + } + if (mCdma.isValid() && clazz.isAssignableFrom(CellSignalStrengthCdma.class)) { + cssList.add((T) mCdma); + } + if (mTdscdma.isValid() && clazz.isAssignableFrom(CellSignalStrengthTdscdma.class)) { + cssList.add((T) mTdscdma); + } + if (mWcdma.isValid() && clazz.isAssignableFrom(CellSignalStrengthWcdma.class)) { + cssList.add((T) mWcdma); + } + if (mGsm.isValid() && clazz.isAssignableFrom(CellSignalStrengthGsm.class)) { + cssList.add((T) mGsm); + } + if (mNr.isValid() && clazz.isAssignableFrom(CellSignalStrengthNr.class)) { + cssList.add((T) mNr); + } return cssList; } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 32ff5e26a2c4..3a38645e5fc9 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -10236,24 +10236,25 @@ public class TelephonyManager { /** * Returns if the usage of multiple SIM cards at the same time to register on the network - * (e.g. Dual Standby or Dual Active) is restricted. + * (e.g. Dual Standby or Dual Active) is supported by the device and by the carrier. * - * @return true if usage of multiple SIMs is restricted, false otherwise. + * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * - * @hide + * @return true if usage of multiple SIMs is supported, false otherwise. */ - @SystemApi - @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) - public boolean isMultisimCarrierRestricted() { + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) + public boolean isMultisimSupported() { try { ITelephony service = getITelephony(); if (service != null) { - return service.isMultisimCarrierRestricted(); + return service.isMultisimSupported(getOpPackageName()); } } catch (RemoteException e) { - Log.e(TAG, "isMultisimCarrierRestricted RemoteException", e); + Log.e(TAG, "isMultisimSupported RemoteException", e); } - return true; + return false; } /** @@ -10289,8 +10290,8 @@ public class TelephonyManager { @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void switchMultiSimConfig(int numOfSims) { //only proceed if multi-sim is not restricted - if (isMultisimCarrierRestricted()) { - Rlog.e(TAG, "switchMultiSimConfig not possible. It is restricted."); + if (!isMultisimSupported()) { + Rlog.e(TAG, "switchMultiSimConfig not possible. It is restricted or not supported."); return; } diff --git a/telephony/java/android/telephony/ims/Rcs1To1Thread.java b/telephony/java/android/telephony/ims/Rcs1To1Thread.java index d4a78ffb77db..0bb1b4379679 100644 --- a/telephony/java/android/telephony/ims/Rcs1To1Thread.java +++ b/telephony/java/android/telephony/ims/Rcs1To1Thread.java @@ -22,6 +22,8 @@ import android.annotation.WorkerThread; * Rcs1To1Thread represents a single RCS conversation thread with a total of two * {@link RcsParticipant}s. Please see Section 5 (1-to-1 Messaging) - GSMA RCC.71 (RCS Universal * Profile Service Definition Document) + * + * @hide */ public class Rcs1To1Thread extends RcsThread { private int mThreadId; diff --git a/telephony/java/android/telephony/ims/RcsEvent.java b/telephony/java/android/telephony/ims/RcsEvent.java index a547c5c00141..994b27ab7405 100644 --- a/telephony/java/android/telephony/ims/RcsEvent.java +++ b/telephony/java/android/telephony/ims/RcsEvent.java @@ -17,6 +17,8 @@ package android.telephony.ims; /** * The base class for events that can happen on {@link RcsParticipant}s and {@link RcsThread}s. + * + * @hide */ public abstract class RcsEvent { private final long mTimestamp; diff --git a/telephony/java/android/telephony/ims/RcsEventQueryParams.java b/telephony/java/android/telephony/ims/RcsEventQueryParams.java index 9dbfe4393213..5f8fa8003751 100644 --- a/telephony/java/android/telephony/ims/RcsEventQueryParams.java +++ b/telephony/java/android/telephony/ims/RcsEventQueryParams.java @@ -37,6 +37,8 @@ import java.security.InvalidParameterException; * The parameters to pass into * {@link RcsMessageStore#getRcsEvents(RcsEventQueryParams)} in order to select a * subset of {@link RcsEvent}s present in the message store. + * + * @hide */ public final class RcsEventQueryParams implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/RcsEventQueryResult.java b/telephony/java/android/telephony/ims/RcsEventQueryResult.java index 92bda813f93e..d6347e3ec693 100644 --- a/telephony/java/android/telephony/ims/RcsEventQueryResult.java +++ b/telephony/java/android/telephony/ims/RcsEventQueryResult.java @@ -22,6 +22,8 @@ import java.util.List; * The result of a {@link RcsMessageStore#getRcsEvents(RcsEventQueryParams)} * call. This class allows getting the token for querying the next batch of events in order to * prevent handling large amounts of data at once. + * + * @hide */ public class RcsEventQueryResult { private RcsQueryContinuationToken mContinuationToken; diff --git a/telephony/java/android/telephony/ims/RcsFileTransferCreationParams.java b/telephony/java/android/telephony/ims/RcsFileTransferCreationParams.java index 14af8ea63a67..4742ba2730b6 100644 --- a/telephony/java/android/telephony/ims/RcsFileTransferCreationParams.java +++ b/telephony/java/android/telephony/ims/RcsFileTransferCreationParams.java @@ -24,6 +24,8 @@ import android.os.Parcelable; * Pass an instance of this class to * {@link RcsMessage#insertFileTransfer(RcsFileTransferCreationParams)} create an * {@link RcsFileTransferPart} and save it into storage. + * + * @hide */ public final class RcsFileTransferCreationParams implements Parcelable { private String mRcsFileTransferSessionId; diff --git a/telephony/java/android/telephony/ims/RcsFileTransferPart.java b/telephony/java/android/telephony/ims/RcsFileTransferPart.java index 9531c2e2f981..3816cd413722 100644 --- a/telephony/java/android/telephony/ims/RcsFileTransferPart.java +++ b/telephony/java/android/telephony/ims/RcsFileTransferPart.java @@ -26,6 +26,8 @@ import java.lang.annotation.RetentionPolicy; /** * A part of a composite {@link RcsMessage} that holds a file transfer. Please see Section 7 * (File Transfer) - GSMA RCC.71 (RCS Universal Profile Service Definition Document) + * + * @hide */ public class RcsFileTransferPart { /** diff --git a/telephony/java/android/telephony/ims/RcsGroupThread.java b/telephony/java/android/telephony/ims/RcsGroupThread.java index 6e17bc2a685f..8cd633ba1edf 100644 --- a/telephony/java/android/telephony/ims/RcsGroupThread.java +++ b/telephony/java/android/telephony/ims/RcsGroupThread.java @@ -29,6 +29,8 @@ import java.util.Set; * RcsGroupThread represents a single RCS conversation thread where {@link RcsParticipant}s can join * or leave. Please see Section 6 (Group Chat) - GSMA RCC.71 (RCS Universal Profile Service * Definition Document) + * + * @hide */ public class RcsGroupThread extends RcsThread { /** diff --git a/telephony/java/android/telephony/ims/RcsGroupThreadEvent.java b/telephony/java/android/telephony/ims/RcsGroupThreadEvent.java index 99086aaef676..4a6b963a143a 100644 --- a/telephony/java/android/telephony/ims/RcsGroupThreadEvent.java +++ b/telephony/java/android/telephony/ims/RcsGroupThreadEvent.java @@ -19,6 +19,8 @@ import android.annotation.NonNull; /** * An event that happened on an {@link RcsGroupThread}. + * + * @hide */ public abstract class RcsGroupThreadEvent extends RcsEvent { private final int mRcsGroupThreadId; diff --git a/telephony/java/android/telephony/ims/RcsGroupThreadIconChangedEvent.java b/telephony/java/android/telephony/ims/RcsGroupThreadIconChangedEvent.java index cbd762d3032b..3c6c74fac8e2 100644 --- a/telephony/java/android/telephony/ims/RcsGroupThreadIconChangedEvent.java +++ b/telephony/java/android/telephony/ims/RcsGroupThreadIconChangedEvent.java @@ -22,6 +22,8 @@ import android.net.Uri; /** * An event that indicates an {@link RcsGroupThread}'s icon was changed. Please see R6-2-5 - GSMA * RCC.71 (RCS Universal Profile Service Definition Document) + * + * @hide */ public final class RcsGroupThreadIconChangedEvent extends RcsGroupThreadEvent { private final Uri mNewIcon; diff --git a/telephony/java/android/telephony/ims/RcsGroupThreadNameChangedEvent.java b/telephony/java/android/telephony/ims/RcsGroupThreadNameChangedEvent.java index a2a4fab4f3d2..54032536601e 100644 --- a/telephony/java/android/telephony/ims/RcsGroupThreadNameChangedEvent.java +++ b/telephony/java/android/telephony/ims/RcsGroupThreadNameChangedEvent.java @@ -21,6 +21,8 @@ import android.annotation.Nullable; /** * An event that indicates an {@link RcsGroupThread}'s name was changed. Please see R6-2-5 - GSMA * RCC.71 (RCS Universal Profile Service Definition Document) + * + * @hide */ public final class RcsGroupThreadNameChangedEvent extends RcsGroupThreadEvent { private final String mNewName; diff --git a/telephony/java/android/telephony/ims/RcsGroupThreadParticipantJoinedEvent.java b/telephony/java/android/telephony/ims/RcsGroupThreadParticipantJoinedEvent.java index 183cd9a81431..48be479a1ac6 100644 --- a/telephony/java/android/telephony/ims/RcsGroupThreadParticipantJoinedEvent.java +++ b/telephony/java/android/telephony/ims/RcsGroupThreadParticipantJoinedEvent.java @@ -20,6 +20,8 @@ import android.annotation.NonNull; /** * An event that indicates an RCS participant has joined an {@link RcsThread}. Please see US6-3 - * GSMA RCC.71 (RCS Universal Profile Service Definition Document) + * + * @hide */ public final class RcsGroupThreadParticipantJoinedEvent extends RcsGroupThreadEvent { private final RcsParticipant mJoinedParticipantId; diff --git a/telephony/java/android/telephony/ims/RcsGroupThreadParticipantLeftEvent.java b/telephony/java/android/telephony/ims/RcsGroupThreadParticipantLeftEvent.java index c12549b5acbf..b724a3f2159f 100644 --- a/telephony/java/android/telephony/ims/RcsGroupThreadParticipantLeftEvent.java +++ b/telephony/java/android/telephony/ims/RcsGroupThreadParticipantLeftEvent.java @@ -20,6 +20,8 @@ import android.annotation.NonNull; /** * An event that indicates an RCS participant has left an {@link RcsThread}. Please see US6-23 - * GSMA RCC.71 (RCS Universal Profile Service Definition Document) + * + * @hide */ public final class RcsGroupThreadParticipantLeftEvent extends RcsGroupThreadEvent { private RcsParticipant mLeavingParticipant; diff --git a/telephony/java/android/telephony/ims/RcsIncomingMessage.java b/telephony/java/android/telephony/ims/RcsIncomingMessage.java index 61911abd00c5..06e2a41accee 100644 --- a/telephony/java/android/telephony/ims/RcsIncomingMessage.java +++ b/telephony/java/android/telephony/ims/RcsIncomingMessage.java @@ -19,6 +19,8 @@ import android.annotation.WorkerThread; /** * This is a single instance of a message received over RCS. + * + * @hide */ public class RcsIncomingMessage extends RcsMessage { /** diff --git a/telephony/java/android/telephony/ims/RcsIncomingMessageCreationParams.java b/telephony/java/android/telephony/ims/RcsIncomingMessageCreationParams.java index 61dedbc1578a..58dc1bc70424 100644 --- a/telephony/java/android/telephony/ims/RcsIncomingMessageCreationParams.java +++ b/telephony/java/android/telephony/ims/RcsIncomingMessageCreationParams.java @@ -24,6 +24,8 @@ import android.os.Parcelable; * {@link RcsIncomingMessageCreationParams} is a collection of parameters that should be passed * into {@link RcsThread#addIncomingMessage(RcsIncomingMessageCreationParams)} to generate an * {@link RcsIncomingMessage} on that {@link RcsThread} + * + * @hide */ public final class RcsIncomingMessageCreationParams extends RcsMessageCreationParams implements Parcelable { diff --git a/telephony/java/android/telephony/ims/RcsManager.java b/telephony/java/android/telephony/ims/RcsManager.java index 22e4b2249c36..63dc1ac568bf 100644 --- a/telephony/java/android/telephony/ims/RcsManager.java +++ b/telephony/java/android/telephony/ims/RcsManager.java @@ -20,6 +20,8 @@ import android.content.Context; /** * The manager class for RCS related utilities. + * + * @hide */ @SystemService(Context.TELEPHONY_RCS_SERVICE) public class RcsManager { diff --git a/telephony/java/android/telephony/ims/RcsMessage.java b/telephony/java/android/telephony/ims/RcsMessage.java index 32274131a5ad..b0d0d5a6a9bb 100644 --- a/telephony/java/android/telephony/ims/RcsMessage.java +++ b/telephony/java/android/telephony/ims/RcsMessage.java @@ -27,6 +27,8 @@ import java.util.Set; /** * This is a single instance of a message sent or received over RCS. + * + * @hide */ public abstract class RcsMessage { /** diff --git a/telephony/java/android/telephony/ims/RcsMessageCreationParams.java b/telephony/java/android/telephony/ims/RcsMessageCreationParams.java index c46c605d861d..f0eea88ac8a9 100644 --- a/telephony/java/android/telephony/ims/RcsMessageCreationParams.java +++ b/telephony/java/android/telephony/ims/RcsMessageCreationParams.java @@ -27,6 +27,8 @@ import android.os.Parcel; * {@link RcsThread#addIncomingMessage(RcsIncomingMessageCreationParams)} and * {@link RcsThread#addOutgoingMessage(RcsOutgoingMessageCreationParams)} to create and persist * {@link RcsMessage}s on an {@link RcsThread} + * + * @hide */ public class RcsMessageCreationParams { // The globally unique id of the RcsMessage to be created. diff --git a/telephony/java/android/telephony/ims/RcsMessageQueryParams.java b/telephony/java/android/telephony/ims/RcsMessageQueryParams.java index 535a597f5e1e..6491ac9fad5f 100644 --- a/telephony/java/android/telephony/ims/RcsMessageQueryParams.java +++ b/telephony/java/android/telephony/ims/RcsMessageQueryParams.java @@ -31,6 +31,8 @@ import java.security.InvalidParameterException; * The parameters to pass into * {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParams)} in order to select a * subset of {@link RcsMessage}s present in the message store. + * + * @hide */ public final class RcsMessageQueryParams implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/RcsMessageQueryResult.java b/telephony/java/android/telephony/ims/RcsMessageQueryResult.java index 3514b48e80a1..e4020c185fa3 100644 --- a/telephony/java/android/telephony/ims/RcsMessageQueryResult.java +++ b/telephony/java/android/telephony/ims/RcsMessageQueryResult.java @@ -32,6 +32,8 @@ import java.util.List; * The result of a {@link RcsMessageStore#getRcsMessages(RcsMessageQueryParams)} * call. This class allows getting the token for querying the next batch of messages in order to * prevent handling large amounts of data at once. + * + * @hide */ public final class RcsMessageQueryResult implements Parcelable { // The token to continue the query to get the next batch of results diff --git a/telephony/java/android/telephony/ims/RcsMessageSnippet.java b/telephony/java/android/telephony/ims/RcsMessageSnippet.java index b0b930c56e91..9064251f5021 100644 --- a/telephony/java/android/telephony/ims/RcsMessageSnippet.java +++ b/telephony/java/android/telephony/ims/RcsMessageSnippet.java @@ -23,6 +23,8 @@ import android.telephony.ims.RcsMessage.RcsMessageStatus; /** * An immutable summary of the latest {@link RcsMessage} on an {@link RcsThread} + * + * @hide */ public final class RcsMessageSnippet implements Parcelable { private final String mText; diff --git a/telephony/java/android/telephony/ims/RcsMessageStore.java b/telephony/java/android/telephony/ims/RcsMessageStore.java index 31f2983dcf93..311165232158 100644 --- a/telephony/java/android/telephony/ims/RcsMessageStore.java +++ b/telephony/java/android/telephony/ims/RcsMessageStore.java @@ -26,6 +26,8 @@ import java.util.List; /** * RcsMessageStore is the application interface to RcsProvider and provides access methods to * RCS related database tables. + * + * @hide */ public class RcsMessageStore { /** diff --git a/telephony/java/android/telephony/ims/RcsMessageStoreException.java b/telephony/java/android/telephony/ims/RcsMessageStoreException.java index f25bb173be37..3b3fcf21dd7a 100644 --- a/telephony/java/android/telephony/ims/RcsMessageStoreException.java +++ b/telephony/java/android/telephony/ims/RcsMessageStoreException.java @@ -19,6 +19,8 @@ package android.telephony.ims; /** * An exception that happened on {@link RcsMessageStore} or one of the derived storage classes in * {@link android.telephony.ims} + * + * @hide */ public class RcsMessageStoreException extends Exception { diff --git a/telephony/java/android/telephony/ims/RcsOutgoingMessage.java b/telephony/java/android/telephony/ims/RcsOutgoingMessage.java index 06fb83268afb..1b4bfe576ac6 100644 --- a/telephony/java/android/telephony/ims/RcsOutgoingMessage.java +++ b/telephony/java/android/telephony/ims/RcsOutgoingMessage.java @@ -23,6 +23,8 @@ import java.util.List; /** * This is a single instance of a message sent over RCS. + * + * @hide */ public class RcsOutgoingMessage extends RcsMessage { RcsOutgoingMessage(int id) { diff --git a/telephony/java/android/telephony/ims/RcsOutgoingMessageCreationParams.java b/telephony/java/android/telephony/ims/RcsOutgoingMessageCreationParams.java index 979634a069df..81e3244d57e8 100644 --- a/telephony/java/android/telephony/ims/RcsOutgoingMessageCreationParams.java +++ b/telephony/java/android/telephony/ims/RcsOutgoingMessageCreationParams.java @@ -23,6 +23,8 @@ import android.os.Parcelable; * {@link RcsOutgoingMessageCreationParams} is a collection of parameters that should be passed * into {@link RcsThread#addOutgoingMessage(RcsOutgoingMessageCreationParams)} to generate an * {@link RcsOutgoingMessage} on that {@link RcsThread} + * + * @hide */ public final class RcsOutgoingMessageCreationParams extends RcsMessageCreationParams implements Parcelable { diff --git a/telephony/java/android/telephony/ims/RcsOutgoingMessageDelivery.java b/telephony/java/android/telephony/ims/RcsOutgoingMessageDelivery.java index 1c87b13f0dfb..2db49c6d0dce 100644 --- a/telephony/java/android/telephony/ims/RcsOutgoingMessageDelivery.java +++ b/telephony/java/android/telephony/ims/RcsOutgoingMessageDelivery.java @@ -21,6 +21,8 @@ import android.annotation.WorkerThread; /** * This class holds the delivery information of an {@link RcsOutgoingMessage} for each * {@link RcsParticipant} that the message was intended for. + * + * @hide */ public class RcsOutgoingMessageDelivery { // The participant that this delivery is intended for diff --git a/telephony/java/android/telephony/ims/RcsParticipant.java b/telephony/java/android/telephony/ims/RcsParticipant.java index 7ba5d8e65f76..bcf134a71ea3 100644 --- a/telephony/java/android/telephony/ims/RcsParticipant.java +++ b/telephony/java/android/telephony/ims/RcsParticipant.java @@ -20,6 +20,8 @@ import android.annotation.WorkerThread; /** * RcsParticipant is an RCS capable contact that can participate in {@link RcsThread}s. + * + * @hide */ public class RcsParticipant { // The row ID of this participant in the database diff --git a/telephony/java/android/telephony/ims/RcsParticipantAliasChangedEvent.java b/telephony/java/android/telephony/ims/RcsParticipantAliasChangedEvent.java index cc2613f9e684..61801f3fbf2c 100644 --- a/telephony/java/android/telephony/ims/RcsParticipantAliasChangedEvent.java +++ b/telephony/java/android/telephony/ims/RcsParticipantAliasChangedEvent.java @@ -21,6 +21,8 @@ import android.annotation.Nullable; /** * An event that indicates an {@link RcsParticipant}'s alias was changed. Please see US18-2 - GSMA * RCC.71 (RCS Universal Profile Service Definition Document) + * + * @hide */ public final class RcsParticipantAliasChangedEvent extends RcsEvent { // The participant that changed their alias diff --git a/telephony/java/android/telephony/ims/RcsParticipantQueryParams.java b/telephony/java/android/telephony/ims/RcsParticipantQueryParams.java index d24d079d7038..ada9b8ae9d1a 100644 --- a/telephony/java/android/telephony/ims/RcsParticipantQueryParams.java +++ b/telephony/java/android/telephony/ims/RcsParticipantQueryParams.java @@ -30,6 +30,8 @@ import java.security.InvalidParameterException; * The parameters to pass into * {@link RcsMessageStore#getRcsParticipants(RcsParticipantQueryParams)} in order to select a * subset of {@link RcsThread}s present in the message store. + * + * @hide */ public final class RcsParticipantQueryParams implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/RcsParticipantQueryResult.java b/telephony/java/android/telephony/ims/RcsParticipantQueryResult.java index 505f1a55d1f0..92e2fa78526a 100644 --- a/telephony/java/android/telephony/ims/RcsParticipantQueryResult.java +++ b/telephony/java/android/telephony/ims/RcsParticipantQueryResult.java @@ -28,6 +28,8 @@ import java.util.List; * The result of a {@link RcsMessageStore#getRcsParticipants(RcsParticipantQueryParams)} * call. This class allows getting the token for querying the next batch of participants in order to * prevent handling large amounts of data at once. + * + * @hide */ public final class RcsParticipantQueryResult implements Parcelable { // A token for the caller to continue their query for the next batch of results diff --git a/telephony/java/android/telephony/ims/RcsQueryContinuationToken.java b/telephony/java/android/telephony/ims/RcsQueryContinuationToken.java index 08643de51d40..970c11078772 100644 --- a/telephony/java/android/telephony/ims/RcsQueryContinuationToken.java +++ b/telephony/java/android/telephony/ims/RcsQueryContinuationToken.java @@ -31,6 +31,8 @@ import java.lang.annotation.RetentionPolicy; * @see RcsMessageQueryResult#getContinuationToken() * @see RcsParticipantQueryResult#getContinuationToken() * @see RcsThreadQueryResult#getContinuationToken() + * + * @hide */ public final class RcsQueryContinuationToken implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/RcsThread.java b/telephony/java/android/telephony/ims/RcsThread.java index e015dd3e9c0a..cf1dc76fedfb 100644 --- a/telephony/java/android/telephony/ims/RcsThread.java +++ b/telephony/java/android/telephony/ims/RcsThread.java @@ -27,6 +27,8 @@ import com.android.internal.annotations.VisibleForTesting; /** * RcsThread represents a single RCS conversation thread. It holds messages that were sent and * received and events that occurred on that thread. + * + * @hide */ public abstract class RcsThread { /** diff --git a/telephony/java/android/telephony/ims/RcsThreadQueryParams.java b/telephony/java/android/telephony/ims/RcsThreadQueryParams.java index 05a5a3917691..81eee4081ace 100644 --- a/telephony/java/android/telephony/ims/RcsThreadQueryParams.java +++ b/telephony/java/android/telephony/ims/RcsThreadQueryParams.java @@ -35,6 +35,8 @@ import java.util.Set; /** * The parameters to pass into {@link RcsMessageStore#getRcsThreads(RcsThreadQueryParams)} in * order to select a subset of {@link RcsThread}s present in the message store. + * + * @hide */ public final class RcsThreadQueryParams implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/RcsThreadQueryResult.java b/telephony/java/android/telephony/ims/RcsThreadQueryResult.java index 1cac61d1aa64..9f2fba5caab4 100644 --- a/telephony/java/android/telephony/ims/RcsThreadQueryResult.java +++ b/telephony/java/android/telephony/ims/RcsThreadQueryResult.java @@ -32,6 +32,8 @@ import java.util.List; * The result of a {@link RcsMessageStore#getRcsThreads(RcsThreadQueryParams)} * call. This class allows getting the token for querying the next batch of threads in order to * prevent handling large amounts of data at once. + * + * @hide */ public final class RcsThreadQueryResult implements Parcelable { // A token for the caller to continue their query for the next batch of results diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index c9b438582a8c..4928e344b4b3 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1834,10 +1834,12 @@ interface ITelephony { void setMultisimCarrierRestriction(boolean isMultisimCarrierRestricted); /** - * Returns if the usage of multiple SIM cards at the same time is restricted. - * @hide + * Returns if the usage of multiple SIM cards at the same time is supported. + * + * @param callingPackage The package making the call. + * @return true if multisim is supported, false otherwise. */ - boolean isMultisimCarrierRestricted(); + boolean isMultisimSupported(String callingPackage); /** * Switch configs to enable multi-sim or switch back to single-sim diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java index 603c4c2870d7..030c3f495d0f 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java +++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java @@ -188,18 +188,17 @@ public interface TelephonyProperties */ static final String PROPERTY_IGNORE_NITZ = "telephony.test.ignore.nitz"; - /** + /** * Property to set multi sim feature. * Type: String(dsds, dsda) */ static final String PROPERTY_MULTI_SIM_CONFIG = "persist.radio.multisim.config"; - /** + /** * Property to indicate if reboot is required when changing modems configurations * Type: String(true, false) default is false; most devices don't need reboot */ - String PROPERTY_REBOOT_REQUIRED_ON_MODEM_CHANGE = - "persist.radio.reboot_on_modem_change"; + String PROPERTY_REBOOT_REQUIRED_ON_MODEM_CHANGE = "persist.radio.reboot_on_modem_change"; /** * Property to store default subscription. diff --git a/test-mock/api/test-current.txt b/test-mock/api/test-current.txt index 14cb9e3a8f71..9768c622f19d 100644 --- a/test-mock/api/test-current.txt +++ b/test-mock/api/test-current.txt @@ -10,7 +10,9 @@ package android.test.mock { method public String getPermissionControllerPackageName(); method @NonNull public String getServicesSystemSharedLibraryPackageName(); method @NonNull public String getSharedSystemSharedLibraryPackageName(); + method public void grantRuntimePermission(String, String, android.os.UserHandle); method public boolean isPermissionReviewModeEnabled(); + method public void revokeRuntimePermission(String, String, android.os.UserHandle); } } diff --git a/tests/HwAccelerationTest/Android.bp b/tests/HwAccelerationTest/Android.bp new file mode 100644 index 000000000000..abcd73b115af --- /dev/null +++ b/tests/HwAccelerationTest/Android.bp @@ -0,0 +1,21 @@ +// +// Copyright (C) 2010 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. +// + +android_test { + name: "HwAccelerationTest", + srcs: ["**/*.java"], + platform_apis: true, +} diff --git a/tests/HwAccelerationTest/Android.mk b/tests/HwAccelerationTest/Android.mk deleted file mode 100644 index 11ea954c62c7..000000000000 --- a/tests/HwAccelerationTest/Android.mk +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2010 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. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) - -LOCAL_PACKAGE_NAME := HwAccelerationTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_MODULE_TAGS := tests - -include $(BUILD_PACKAGE) diff --git a/tests/JankBench/Android.bp b/tests/JankBench/Android.bp new file mode 100644 index 000000000000..4ca33154e927 --- /dev/null +++ b/tests/JankBench/Android.bp @@ -0,0 +1,21 @@ +android_test { + name: "JankBench", + manifest: "app/src/main/AndroidManifest.xml", + sdk_version: "current", + // omit gradle 'build' dir + srcs: ["app/src/main/java/**/*.java"], + // use appcompat/support lib from the tree, so improvements/ + // regressions are reflected in test data + resource_dirs: ["app/src/main/res"], + static_libs: [ + "android-support-design", + "android-support-v4", + "android-support-v7-appcompat", + "android-support-v7-cardview", + "android-support-v7-recyclerview", + "android-support-v17-leanback", + "apache-commons-math", + "junit", + ], + test_suites: ["device-tests"], +} diff --git a/tests/JankBench/Android.mk b/tests/JankBench/Android.mk deleted file mode 100644 index 291ba78758b4..000000000000 --- a/tests/JankBench/Android.mk +++ /dev/null @@ -1,38 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml - -LOCAL_SDK_VERSION := current - -LOCAL_USE_AAPT2 := true - -# omit gradle 'build' dir -LOCAL_SRC_FILES := $(call all-java-files-under,app/src/main/java) - -# use appcompat/support lib from the tree, so improvements/ -# regressions are reflected in test data -LOCAL_RESOURCE_DIR := \ - $(LOCAL_PATH)/app/src/main/res \ - - -LOCAL_STATIC_ANDROID_LIBRARIES := \ - $(ANDROID_SUPPORT_DESIGN_TARGETS) \ - android-support-v4 \ - android-support-v7-appcompat \ - android-support-v7-cardview \ - android-support-v7-recyclerview \ - android-support-v17-leanback \ - -LOCAL_STATIC_JAVA_LIBRARIES := \ - apache-commons-math \ - junit - - -LOCAL_PACKAGE_NAME := JankBench - -LOCAL_COMPATIBILITY_SUITE := device-tests - -include $(BUILD_PACKAGE) diff --git a/tests/JankBench/app/src/main/jni/Android.bp.converted b/tests/JankBench/app/src/main/jni/Android.bp.converted new file mode 100644 index 000000000000..9fecf1599fd9 --- /dev/null +++ b/tests/JankBench/app/src/main/jni/Android.bp.converted @@ -0,0 +1,27 @@ +// Copyright (C) 2015 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. + +cc_library_shared { + name: "libnativebench", + cflags: [ + "-Wno-unused-parameter", + "-Wno-unused-variable", + ], + srcs: [ + "Bench.cpp", + "WorkerPool.cpp", + "test.cpp", + ], + host_ldlibs: ["-llog"], +} diff --git a/tests/JankBench/app/src/main/jni/Android.mk b/tests/JankBench/app/src/main/jni/Android.mk deleted file mode 100644 index 8ba874de0e8a..000000000000 --- a/tests/JankBench/app/src/main/jni/Android.mk +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (C) 2015 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. - -LOCAL_PATH := $(call my-dir) -LOCAL_SDK_VERSION := 26 - -include $(CLEAR_VARS) - -LOCAL_CFLAGS = -Wno-unused-parameter - -LOCAL_MODULE:= libnativebench - -LOCAL_SRC_FILES := \ - Bench.cpp \ - WorkerPool.cpp \ - test.cpp - -LOCAL_LDLIBS := -llog - -include $(BUILD_SHARED_LIBRARY) diff --git a/tests/UiBench/Android.bp b/tests/UiBench/Android.bp new file mode 100644 index 000000000000..af17b97f2ea7 --- /dev/null +++ b/tests/UiBench/Android.bp @@ -0,0 +1,19 @@ +android_test { + name: "UiBench", + sdk_version: "current", + min_sdk_version: "21", + // omit gradle 'build' dir + srcs: ["src/**/*.java"], + // use appcompat/support lib from the tree, so improvements/ + // regressions are reflected in test data + resource_dirs: ["res"], + static_libs: [ + "android-support-design", + "android-support-v4", + "android-support-v7-appcompat", + "android-support-v7-cardview", + "android-support-v7-recyclerview", + "android-support-v17-leanback", + ], + test_suites: ["device-tests"], +} diff --git a/tests/UiBench/Android.mk b/tests/UiBench/Android.mk deleted file mode 100644 index c8e6c2091d8f..000000000000 --- a/tests/UiBench/Android.mk +++ /dev/null @@ -1,29 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests -LOCAL_SDK_VERSION := current -LOCAL_MIN_SDK_VERSION := 21 - -# omit gradle 'build' dir -LOCAL_SRC_FILES := $(call all-java-files-under,src) - -# use appcompat/support lib from the tree, so improvements/ -# regressions are reflected in test data -LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res - -LOCAL_USE_AAPT2 := true - -LOCAL_STATIC_ANDROID_LIBRARIES := \ - $(ANDROID_SUPPORT_DESIGN_TARGETS) \ - android-support-v4 \ - android-support-v7-appcompat \ - android-support-v7-cardview \ - android-support-v7-recyclerview \ - android-support-v17-leanback - -LOCAL_PACKAGE_NAME := UiBench - -LOCAL_COMPATIBILITY_SUITE := device-tests - -include $(BUILD_PACKAGE) diff --git a/tests/UsageStatsTest/Android.bp b/tests/UsageStatsTest/Android.bp new file mode 100644 index 000000000000..4995effa1ce9 --- /dev/null +++ b/tests/UsageStatsTest/Android.bp @@ -0,0 +1,8 @@ +android_test { + name: "UsageStatsTest", + // Only compile source java files in this apk. + srcs: ["src/**/*.java"], + static_libs: ["android-support-v4"], + certificate: "platform", + platform_apis: true, +} diff --git a/tests/UsageStatsTest/Android.mk b/tests/UsageStatsTest/Android.mk deleted file mode 100644 index 6735c7c8f787..000000000000 --- a/tests/UsageStatsTest/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -# Only compile source java files in this apk. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 - -LOCAL_CERTIFICATE := platform - -LOCAL_PACKAGE_NAME := UsageStatsTest -LOCAL_PRIVATE_PLATFORM_APIS := true - -include $(BUILD_PACKAGE) diff --git a/tests/libs-permissions/Android.bp b/tests/libs-permissions/Android.bp new file mode 100644 index 000000000000..16e927a0cbca --- /dev/null +++ b/tests/libs-permissions/Android.bp @@ -0,0 +1,14 @@ +java_library { + name: "com.android.test.libs.product", + installable: true, + product_specific: true, + srcs: ["product/java/**/*.java"], + required: ["com.android.test.libs.product.xml"], +} + +prebuilt_etc { + name: "com.android.test.libs.product.xml", + src: "product/com.android.test.libs.product.xml", + sub_dir: "permissions", + product_specific: true, +} diff --git a/tests/libs-permissions/Android.mk b/tests/libs-permissions/Android.mk deleted file mode 100644 index eb3862390338..000000000000 --- a/tests/libs-permissions/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := com.android.test.libs.product -LOCAL_PRODUCT_MODULE := true -LOCAL_SRC_FILES := $(call all-java-files-under, product/java) -LOCAL_REQUIRED_MODULES := com.android.test.libs.product.xml -include $(BUILD_JAVA_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := com.android.test.libs.product.xml -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_ETC)/permissions -LOCAL_SRC_FILES:= product/com.android.test.libs.product.xml -include $(BUILD_PREBUILT) diff --git a/tests/privapp-permissions/Android.bp b/tests/privapp-permissions/Android.bp new file mode 100644 index 000000000000..066d4f94e896 --- /dev/null +++ b/tests/privapp-permissions/Android.bp @@ -0,0 +1,45 @@ +android_app { + name: "PrivAppPermissionTest", + sdk_version: "current", + privileged: true, + manifest: "system/AndroidManifest.xml", + required: ["privapp-permissions-test.xml"], +} + +prebuilt_etc { + name: "privapp-permissions-test.xml", + src: "system/privapp-permissions-test.xml", + sub_dir: "permissions", +} + +android_app { + name: "VendorPrivAppPermissionTest", + sdk_version: "current", + privileged: true, + manifest: "vendor/AndroidManifest.xml", + vendor: true, + required: ["vendorprivapp-permissions-test.xml"], +} + +prebuilt_etc { + name: "vendorprivapp-permissions-test.xml", + src: "vendor/privapp-permissions-test.xml", + sub_dir: "permissions", + proprietary: true, +} + +android_app { + name: "ProductPrivAppPermissionTest", + sdk_version: "current", + privileged: true, + manifest: "product/AndroidManifest.xml", + product_specific: true, + required: ["productprivapp-permissions-test.xml"], +} + +prebuilt_etc { + name: "productprivapp-permissions-test.xml", + src: "product/privapp-permissions-test.xml", + sub_dir: "permissions", + product_specific: true, +} diff --git a/tests/privapp-permissions/Android.mk b/tests/privapp-permissions/Android.mk deleted file mode 100644 index 9795188559c4..000000000000 --- a/tests/privapp-permissions/Android.mk +++ /dev/null @@ -1,48 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := PrivAppPermissionTest -LOCAL_SDK_VERSION := current -LOCAL_PRIVILEGED_MODULE := true -LOCAL_MANIFEST_FILE := system/AndroidManifest.xml -LOCAL_REQUIRED_MODULES := privapp-permissions-test.xml -include $(BUILD_PACKAGE) - -include $(CLEAR_VARS) -LOCAL_MODULE := privapp-permissions-test.xml -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions -LOCAL_SRC_FILES:= system/privapp-permissions-test.xml -include $(BUILD_PREBUILT) - -include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := VendorPrivAppPermissionTest -LOCAL_SDK_VERSION := current -LOCAL_PRIVILEGED_MODULE := true -LOCAL_MANIFEST_FILE := vendor/AndroidManifest.xml -LOCAL_VENDOR_MODULE := true -LOCAL_REQUIRED_MODULES := vendorprivapp-permissions-test.xml -include $(BUILD_PACKAGE) - -include $(CLEAR_VARS) -LOCAL_MODULE := vendorprivapp-permissions-test.xml -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/permissions -LOCAL_SRC_FILES:= vendor/privapp-permissions-test.xml -include $(BUILD_PREBUILT) - -include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := ProductPrivAppPermissionTest -LOCAL_SDK_VERSION := current -LOCAL_PRIVILEGED_MODULE := true -LOCAL_MANIFEST_FILE := product/AndroidManifest.xml -LOCAL_PRODUCT_MODULE := true -LOCAL_REQUIRED_MODULES := productprivapp-permissions-test.xml -include $(BUILD_PACKAGE) - -include $(CLEAR_VARS) -LOCAL_MODULE := productprivapp-permissions-test.xml -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_ETC)/permissions -LOCAL_SRC_FILES:= product/privapp-permissions-test.xml -include $(BUILD_PREBUILT) |