diff options
390 files changed, 5254 insertions, 3093 deletions
diff --git a/Android.mk b/Android.mk index 92bd03e8a215..991d18513be8 100644 --- a/Android.mk +++ b/Android.mk @@ -309,6 +309,7 @@ LOCAL_SRC_FILES += \ core/java/android/companion/IFindDeviceCallback.aidl \ core/java/android/service/dreams/IDreamManager.aidl \ core/java/android/service/dreams/IDreamService.aidl \ + core/java/android/service/oemlock/IOemLockService.aidl \ core/java/android/service/persistentdata/IPersistentDataBlockService.aidl \ core/java/android/service/trust/ITrustAgentService.aidl \ core/java/android/service/trust/ITrustAgentServiceCallback.aidl \ diff --git a/api/current.txt b/api/current.txt index e5083592143e..98db4f78f833 100644 --- a/api/current.txt +++ b/api/current.txt @@ -211,6 +211,7 @@ package android { ctor public R.attr(); field public static final int __removed1 = 16844099; // 0x1010543 field public static final int __removed2 = 16844104; // 0x1010548 + field public static final int __removed3 = 16844116; // 0x1010554 field public static final int absListViewStyle = 16842858; // 0x101006a field public static final int accessibilityEventTypes = 16843648; // 0x1010380 field public static final int accessibilityFeedbackType = 16843650; // 0x1010382 @@ -313,7 +314,6 @@ package android { field public static final int autoUrlDetect = 16843404; // 0x101028c field public static final int autoVerify = 16844014; // 0x10104ee field public static final int autofillHints = 16844121; // 0x1010559 - field public static final int autofillMode = 16844116; // 0x1010554 field public static final int background = 16842964; // 0x10100d4 field public static final int backgroundDimAmount = 16842802; // 0x1010032 field public static final int backgroundDimEnabled = 16843295; // 0x101021f @@ -1541,6 +1541,7 @@ package android { field public static final int windowShowAnimation = 16842934; // 0x10100b6 field public static final int windowShowWallpaper = 16843410; // 0x1010292 field public static final int windowSoftInputMode = 16843307; // 0x101022b + field public static final int windowSplashscreenContent = 16844135; // 0x1010567 field public static final int windowSwipeToDismiss = 16843763; // 0x10103f3 field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c field public static final int windowTitleSize = 16842842; // 0x101005a @@ -3614,6 +3615,7 @@ package android.app { method public android.net.Uri getReferrer(); method public int getRequestedOrientation(); method public final android.view.SearchEvent getSearchEvent(); + method public long getStartInitiatedTime(); method public int getTaskId(); method public final java.lang.CharSequence getTitle(); method public final int getTitleColor(); @@ -3940,7 +3942,8 @@ package android.app { field public static final int IMPORTANCE_FOREGROUND = 100; // 0x64 field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d field public static final int IMPORTANCE_GONE = 1000; // 0x3e8 - field public static final int IMPORTANCE_PERCEPTIBLE = 130; // 0x82 + field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6 + field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82 field public static final int IMPORTANCE_SERVICE = 300; // 0x12c field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96 field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8 @@ -4699,7 +4702,7 @@ package android.app { public abstract class FragmentContainer { ctor public FragmentContainer(); method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle); - method public abstract android.view.View onFindViewById(int); + method public abstract <T extends android.view.View> T onFindViewById(int); method public abstract boolean onHasView(); } @@ -4750,7 +4753,7 @@ package android.app { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); - method public android.view.View onFindViewById(int); + method public <T extends android.view.View> T onFindViewById(int); method public abstract E onGetHost(); method public android.view.LayoutInflater onGetLayoutInflater(); method public int onGetWindowAnimations(); @@ -6089,6 +6092,17 @@ package android.app { method public void onDetached(); } + public final class WallpaperColors implements android.os.Parcelable { + ctor public WallpaperColors(android.os.Parcel); + ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>); + ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>, boolean); + method public int describeContents(); + method public java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>> getColors(); + method public boolean supportsDarkText(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR; + } + public final class WallpaperInfo implements android.os.Parcelable { ctor public WallpaperInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public int describeContents(); @@ -6111,6 +6125,8 @@ package android.app { } public class WallpaperManager { + method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); + method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler); method public void clear() throws java.io.IOException; method public void clear(int) throws java.io.IOException; method public void clearWallpaperOffsets(android.os.IBinder); @@ -6125,6 +6141,7 @@ package android.app { method public android.graphics.drawable.Drawable getDrawable(); method public android.graphics.drawable.Drawable getFastDrawable(); method public static android.app.WallpaperManager getInstance(android.content.Context); + method public android.app.WallpaperColors getWallpaperColors(int); method public android.os.ParcelFileDescriptor getWallpaperFile(int); method public int getWallpaperId(int); method public android.app.WallpaperInfo getWallpaperInfo(); @@ -6133,6 +6150,7 @@ package android.app { method public boolean isWallpaperSupported(); method public android.graphics.drawable.Drawable peekDrawable(); method public android.graphics.drawable.Drawable peekFastDrawable(); + method public void removeOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); method public void sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle); method public void setBitmap(android.graphics.Bitmap) throws java.io.IOException; method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException; @@ -6157,6 +6175,10 @@ package android.app { field public static final java.lang.String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview"; } + public static abstract interface WallpaperManager.OnColorsChangedListener { + method public abstract void onColorsChanged(android.app.WallpaperColors, int); + } + } package android.app.admin { @@ -6792,6 +6814,7 @@ package android.app.job { field public static final long DEFAULT_INITIAL_BACKOFF_MILLIS = 30000L; // 0x7530L field public static final long MAX_BACKOFF_DELAY_MILLIS = 18000000L; // 0x112a880L field public static final int NETWORK_TYPE_ANY = 1; // 0x1 + field public static final int NETWORK_TYPE_METERED = 4; // 0x4 field public static final int NETWORK_TYPE_NONE = 0; // 0x0 field public static final int NETWORK_TYPE_NOT_ROAMING = 3; // 0x3 field public static final int NETWORK_TYPE_UNMETERED = 2; // 0x2 @@ -6866,6 +6889,14 @@ package android.app.job { field public static final java.lang.String PERMISSION_BIND = "android.permission.BIND_JOB_SERVICE"; } + public abstract class JobServiceEngine { + ctor public JobServiceEngine(android.content.Context); + method public final android.os.IBinder getBinder(); + method public final void jobFinished(android.app.job.JobParameters, boolean); + method public abstract boolean onStartJob(android.app.job.JobParameters); + method public abstract boolean onStopJob(android.app.job.JobParameters); + } + public final class JobWorkItem implements android.os.Parcelable { ctor public JobWorkItem(android.content.Intent); ctor public JobWorkItem(android.os.Parcel); @@ -7607,9 +7638,11 @@ package android.bluetooth { field public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; // 0x2 field public static final int PAIRING_VARIANT_PIN = 0; // 0x0 field public static final int PHY_LE_1M = 1; // 0x1 + field public static final int PHY_LE_1M_MASK = 1; // 0x1 field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_ANY = 7; // 0x7 - field public static final int PHY_LE_CODED = 4; // 0x4 + field public static final int PHY_LE_2M_MASK = 2; // 0x2 + field public static final int PHY_LE_CODED = 3; // 0x3 + field public static final int PHY_LE_CODED_MASK = 4; // 0x4 field public static final int PHY_OPTION_NO_PREFERRED = 0; // 0x0 field public static final int PHY_OPTION_S2 = 1; // 0x1 field public static final int PHY_OPTION_S8 = 2; // 0x2 @@ -8027,9 +8060,6 @@ package android.bluetooth.le { field public static final int INTERVAL_MAX = 16777215; // 0xffffff field public static final int INTERVAL_MEDIUM = 400; // 0x190 field public static final int INTERVAL_MIN = 160; // 0xa0 - field public static final int PHY_LE_1M = 1; // 0x1 - field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int TX_POWER_HIGH = 1; // 0x1 field public static final int TX_POWER_LOW = -15; // 0xfffffff1 field public static final int TX_POWER_MAX = 1; // 0x1 @@ -8067,7 +8097,12 @@ package android.bluetooth.le { method public void flushPendingScanResults(android.bluetooth.le.ScanCallback); method public void startScan(android.bluetooth.le.ScanCallback); method public void startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback); + method public int startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.app.PendingIntent); method public void stopScan(android.bluetooth.le.ScanCallback); + method public void stopScan(android.app.PendingIntent); + field public static final java.lang.String EXTRA_CALLBACK_TYPE = "android.bluetooth.le.extra.CALLBACK_TYPE"; + field public static final java.lang.String EXTRA_ERROR_CODE = "android.bluetooth.le.extra.ERROR_CODE"; + field public static final java.lang.String EXTRA_LIST_SCAN_RESULT = "android.bluetooth.le.extra.LIST_SCAN_RESULT"; } public final class PeriodicAdvertisingParameters implements android.os.Parcelable { @@ -8158,9 +8193,6 @@ package android.bluetooth.le { field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanResult> CREATOR; field public static final int DATA_COMPLETE = 0; // 0x0 field public static final int DATA_TRUNCATED = 2; // 0x2 - field public static final int PHY_LE_1M = 1; // 0x1 - field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int PHY_UNUSED = 0; // 0x0 field public static final int SID_NOT_PRESENT = 255; // 0xff } @@ -8183,9 +8215,7 @@ package android.bluetooth.le { field public static final int MATCH_NUM_FEW_ADVERTISEMENT = 2; // 0x2 field public static final int MATCH_NUM_MAX_ADVERTISEMENT = 3; // 0x3 field public static final int MATCH_NUM_ONE_ADVERTISEMENT = 1; // 0x1 - field public static final int PHY_LE_1M = 1; // 0x1 field public static final int PHY_LE_ALL_SUPPORTED = 255; // 0xff - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int SCAN_MODE_BALANCED = 1; // 0x1 field public static final int SCAN_MODE_LOW_LATENCY = 2; // 0x2 field public static final int SCAN_MODE_LOW_POWER = 0; // 0x0 @@ -8247,7 +8277,8 @@ package android.companion { method public android.companion.BluetoothLEDeviceFilter build(); method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern); method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]); - method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean); + method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean); + method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int); method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter); } @@ -8255,6 +8286,8 @@ package android.companion { method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler); method public void disassociate(java.lang.String); method public java.util.List<java.lang.String> getAssociations(); + method public boolean hasNotificationAccess(android.content.ComponentName); + method public void requestNotificationAccess(android.content.ComponentName); field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE"; } @@ -12536,6 +12569,7 @@ package android.graphics { field public boolean inJustDecodeBounds; field public boolean inMutable; field public deprecated boolean inPreferQualityOverSpeed; + field public android.graphics.ColorSpace inPreferredColorSpace; field public android.graphics.Bitmap.Config inPreferredConfig; field public boolean inPremultiplied; field public deprecated boolean inPurgeable; @@ -15751,7 +15785,6 @@ package android.hardware.display { method public void unregisterDisplayListener(android.hardware.display.DisplayManager.DisplayListener); field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION"; field public static final int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR = 16; // 0x10 - field public static final int VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 32; // 0x20 field public static final int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY = 8; // 0x8 field public static final int VIRTUAL_DISPLAY_FLAG_PRESENTATION = 2; // 0x2 field public static final int VIRTUAL_DISPLAY_FLAG_PUBLIC = 1; // 0x1 @@ -24617,9 +24650,10 @@ package android.media.tv { public static final class TvContract.PreviewPrograms implements android.media.tv.TvContract.BaseTvColumns { field public static final int ASPECT_RATIO_16_9 = 0; // 0x0 - field public static final int ASPECT_RATIO_1_1 = 2; // 0x2 - field public static final int ASPECT_RATIO_2_3 = 3; // 0x3 + field public static final int ASPECT_RATIO_1_1 = 3; // 0x3 + field public static final int ASPECT_RATIO_2_3 = 4; // 0x4 field public static final int ASPECT_RATIO_3_2 = 1; // 0x1 + field public static final int ASPECT_RATIO_4_3 = 2; // 0x2 field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0 field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1 field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2 @@ -24802,9 +24836,10 @@ package android.media.tv { public static final class TvContract.WatchNextPrograms implements android.media.tv.TvContract.BaseTvColumns { ctor public TvContract.WatchNextPrograms(); field public static final int ASPECT_RATIO_16_9 = 0; // 0x0 - field public static final int ASPECT_RATIO_1_1 = 2; // 0x2 - field public static final int ASPECT_RATIO_2_3 = 3; // 0x3 + field public static final int ASPECT_RATIO_1_1 = 3; // 0x3 + field public static final int ASPECT_RATIO_2_3 = 4; // 0x4 field public static final int ASPECT_RATIO_3_2 = 1; // 0x1 + field public static final int ASPECT_RATIO_4_3 = 2; // 0x2 field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0 field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1 field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2 @@ -25523,22 +25558,25 @@ package android.net { method public java.lang.String getName(); method public int getTruncationLengthBits(); method public void writeToParcel(android.os.Parcel, int); - field public static final java.lang.String ALGO_AUTH_HMAC_MD5 = "hmac(md5)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA1 = "hmac(sha1)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA256 = "hmac(sha256)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA384 = "hmac(sha384)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA512 = "hmac(sha512)"; - field public static final java.lang.String ALGO_CRYPT_AES_CBC = "cbc(aes)"; + field public static final java.lang.String AUTH_HMAC_MD5 = "hmac(md5)"; + field public static final java.lang.String AUTH_HMAC_SHA1 = "hmac(sha1)"; + field public static final java.lang.String AUTH_HMAC_SHA256 = "hmac(sha256)"; + field public static final java.lang.String AUTH_HMAC_SHA384 = "hmac(sha384)"; + field public static final java.lang.String AUTH_HMAC_SHA512 = "hmac(sha512)"; field public static final android.os.Parcelable.Creator<android.net.IpSecAlgorithm> CREATOR; + field public static final java.lang.String CRYPT_AES_CBC = "cbc(aes)"; } public final class IpSecManager { method public void applyTransportModeTransform(java.net.Socket, android.net.IpSecTransform) throws java.io.IOException; method public void applyTransportModeTransform(java.net.DatagramSocket, android.net.IpSecTransform) throws java.io.IOException; + method public void applyTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException; method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException; method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException; method public void removeTransportModeTransform(java.net.Socket, android.net.IpSecTransform); method public void removeTransportModeTransform(java.net.DatagramSocket, android.net.IpSecTransform); + method public void removeTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform); + method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException; method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException; field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0 } @@ -25778,6 +25816,10 @@ package android.net { method public android.net.NetworkRequest.Builder removeCapability(int); method public android.net.NetworkRequest.Builder removeTransportType(int); method public android.net.NetworkRequest.Builder setNetworkSpecifier(java.lang.String); + method public android.net.NetworkRequest.Builder setNetworkSpecifier(android.net.NetworkSpecifier); + } + + public abstract class NetworkSpecifier { } public class ParseException extends java.lang.RuntimeException { @@ -37031,8 +37073,10 @@ package android.service.autofill { method public final android.os.IBinder onBind(android.content.Intent); method public void onConnected(); method public void onDisconnected(); - method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback); - method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback); + method public void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback); + method public abstract deprecated void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback); + method public void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback); + method public abstract deprecated void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback); field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService"; field public static final java.lang.String SERVICE_META_DATA = "android.autofill"; } @@ -37057,6 +37101,25 @@ package android.service.autofill { method public void onSuccess(android.service.autofill.FillResponse); } + public final class FillContext implements android.os.Parcelable { + method public int describeContents(); + method public int getRequestId(); + method public android.app.assist.AssistStructure getStructure(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.FillContext> CREATOR; + } + + public final class FillRequest implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getClientState(); + method public int getFlags(); + method public int getId(); + method public android.app.assist.AssistStructure getStructure(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.FillRequest> CREATOR; + field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1 + } + public final class FillResponse implements android.os.Parcelable { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); @@ -37068,7 +37131,8 @@ package android.service.autofill { method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset); method public android.service.autofill.FillResponse build(); method public android.service.autofill.FillResponse.Builder setAuthentication(android.view.autofill.AutofillId[], android.content.IntentSender, android.widget.RemoteViews); - method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle); + method public android.service.autofill.FillResponse.Builder setClientState(android.os.Bundle); + method public deprecated android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle); method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo); } @@ -37097,6 +37161,14 @@ package android.service.autofill { method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]); } + public final class SaveRequest implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getClientState(); + method public java.util.List<android.service.autofill.FillContext> getFillContexts(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR; + } + } package android.service.carrier { @@ -37216,7 +37288,7 @@ package android.service.dreams { method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); method public boolean dispatchTouchEvent(android.view.MotionEvent); method public boolean dispatchTrackballEvent(android.view.MotionEvent); - method public android.view.View findViewById(int); + method public <T extends android.view.View> T findViewById(int); method public final void finish(); method public android.view.Window getWindow(); method public android.view.WindowManager getWindowManager(); @@ -37730,10 +37802,12 @@ package android.service.wallpaper { method public int getDesiredMinimumHeight(); method public int getDesiredMinimumWidth(); method public android.view.SurfaceHolder getSurfaceHolder(); + method public void invalidateColors(); method public boolean isPreview(); method public boolean isVisible(); method public void onApplyWindowInsets(android.view.WindowInsets); method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean); + method public android.app.WallpaperColors onComputeWallpaperColors(); method public void onCreate(android.view.SurfaceHolder); method public void onDesiredSizeChanged(int, int); method public void onDestroy(); @@ -43884,7 +43958,6 @@ package android.view { method public boolean isValid(); method public boolean isWideColorGamut(); field public static final int DEFAULT_DISPLAY = 0; // 0x0 - field public static final int FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 32; // 0x20 field public static final int FLAG_PRESENTATION = 8; // 0x8 field public static final int FLAG_PRIVATE = 4; // 0x4 field public static final int FLAG_ROUND = 16; // 0x10 @@ -45365,7 +45438,6 @@ package android.view { method public android.view.animation.Animation getAnimation(); method public android.os.IBinder getApplicationWindowToken(); method public java.lang.String[] getAutofillHints(); - method public int getAutofillMode(); method public int getAutofillType(); method public android.view.autofill.AutofillValue getAutofillValue(); method public android.graphics.drawable.Drawable getBackground(); @@ -45454,7 +45526,6 @@ package android.view { method public float getPivotX(); method public float getPivotY(); method public android.view.PointerIcon getPointerIcon(); - method public int getResolvedAutofillMode(); method public android.content.res.Resources getResources(); method public final boolean getRevealOnFocusHint(); method public final int getRight(); @@ -45687,7 +45758,6 @@ package android.view { method public void setAlpha(float); method public void setAnimation(android.view.animation.Animation); method public void setAutofillHints(java.lang.String...); - method public void setAutofillMode(int); method public void setBackground(android.graphics.drawable.Drawable); method public void setBackgroundColor(int); method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable); @@ -45843,9 +45913,6 @@ package android.view { field public static final java.lang.String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress"; field public static final java.lang.String AUTOFILL_HINT_POSTAL_CODE = "postalCode"; field public static final java.lang.String AUTOFILL_HINT_USERNAME = "username"; - field public static final int AUTOFILL_MODE_AUTO = 1; // 0x1 - field public static final int AUTOFILL_MODE_INHERIT = 0; // 0x0 - field public static final int AUTOFILL_MODE_MANUAL = 2; // 0x2 field public static final int AUTOFILL_TYPE_DATE = 4; // 0x4 field public static final int AUTOFILL_TYPE_LIST = 3; // 0x3 field public static final int AUTOFILL_TYPE_NONE = 0; // 0x0 @@ -46413,7 +46480,6 @@ package android.view { method public abstract int getLayoutDirection(); method public abstract android.view.ViewParent getParent(); method public abstract android.view.ViewParent getParentForAccessibility(); - method public default int getResolvedAutofillMode(); method public abstract int getTextAlignment(); method public abstract int getTextDirection(); method public abstract deprecated void invalidateChild(android.view.View, android.graphics.Rect); @@ -47800,7 +47866,7 @@ package android.view.autofill { field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE"; field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT"; field public static final java.lang.String EXTRA_DATA_EXTRAS = "android.view.autofill.extra.DATA_EXTRAS"; - field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1 + field public static final deprecated int FLAG_MANUAL_REQUEST = 1; // 0x1 } public static abstract class AutofillManager.AutofillCallback { diff --git a/api/system-current.txt b/api/system-current.txt index 57f0daf820e3..7dfd44b537d3 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -142,12 +142,14 @@ package android { field public static final java.lang.String MANAGE_APP_OPS_RESTRICTIONS = "android.permission.MANAGE_APP_OPS_RESTRICTIONS"; field public static final java.lang.String MANAGE_APP_TOKENS = "android.permission.MANAGE_APP_TOKENS"; field public static final java.lang.String MANAGE_AUTO_FILL = "android.permission.MANAGE_AUTO_FILL"; + field public static final java.lang.String MANAGE_CARRIER_OEM_UNLOCK_STATE = "android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE"; field public static final java.lang.String MANAGE_CA_CERTIFICATES = "android.permission.MANAGE_CA_CERTIFICATES"; field public static final java.lang.String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS"; field public static final java.lang.String MANAGE_DOCUMENTS = "android.permission.MANAGE_DOCUMENTS"; field public static final java.lang.String MANAGE_OWN_CALLS = "android.permission.MANAGE_OWN_CALLS"; field public static final java.lang.String MANAGE_USB = "android.permission.MANAGE_USB"; field public static final java.lang.String MANAGE_USERS = "android.permission.MANAGE_USERS"; + field public static final java.lang.String MANAGE_USER_OEM_UNLOCK_STATE = "android.permission.MANAGE_USER_OEM_UNLOCK_STATE"; field public static final java.lang.String MASTER_CLEAR = "android.permission.MASTER_CLEAR"; field public static final java.lang.String MEDIA_CONTENT_CONTROL = "android.permission.MEDIA_CONTENT_CONTROL"; field public static final java.lang.String MODIFY_APPWIDGET_BIND_PERMISSIONS = "android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"; @@ -327,6 +329,7 @@ package android { ctor public R.attr(); field public static final int __removed1 = 16844099; // 0x1010543 field public static final int __removed2 = 16844104; // 0x1010548 + field public static final int __removed3 = 16844116; // 0x1010554 field public static final int absListViewStyle = 16842858; // 0x101006a field public static final int accessibilityEventTypes = 16843648; // 0x1010380 field public static final int accessibilityFeedbackType = 16843650; // 0x1010382 @@ -429,7 +432,6 @@ package android { field public static final int autoUrlDetect = 16843404; // 0x101028c field public static final int autoVerify = 16844014; // 0x10104ee field public static final int autofillHints = 16844121; // 0x1010559 - field public static final int autofillMode = 16844116; // 0x1010554 field public static final int background = 16842964; // 0x10100d4 field public static final int backgroundDimAmount = 16842802; // 0x1010032 field public static final int backgroundDimEnabled = 16843295; // 0x101021f @@ -1661,6 +1663,7 @@ package android { field public static final int windowShowAnimation = 16842934; // 0x10100b6 field public static final int windowShowWallpaper = 16843410; // 0x1010292 field public static final int windowSoftInputMode = 16843307; // 0x101022b + field public static final int windowSplashscreenContent = 16844135; // 0x1010567 field public static final int windowSwipeToDismiss = 16843763; // 0x10103f3 field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c field public static final int windowTitleSize = 16842842; // 0x101005a @@ -3740,6 +3743,7 @@ package android.app { method public android.net.Uri getReferrer(); method public int getRequestedOrientation(); method public final android.view.SearchEvent getSearchEvent(); + method public long getStartInitiatedTime(); method public int getTaskId(); method public final java.lang.CharSequence getTitle(); method public final int getTitleColor(); @@ -4084,7 +4088,8 @@ package android.app { field public static final int IMPORTANCE_FOREGROUND = 100; // 0x64 field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d field public static final int IMPORTANCE_GONE = 1000; // 0x3e8 - field public static final int IMPORTANCE_PERCEPTIBLE = 130; // 0x82 + field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6 + field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82 field public static final int IMPORTANCE_SERVICE = 300; // 0x12c field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96 field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8 @@ -4862,7 +4867,7 @@ package android.app { public abstract class FragmentContainer { ctor public FragmentContainer(); method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle); - method public abstract android.view.View onFindViewById(int); + method public abstract <T extends android.view.View> T onFindViewById(int); method public abstract boolean onHasView(); } @@ -4913,7 +4918,7 @@ package android.app { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); - method public android.view.View onFindViewById(int); + method public <T extends android.view.View> T onFindViewById(int); method public abstract E onGetHost(); method public android.view.LayoutInflater onGetLayoutInflater(); method public int onGetWindowAnimations(); @@ -6291,6 +6296,17 @@ package android.app { method public void setPersistentVrModeEnabled(boolean); } + public final class WallpaperColors implements android.os.Parcelable { + ctor public WallpaperColors(android.os.Parcel); + ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>); + ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>, boolean); + method public int describeContents(); + method public java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>> getColors(); + method public boolean supportsDarkText(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR; + } + public final class WallpaperInfo implements android.os.Parcelable { ctor public WallpaperInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public int describeContents(); @@ -6313,6 +6329,8 @@ package android.app { } public class WallpaperManager { + method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); + method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler); method public void clear() throws java.io.IOException; method public void clear(int) throws java.io.IOException; method public void clearWallpaper(); @@ -6329,6 +6347,7 @@ package android.app { method public android.graphics.drawable.Drawable getDrawable(); method public android.graphics.drawable.Drawable getFastDrawable(); method public static android.app.WallpaperManager getInstance(android.content.Context); + method public android.app.WallpaperColors getWallpaperColors(int); method public android.os.ParcelFileDescriptor getWallpaperFile(int); method public int getWallpaperId(int); method public android.app.WallpaperInfo getWallpaperInfo(); @@ -6337,6 +6356,7 @@ package android.app { method public boolean isWallpaperSupported(); method public android.graphics.drawable.Drawable peekDrawable(); method public android.graphics.drawable.Drawable peekFastDrawable(); + method public void removeOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); method public void sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle); method public void setBitmap(android.graphics.Bitmap) throws java.io.IOException; method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException; @@ -6364,6 +6384,10 @@ package android.app { field public static final java.lang.String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview"; } + public static abstract interface WallpaperManager.OnColorsChangedListener { + method public abstract void onColorsChanged(android.app.WallpaperColors, int); + } + } package android.app.admin { @@ -7223,6 +7247,7 @@ package android.app.job { field public static final long DEFAULT_INITIAL_BACKOFF_MILLIS = 30000L; // 0x7530L field public static final long MAX_BACKOFF_DELAY_MILLIS = 18000000L; // 0x112a880L field public static final int NETWORK_TYPE_ANY = 1; // 0x1 + field public static final int NETWORK_TYPE_METERED = 4; // 0x4 field public static final int NETWORK_TYPE_NONE = 0; // 0x0 field public static final int NETWORK_TYPE_NOT_ROAMING = 3; // 0x3 field public static final int NETWORK_TYPE_UNMETERED = 2; // 0x2 @@ -7298,6 +7323,14 @@ package android.app.job { field public static final java.lang.String PERMISSION_BIND = "android.permission.BIND_JOB_SERVICE"; } + public abstract class JobServiceEngine { + ctor public JobServiceEngine(android.content.Context); + method public final android.os.IBinder getBinder(); + method public final void jobFinished(android.app.job.JobParameters, boolean); + method public abstract boolean onStartJob(android.app.job.JobParameters); + method public abstract boolean onStopJob(android.app.job.JobParameters); + } + public final class JobWorkItem implements android.os.Parcelable { ctor public JobWorkItem(android.content.Intent); ctor public JobWorkItem(android.os.Parcel); @@ -8077,9 +8110,11 @@ package android.bluetooth { field public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; // 0x2 field public static final int PAIRING_VARIANT_PIN = 0; // 0x0 field public static final int PHY_LE_1M = 1; // 0x1 + field public static final int PHY_LE_1M_MASK = 1; // 0x1 field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_ANY = 7; // 0x7 - field public static final int PHY_LE_CODED = 4; // 0x4 + field public static final int PHY_LE_2M_MASK = 2; // 0x2 + field public static final int PHY_LE_CODED = 3; // 0x3 + field public static final int PHY_LE_CODED_MASK = 4; // 0x4 field public static final int PHY_OPTION_NO_PREFERRED = 0; // 0x0 field public static final int PHY_OPTION_S2 = 1; // 0x1 field public static final int PHY_OPTION_S8 = 2; // 0x2 @@ -8497,9 +8532,6 @@ package android.bluetooth.le { field public static final int INTERVAL_MAX = 16777215; // 0xffffff field public static final int INTERVAL_MEDIUM = 400; // 0x190 field public static final int INTERVAL_MIN = 160; // 0xa0 - field public static final int PHY_LE_1M = 1; // 0x1 - field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int TX_POWER_HIGH = 1; // 0x1 field public static final int TX_POWER_LOW = -15; // 0xfffffff1 field public static final int TX_POWER_MAX = 1; // 0x1 @@ -8537,10 +8569,15 @@ package android.bluetooth.le { method public void flushPendingScanResults(android.bluetooth.le.ScanCallback); method public void startScan(android.bluetooth.le.ScanCallback); method public void startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback); + method public int startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.app.PendingIntent); method public void startScanFromSource(android.os.WorkSource, android.bluetooth.le.ScanCallback); method public void startScanFromSource(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.os.WorkSource, android.bluetooth.le.ScanCallback); method public void startTruncatedScan(java.util.List<android.bluetooth.le.TruncatedFilter>, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback); method public void stopScan(android.bluetooth.le.ScanCallback); + method public void stopScan(android.app.PendingIntent); + field public static final java.lang.String EXTRA_CALLBACK_TYPE = "android.bluetooth.le.extra.CALLBACK_TYPE"; + field public static final java.lang.String EXTRA_ERROR_CODE = "android.bluetooth.le.extra.ERROR_CODE"; + field public static final java.lang.String EXTRA_LIST_SCAN_RESULT = "android.bluetooth.le.extra.LIST_SCAN_RESULT"; } public final class PeriodicAdvertisingParameters implements android.os.Parcelable { @@ -8641,9 +8678,6 @@ package android.bluetooth.le { field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanResult> CREATOR; field public static final int DATA_COMPLETE = 0; // 0x0 field public static final int DATA_TRUNCATED = 2; // 0x2 - field public static final int PHY_LE_1M = 1; // 0x1 - field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int PHY_UNUSED = 0; // 0x0 field public static final int SID_NOT_PRESENT = 255; // 0xff } @@ -8666,9 +8700,7 @@ package android.bluetooth.le { field public static final int MATCH_NUM_FEW_ADVERTISEMENT = 2; // 0x2 field public static final int MATCH_NUM_MAX_ADVERTISEMENT = 3; // 0x3 field public static final int MATCH_NUM_ONE_ADVERTISEMENT = 1; // 0x1 - field public static final int PHY_LE_1M = 1; // 0x1 field public static final int PHY_LE_ALL_SUPPORTED = 255; // 0xff - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int SCAN_MODE_BALANCED = 1; // 0x1 field public static final int SCAN_MODE_LOW_LATENCY = 2; // 0x2 field public static final int SCAN_MODE_LOW_POWER = 0; // 0x0 @@ -8739,7 +8771,8 @@ package android.companion { method public android.companion.BluetoothLEDeviceFilter build(); method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern); method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]); - method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean); + method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean); + method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int); method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter); } @@ -8747,6 +8780,8 @@ package android.companion { method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler); method public void disassociate(java.lang.String); method public java.util.List<java.lang.String> getAssociations(); + method public boolean hasNotificationAccess(android.content.ComponentName); + method public void requestNotificationAccess(android.content.ComponentName); field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE"; } @@ -9436,6 +9471,7 @@ package android.content { field public static final java.lang.String NFC_SERVICE = "nfc"; field public static final java.lang.String NOTIFICATION_SERVICE = "notification"; field public static final java.lang.String NSD_SERVICE = "servicediscovery"; + field public static final java.lang.String OEM_LOCK_SERVICE = "oem_lock"; field public static final java.lang.String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block"; field public static final java.lang.String POWER_SERVICE = "power"; field public static final java.lang.String PRINT_SERVICE = "print"; @@ -9852,6 +9888,7 @@ package android.content { field public static final java.lang.String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE"; field public static final java.lang.String ACTION_MANAGE_PERMISSIONS = "android.intent.action.MANAGE_PERMISSIONS"; field public static final java.lang.String ACTION_MANAGE_PERMISSION_APPS = "android.intent.action.MANAGE_PERMISSION_APPS"; + field public static final deprecated java.lang.String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR"; field public static final java.lang.String ACTION_MASTER_CLEAR_NOTIFICATION = "android.intent.action.MASTER_CLEAR_NOTIFICATION"; field public static final java.lang.String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL"; field public static final java.lang.String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON"; @@ -13303,6 +13340,7 @@ package android.graphics { field public boolean inJustDecodeBounds; field public boolean inMutable; field public deprecated boolean inPreferQualityOverSpeed; + field public android.graphics.ColorSpace inPreferredColorSpace; field public android.graphics.Bitmap.Config inPreferredConfig; field public boolean inPremultiplied; field public deprecated boolean inPurgeable; @@ -16537,7 +16575,6 @@ package android.hardware.display { method public void unregisterDisplayListener(android.hardware.display.DisplayManager.DisplayListener); field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION"; field public static final int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR = 16; // 0x10 - field public static final int VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 32; // 0x20 field public static final int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY = 8; // 0x8 field public static final int VIRTUAL_DISPLAY_FLAG_PRESENTATION = 2; // 0x2 field public static final int VIRTUAL_DISPLAY_FLAG_PUBLIC = 1; // 0x1 @@ -26607,9 +26644,10 @@ package android.media.tv { public static final class TvContract.PreviewPrograms implements android.media.tv.TvContract.BaseTvColumns { field public static final int ASPECT_RATIO_16_9 = 0; // 0x0 - field public static final int ASPECT_RATIO_1_1 = 2; // 0x2 - field public static final int ASPECT_RATIO_2_3 = 3; // 0x3 + field public static final int ASPECT_RATIO_1_1 = 3; // 0x3 + field public static final int ASPECT_RATIO_2_3 = 4; // 0x4 field public static final int ASPECT_RATIO_3_2 = 1; // 0x1 + field public static final int ASPECT_RATIO_4_3 = 2; // 0x2 field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0 field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1 field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2 @@ -26792,9 +26830,10 @@ package android.media.tv { public static final class TvContract.WatchNextPrograms implements android.media.tv.TvContract.BaseTvColumns { ctor public TvContract.WatchNextPrograms(); field public static final int ASPECT_RATIO_16_9 = 0; // 0x0 - field public static final int ASPECT_RATIO_1_1 = 2; // 0x2 - field public static final int ASPECT_RATIO_2_3 = 3; // 0x3 + field public static final int ASPECT_RATIO_1_1 = 3; // 0x3 + field public static final int ASPECT_RATIO_2_3 = 4; // 0x4 field public static final int ASPECT_RATIO_3_2 = 1; // 0x1 + field public static final int ASPECT_RATIO_4_3 = 2; // 0x2 field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0 field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1 field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2 @@ -27705,22 +27744,25 @@ package android.net { method public java.lang.String getName(); method public int getTruncationLengthBits(); method public void writeToParcel(android.os.Parcel, int); - field public static final java.lang.String ALGO_AUTH_HMAC_MD5 = "hmac(md5)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA1 = "hmac(sha1)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA256 = "hmac(sha256)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA384 = "hmac(sha384)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA512 = "hmac(sha512)"; - field public static final java.lang.String ALGO_CRYPT_AES_CBC = "cbc(aes)"; + field public static final java.lang.String AUTH_HMAC_MD5 = "hmac(md5)"; + field public static final java.lang.String AUTH_HMAC_SHA1 = "hmac(sha1)"; + field public static final java.lang.String AUTH_HMAC_SHA256 = "hmac(sha256)"; + field public static final java.lang.String AUTH_HMAC_SHA384 = "hmac(sha384)"; + field public static final java.lang.String AUTH_HMAC_SHA512 = "hmac(sha512)"; field public static final android.os.Parcelable.Creator<android.net.IpSecAlgorithm> CREATOR; + field public static final java.lang.String CRYPT_AES_CBC = "cbc(aes)"; } public final class IpSecManager { method public void applyTransportModeTransform(java.net.Socket, android.net.IpSecTransform) throws java.io.IOException; method public void applyTransportModeTransform(java.net.DatagramSocket, android.net.IpSecTransform) throws java.io.IOException; + method public void applyTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException; method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException; method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException; method public void removeTransportModeTransform(java.net.Socket, android.net.IpSecTransform); method public void removeTransportModeTransform(java.net.DatagramSocket, android.net.IpSecTransform); + method public void removeTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform); + method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException; method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException; field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0 } @@ -27997,6 +28039,7 @@ package android.net { method public android.net.NetworkRequest.Builder removeCapability(int); method public android.net.NetworkRequest.Builder removeTransportType(int); method public android.net.NetworkRequest.Builder setNetworkSpecifier(java.lang.String); + method public android.net.NetworkRequest.Builder setNetworkSpecifier(android.net.NetworkSpecifier); } public class NetworkScoreManager { @@ -28015,6 +28058,9 @@ package android.net { field public static final java.lang.String EXTRA_PACKAGE_NAME = "packageName"; } + public abstract class NetworkSpecifier { + } + public class ParseException extends java.lang.RuntimeException { field public java.lang.String response; } @@ -28137,10 +28183,6 @@ package android.net { field public static final java.lang.String ATTRIBUTES_KEY_BADGING_CURVE = "android.net.attributes.key.BADGING_CURVE"; field public static final java.lang.String ATTRIBUTES_KEY_HAS_CAPTIVE_PORTAL = "android.net.attributes.key.HAS_CAPTIVE_PORTAL"; field public static final java.lang.String ATTRIBUTES_KEY_RANKING_SCORE_OFFSET = "android.net.attributes.key.RANKING_SCORE_OFFSET"; - field public static final deprecated int BADGING_4K = 30; // 0x1e - field public static final deprecated int BADGING_HD = 20; // 0x14 - field public static final deprecated int BADGING_NONE = 0; // 0x0 - field public static final deprecated int BADGING_SD = 10; // 0xa field public static final android.os.Parcelable.Creator<android.net.ScoredNetwork> CREATOR; field public final android.os.Bundle attributes; field public final boolean meteredHint; @@ -28148,9 +28190,6 @@ package android.net { field public final android.net.RssiCurve rssiCurve; } - public static abstract deprecated class ScoredNetwork.Badging implements java.lang.annotation.Annotation { - } - public class TrafficStats { ctor public TrafficStats(); method public static void clearThreadStatsTag(); @@ -34665,7 +34704,7 @@ package android.os { field public static final java.lang.String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts"; field public static final java.lang.String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media"; field public static final java.lang.String DISALLOW_NETWORK_RESET = "no_network_reset"; - field public static final java.lang.String DISALLOW_OEM_UNLOCK = "no_oem_unlock"; + field public static final deprecated java.lang.String DISALLOW_OEM_UNLOCK = "no_oem_unlock"; field public static final java.lang.String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam"; field public static final java.lang.String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls"; field public static final java.lang.String DISALLOW_REMOVE_MANAGED_PROFILE = "no_remove_managed_profile"; @@ -40144,8 +40183,10 @@ package android.service.autofill { method public final android.os.IBinder onBind(android.content.Intent); method public void onConnected(); method public void onDisconnected(); - method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback); - method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback); + method public void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback); + method public abstract deprecated void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback); + method public void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback); + method public abstract deprecated void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback); field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService"; field public static final java.lang.String SERVICE_META_DATA = "android.autofill"; } @@ -40170,6 +40211,25 @@ package android.service.autofill { method public void onSuccess(android.service.autofill.FillResponse); } + public final class FillContext implements android.os.Parcelable { + method public int describeContents(); + method public int getRequestId(); + method public android.app.assist.AssistStructure getStructure(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.FillContext> CREATOR; + } + + public final class FillRequest implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getClientState(); + method public int getFlags(); + method public int getId(); + method public android.app.assist.AssistStructure getStructure(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.FillRequest> CREATOR; + field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1 + } + public final class FillResponse implements android.os.Parcelable { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); @@ -40181,7 +40241,8 @@ package android.service.autofill { method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset); method public android.service.autofill.FillResponse build(); method public android.service.autofill.FillResponse.Builder setAuthentication(android.view.autofill.AutofillId[], android.content.IntentSender, android.widget.RemoteViews); - method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle); + method public android.service.autofill.FillResponse.Builder setClientState(android.os.Bundle); + method public deprecated android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle); method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo); } @@ -40210,6 +40271,14 @@ package android.service.autofill { method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]); } + public final class SaveRequest implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getClientState(); + method public java.util.List<android.service.autofill.FillContext> getFillContexts(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR; + } + } package android.service.carrier { @@ -40329,7 +40398,7 @@ package android.service.dreams { method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); method public boolean dispatchTouchEvent(android.view.MotionEvent); method public boolean dispatchTrackballEvent(android.view.MotionEvent); - method public android.view.View findViewById(int); + method public <T extends android.view.View> T findViewById(int); method public final void finish(); method public android.view.Window getWindow(); method public android.view.WindowManager getWindowManager(); @@ -40623,15 +40692,26 @@ package android.service.notification { } +package android.service.oemlock { + + public class OemLockManager { + method public boolean isOemUnlockAllowedByCarrier(); + method public boolean isOemUnlockAllowedByUser(); + method public void setOemUnlockAllowedByCarrier(boolean, byte[]); + method public void setOemUnlockAllowedByUser(boolean); + } + +} + package android.service.persistentdata { public class PersistentDataBlockManager { method public int getDataBlockSize(); method public int getFlashLockState(); method public long getMaximumDataBlockSize(); - method public boolean getOemUnlockEnabled(); + method public deprecated boolean getOemUnlockEnabled(); method public byte[] read(); - method public void setOemUnlockEnabled(boolean); + method public deprecated void setOemUnlockEnabled(boolean); method public void wipe(); method public int write(byte[]); field public static final int FLASH_LOCK_LOCKED = 1; // 0x1 @@ -40974,10 +41054,12 @@ package android.service.wallpaper { method public int getDesiredMinimumHeight(); method public int getDesiredMinimumWidth(); method public android.view.SurfaceHolder getSurfaceHolder(); + method public void invalidateColors(); method public boolean isPreview(); method public boolean isVisible(); method public void onApplyWindowInsets(android.view.WindowInsets); method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean); + method public android.app.WallpaperColors onComputeWallpaperColors(); method public void onCreate(android.view.SurfaceHolder); method public void onDesiredSizeChanged(int, int); method public void onDestroy(); @@ -47450,7 +47532,6 @@ package android.view { method public boolean isValid(); method public boolean isWideColorGamut(); field public static final int DEFAULT_DISPLAY = 0; // 0x0 - field public static final int FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 32; // 0x20 field public static final int FLAG_PRESENTATION = 8; // 0x8 field public static final int FLAG_PRIVATE = 4; // 0x4 field public static final int FLAG_ROUND = 16; // 0x10 @@ -48931,7 +49012,6 @@ package android.view { method public android.view.animation.Animation getAnimation(); method public android.os.IBinder getApplicationWindowToken(); method public java.lang.String[] getAutofillHints(); - method public int getAutofillMode(); method public int getAutofillType(); method public android.view.autofill.AutofillValue getAutofillValue(); method public android.graphics.drawable.Drawable getBackground(); @@ -49020,7 +49100,6 @@ package android.view { method public float getPivotX(); method public float getPivotY(); method public android.view.PointerIcon getPointerIcon(); - method public int getResolvedAutofillMode(); method public android.content.res.Resources getResources(); method public final boolean getRevealOnFocusHint(); method public final int getRight(); @@ -49253,7 +49332,6 @@ package android.view { method public void setAlpha(float); method public void setAnimation(android.view.animation.Animation); method public void setAutofillHints(java.lang.String...); - method public void setAutofillMode(int); method public void setBackground(android.graphics.drawable.Drawable); method public void setBackgroundColor(int); method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable); @@ -49409,9 +49487,6 @@ package android.view { field public static final java.lang.String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress"; field public static final java.lang.String AUTOFILL_HINT_POSTAL_CODE = "postalCode"; field public static final java.lang.String AUTOFILL_HINT_USERNAME = "username"; - field public static final int AUTOFILL_MODE_AUTO = 1; // 0x1 - field public static final int AUTOFILL_MODE_INHERIT = 0; // 0x0 - field public static final int AUTOFILL_MODE_MANUAL = 2; // 0x2 field public static final int AUTOFILL_TYPE_DATE = 4; // 0x4 field public static final int AUTOFILL_TYPE_LIST = 3; // 0x3 field public static final int AUTOFILL_TYPE_NONE = 0; // 0x0 @@ -49979,7 +50054,6 @@ package android.view { method public abstract int getLayoutDirection(); method public abstract android.view.ViewParent getParent(); method public abstract android.view.ViewParent getParentForAccessibility(); - method public default int getResolvedAutofillMode(); method public abstract int getTextAlignment(); method public abstract int getTextDirection(); method public abstract deprecated void invalidateChild(android.view.View, android.graphics.Rect); @@ -51369,7 +51443,7 @@ package android.view.autofill { field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE"; field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT"; field public static final java.lang.String EXTRA_DATA_EXTRAS = "android.view.autofill.extra.DATA_EXTRAS"; - field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1 + field public static final deprecated int FLAG_MANUAL_REQUEST = 1; // 0x1 } public static abstract class AutofillManager.AutofillCallback { diff --git a/api/test-current.txt b/api/test-current.txt index 349f3814f754..090df83b39fe 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -211,6 +211,7 @@ package android { ctor public R.attr(); field public static final int __removed1 = 16844099; // 0x1010543 field public static final int __removed2 = 16844104; // 0x1010548 + field public static final int __removed3 = 16844116; // 0x1010554 field public static final int absListViewStyle = 16842858; // 0x101006a field public static final int accessibilityEventTypes = 16843648; // 0x1010380 field public static final int accessibilityFeedbackType = 16843650; // 0x1010382 @@ -313,7 +314,6 @@ package android { field public static final int autoUrlDetect = 16843404; // 0x101028c field public static final int autoVerify = 16844014; // 0x10104ee field public static final int autofillHints = 16844121; // 0x1010559 - field public static final int autofillMode = 16844116; // 0x1010554 field public static final int background = 16842964; // 0x10100d4 field public static final int backgroundDimAmount = 16842802; // 0x1010032 field public static final int backgroundDimEnabled = 16843295; // 0x101021f @@ -1541,6 +1541,7 @@ package android { field public static final int windowShowAnimation = 16842934; // 0x10100b6 field public static final int windowShowWallpaper = 16843410; // 0x1010292 field public static final int windowSoftInputMode = 16843307; // 0x101022b + field public static final int windowSplashscreenContent = 16844135; // 0x1010567 field public static final int windowSwipeToDismiss = 16843763; // 0x10103f3 field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c field public static final int windowTitleSize = 16842842; // 0x101005a @@ -3616,6 +3617,7 @@ package android.app { method public android.net.Uri getReferrer(); method public int getRequestedOrientation(); method public final android.view.SearchEvent getSearchEvent(); + method public long getStartInitiatedTime(); method public int getTaskId(); method public final java.lang.CharSequence getTitle(); method public final int getTitleColor(); @@ -3950,7 +3952,8 @@ package android.app { field public static final int IMPORTANCE_FOREGROUND = 100; // 0x64 field public static final int IMPORTANCE_FOREGROUND_SERVICE = 125; // 0x7d field public static final int IMPORTANCE_GONE = 1000; // 0x3e8 - field public static final int IMPORTANCE_PERCEPTIBLE = 130; // 0x82 + field public static final int IMPORTANCE_PERCEPTIBLE = 230; // 0xe6 + field public static final deprecated int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; // 0x82 field public static final int IMPORTANCE_SERVICE = 300; // 0x12c field public static final int IMPORTANCE_TOP_SLEEPING = 150; // 0x96 field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8 @@ -4712,7 +4715,7 @@ package android.app { public abstract class FragmentContainer { ctor public FragmentContainer(); method public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle); - method public abstract android.view.View onFindViewById(int); + method public abstract <T extends android.view.View> T onFindViewById(int); method public abstract boolean onHasView(); } @@ -4763,7 +4766,7 @@ package android.app { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); - method public android.view.View onFindViewById(int); + method public <T extends android.view.View> T onFindViewById(int); method public abstract E onGetHost(); method public android.view.LayoutInflater onGetLayoutInflater(); method public int onGetWindowAnimations(); @@ -6109,6 +6112,17 @@ package android.app { method public void onDetached(); } + public final class WallpaperColors implements android.os.Parcelable { + ctor public WallpaperColors(android.os.Parcel); + ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>); + ctor public WallpaperColors(java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>>, boolean); + method public int describeContents(); + method public java.util.List<android.util.Pair<android.graphics.Color, java.lang.Integer>> getColors(); + method public boolean supportsDarkText(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR; + } + public final class WallpaperInfo implements android.os.Parcelable { ctor public WallpaperInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public int describeContents(); @@ -6131,6 +6145,8 @@ package android.app { } public class WallpaperManager { + method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); + method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler); method public void clear() throws java.io.IOException; method public void clear(int) throws java.io.IOException; method public void clearWallpaperOffsets(android.os.IBinder); @@ -6145,6 +6161,7 @@ package android.app { method public android.graphics.drawable.Drawable getDrawable(); method public android.graphics.drawable.Drawable getFastDrawable(); method public static android.app.WallpaperManager getInstance(android.content.Context); + method public android.app.WallpaperColors getWallpaperColors(int); method public android.os.ParcelFileDescriptor getWallpaperFile(int); method public int getWallpaperId(int); method public android.app.WallpaperInfo getWallpaperInfo(); @@ -6153,6 +6170,7 @@ package android.app { method public boolean isWallpaperSupported(); method public android.graphics.drawable.Drawable peekDrawable(); method public android.graphics.drawable.Drawable peekFastDrawable(); + method public void removeOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); method public void sendWallpaperCommand(android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle); method public void setBitmap(android.graphics.Bitmap) throws java.io.IOException; method public int setBitmap(android.graphics.Bitmap, android.graphics.Rect, boolean) throws java.io.IOException; @@ -6177,6 +6195,10 @@ package android.app { field public static final java.lang.String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview"; } + public static abstract interface WallpaperManager.OnColorsChangedListener { + method public abstract void onColorsChanged(android.app.WallpaperColors, int); + } + } package android.app.admin { @@ -6822,6 +6844,7 @@ package android.app.job { field public static final long DEFAULT_INITIAL_BACKOFF_MILLIS = 30000L; // 0x7530L field public static final long MAX_BACKOFF_DELAY_MILLIS = 18000000L; // 0x112a880L field public static final int NETWORK_TYPE_ANY = 1; // 0x1 + field public static final int NETWORK_TYPE_METERED = 4; // 0x4 field public static final int NETWORK_TYPE_NONE = 0; // 0x0 field public static final int NETWORK_TYPE_NOT_ROAMING = 3; // 0x3 field public static final int NETWORK_TYPE_UNMETERED = 2; // 0x2 @@ -6896,6 +6919,14 @@ package android.app.job { field public static final java.lang.String PERMISSION_BIND = "android.permission.BIND_JOB_SERVICE"; } + public abstract class JobServiceEngine { + ctor public JobServiceEngine(android.content.Context); + method public final android.os.IBinder getBinder(); + method public final void jobFinished(android.app.job.JobParameters, boolean); + method public abstract boolean onStartJob(android.app.job.JobParameters); + method public abstract boolean onStopJob(android.app.job.JobParameters); + } + public final class JobWorkItem implements android.os.Parcelable { ctor public JobWorkItem(android.content.Intent); ctor public JobWorkItem(android.os.Parcel); @@ -7638,9 +7669,11 @@ package android.bluetooth { field public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; // 0x2 field public static final int PAIRING_VARIANT_PIN = 0; // 0x0 field public static final int PHY_LE_1M = 1; // 0x1 + field public static final int PHY_LE_1M_MASK = 1; // 0x1 field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_ANY = 7; // 0x7 - field public static final int PHY_LE_CODED = 4; // 0x4 + field public static final int PHY_LE_2M_MASK = 2; // 0x2 + field public static final int PHY_LE_CODED = 3; // 0x3 + field public static final int PHY_LE_CODED_MASK = 4; // 0x4 field public static final int PHY_OPTION_NO_PREFERRED = 0; // 0x0 field public static final int PHY_OPTION_S2 = 1; // 0x1 field public static final int PHY_OPTION_S8 = 2; // 0x2 @@ -8058,9 +8091,6 @@ package android.bluetooth.le { field public static final int INTERVAL_MAX = 16777215; // 0xffffff field public static final int INTERVAL_MEDIUM = 400; // 0x190 field public static final int INTERVAL_MIN = 160; // 0xa0 - field public static final int PHY_LE_1M = 1; // 0x1 - field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int TX_POWER_HIGH = 1; // 0x1 field public static final int TX_POWER_LOW = -15; // 0xfffffff1 field public static final int TX_POWER_MAX = 1; // 0x1 @@ -8098,7 +8128,12 @@ package android.bluetooth.le { method public void flushPendingScanResults(android.bluetooth.le.ScanCallback); method public void startScan(android.bluetooth.le.ScanCallback); method public void startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback); + method public int startScan(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.app.PendingIntent); method public void stopScan(android.bluetooth.le.ScanCallback); + method public void stopScan(android.app.PendingIntent); + field public static final java.lang.String EXTRA_CALLBACK_TYPE = "android.bluetooth.le.extra.CALLBACK_TYPE"; + field public static final java.lang.String EXTRA_ERROR_CODE = "android.bluetooth.le.extra.ERROR_CODE"; + field public static final java.lang.String EXTRA_LIST_SCAN_RESULT = "android.bluetooth.le.extra.LIST_SCAN_RESULT"; } public final class PeriodicAdvertisingParameters implements android.os.Parcelable { @@ -8189,9 +8224,6 @@ package android.bluetooth.le { field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanResult> CREATOR; field public static final int DATA_COMPLETE = 0; // 0x0 field public static final int DATA_TRUNCATED = 2; // 0x2 - field public static final int PHY_LE_1M = 1; // 0x1 - field public static final int PHY_LE_2M = 2; // 0x2 - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int PHY_UNUSED = 0; // 0x0 field public static final int SID_NOT_PRESENT = 255; // 0xff } @@ -8214,9 +8246,7 @@ package android.bluetooth.le { field public static final int MATCH_NUM_FEW_ADVERTISEMENT = 2; // 0x2 field public static final int MATCH_NUM_MAX_ADVERTISEMENT = 3; // 0x3 field public static final int MATCH_NUM_ONE_ADVERTISEMENT = 1; // 0x1 - field public static final int PHY_LE_1M = 1; // 0x1 field public static final int PHY_LE_ALL_SUPPORTED = 255; // 0xff - field public static final int PHY_LE_CODED = 3; // 0x3 field public static final int SCAN_MODE_BALANCED = 1; // 0x1 field public static final int SCAN_MODE_LOW_LATENCY = 2; // 0x2 field public static final int SCAN_MODE_LOW_POWER = 0; // 0x0 @@ -8278,7 +8308,8 @@ package android.companion { method public android.companion.BluetoothLEDeviceFilter build(); method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern); method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]); - method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean); + method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromBytes(java.lang.String, java.lang.String, int, int, boolean); + method public android.companion.BluetoothLEDeviceFilter.Builder setRenameFromName(java.lang.String, java.lang.String, int, int); method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter); } @@ -8286,6 +8317,8 @@ package android.companion { method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler); method public void disassociate(java.lang.String); method public java.util.List<java.lang.String> getAssociations(); + method public boolean hasNotificationAccess(android.content.ComponentName); + method public void requestNotificationAccess(android.content.ComponentName); field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE"; } @@ -12578,6 +12611,7 @@ package android.graphics { field public boolean inJustDecodeBounds; field public boolean inMutable; field public deprecated boolean inPreferQualityOverSpeed; + field public android.graphics.ColorSpace inPreferredColorSpace; field public android.graphics.Bitmap.Config inPreferredConfig; field public boolean inPremultiplied; field public deprecated boolean inPurgeable; @@ -15800,7 +15834,6 @@ package android.hardware.display { method public void unregisterDisplayListener(android.hardware.display.DisplayManager.DisplayListener); field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION"; field public static final int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR = 16; // 0x10 - field public static final int VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 32; // 0x20 field public static final int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY = 8; // 0x8 field public static final int VIRTUAL_DISPLAY_FLAG_PRESENTATION = 2; // 0x2 field public static final int VIRTUAL_DISPLAY_FLAG_PUBLIC = 1; // 0x1 @@ -24724,9 +24757,10 @@ package android.media.tv { public static final class TvContract.PreviewPrograms implements android.media.tv.TvContract.BaseTvColumns { field public static final int ASPECT_RATIO_16_9 = 0; // 0x0 - field public static final int ASPECT_RATIO_1_1 = 2; // 0x2 - field public static final int ASPECT_RATIO_2_3 = 3; // 0x3 + field public static final int ASPECT_RATIO_1_1 = 3; // 0x3 + field public static final int ASPECT_RATIO_2_3 = 4; // 0x4 field public static final int ASPECT_RATIO_3_2 = 1; // 0x1 + field public static final int ASPECT_RATIO_4_3 = 2; // 0x2 field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0 field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1 field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2 @@ -24909,9 +24943,10 @@ package android.media.tv { public static final class TvContract.WatchNextPrograms implements android.media.tv.TvContract.BaseTvColumns { ctor public TvContract.WatchNextPrograms(); field public static final int ASPECT_RATIO_16_9 = 0; // 0x0 - field public static final int ASPECT_RATIO_1_1 = 2; // 0x2 - field public static final int ASPECT_RATIO_2_3 = 3; // 0x3 + field public static final int ASPECT_RATIO_1_1 = 3; // 0x3 + field public static final int ASPECT_RATIO_2_3 = 4; // 0x4 field public static final int ASPECT_RATIO_3_2 = 1; // 0x1 + field public static final int ASPECT_RATIO_4_3 = 2; // 0x2 field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0 field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1 field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2 @@ -25630,22 +25665,25 @@ package android.net { method public java.lang.String getName(); method public int getTruncationLengthBits(); method public void writeToParcel(android.os.Parcel, int); - field public static final java.lang.String ALGO_AUTH_HMAC_MD5 = "hmac(md5)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA1 = "hmac(sha1)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA256 = "hmac(sha256)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA384 = "hmac(sha384)"; - field public static final java.lang.String ALGO_AUTH_HMAC_SHA512 = "hmac(sha512)"; - field public static final java.lang.String ALGO_CRYPT_AES_CBC = "cbc(aes)"; + field public static final java.lang.String AUTH_HMAC_MD5 = "hmac(md5)"; + field public static final java.lang.String AUTH_HMAC_SHA1 = "hmac(sha1)"; + field public static final java.lang.String AUTH_HMAC_SHA256 = "hmac(sha256)"; + field public static final java.lang.String AUTH_HMAC_SHA384 = "hmac(sha384)"; + field public static final java.lang.String AUTH_HMAC_SHA512 = "hmac(sha512)"; field public static final android.os.Parcelable.Creator<android.net.IpSecAlgorithm> CREATOR; + field public static final java.lang.String CRYPT_AES_CBC = "cbc(aes)"; } public final class IpSecManager { method public void applyTransportModeTransform(java.net.Socket, android.net.IpSecTransform) throws java.io.IOException; method public void applyTransportModeTransform(java.net.DatagramSocket, android.net.IpSecTransform) throws java.io.IOException; + method public void applyTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException; method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException; method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException; method public void removeTransportModeTransform(java.net.Socket, android.net.IpSecTransform); method public void removeTransportModeTransform(java.net.DatagramSocket, android.net.IpSecTransform); + method public void removeTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform); + method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException; method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException; field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0 } @@ -25885,6 +25923,10 @@ package android.net { method public android.net.NetworkRequest.Builder removeCapability(int); method public android.net.NetworkRequest.Builder removeTransportType(int); method public android.net.NetworkRequest.Builder setNetworkSpecifier(java.lang.String); + method public android.net.NetworkRequest.Builder setNetworkSpecifier(android.net.NetworkSpecifier); + } + + public abstract class NetworkSpecifier { } public class ParseException extends java.lang.RuntimeException { @@ -37184,8 +37226,10 @@ package android.service.autofill { method public final android.os.IBinder onBind(android.content.Intent); method public void onConnected(); method public void onDisconnected(); - method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback); - method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback); + method public void onFillRequest(android.service.autofill.FillRequest, android.os.CancellationSignal, android.service.autofill.FillCallback); + method public abstract deprecated void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, int, android.os.CancellationSignal, android.service.autofill.FillCallback); + method public void onSaveRequest(android.service.autofill.SaveRequest, android.service.autofill.SaveCallback); + method public abstract deprecated void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback); field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService"; field public static final java.lang.String SERVICE_META_DATA = "android.autofill"; } @@ -37210,6 +37254,25 @@ package android.service.autofill { method public void onSuccess(android.service.autofill.FillResponse); } + public final class FillContext implements android.os.Parcelable { + method public int describeContents(); + method public int getRequestId(); + method public android.app.assist.AssistStructure getStructure(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.FillContext> CREATOR; + } + + public final class FillRequest implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getClientState(); + method public int getFlags(); + method public int getId(); + method public android.app.assist.AssistStructure getStructure(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.FillRequest> CREATOR; + field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1 + } + public final class FillResponse implements android.os.Parcelable { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); @@ -37221,7 +37284,8 @@ package android.service.autofill { method public android.service.autofill.FillResponse.Builder addDataset(android.service.autofill.Dataset); method public android.service.autofill.FillResponse build(); method public android.service.autofill.FillResponse.Builder setAuthentication(android.view.autofill.AutofillId[], android.content.IntentSender, android.widget.RemoteViews); - method public android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle); + method public android.service.autofill.FillResponse.Builder setClientState(android.os.Bundle); + method public deprecated android.service.autofill.FillResponse.Builder setExtras(android.os.Bundle); method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo); } @@ -37250,6 +37314,14 @@ package android.service.autofill { method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]); } + public final class SaveRequest implements android.os.Parcelable { + method public int describeContents(); + method public android.os.Bundle getClientState(); + method public java.util.List<android.service.autofill.FillContext> getFillContexts(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR; + } + } package android.service.carrier { @@ -37369,7 +37441,7 @@ package android.service.dreams { method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); method public boolean dispatchTouchEvent(android.view.MotionEvent); method public boolean dispatchTrackballEvent(android.view.MotionEvent); - method public android.view.View findViewById(int); + method public <T extends android.view.View> T findViewById(int); method public final void finish(); method public android.view.Window getWindow(); method public android.view.WindowManager getWindowManager(); @@ -37924,10 +37996,12 @@ package android.service.wallpaper { method public int getDesiredMinimumHeight(); method public int getDesiredMinimumWidth(); method public android.view.SurfaceHolder getSurfaceHolder(); + method public void invalidateColors(); method public boolean isPreview(); method public boolean isVisible(); method public void onApplyWindowInsets(android.view.WindowInsets); method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean); + method public android.app.WallpaperColors onComputeWallpaperColors(); method public void onCreate(android.view.SurfaceHolder); method public void onDesiredSizeChanged(int, int); method public void onDestroy(); @@ -44247,7 +44321,6 @@ package android.view { method public boolean isValid(); method public boolean isWideColorGamut(); field public static final int DEFAULT_DISPLAY = 0; // 0x0 - field public static final int FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 32; // 0x20 field public static final int FLAG_PRESENTATION = 8; // 0x8 field public static final int FLAG_PRIVATE = 4; // 0x4 field public static final int FLAG_ROUND = 16; // 0x10 @@ -45731,7 +45804,6 @@ package android.view { method public android.view.animation.Animation getAnimation(); method public android.os.IBinder getApplicationWindowToken(); method public java.lang.String[] getAutofillHints(); - method public int getAutofillMode(); method public int getAutofillType(); method public android.view.autofill.AutofillValue getAutofillValue(); method public android.graphics.drawable.Drawable getBackground(); @@ -45820,7 +45892,6 @@ package android.view { method public float getPivotX(); method public float getPivotY(); method public android.view.PointerIcon getPointerIcon(); - method public int getResolvedAutofillMode(); method public android.content.res.Resources getResources(); method public final boolean getRevealOnFocusHint(); method public final int getRight(); @@ -46056,7 +46127,6 @@ package android.view { method public void setAlpha(float); method public void setAnimation(android.view.animation.Animation); method public void setAutofillHints(java.lang.String...); - method public void setAutofillMode(int); method public void setAutofilled(boolean); method public void setBackground(android.graphics.drawable.Drawable); method public void setBackgroundColor(int); @@ -46213,9 +46283,6 @@ package android.view { field public static final java.lang.String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress"; field public static final java.lang.String AUTOFILL_HINT_POSTAL_CODE = "postalCode"; field public static final java.lang.String AUTOFILL_HINT_USERNAME = "username"; - field public static final int AUTOFILL_MODE_AUTO = 1; // 0x1 - field public static final int AUTOFILL_MODE_INHERIT = 0; // 0x0 - field public static final int AUTOFILL_MODE_MANUAL = 2; // 0x2 field public static final int AUTOFILL_TYPE_DATE = 4; // 0x4 field public static final int AUTOFILL_TYPE_LIST = 3; // 0x3 field public static final int AUTOFILL_TYPE_NONE = 0; // 0x0 @@ -46787,7 +46854,6 @@ package android.view { method public abstract int getLayoutDirection(); method public abstract android.view.ViewParent getParent(); method public abstract android.view.ViewParent getParentForAccessibility(); - method public default int getResolvedAutofillMode(); method public abstract int getTextAlignment(); method public abstract int getTextDirection(); method public abstract deprecated void invalidateChild(android.view.View, android.graphics.Rect); @@ -48178,7 +48244,7 @@ package android.view.autofill { field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE"; field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT"; field public static final java.lang.String EXTRA_DATA_EXTRAS = "android.view.autofill.extra.DATA_EXTRAS"; - field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1 + field public static final deprecated int FLAG_MANUAL_REQUEST = 1; // 0x1 } public static abstract class AutofillManager.AutofillCallback { diff --git a/core/java/android/accounts/ChooseAccountActivity.java b/core/java/android/accounts/ChooseAccountActivity.java index 16a45ba6d5fe..9f2c39bbc4ce 100644 --- a/core/java/android/accounts/ChooseAccountActivity.java +++ b/core/java/android/accounts/ChooseAccountActivity.java @@ -77,7 +77,7 @@ public class ChooseAccountActivity extends Activity { setContentView(R.layout.choose_account); // Setup the list - ListView list = (ListView) findViewById(android.R.id.list); + ListView list = findViewById(android.R.id.list); // Use an existing ListAdapter that will map an array of strings to TextViews list.setAdapter(new AccountArrayAdapter(this, android.R.layout.simple_list_item_1, mAccountInfos)); diff --git a/core/java/android/accounts/ChooseAccountTypeActivity.java b/core/java/android/accounts/ChooseAccountTypeActivity.java index a3222d849367..e3352bc85668 100644 --- a/core/java/android/accounts/ChooseAccountTypeActivity.java +++ b/core/java/android/accounts/ChooseAccountTypeActivity.java @@ -99,7 +99,7 @@ public class ChooseAccountTypeActivity extends Activity { setContentView(R.layout.choose_account_type); // Setup the list - ListView list = (ListView) findViewById(android.R.id.list); + ListView list = findViewById(android.R.id.list); // Use an existing ListAdapter that will map an array of strings to TextViews list.setAdapter(new AccountArrayAdapter(this, android.R.layout.simple_list_item_1, mAuthenticatorInfosToDisplay)); diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java index 844258515561..6680ce6acb04 100644 --- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java +++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java @@ -248,7 +248,7 @@ public class ChooseTypeAndAccountActivity extends Activity populateUIAccountList(listItems); // Only enable "OK" button if something has been selected. - mOkButton = (Button) findViewById(android.R.id.button2); + mOkButton = findViewById(android.R.id.button2); mOkButton.setEnabled(mSelectedItemIndex != SELECTED_ITEM_NONE); } @@ -592,7 +592,7 @@ public class ChooseTypeAndAccountActivity extends Activity * If not specified then makes the description invisible. */ private void overrideDescriptionIfSupplied(String descriptionOverride) { - TextView descriptionView = (TextView) findViewById(R.id.description); + TextView descriptionView = findViewById(R.id.description); if (!TextUtils.isEmpty(descriptionOverride)) { descriptionView.setText(descriptionOverride); } else { @@ -605,7 +605,7 @@ public class ChooseTypeAndAccountActivity extends Activity * based on {@code mSelectedItemIndex} member variable. */ private final void populateUIAccountList(String[] listItems) { - ListView list = (ListView) findViewById(android.R.id.list); + ListView list = findViewById(android.R.id.list); list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, listItems)); list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java index 38eab2905022..af74b036a796 100644 --- a/core/java/android/accounts/GrantCredentialsPermissionActivity.java +++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java @@ -84,7 +84,7 @@ public class GrantCredentialsPermissionActivity extends Activity implements View return; } - final TextView authTokenTypeView = (TextView) findViewById(R.id.authtoken_type); + final TextView authTokenTypeView = findViewById(R.id.authtoken_type); authTokenTypeView.setVisibility(View.GONE); final AccountManagerCallback<String> callback = new AccountManagerCallback<String>() { @@ -116,7 +116,7 @@ public class GrantCredentialsPermissionActivity extends Activity implements View findViewById(R.id.allow_button).setOnClickListener(this); findViewById(R.id.deny_button).setOnClickListener(this); - LinearLayout packagesListView = (LinearLayout) findViewById(R.id.packages_list); + LinearLayout packagesListView = findViewById(R.id.packages_list); for (String pkg : packages) { String packageLabel; diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 74822d132873..b36a1600bae5 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -18,6 +18,7 @@ package android.app; import android.metrics.LogMaker; import android.graphics.Rect; +import android.os.SystemClock; import android.view.ViewRootImpl.ActivityConfigCallback; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; @@ -5941,7 +5942,7 @@ public class Activity extends ContextThemeWrapper */ public void setTaskDescription(ActivityManager.TaskDescription taskDescription) { if (mTaskDescription != taskDescription) { - mTaskDescription.copyFrom(taskDescription); + mTaskDescription.copyFromPreserveHiddenFields(taskDescription); // Scale the icon down to something reasonable if it is provided if (taskDescription.getIconFilename() == null && taskDescription.getIcon() != null) { final int size = ActivityManager.getLauncherLargeIconSizeInner(this); @@ -7433,6 +7434,25 @@ public class Activity extends ContextThemeWrapper } } + /** + * Return the timestamp at which this activity start was last initiated by the system in the + * {@link SystemClock#uptimeMillis()} time base. + * + * This can be used to understand how much time is taken for an activity to be started and + * displayed to the user. + * + * @return timestamp at which this activity start was initiated by the system + * or {@code 0} if for any reason the timestamp could not be retrieved. + */ + public long getStartInitiatedTime() { + try { + return ActivityManager.getService().getActivityStartInitiatedTime(mToken); + } catch (RemoteException e) { + Log.e(TAG, "Failed to call getActivityStartTime", e); + return 0; + } + } + class HostCallbacks extends FragmentHostCallback<Activity> { public HostCallbacks() { super(Activity.this /*activity*/); @@ -7526,7 +7546,7 @@ public class Activity extends ContextThemeWrapper @Nullable @Override - public View onFindViewById(int id) { + public <T extends View> T onFindViewById(int id) { return Activity.this.findViewById(id); } diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 80482ca6e026..66167a3c986a 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -30,6 +30,8 @@ import android.graphics.GraphicBuffer; import android.graphics.Matrix; import android.graphics.Point; import android.os.BatteryStats; +import android.os.Build; +import android.os.Build.VERSION_CODES; import android.os.IBinder; import android.os.ParcelFileDescriptor; @@ -138,14 +140,17 @@ public class ActivityManager { static final class UidObserver extends IUidObserver.Stub { final OnUidImportanceListener mListener; + final Context mContext; - UidObserver(OnUidImportanceListener listener) { + UidObserver(OnUidImportanceListener listener, Context clientContext) { mListener = listener; + mContext = clientContext; } @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) { - mListener.onUidImportance(uid, RunningAppProcessInfo.procStateToImportance(procState)); + mListener.onUidImportance(uid, RunningAppProcessInfo.procStateToImportanceForClient( + procState, mContext)); } @Override @@ -1222,6 +1227,27 @@ public class ActivityManager { mNavigationBarColor = other.mNavigationBarColor; } + /** + * Copies this the values from another TaskDescription, but preserves the hidden fields + * if they weren't set on {@code other} + * @hide + */ + public void copyFromPreserveHiddenFields(TaskDescription other) { + mLabel = other.mLabel; + mIcon = other.mIcon; + mIconFilename = other.mIconFilename; + mColorPrimary = other.mColorPrimary; + if (other.mColorBackground != 0) { + mColorBackground = other.mColorBackground; + } + if (other.mStatusBarColor != 0) { + mStatusBarColor = other.mStatusBarColor; + } + if (other.mNavigationBarColor != 0) { + mNavigationBarColor = other.mNavigationBarColor; + } + } + private TaskDescription(Parcel source) { readFromParcel(source); } @@ -3081,10 +3107,32 @@ public class ActivityManager { public static final int IMPORTANCE_VISIBLE = 200; /** + * Constant for {@link #importance}: {@link #IMPORTANCE_PERCEPTIBLE} had this wrong value + * before {@link Build.VERSION_CODES#O}. Since the {@link Build.VERSION_CODES#O} SDK, + * the value of {@link #IMPORTANCE_PERCEPTIBLE} has been fixed. + * + * @deprecated Use {@link #IMPORTANCE_PERCEPTIBLE} instead. + */ + @Deprecated + public static final int IMPORTANCE_PERCEPTIBLE_DEPRECATED = 130; + + /** * Constant for {@link #importance}: This process is not something the user - * is directly aware of, but is otherwise perceptable to them to some degree. + * is directly aware of, but is otherwise perceptible to them to some degree. */ - public static final int IMPORTANCE_PERCEPTIBLE = 130; + public static final int IMPORTANCE_PERCEPTIBLE = 230; + + /** + * Constant for {@link #importance}: {@link #IMPORTANCE_CANT_SAVE_STATE} had + * this wrong value + * before {@link Build.VERSION_CODES#O}. Since the {@link Build.VERSION_CODES#O} SDK, + * the value of {@link #IMPORTANCE_CANT_SAVE_STATE} has been fixed. + * + * @deprecated Use {@link #IMPORTANCE_CANT_SAVE_STATE} instead. + * @hide + */ + @Deprecated + public static final int IMPORTANCE_CANT_SAVE_STATE_DEPRECATED = 170; /** * Constant for {@link #importance}: This process is running an @@ -3092,7 +3140,7 @@ public class ActivityManager { * while in the background. * @hide */ - public static final int IMPORTANCE_CANT_SAVE_STATE = 170; + public static final int IMPORTANCE_CANT_SAVE_STATE= 270; /** * Constant for {@link #importance}: This process is contains services @@ -3128,7 +3176,11 @@ public class ActivityManager { */ public static final int IMPORTANCE_GONE = 1000; - /** @hide */ + /** + * Convert a proc state to the correspondent IMPORTANCE_* constant. If the return value + * will be passed to a client, use {@link #procStateToImportanceForClient}. + * @hide + */ public static int procStateToImportance(int procState) { if (procState == PROCESS_STATE_NONEXISTENT) { return IMPORTANCE_GONE; @@ -3151,6 +3203,28 @@ public class ActivityManager { } } + /** + * Convert a proc state to the correspondent IMPORTANCE_* constant for a client represented + * by a given {@link Context}, with converting {@link #IMPORTANCE_PERCEPTIBLE} + * and {@link #IMPORTANCE_CANT_SAVE_STATE} to the corresponding "wrong" value if the + * client's target SDK < {@link VERSION_CODES#O}. + * @hide + */ + public static int procStateToImportanceForClient(int procState, Context clientContext) { + final int importance = procStateToImportance(procState); + + // For pre O apps, convert to the old, wrong values. + if (clientContext.getApplicationInfo().targetSdkVersion < VERSION_CODES.O) { + switch (importance) { + case IMPORTANCE_PERCEPTIBLE: + return IMPORTANCE_PERCEPTIBLE_DEPRECATED; + case IMPORTANCE_CANT_SAVE_STATE: + return IMPORTANCE_CANT_SAVE_STATE_DEPRECATED; + } + } + return importance; + } + /** @hide */ public static int importanceToProcState(int importance) { if (importance == IMPORTANCE_GONE) { @@ -3380,7 +3454,7 @@ public class ActivityManager { try { int procState = getService().getPackageProcessState(packageName, mContext.getOpPackageName()); - return RunningAppProcessInfo.procStateToImportance(procState); + return RunningAppProcessInfo.procStateToImportanceForClient(procState, mContext); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3400,7 +3474,7 @@ public class ActivityManager { try { int procState = getService().getUidProcessState(uid, mContext.getOpPackageName()); - return RunningAppProcessInfo.procStateToImportance(procState); + return RunningAppProcessInfo.procStateToImportanceForClient(procState, mContext); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3450,7 +3524,7 @@ public class ActivityManager { throw new IllegalArgumentException("Listener already registered: " + listener); } // TODO: implement the cut point in the system process to avoid IPCs. - UidObserver observer = new UidObserver(listener); + UidObserver observer = new UidObserver(listener, mContext); try { getService().registerUidObserver(observer, UID_OBSERVER_PROCSTATE | UID_OBSERVER_GONE, diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java index 9928512de09f..7d81c4c029de 100644 --- a/core/java/android/app/AlertDialog.java +++ b/core/java/android/app/AlertDialog.java @@ -48,7 +48,7 @@ import com.android.internal.R; * and add your view to it: * * <pre> - * FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom); + * FrameLayout fl = findViewById(android.R.id.custom); * fl.addView(myView, new LayoutParams(MATCH_PARENT, WRAP_CONTENT)); * </pre> * diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 6487e671dea7..c7bcc54b51b6 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -2527,7 +2527,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene mChildFragmentManager.attachController(mHost, new FragmentContainer() { @Override @Nullable - public View onFindViewById(int id) { + public <T extends View> T onFindViewById(int id) { if (mView == null) { throw new IllegalStateException("Fragment does not have a view"); } diff --git a/core/java/android/app/FragmentContainer.java b/core/java/android/app/FragmentContainer.java index 6ed54dcdbc85..77c9c312ce24 100644 --- a/core/java/android/app/FragmentContainer.java +++ b/core/java/android/app/FragmentContainer.java @@ -31,7 +31,7 @@ public abstract class FragmentContainer { * view is not a child of this container. */ @Nullable - public abstract View onFindViewById(@IdRes int id); + public abstract <T extends View> T onFindViewById(@IdRes int id); /** * Return {@code true} if the container holds any view. diff --git a/core/java/android/app/FragmentHostCallback.java b/core/java/android/app/FragmentHostCallback.java index fb60e07a8805..5ef23e630573 100644 --- a/core/java/android/app/FragmentHostCallback.java +++ b/core/java/android/app/FragmentHostCallback.java @@ -207,7 +207,7 @@ public abstract class FragmentHostCallback<E> extends FragmentContainer { @Nullable @Override - public View onFindViewById(int id) { + public <T extends View> T onFindViewById(int id) { return null; } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 75d62956671e..91578a2da9c7 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -1243,7 +1243,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate + f + " for a container view with no id")); } - container = (ViewGroup) mContainer.onFindViewById(f.mContainerId); + container = mContainer.onFindViewById(f.mContainerId); if (container == null && !f.mRestored) { String resName; try { diff --git a/core/java/android/app/FragmentTransition.java b/core/java/android/app/FragmentTransition.java index 780a9227cecc..9a920d7a87b4 100644 --- a/core/java/android/app/FragmentTransition.java +++ b/core/java/android/app/FragmentTransition.java @@ -193,7 +193,7 @@ class FragmentTransition { View nonExistentView, ArrayMap<String, String> nameOverrides) { ViewGroup sceneRoot = null; if (fragmentManager.mContainer.onHasView()) { - sceneRoot = (ViewGroup) fragmentManager.mContainer.onFindViewById(containerId); + sceneRoot = fragmentManager.mContainer.onFindViewById(containerId); } if (sceneRoot == null) { return; @@ -265,7 +265,7 @@ class FragmentTransition { View nonExistentView, ArrayMap<String, String> nameOverrides) { ViewGroup sceneRoot = null; if (fragmentManager.mContainer.onHasView()) { - sceneRoot = (ViewGroup) fragmentManager.mContainer.onFindViewById(containerId); + sceneRoot = fragmentManager.mContainer.onFindViewById(containerId); } if (sceneRoot == null) { return; diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index fc827a946a44..4210d2e7d3ec 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -632,6 +632,8 @@ interface IActivityManager { */ void backgroundWhitelistUid(int uid); + long getActivityStartInitiatedTime(IBinder token); + // WARNING: when these transactions are updated, check if they are any callers on the native // side. If so, make sure they are using the correct transaction ids and arguments. // If a transaction which will also be used on the native side is being inserted, add it diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java index 9c18df8c6c2a..4abca9a13c4b 100644 --- a/core/java/android/app/SearchDialog.java +++ b/core/java/android/app/SearchDialog.java @@ -165,7 +165,7 @@ public class SearchDialog extends Dialog { setContentView(com.android.internal.R.layout.search_bar); // get the view elements for local access - mSearchView = (SearchView) findViewById(com.android.internal.R.id.search_view); + mSearchView = findViewById(com.android.internal.R.id.search_view); mSearchView.setIconified(false); mSearchView.setOnCloseListener(mOnCloseListener); mSearchView.setOnQueryTextListener(mOnQueryChangeListener); @@ -184,7 +184,7 @@ public class SearchDialog extends Dialog { mBadgeLabel = (TextView) mSearchView.findViewById(com.android.internal.R.id.search_badge); mSearchAutoComplete = (AutoCompleteTextView) mSearchView.findViewById(com.android.internal.R.id.search_src_text); - mAppIcon = (ImageView) findViewById(com.android.internal.R.id.search_app_icon); + mAppIcon = findViewById(com.android.internal.R.id.search_app_icon); mSearchPlate = mSearchView.findViewById(com.android.internal.R.id.search_plate); mWorkingSpinner = getContext().getDrawable(com.android.internal.R.drawable.search_spinner); // TODO: Restore the spinner for slow suggestion lookups diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 19f7426863cb..40fe6af9627d 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -120,6 +120,8 @@ import android.print.IPrintManager; import android.print.PrintManager; import android.view.autofill.AutofillManager; import android.view.autofill.IAutoFillManager; +import android.service.oemlock.IOemLockService; +import android.service.oemlock.OemLockManager; import android.service.persistentdata.IPersistentDataBlockService; import android.service.persistentdata.PersistentDataBlockManager; import android.service.vr.IVrManager; @@ -752,6 +754,20 @@ final class SystemServiceRegistry { } }}); + registerService(Context.OEM_LOCK_SERVICE, OemLockManager.class, + new StaticServiceFetcher<OemLockManager>() { + @Override + public OemLockManager createService() throws ServiceNotFoundException { + IBinder b = ServiceManager.getServiceOrThrow(Context.OEM_LOCK_SERVICE); + IOemLockService oemLockService = IOemLockService.Stub.asInterface(b); + if (oemLockService != null) { + return new OemLockManager(oemLockService); + } else { + // not supported + return null; + } + }}); + registerService(Context.MEDIA_PROJECTION_SERVICE, MediaProjectionManager.class, new CachedServiceFetcher<MediaProjectionManager>() { @Override diff --git a/core/java/android/app/TabActivity.java b/core/java/android/app/TabActivity.java index 637c8c19aef5..ad8b0dbe23f7 100644 --- a/core/java/android/app/TabActivity.java +++ b/core/java/android/app/TabActivity.java @@ -108,7 +108,7 @@ public class TabActivity extends ActivityGroup { @Override public void onContentChanged() { super.onContentChanged(); - mTabHost = (TabHost) findViewById(com.android.internal.R.id.tabhost); + mTabHost = findViewById(com.android.internal.R.id.tabhost); if (mTabHost == null) { throw new RuntimeException( diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java new file mode 100644 index 000000000000..5ed66cac5f8f --- /dev/null +++ b/core/java/android/app/WallpaperColors.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2017 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.app; + +import android.graphics.Color; +import android.os.Parcel; +import android.os.Parcelable; + +import android.util.Pair; + +import java.util.List; + +/** + * A class containing information about the colors of a wallpaper. + */ +public final class WallpaperColors implements Parcelable { + + public WallpaperColors(Parcel parcel) { + } + + /** + * Wallpaper color details containing a list of colors and their weights, + * as if it were an histogram. + * This list can be extracted from a bitmap by the Palette API. + * + * Dark text support will be calculated internally based on the histogram. + * + * @param colors list of pairs where each pair contains a color + * and number of occurrences/influence. + */ + public WallpaperColors(List<Pair<Color, Integer>> colors) { + } + + /** + * Wallpaper color details containing a list of colors and their weights, + * as if it were an histogram. + * Explicit dark text support. + * + * @param colors list of pairs where each pair contains a color + * and number of occurrences/influence. + * @param supportsDarkText can have dark text on top or not + */ + public WallpaperColors(List<Pair<Color, Integer>> colors, boolean supportsDarkText) { + } + + public static final Creator<WallpaperColors> CREATOR = new Creator<WallpaperColors>() { + @Override + public WallpaperColors createFromParcel(Parcel in) { + return new WallpaperColors(in); + } + + @Override + public WallpaperColors[] newArray(int size) { + return new WallpaperColors[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + } + + /** + * List of colors with their occurrences. The bigger the int, the more relevant the color. + * @return list of colors paired with their weights. + */ + public List<Pair<Color, Integer>> getColors() { + return null; + } + + /** + * Whether or not dark text is legible on top of this wallpaper. + * + * @return true if dark text is supported + */ + public boolean supportsDarkText() { + return false; + } +} diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index aa0eaaebf975..0676bca0e796 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -17,6 +17,8 @@ package android.app; import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RawRes; import android.annotation.SystemApi; import android.content.ComponentName; @@ -741,6 +743,43 @@ public class WallpaperManager { return getWallpaperFile(which, mContext.getUserId()); } + + /** + * Registers a listener to get notified when the wallpaper colors change. + * Callback might be called from an arbitrary background thread. + * + * @param listener A listener to register + */ + public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener) { + } + + /** + * Registers a listener to get notified when the wallpaper colors change + * @param listener A listener to register + * @param handler Where to call it from. Might be called from a background thread + * if null. + */ + public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener, + @Nullable Handler handler) { + } + + /** + * Stop listening to color updates. + * @param callback A callback to unsubscribe + */ + public void removeOnColorsChangedListener(@NonNull OnColorsChangedListener callback) { + } + + /** + * Get the primary colors of a wallpaper + * @param which wallpaper type. Must be either {@link #FLAG_SYSTEM} or + * {@link #FLAG_LOCK} + * @return a list of colors ordered by priority + */ + public @Nullable WallpaperColors getWallpaperColors(int which) { + return null; + } + /** * Version of {@link #getWallpaperFile(int)} that can access the wallpaper data * for a given user. The caller must hold the INTERACT_ACROSS_USERS_FULL @@ -1732,4 +1771,19 @@ public class WallpaperManager { mLatch.countDown(); } } + + /** + * Interface definition for a callback to be invoked when colors change on a wallpaper. + */ + public interface OnColorsChangedListener { + /** + * Called when colors change. + * A {@link android.app.WallpaperColors} object containing a simplified + * color histogram will be given. + * + * @param colors Wallpaper color info + * @param which A combination of {@link #FLAG_LOCK} and {@link #FLAG_SYSTEM} + */ + void onColorsChanged(WallpaperColors colors, int which); + } } diff --git a/core/java/android/app/job/JobInfo.java b/core/java/android/app/job/JobInfo.java index 412e4459ecdd..23baa17d947f 100644 --- a/core/java/android/app/job/JobInfo.java +++ b/core/java/android/app/job/JobInfo.java @@ -51,6 +51,8 @@ public class JobInfo implements Parcelable { public static final int NETWORK_TYPE_UNMETERED = 2; /** This job requires network connectivity that is not roaming. */ public static final int NETWORK_TYPE_NOT_ROAMING = 3; + /** This job requires metered connectivity such as most cellular data networks. */ + public static final int NETWORK_TYPE_METERED = 4; /** * Amount of backoff a job has initially by default, in milliseconds. @@ -347,10 +349,13 @@ public class JobInfo implements Parcelable { } /** - * One of {@link android.app.job.JobInfo#NETWORK_TYPE_ANY}, + * The kind of connectivity requirements that the job has. + * + * @return One of {@link android.app.job.JobInfo#NETWORK_TYPE_ANY}, * {@link android.app.job.JobInfo#NETWORK_TYPE_NONE}, - * {@link android.app.job.JobInfo#NETWORK_TYPE_UNMETERED}, or - * {@link android.app.job.JobInfo#NETWORK_TYPE_NOT_ROAMING}. + * {@link android.app.job.JobInfo#NETWORK_TYPE_UNMETERED}, + * {@link android.app.job.JobInfo#NETWORK_TYPE_METERED}, or + * {@link android.app.job.JobInfo#NETWORK_TYPE_NOT_ROAMING}, */ public int getNetworkType() { return networkType; diff --git a/core/java/android/app/job/JobService.java b/core/java/android/app/job/JobService.java index f4019ce446f7..9096b47b8d4d 100644 --- a/core/java/android/app/job/JobService.java +++ b/core/java/android/app/job/JobService.java @@ -60,161 +60,24 @@ public abstract class JobService extends Service { public static final String PERMISSION_BIND = "android.permission.BIND_JOB_SERVICE"; - /** - * Identifier for a message that will result in a call to - * {@link #onStartJob(android.app.job.JobParameters)}. - */ - private static final int MSG_EXECUTE_JOB = 0; - /** - * Message that will result in a call to {@link #onStopJob(android.app.job.JobParameters)}. - */ - private static final int MSG_STOP_JOB = 1; - /** - * Message that the client has completed execution of this job. - */ - private static final int MSG_JOB_FINISHED = 2; - - /** Lock object for {@link #mHandler}. */ - private final Object mHandlerLock = new Object(); - - /** - * Handler we post jobs to. Responsible for calling into the client logic, and handling the - * callback to the system. - */ - @GuardedBy("mHandlerLock") - JobHandler mHandler; - - static final class JobInterface extends IJobService.Stub { - final WeakReference<JobService> mService; - - JobInterface(JobService service) { - mService = new WeakReference<>(service); - } - - @Override - public void startJob(JobParameters jobParams) throws RemoteException { - JobService service = mService.get(); - if (service != null) { - service.ensureHandler(); - Message m = Message.obtain(service.mHandler, MSG_EXECUTE_JOB, jobParams); - m.sendToTarget(); - } - } - - @Override - public void stopJob(JobParameters jobParams) throws RemoteException { - JobService service = mService.get(); - if (service != null) { - service.ensureHandler(); - Message m = Message.obtain(service.mHandler, MSG_STOP_JOB, jobParams); - m.sendToTarget(); - } - - } - } - - IJobService mBinder; + private JobServiceEngine mEngine; /** @hide */ - void ensureHandler() { - synchronized (mHandlerLock) { - if (mHandler == null) { - mHandler = new JobHandler(getMainLooper()); - } - } - } - - /** - * Runs on application's main thread - callbacks are meant to offboard work to some other - * (app-specified) mechanism. - * @hide - */ - class JobHandler extends Handler { - JobHandler(Looper looper) { - super(looper); - } - - @Override - public void handleMessage(Message msg) { - final JobParameters params = (JobParameters) msg.obj; - switch (msg.what) { - case MSG_EXECUTE_JOB: - try { - boolean workOngoing = JobService.this.onStartJob(params); - ackStartMessage(params, workOngoing); - } catch (Exception e) { - Log.e(TAG, "Error while executing job: " + params.getJobId()); - throw new RuntimeException(e); - } - break; - case MSG_STOP_JOB: - try { - boolean ret = JobService.this.onStopJob(params); - ackStopMessage(params, ret); - } catch (Exception e) { - Log.e(TAG, "Application unable to handle onStopJob.", e); - throw new RuntimeException(e); - } - break; - case MSG_JOB_FINISHED: - final boolean needsReschedule = (msg.arg2 == 1); - IJobCallback callback = params.getCallback(); - if (callback != null) { - try { - callback.jobFinished(params.getJobId(), needsReschedule); - } catch (RemoteException e) { - Log.e(TAG, "Error reporting job finish to system: binder has gone" + - "away."); - } - } else { - Log.e(TAG, "finishJob() called for a nonexistent job id."); - } - break; - default: - Log.e(TAG, "Unrecognised message received."); - break; - } - } - - private void ackStartMessage(JobParameters params, boolean workOngoing) { - final IJobCallback callback = params.getCallback(); - final int jobId = params.getJobId(); - if (callback != null) { - try { - callback.acknowledgeStartMessage(jobId, workOngoing); - } catch(RemoteException e) { - Log.e(TAG, "System unreachable for starting job."); - } - } else { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Attempting to ack a job that has already been processed."); + public final IBinder onBind(Intent intent) { + if (mEngine == null) { + mEngine = new JobServiceEngine(this) { + @Override + public boolean onStartJob(JobParameters params) { + return JobService.this.onStartJob(params); } - } - } - private void ackStopMessage(JobParameters params, boolean reschedule) { - final IJobCallback callback = params.getCallback(); - final int jobId = params.getJobId(); - if (callback != null) { - try { - callback.acknowledgeStopMessage(jobId, reschedule); - } catch(RemoteException e) { - Log.e(TAG, "System unreachable for stopping job."); + @Override + public boolean onStopJob(JobParameters params) { + return JobService.this.onStopJob(params); } - } else { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Attempting to ack a job that has already been processed."); - } - } - } - } - - /** @hide */ - public final IBinder onBind(Intent intent) { - if (mBinder == null) { - mBinder = new JobInterface(this); + }; } - return mBinder.asBinder(); + return mEngine.getBinder(); } /** @@ -269,9 +132,6 @@ public abstract class JobService extends Service { * criteria specified at schedule-time. False otherwise. */ public final void jobFinished(JobParameters params, boolean needsReschedule) { - ensureHandler(); - Message m = Message.obtain(mHandler, MSG_JOB_FINISHED, params); - m.arg2 = needsReschedule ? 1 : 0; - m.sendToTarget(); + mEngine.jobFinished(params, needsReschedule); } }
\ No newline at end of file diff --git a/core/java/android/app/job/JobServiceEngine.java b/core/java/android/app/job/JobServiceEngine.java new file mode 100644 index 000000000000..879212ea1fb3 --- /dev/null +++ b/core/java/android/app/job/JobServiceEngine.java @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2014 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.app.job; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.RemoteException; +import android.util.Log; + +import com.android.internal.annotations.GuardedBy; + +import java.lang.ref.WeakReference; + +/** + * Helper for implementing a {@link android.app.Service} that interacts with + * {@link JobScheduler}. + */ +public abstract class JobServiceEngine { + private static final String TAG = "JobServiceEngine"; + + /** + * Identifier for a message that will result in a call to + * {@link #onStartJob(android.app.job.JobParameters)}. + */ + private static final int MSG_EXECUTE_JOB = 0; + /** + * Message that will result in a call to {@link #onStopJob(android.app.job.JobParameters)}. + */ + private static final int MSG_STOP_JOB = 1; + /** + * Message that the client has completed execution of this job. + */ + private static final int MSG_JOB_FINISHED = 2; + + /** + * Context we are running in. + */ + private final Context mContext; + + private final IJobService mBinder; + + /** Lock object for {@link #mHandler}. */ + private final Object mHandlerLock = new Object(); + + /** + * Handler we post jobs to. Responsible for calling into the client logic, and handling the + * callback to the system. + */ + @GuardedBy("mHandlerLock") + JobHandler mHandler; + + static final class JobInterface extends IJobService.Stub { + final WeakReference<JobServiceEngine> mService; + + JobInterface(JobServiceEngine service) { + mService = new WeakReference<>(service); + } + + @Override + public void startJob(JobParameters jobParams) throws RemoteException { + JobServiceEngine service = mService.get(); + if (service != null) { + Message m = Message.obtain(service.mHandler, MSG_EXECUTE_JOB, jobParams); + m.sendToTarget(); + } + } + + @Override + public void stopJob(JobParameters jobParams) throws RemoteException { + JobServiceEngine service = mService.get(); + if (service != null) { + Message m = Message.obtain(service.mHandler, MSG_STOP_JOB, jobParams); + m.sendToTarget(); + } + } + } + + /** + * Runs on application's main thread - callbacks are meant to offboard work to some other + * (app-specified) mechanism. + * @hide + */ + class JobHandler extends Handler { + JobHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + final JobParameters params = (JobParameters) msg.obj; + switch (msg.what) { + case MSG_EXECUTE_JOB: + try { + boolean workOngoing = JobServiceEngine.this.onStartJob(params); + ackStartMessage(params, workOngoing); + } catch (Exception e) { + Log.e(TAG, "Error while executing job: " + params.getJobId()); + throw new RuntimeException(e); + } + break; + case MSG_STOP_JOB: + try { + boolean ret = JobServiceEngine.this.onStopJob(params); + ackStopMessage(params, ret); + } catch (Exception e) { + Log.e(TAG, "Application unable to handle onStopJob.", e); + throw new RuntimeException(e); + } + break; + case MSG_JOB_FINISHED: + final boolean needsReschedule = (msg.arg2 == 1); + IJobCallback callback = params.getCallback(); + if (callback != null) { + try { + callback.jobFinished(params.getJobId(), needsReschedule); + } catch (RemoteException e) { + Log.e(TAG, "Error reporting job finish to system: binder has gone" + + "away."); + } + } else { + Log.e(TAG, "finishJob() called for a nonexistent job id."); + } + break; + default: + Log.e(TAG, "Unrecognised message received."); + break; + } + } + + private void ackStartMessage(JobParameters params, boolean workOngoing) { + final IJobCallback callback = params.getCallback(); + final int jobId = params.getJobId(); + if (callback != null) { + try { + callback.acknowledgeStartMessage(jobId, workOngoing); + } catch(RemoteException e) { + Log.e(TAG, "System unreachable for starting job."); + } + } else { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "Attempting to ack a job that has already been processed."); + } + } + } + + private void ackStopMessage(JobParameters params, boolean reschedule) { + final IJobCallback callback = params.getCallback(); + final int jobId = params.getJobId(); + if (callback != null) { + try { + callback.acknowledgeStopMessage(jobId, reschedule); + } catch(RemoteException e) { + Log.e(TAG, "System unreachable for stopping job."); + } + } else { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "Attempting to ack a job that has already been processed."); + } + } + } + } + + /** + * Create a new engine, ready for use. + * + * @param context The {@link Service} that is creating this engine. + */ + public JobServiceEngine(Context context) { + mContext = context; + mBinder = new JobInterface(this); + mHandler = new JobHandler(mContext.getMainLooper()); + } + + /** + * Retrieve the engine's IPC interface that should be returned by + * {@link Service#onBind(Intent)}. + */ + public final IBinder getBinder() { + return mBinder.asBinder(); + } + + /** + * Engine's report that a job has started. See + * {@link JobService#onStartJob(JobParameters) JobService.onStartJob} for more information. + */ + public abstract boolean onStartJob(JobParameters params); + + /** + * Engine's report that a job has stopped. See + * {@link JobService#onStopJob(JobParameters) JobService.onStopJob} for more information. + */ + public abstract boolean onStopJob(JobParameters params); + + /** + * Call in to engine to report that a job has finished executing. See + * {@link JobService#jobFinished(JobParameters, boolean)} JobService.jobFinished} for more + * information. + */ + public final void jobFinished(JobParameters params, boolean needsReschedule) { + Message m = Message.obtain(mHandler, MSG_JOB_FINISHED, params); + m.arg2 = needsReschedule ? 1 : 0; + m.sendToTarget(); + } +}
\ No newline at end of file diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index cb6fa052ddac..e6cebc0819f5 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -593,24 +593,34 @@ public final class BluetoothDevice implements Parcelable { public static final int TRANSPORT_LE = 2; /** - * 1M initiating PHY. + * Bluetooth LE 1M PHY. */ public static final int PHY_LE_1M = 1; /** - * 2M initiating PHY. + * Bluetooth LE 2M PHY. */ public static final int PHY_LE_2M = 2; /** - * LE Coded initiating PHY. + * Bluetooth LE Coded PHY. */ - public static final int PHY_LE_CODED = 4; + public static final int PHY_LE_CODED = 3; /** - * Any LE PHY. + * Bluetooth LE 1M PHY mask. */ - public static final int PHY_LE_ANY = PHY_LE_1M | PHY_LE_2M | PHY_LE_CODED; + public static final int PHY_LE_1M_MASK = 1; + + /** + * Bluetooth LE 2M PHY mask. + */ + public static final int PHY_LE_2M_MASK = 2; + + /** + * Bluetooth LE Coded PHY mask. + */ + public static final int PHY_LE_CODED_MASK = 4; /** * No preferred coding when transmitting on the LE Coded PHY. @@ -1651,7 +1661,7 @@ public final class BluetoothDevice implements Parcelable { */ public BluetoothGatt connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback, int transport) { - return (connectGatt(context, autoConnect,callback, TRANSPORT_AUTO, PHY_LE_1M)); + return (connectGatt(context, autoConnect,callback, TRANSPORT_AUTO, PHY_LE_1M_MASK)); } /** @@ -1668,8 +1678,8 @@ public final class BluetoothDevice implements Parcelable { * {@link BluetoothDevice#TRANSPORT_AUTO} or * {@link BluetoothDevice#TRANSPORT_BREDR} or {@link BluetoothDevice#TRANSPORT_LE} * @param phy preferred PHY for connections to remote LE device. Bitwise OR of any of - * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, - * and {@link BluetoothDevice#PHY_LE_CODED}. This option does not take effect if + * {@link BluetoothDevice#PHY_LE_1M_MASK}, {@link BluetoothDevice#PHY_LE_2M_MASK}, + * and {@link BluetoothDevice#PHY_LE_CODED_MASK}. This option does not take effect if * {@code autoConnect} is set to true. * @throws IllegalArgumentException if callback is null */ diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index 5d1e8ec58ceb..4aaf6bd3eb17 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -785,11 +785,11 @@ public final class BluetoothGatt implements BluetoothProfile { * if no PHY change happens. It is also triggered when remote device updates the PHY. * * @param txPhy preferred transmitter PHY. Bitwise OR of any of - * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, and - * {@link BluetoothDevice#PHY_LE_CODED}. + * {@link BluetoothDevice#PHY_LE_1M_MASK}, {@link BluetoothDevice#PHY_LE_2M_MASK}, + * and {@link BluetoothDevice#PHY_LE_CODED_MASK}. * @param rxPhy preferred receiver PHY. Bitwise OR of any of - * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, and - * {@link BluetoothDevice#PHY_LE_CODED}. + * {@link BluetoothDevice#PHY_LE_1M_MASK}, {@link BluetoothDevice#PHY_LE_2M_MASK}, + * and {@link BluetoothDevice#PHY_LE_CODED_MASK}. * @param phyOptions preferred coding to use when transmitting on the LE Coded PHY. Can be one * of {@link BluetoothDevice#PHY_OPTION_NO_PREFERRED}, * {@link BluetoothDevice#PHY_OPTION_S2} or {@link BluetoothDevice#PHY_OPTION_S8} diff --git a/core/java/android/bluetooth/BluetoothGattServer.java b/core/java/android/bluetooth/BluetoothGattServer.java index 2df2ed8ff86f..eddc278851f4 100644 --- a/core/java/android/bluetooth/BluetoothGattServer.java +++ b/core/java/android/bluetooth/BluetoothGattServer.java @@ -558,11 +558,11 @@ public final class BluetoothGattServer implements BluetoothProfile { * * @param device The remote device to send this response to * @param txPhy preferred transmitter PHY. Bitwise OR of any of - * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, and - * {@link BluetoothDevice#PHY_LE_CODED}. + * {@link BluetoothDevice#PHY_LE_1M_MASK}, {@link BluetoothDevice#PHY_LE_2M_MASK}, + * and {@link BluetoothDevice#PHY_LE_CODED_MASK}. * @param rxPhy preferred receiver PHY. Bitwise OR of any of - * {@link BluetoothDevice#PHY_LE_1M}, {@link BluetoothDevice#PHY_LE_2M}, and - * {@link BluetoothDevice#PHY_LE_CODED}. + * {@link BluetoothDevice#PHY_LE_1M_MASK}, {@link BluetoothDevice#PHY_LE_2M_MASK}, + * and {@link BluetoothDevice#PHY_LE_CODED_MASK}. * @param phyOptions preferred coding to use when transmitting on the LE Coded PHY. Can be one * of {@link BluetoothDevice#PHY_OPTION_NO_PREFERRED}, * {@link BluetoothDevice#PHY_OPTION_S2} or {@link BluetoothDevice#PHY_OPTION_S8} diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl index 334e88b69fde..582709c3ba47 100644 --- a/core/java/android/bluetooth/IBluetoothGatt.aidl +++ b/core/java/android/bluetooth/IBluetoothGatt.aidl @@ -16,6 +16,7 @@ package android.bluetooth; +import android.app.PendingIntent; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGattService; import android.bluetooth.le.AdvertiseSettings; @@ -47,6 +48,9 @@ interface IBluetoothGatt { void unregisterScanner(in int scannerId); void startScan(in int scannerId, in ScanSettings settings, in List<ScanFilter> filters, in WorkSource workSource, in List scanStorages, in String callingPackage); + void startScanForIntent(in PendingIntent intent, in ScanSettings settings, in List<ScanFilter> filters, + in String callingPackage); + void stopScanForIntent(in PendingIntent intent, in String callingPackage); void stopScan(in int scannerId); void flushPendingBatchResults(in int scannerId); diff --git a/core/java/android/bluetooth/le/AdvertisingSetParameters.java b/core/java/android/bluetooth/le/AdvertisingSetParameters.java index 4e9fac3ee22b..31d8f482090d 100644 --- a/core/java/android/bluetooth/le/AdvertisingSetParameters.java +++ b/core/java/android/bluetooth/le/AdvertisingSetParameters.java @@ -17,6 +17,7 @@ package android.bluetooth.le; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; import android.os.Parcel; import android.os.Parcelable; @@ -30,21 +31,6 @@ import android.os.Parcelable; public final class AdvertisingSetParameters implements Parcelable { /** - * 1M advertiser PHY. - */ - public static final int PHY_LE_1M = 1; - - /** - * 2M advertiser PHY. - */ - public static final int PHY_LE_2M = 2; - - /** - * LE Coded advertiser PHY. - */ - public static final int PHY_LE_CODED = 3; - - /** * Advertise on low frequency, around every 1000ms. This is the default and * preferred advertising mode as it consumes the least power. */ @@ -246,8 +232,8 @@ public final class AdvertisingSetParameters implements Parcelable { private boolean isLegacy = false; private boolean isAnonymous = false; private boolean includeTxPower = false; - private int primaryPhy = PHY_LE_1M; - private int secondaryPhy = PHY_LE_1M; + private int primaryPhy = BluetoothDevice.PHY_LE_1M; + private int secondaryPhy = BluetoothDevice.PHY_LE_1M; private int interval = INTERVAL_LOW; private int txPowerLevel = TX_POWER_MEDIUM; @@ -321,12 +307,13 @@ public final class AdvertisingSetParameters implements Parcelable { * Use {@link BluetoothAdapter#isLeCodedPhySupported} to determine if LE Coded PHY is * supported on this device. * @param primaryPhy Primary advertising physical channel, can only be - * {@link AdvertisingSetParameters#PHY_LE_1M} or - * {@link AdvertisingSetParameters#PHY_LE_CODED}. + * {@link BluetoothDevice#PHY_LE_1M} or + * {@link BluetoothDevice#PHY_LE_CODED}. * @throws IllegalArgumentException If the primaryPhy is invalid. */ public Builder setPrimaryPhy(int primaryPhy) { - if (primaryPhy != PHY_LE_1M && primaryPhy != PHY_LE_CODED) { + if (primaryPhy != BluetoothDevice.PHY_LE_1M && + primaryPhy != BluetoothDevice.PHY_LE_CODED) { throw new IllegalArgumentException("bad primaryPhy " + primaryPhy); } this.primaryPhy = primaryPhy; @@ -343,14 +330,15 @@ public final class AdvertisingSetParameters implements Parcelable { * supported on this device. * * @param secondaryPhy Secondary advertising physical channel, can only be - * one of {@link AdvertisingSetParameters#PHY_LE_1M}, - * {@link AdvertisingSetParameters#PHY_LE_2M} or - * {@link AdvertisingSetParameters#PHY_LE_CODED}. + * one of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M} or + * {@link BluetoothDevice#PHY_LE_CODED}. * @throws IllegalArgumentException If the secondaryPhy is invalid. */ public Builder setSecondaryPhy(int secondaryPhy) { - if (secondaryPhy != PHY_LE_1M && secondaryPhy !=PHY_LE_2M && - secondaryPhy != PHY_LE_CODED) { + if (secondaryPhy != BluetoothDevice.PHY_LE_1M && + secondaryPhy != BluetoothDevice.PHY_LE_2M && + secondaryPhy != BluetoothDevice.PHY_LE_CODED) { throw new IllegalArgumentException("bad secondaryPhy " + secondaryPhy); } this.secondaryPhy = secondaryPhy; diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java index 73fc1339afa6..ea3031b20177 100644 --- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java +++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java @@ -17,6 +17,7 @@ package android.bluetooth.le; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothUuid; import android.bluetooth.IBluetoothGatt; @@ -363,12 +364,12 @@ public final class BluetoothLeAdvertiser { boolean support2MPhy = mBluetoothAdapter.isLe2MPhySupported(); int pphy = parameters.getPrimaryPhy(); int sphy = parameters.getSecondaryPhy(); - if (pphy == AdvertisingSetParameters.PHY_LE_CODED && !supportCodedPhy) { + if (pphy == BluetoothDevice.PHY_LE_CODED && !supportCodedPhy) { throw new IllegalArgumentException("Unsupported primary PHY selected"); } - if ((sphy == AdvertisingSetParameters.PHY_LE_CODED && !supportCodedPhy) - || (sphy == AdvertisingSetParameters.PHY_LE_2M && !support2MPhy)) { + if ((sphy == BluetoothDevice.PHY_LE_CODED && !supportCodedPhy) + || (sphy == BluetoothDevice.PHY_LE_2M && !support2MPhy)) { throw new IllegalArgumentException("Unsupported secondary PHY selected"); } diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java index b63c614711ea..b65a7ad0c017 100644 --- a/core/java/android/bluetooth/le/BluetoothLeScanner.java +++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java @@ -17,17 +17,18 @@ package android.bluetooth.le; import android.Manifest; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.app.ActivityThread; +import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothGatt; import android.bluetooth.IBluetoothGatt; import android.bluetooth.IBluetoothManager; -import android.bluetooth.le.IScannerCallback; import android.os.Handler; import android.os.Looper; -import android.os.ParcelUuid; import android.os.RemoteException; import android.os.WorkSource; import android.util.Log; @@ -36,7 +37,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.UUID; /** * This class provides methods to perform scan related operations for Bluetooth LE devices. An @@ -57,6 +57,27 @@ public final class BluetoothLeScanner { private static final boolean DBG = true; private static final boolean VDBG = false; + /** + * Extra containing a list of ScanResults. It can have one or more results if there was no + * error. In case of error, {@link #EXTRA_ERROR_CODE} will contain the error code and this + * extra will not be available. + */ + public static final String EXTRA_LIST_SCAN_RESULT + = "android.bluetooth.le.extra.LIST_SCAN_RESULT"; + + /** + * Optional extra indicating the error code, if any. The error code will be one of the + * SCAN_FAILED_* codes in {@link ScanCallback}. + */ + public static final String EXTRA_ERROR_CODE = "android.bluetooth.le.extra.ERROR_CODE"; + + /** + * Optional extra indicating the callback type, which will be one of + * ScanSettings.CALLBACK_TYPE_*. + * @see ScanCallback#onScanResult(int, ScanResult) + */ + public static final String EXTRA_CALLBACK_TYPE = "android.bluetooth.le.extra.CALLBACK_TYPE"; + private final IBluetoothManager mBluetoothManager; private final Handler mHandler; private BluetoothAdapter mBluetoothAdapter; @@ -110,7 +131,27 @@ public final class BluetoothLeScanner { @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) public void startScan(List<ScanFilter> filters, ScanSettings settings, final ScanCallback callback) { - startScan(filters, settings, null, callback, null); + startScan(filters, settings, null, callback, /*callbackIntent=*/ null, null); + } + + /** + * Start Bluetooth LE scan using a {@link PendingIntent}. The scan results will be delivered via + * the PendingIntent. Use this method of scanning if your process is not always running and it + * should be started when scan results are available. + * + * @param filters Optional list of ScanFilters for finding exact BLE devices. + * @param settings Optional settings for the scan. + * @param callbackIntent The PendingIntent to deliver the result to. + * @return Returns 0 for success or an error code from {@link ScanCallback} if the scan request + * could not be sent. + * @see #stopScan(PendingIntent) + */ + @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) + public int startScan(@Nullable List<ScanFilter> filters, @Nullable ScanSettings settings, + @NonNull PendingIntent callbackIntent) { + return startScan(filters, + settings != null ? settings : new ScanSettings.Builder().build(), + null, null, callbackIntent, null); } /** @@ -145,23 +186,23 @@ public final class BluetoothLeScanner { Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.UPDATE_DEVICE_STATS }) public void startScanFromSource(List<ScanFilter> filters, ScanSettings settings, final WorkSource workSource, final ScanCallback callback) { - startScan(filters, settings, workSource, callback, null); + startScan(filters, settings, workSource, callback, null, null); } - private void startScan(List<ScanFilter> filters, ScanSettings settings, + private int startScan(List<ScanFilter> filters, ScanSettings settings, final WorkSource workSource, final ScanCallback callback, + final PendingIntent callbackIntent, List<List<ResultStorageDescriptor>> resultStorages) { BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter); - if (callback == null) { + if (callback == null && callbackIntent == null) { throw new IllegalArgumentException("callback is null"); } if (settings == null) { throw new IllegalArgumentException("settings is null"); } synchronized (mLeScanClients) { - if (mLeScanClients.containsKey(callback)) { + if (callback != null && mLeScanClients.containsKey(callback)) { postCallbackError(callback, ScanCallback.SCAN_FAILED_ALREADY_STARTED); - return; } IBluetoothGatt gatt; try { @@ -170,28 +211,34 @@ public final class BluetoothLeScanner { gatt = null; } if (gatt == null) { - postCallbackError(callback, ScanCallback.SCAN_FAILED_INTERNAL_ERROR); - return; + return postCallbackErrorOrReturn(callback, ScanCallback.SCAN_FAILED_INTERNAL_ERROR); } if (!isSettingsConfigAllowedForScan(settings)) { - postCallbackError(callback, - ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED); - return; + return postCallbackErrorOrReturn(callback, + ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED); } if (!isHardwareResourcesAvailableForScan(settings)) { - postCallbackError(callback, - ScanCallback.SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES); - return; + return postCallbackErrorOrReturn(callback, + ScanCallback.SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES); } if (!isSettingsAndFilterComboAllowed(settings, filters)) { - postCallbackError(callback, + return postCallbackErrorOrReturn(callback, ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED); - return; } - BleScanCallbackWrapper wrapper = new BleScanCallbackWrapper(gatt, filters, - settings, workSource, callback, resultStorages); - wrapper.startRegisteration(); + if (callback != null) { + BleScanCallbackWrapper wrapper = new BleScanCallbackWrapper(gatt, filters, + settings, workSource, callback, resultStorages); + wrapper.startRegistration(); + } else { + try { + gatt.startScanForIntent(callbackIntent, settings, filters, + ActivityThread.currentOpPackageName()); + } catch (RemoteException e) { + return ScanCallback.SCAN_FAILED_INTERNAL_ERROR; + } + } } + return ScanCallback.NO_ERROR; } /** @@ -215,6 +262,25 @@ public final class BluetoothLeScanner { } /** + * Stops an ongoing Bluetooth LE scan started using a PendingIntent. + * <p> + * Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission. + * + * @param callbackIntent The PendingIntent that was used to start the scan. + * @see #startScan(List, ScanSettings, PendingIntent) + */ + @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) + public void stopScan(PendingIntent callbackIntent) { + BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter); + IBluetoothGatt gatt; + try { + gatt = mBluetoothManager.getBluetoothGatt(); + gatt.stopScanForIntent(callbackIntent, ActivityThread.currentOpPackageName()); + } catch (RemoteException e) { + } + } + + /** * Flush pending batch scan results stored in Bluetooth controller. This will return Bluetooth * LE scan results batched on bluetooth controller. Returns immediately, batch scan results data * will be delivered through the {@code callback}. @@ -252,7 +318,7 @@ public final class BluetoothLeScanner { scanFilters.add(filter.getFilter()); scanStorages.add(filter.getStorageDescriptors()); } - startScan(scanFilters, settings, null, callback, scanStorages); + startScan(scanFilters, settings, null, callback, null, scanStorages); } /** @@ -295,7 +361,7 @@ public final class BluetoothLeScanner { mResultStorages = resultStorages; } - public void startRegisteration() { + public void startRegistration() { synchronized (this) { // Scan stopped. if (mScannerId == -1) return; @@ -399,7 +465,6 @@ public final class BluetoothLeScanner { mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, scanResult); } }); - } @Override @@ -453,6 +518,15 @@ public final class BluetoothLeScanner { } } + private int postCallbackErrorOrReturn(final ScanCallback callback, final int errorCode) { + if (callback == null) { + return errorCode; + } else { + postCallbackError(callback, errorCode); + return ScanCallback.NO_ERROR; + } + } + private void postCallbackError(final ScanCallback callback, final int errorCode) { mHandler.post(new Runnable() { @Override diff --git a/core/java/android/bluetooth/le/ScanCallback.java b/core/java/android/bluetooth/le/ScanCallback.java index 61b2e787c86c..aff2e9095024 100644 --- a/core/java/android/bluetooth/le/ScanCallback.java +++ b/core/java/android/bluetooth/le/ScanCallback.java @@ -50,6 +50,8 @@ public abstract class ScanCallback { */ public static final int SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES = 5; + static final int NO_ERROR = 0; + /** * Callback when a BLE advertisement has been found. * diff --git a/core/java/android/bluetooth/le/ScanResult.java b/core/java/android/bluetooth/le/ScanResult.java index 745cd16c78f9..5b2fa406cd3f 100644 --- a/core/java/android/bluetooth/le/ScanResult.java +++ b/core/java/android/bluetooth/le/ScanResult.java @@ -47,21 +47,6 @@ public final class ScanResult implements Parcelable { public static final int PHY_UNUSED = 0x00; /** - * Bluetooth LE 1Mbit advertiser PHY. - */ - public static final int PHY_LE_1M = 0x01; - - /** - * Bluetooth LE 2Mbit advertiser PHY. - */ - public static final int PHY_LE_2M = 0x02; - - /** - * Bluetooth LE Coded advertiser PHY. - */ - public static final int PHY_LE_CODED = 0x03; - - /** * Advertising Set ID is not present in the packet. */ public static final int SID_NOT_PRESENT = 0xFF; @@ -112,7 +97,7 @@ public final class ScanResult implements Parcelable { mRssi = rssi; mTimestampNanos = timestampNanos; mEventType = (DATA_COMPLETE << 5) | ET_LEGACY_MASK | ET_CONNECTABLE_MASK; - mPrimaryPhy = PHY_LE_1M; + mPrimaryPhy = BluetoothDevice.PHY_LE_1M; mSecondaryPhy = PHY_UNUSED; mAdvertisingSid = SID_NOT_PRESENT; mTxPower = 127; @@ -256,16 +241,16 @@ public final class ScanResult implements Parcelable { /** * Returns the primary Physical Layer * on which this advertisment was received. - * Can be one of {@link ScanResult#PHY_LE_1M} or - * {@link ScanResult#PHY_LE_CODED}. + * Can be one of {@link BluetoothDevice#PHY_LE_1M} or + * {@link BluetoothDevice#PHY_LE_CODED}. */ public int getPrimaryPhy() { return mPrimaryPhy; } /** * Returns the secondary Physical Layer * on which this advertisment was received. - * Can be one of {@link ScanResult#PHY_LE_1M}, - * {@link ScanResult#PHY_LE_2M}, {@link ScanResult#PHY_LE_CODED} + * Can be one of {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_2M}, {@link BluetoothDevice#PHY_LE_CODED} * or {@link ScanResult#PHY_UNUSED} - if the advertisement * was not received on a secondary physical channel. */ diff --git a/core/java/android/bluetooth/le/ScanSettings.java b/core/java/android/bluetooth/le/ScanSettings.java index 69c9a8cece3a..36e48e9bd0b8 100644 --- a/core/java/android/bluetooth/le/ScanSettings.java +++ b/core/java/android/bluetooth/le/ScanSettings.java @@ -17,6 +17,7 @@ package android.bluetooth.le; import android.annotation.SystemApi; +import android.bluetooth.BluetoothDevice; import android.os.Parcel; import android.os.Parcelable; @@ -123,16 +124,6 @@ public final class ScanSettings implements Parcelable { public static final int SCAN_RESULT_TYPE_ABBREVIATED = 1; /** - * Use the Bluetooth LE 1Mbit PHY for scanning. - */ - public static final int PHY_LE_1M = 1; - - /** - * Use Bluetooth LE Coded PHY for scanning. - */ - public static final int PHY_LE_CODED = 3; - - /** * Use all supported PHYs for scanning. * This will check the controller capabilities, and start * the scan on 1Mbit and LE Coded PHYs if supported, or on @@ -412,8 +403,8 @@ public final class ScanSettings implements Parcelable { * Selecting an unsupported phy will result in failure to start scan. * * @param phy Can be one of - * {@link ScanSettings#PHY_LE_1M}, - * {@link ScanSettings#PHY_LE_CODED} or + * {@link BluetoothDevice#PHY_LE_1M}, + * {@link BluetoothDevice#PHY_LE_CODED} or * {@link ScanSettings#PHY_LE_ALL_SUPPORTED} */ public Builder setPhy(int phy) { diff --git a/core/java/android/companion/BluetoothDeviceFilterUtils.java b/core/java/android/companion/BluetoothDeviceFilterUtils.java index 8a316f19af8e..3665d1b85bcb 100644 --- a/core/java/android/companion/BluetoothDeviceFilterUtils.java +++ b/core/java/android/companion/BluetoothDeviceFilterUtils.java @@ -37,7 +37,7 @@ public class BluetoothDeviceFilterUtils { private BluetoothDeviceFilterUtils() {} private static final boolean DEBUG = false; - private static final String LOG_TAG = "BluetoothDeviceFilterUtil"; + private static final String LOG_TAG = "BluetoothDeviceFilterUtils"; @Nullable static String patternToString(@Nullable Pattern p) { @@ -50,8 +50,10 @@ public class BluetoothDeviceFilterUtils { } static boolean matches(ScanFilter filter, BluetoothDevice device) { - return matchesAddress(filter.getDeviceAddress(), device) + boolean result = matchesAddress(filter.getDeviceAddress(), device) && matchesServiceUuid(filter.getServiceUuid(), filter.getServiceUuidMask(), device); + if (DEBUG) debugLogMatchResult(result, device, filter); + return result; } static boolean matchesAddress(String deviceAddress, BluetoothDevice device) { diff --git a/core/java/android/companion/BluetoothLEDeviceFilter.java b/core/java/android/companion/BluetoothLEDeviceFilter.java index 0444775871b9..76051d722368 100644 --- a/core/java/android/companion/BluetoothLEDeviceFilter.java +++ b/core/java/android/companion/BluetoothLEDeviceFilter.java @@ -21,6 +21,7 @@ import static android.companion.BluetoothDeviceFilterUtils.patternFromString; import static android.companion.BluetoothDeviceFilterUtils.patternToString; import static com.android.internal.util.Preconditions.checkArgument; +import static com.android.internal.util.Preconditions.checkState; import android.annotation.NonNull; import android.annotation.Nullable; @@ -31,6 +32,7 @@ import android.bluetooth.le.ScanResult; import android.os.Parcel; import android.provider.OneTimeUseBuilder; import android.text.TextUtils; +import android.util.Log; import com.android.internal.util.BitUtils; import com.android.internal.util.ObjectUtils; @@ -47,6 +49,9 @@ import java.util.regex.Pattern; */ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { + private static final boolean DEBUG = false; + private static final String LOG_TAG = "BluetoothLEDeviceFilter"; + private static final int RENAME_PREFIX_LENGTH_LIMIT = 10; private final Pattern mNamePattern; @@ -57,12 +62,14 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { private final String mRenameSuffix; private final int mRenameBytesFrom; private final int mRenameBytesTo; + private final int mRenameNameFrom; + private final int mRenameNameTo; private final boolean mRenameBytesReverseOrder; private BluetoothLEDeviceFilter(Pattern namePattern, ScanFilter scanFilter, byte[] rawDataFilter, byte[] rawDataFilterMask, String renamePrefix, String renameSuffix, int renameBytesFrom, int renameBytesTo, - boolean renameBytesReverseOrder) { + int renameNameFrom, int renameNameTo, boolean renameBytesReverseOrder) { mNamePattern = namePattern; mScanFilter = ObjectUtils.firstNotNull(scanFilter, ScanFilter.EMPTY); mRawDataFilter = rawDataFilter; @@ -71,6 +78,8 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { mRenameSuffix = renameSuffix; mRenameBytesFrom = renameBytesFrom; mRenameBytesTo = renameBytesTo; + mRenameNameFrom = renameNameFrom; + mRenameNameTo = renameNameTo; mRenameBytesReverseOrder = renameBytesReverseOrder; } @@ -129,15 +138,23 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { @Override @Nullable public String getDeviceDisplayName(ScanResult sr) { - if (mRenameBytesFrom < 0) return getDeviceDisplayNameInternal(sr.getDevice()); - final byte[] bytes = sr.getScanRecord().getBytes(); + if (mRenameBytesFrom < 0 && mRenameNameFrom < 0) { + return getDeviceDisplayNameInternal(sr.getDevice()); + } final StringBuilder sb = new StringBuilder(TextUtils.emptyIfNull(mRenamePrefix)); - int startInclusive = mRenameBytesFrom; - int endInclusive = mRenameBytesTo - 1; - int initial = mRenameBytesReverseOrder ? endInclusive : startInclusive; - int step = mRenameBytesReverseOrder ? -1 : 1; - for (int i = initial; startInclusive <= i && i <= endInclusive; i+=step) { - sb.append(Byte.toHexString(bytes[i], true)); + if (mRenameBytesFrom >= 0) { + final byte[] bytes = sr.getScanRecord().getBytes(); + int startInclusive = mRenameBytesFrom; + int endInclusive = mRenameBytesTo - 1; + int initial = mRenameBytesReverseOrder ? endInclusive : startInclusive; + int step = mRenameBytesReverseOrder ? -1 : 1; + for (int i = initial; startInclusive <= i && i <= endInclusive; i += step) { + sb.append(Byte.toHexString(bytes[i], true)); + } + } else { + sb.append( + getDeviceDisplayNameInternal(sr.getDevice()) + .substring(mRenameNameFrom, mRenameNameTo)); } return sb.append(TextUtils.emptyIfNull(mRenameSuffix)).toString(); } @@ -145,9 +162,13 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { /** @hide */ @Override public boolean matches(ScanResult device) { - return matches(device.getDevice()) - && BitUtils.maskedEquals(device.getScanRecord().getBytes(), - mRawDataFilter, mRawDataFilterMask); + boolean result = matches(device.getDevice()) + && (mRawDataFilter == null + || BitUtils.maskedEquals(device.getScanRecord().getBytes(), + mRawDataFilter, mRawDataFilterMask)); + if (DEBUG) Log.i(LOG_TAG, "matches(this = " + this + ", device = " + device + + ") -> " + result); + return result; } private boolean matches(BluetoothDevice device) { @@ -194,6 +215,8 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { dest.writeString(mRenameSuffix); dest.writeInt(mRenameBytesFrom); dest.writeInt(mRenameBytesTo); + dest.writeInt(mRenameNameFrom); + dest.writeInt(mRenameNameTo); dest.writeBoolean(mRenameBytesReverseOrder); } @@ -218,9 +241,16 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { String suffix = in.readString(); int bytesFrom = in.readInt(); int bytesTo = in.readInt(); + int nameFrom = in.readInt(); + int nameTo = in.readInt(); boolean bytesReverseOrder = in.readBoolean(); if (renamePrefix != null) { - builder.setRename(renamePrefix, suffix, bytesFrom, bytesTo, bytesReverseOrder); + if (bytesFrom >= 0) { + builder.setRenameFromBytes(renamePrefix, suffix, bytesFrom, bytesTo, + bytesReverseOrder); + } else { + builder.setRenameFromName(renamePrefix, suffix, nameFrom, nameTo); + } } return builder.build(); } @@ -247,6 +277,8 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { private String mRenameSuffix; private int mRenameBytesFrom = -1; private int mRenameBytesTo; + private int mRenameNameFrom = -1; + private int mRenameNameTo; private boolean mRenameBytesReverseOrder = false; /** @@ -312,17 +344,57 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { * @return self for chaining */ @NonNull - public Builder setRename(@NonNull String prefix, @NonNull String suffix, + public Builder setRenameFromBytes(@NonNull String prefix, @NonNull String suffix, int bytesFrom, int bytesTo, boolean bytesReverseOrder) { - checkNotUsed(); - checkArgument(TextUtils.length(prefix) >= getRenamePrefixLengthLimit(), - "Prefix is too short"); - mRenamePrefix = prefix; - mRenameSuffix = suffix; - checkArgument(bytesFrom < bytesTo, "Byte range must be non-empty"); + checkRenameNotSet(); + checkRangeNotEmpty(bytesFrom, bytesTo); mRenameBytesFrom = bytesFrom; mRenameBytesTo = bytesTo; mRenameBytesReverseOrder = bytesReverseOrder; + return setRename(prefix, suffix); + } + + /** + * Rename the devices shown in the list, using specific characters from the advertised name, + * as well as a custom prefix/suffix around them + * + * Note that the prefix length is limited to {@link #getRenamePrefixLengthLimit} characters + * to ensure that there's enough space to display the byte data + * + * The range of name characters to be displayed cannot be empty + * + * @param prefix to be displayed before the byte data + * @param suffix to be displayed after the byte data + * @param nameFrom the start name character index to be displayed (inclusive) + * @param nameTo the end name character index to be displayed (exclusive) + * @return self for chaining + */ + @NonNull + public Builder setRenameFromName(@NonNull String prefix, @NonNull String suffix, + int nameFrom, int nameTo) { + checkRenameNotSet(); + checkRangeNotEmpty(nameFrom, nameTo); + mRenameNameFrom = nameFrom; + mRenameNameTo = nameTo; + mRenameBytesReverseOrder = false; + return setRename(prefix, suffix); + } + + private void checkRenameNotSet() { + checkState(mRenamePrefix == null, "Renaming rule can only be set once"); + } + + private void checkRangeNotEmpty(int bytesFrom, int bytesTo) { + checkArgument(bytesFrom < bytesTo, "Range must be non-empty"); + } + + @NonNull + private Builder setRename(@NonNull String prefix, @NonNull String suffix) { + checkNotUsed(); + checkArgument(TextUtils.length(prefix) <= getRenamePrefixLengthLimit(), + "Prefix is too long"); + mRenamePrefix = prefix; + mRenameSuffix = suffix; return this; } @@ -334,7 +406,9 @@ public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> { return new BluetoothLEDeviceFilter(mNamePattern, mScanFilter, mRawDataFilter, mRawDataFilterMask, mRenamePrefix, mRenameSuffix, - mRenameBytesFrom, mRenameBytesTo, mRenameBytesReverseOrder); + mRenameBytesFrom, mRenameBytesTo, + mRenameNameFrom, mRenameNameTo, + mRenameBytesReverseOrder); } } } diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java index 4d788e783f34..e50b2a97c2d2 100644 --- a/core/java/android/companion/CompanionDeviceManager.java +++ b/core/java/android/companion/CompanionDeviceManager.java @@ -22,11 +22,13 @@ import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; +import android.content.ComponentName; import android.content.Context; import android.content.IntentSender; import android.content.pm.PackageManager; import android.os.Handler; import android.os.RemoteException; +import android.service.notification.NotificationListenerService; import android.util.Log; import java.util.Collections; @@ -195,22 +197,47 @@ public final class CompanionDeviceManager { } } - /** @hide */ - public void requestNotificationAccess() { + /** + * Request notification access for the given component. + * + * The given component must follow the protocol specified in {@link NotificationListenerService} + * + * Only components from the same {@link ComponentName#getPackageName package} as the calling app + * are allowed. + * + * Your app must have an association with a device before calling this API + */ + public void requestNotificationAccess(ComponentName component) { if (!checkFeaturePresent()) { return; } - //TODO implement - throw new UnsupportedOperationException("Not yet implemented"); + try { + mService.requestNotificationAccess(component).send(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } catch (PendingIntent.CanceledException e) { + throw new RuntimeException(e); + } } - /** @hide */ - public boolean haveNotificationAccess() { + /** + * Check whether the given component can access the notifications via a + * {@link NotificationListenerService} + * + * Your app must have an association with a device before calling this API + * + * @param component the name of the component + * @return whether the given component has the notification listener permission + */ + public boolean hasNotificationAccess(ComponentName component) { if (!checkFeaturePresent()) { return false; } - //TODO implement - throw new UnsupportedOperationException("Not yet implemented"); + try { + return mService.hasNotificationAccess(component); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } private boolean checkFeaturePresent() { diff --git a/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl b/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl index 6bbb58da9938..5f73e551d57c 100644 --- a/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl +++ b/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl @@ -19,4 +19,5 @@ package android.companion; /** @hide */ interface ICompanionDeviceDiscoveryServiceCallback { oneway void onDeviceSelected(String packageName, int userId, String deviceAddress); + oneway void onDeviceSelectionCancel(); } diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl index 7798406c35e5..d3952084116c 100644 --- a/core/java/android/companion/ICompanionDeviceManager.aidl +++ b/core/java/android/companion/ICompanionDeviceManager.aidl @@ -16,8 +16,10 @@ package android.companion; +import android.app.PendingIntent; import android.companion.IFindDeviceCallback; import android.companion.AssociationRequest; +import android.content.ComponentName; /** * Interface for communication with the core companion device manager service. @@ -32,7 +34,6 @@ interface ICompanionDeviceManager { List<String> getAssociations(String callingPackage, int userId); void disassociate(String deviceMacAddress, String callingPackage); - //TODO add these -// boolean haveNotificationAccess(String packageName); -// oneway void requestNotificationAccess(String packageName); + boolean hasNotificationAccess(in ComponentName component); + PendingIntent requestNotificationAccess(in ComponentName component); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 63757755aedd..18120c714793 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -2897,6 +2897,7 @@ public abstract class Context { BATTERY_SERVICE, JOB_SCHEDULER_SERVICE, //@hide: PERSISTENT_DATA_BLOCK_SERVICE, + //@hide: OEM_LOCK_SERVICE, MEDIA_PROJECTION_SERVICE, MIDI_SERVICE, RADIO_SERVICE, @@ -3819,6 +3820,17 @@ public abstract class Context { /** * Use with {@link #getSystemService} to retrieve a {@link + * android.service.oemlock.OemLockManager} instance for managing the OEM lock. + * + * @see #getSystemService + * @see android.service.oemlock.OemLockManager + * @hide + */ + @SystemApi + public static final String OEM_LOCK_SERVICE = "oem_lock"; + + /** + * Use with {@link #getSystemService} to retrieve a {@link * android.media.projection.MediaProjectionManager} instance for managing * media projection sessions. * @see #getSystemService diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 2485bb8aacea..5ca4fa343271 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -3423,11 +3423,11 @@ public class Intent implements Parcelable, Cloneable { public static final String EXTRA_SUBSCRIPTION_INDEX = "android.intent.extra.SUBSCRIPTION_INDEX"; /** - * Deprecated - use {@link #ACTION_FACTORY_RESET} instead. - * - * {@hide} + * Deprecated - use ACTION_FACTORY_RESET instead. + * @hide */ @Deprecated + @SystemApi public static final String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR"; /** diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 11c658a1d4cf..430d8b15216f 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -4273,7 +4273,7 @@ public class PackageParser { a.intents.add(intent); } // adjust activity flags when we implicitly expose it via a browsable filter - intent.setVisibleToInstantApp(visibleToEphemeral || isWebBrowsableIntent(intent)); + intent.setVisibleToInstantApp(visibleToEphemeral || isImplicitlyExposedIntent(intent)); if (intent.isVisibleToInstantApp()) { a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL; } @@ -4306,7 +4306,7 @@ public class PackageParser { owner.preferredActivityFilters.add(intent); } // adjust activity flags when we implicitly expose it via a browsable filter - intent.setVisibleToInstantApp(visibleToEphemeral || isWebBrowsableIntent(intent)); + intent.setVisibleToInstantApp(visibleToEphemeral || isImplicitlyExposedIntent(intent)); if (intent.isVisibleToInstantApp()) { a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL; } @@ -4634,7 +4634,7 @@ public class PackageParser { + parser.getPositionDescription()); } else { intent.setVisibleToInstantApp( - visibleToEphemeral || isWebBrowsableIntent(intent)); + visibleToEphemeral || isImplicitlyExposedIntent(intent)); a.intents.add(intent); } // adjust activity flags when we implicitly expose it via a browsable filter @@ -4836,7 +4836,7 @@ public class PackageParser { } outInfo.intents.add(intent); // adjust provider flags when we implicitly expose it via a browsable filter - intent.setVisibleToInstantApp(visibleToEphemeral || isWebBrowsableIntent(intent)); + intent.setVisibleToInstantApp(visibleToEphemeral || isImplicitlyExposedIntent(intent)); if (intent.isVisibleToInstantApp()) { outInfo.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL; } @@ -5141,7 +5141,7 @@ public class PackageParser { return null; } // adjust activity flags when we implicitly expose it via a browsable filter - intent.setVisibleToInstantApp(visibleToEphemeral || isWebBrowsableIntent(intent)); + intent.setVisibleToInstantApp(visibleToEphemeral || isImplicitlyExposedIntent(intent)); if (intent.isVisibleToInstantApp()) { s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL; } @@ -5182,8 +5182,11 @@ public class PackageParser { return s; } - private boolean isWebBrowsableIntent(IntentInfo intent) { - return intent.hasCategory(Intent.CATEGORY_BROWSABLE); + private boolean isImplicitlyExposedIntent(IntentInfo intent) { + return intent.hasCategory(Intent.CATEGORY_BROWSABLE) + || intent.hasAction(Intent.ACTION_SEND) + || intent.hasAction(Intent.ACTION_SENDTO) + || intent.hasAction(Intent.ACTION_SEND_MULTIPLE); } private boolean parseAllMetaData(Resources res, XmlResourceParser parser, String tag, diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index c8353c9bffb9..88c1627f955b 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -127,7 +127,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration */ public static final int COLOR_MODE_WIDE_COLOR_GAMUT_YES = 0x2; - /** Constant for {@link #colorMode}: bits that encode whether the dynamic range of the screen. */ + /** Constant for {@link #colorMode}: bits that encode the dynamic range of the screen. */ public static final int COLOR_MODE_HDR_MASK = 0xc; /** Constant for {@link #colorMode}: bits shift to get the screen dynamic range. */ public static final int COLOR_MODE_HDR_SHIFT = 2; @@ -155,7 +155,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration COLOR_MODE_HDR_UNDEFINED; /** - * Bit mask of for color capabilities of the screen. Currently there are two fields: + * Bit mask of color capabilities of the screen. Currently there are two fields: * <p>The {@link #COLOR_MODE_WIDE_COLOR_GAMUT_MASK} bits define the color gamut of * the screen. They may be one of * {@link #COLOR_MODE_WIDE_COLOR_GAMUT_NO} or {@link #COLOR_MODE_WIDE_COLOR_GAMUT_YES}.</p> diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index a529c2ffba3d..32671721f58b 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -247,6 +247,7 @@ public final class DisplayManager { * </p> * * @see #createVirtualDisplay + * @hide */ public static final int VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 1 << 5; diff --git a/core/java/android/inputmethodservice/ExtractEditLayout.java b/core/java/android/inputmethodservice/ExtractEditLayout.java index 37ca4b44a1a1..af69f0f8fa74 100644 --- a/core/java/android/inputmethodservice/ExtractEditLayout.java +++ b/core/java/android/inputmethodservice/ExtractEditLayout.java @@ -41,6 +41,6 @@ public class ExtractEditLayout extends LinearLayout { @Override public void onFinishInflate() { super.onFinishInflate(); - mExtractActionButton = (Button) findViewById(com.android.internal.R.id.inputExtractAction); + mExtractActionButton = findViewById(com.android.internal.R.id.inputExtractAction); } } diff --git a/core/java/android/net/IpSecAlgorithm.java b/core/java/android/net/IpSecAlgorithm.java index 7fea4a25cab7..ce7894fb3ba1 100644 --- a/core/java/android/net/IpSecAlgorithm.java +++ b/core/java/android/net/IpSecAlgorithm.java @@ -32,7 +32,7 @@ public final class IpSecAlgorithm implements Parcelable { * * <p>Valid lengths for this key are {128, 192, 256}. */ - public static final String ALGO_CRYPT_AES_CBC = "cbc(aes)"; + public static final String CRYPT_AES_CBC = "cbc(aes)"; /** * MD5 HMAC Authentication/Integrity Algorithm. This algorithm is not recommended for use in new @@ -40,7 +40,7 @@ public final class IpSecAlgorithm implements Parcelable { * * <p>Valid truncation lengths are multiples of 8 bits from 96 to (default) 128. */ - public static final String ALGO_AUTH_HMAC_MD5 = "hmac(md5)"; + public static final String AUTH_HMAC_MD5 = "hmac(md5)"; /** * SHA1 HMAC Authentication/Integrity Algorithm. This algorithm is not recommended for use in @@ -48,35 +48,35 @@ public final class IpSecAlgorithm implements Parcelable { * * <p>Valid truncation lengths are multiples of 8 bits from 96 to (default) 160. */ - public static final String ALGO_AUTH_HMAC_SHA1 = "hmac(sha1)"; + public static final String AUTH_HMAC_SHA1 = "hmac(sha1)"; /** * SHA256 HMAC Authentication/Integrity Algorithm. * * <p>Valid truncation lengths are multiples of 8 bits from 96 to (default) 256. */ - public static final String ALGO_AUTH_HMAC_SHA256 = "hmac(sha256)"; + public static final String AUTH_HMAC_SHA256 = "hmac(sha256)"; /** * SHA384 HMAC Authentication/Integrity Algorithm. * * <p>Valid truncation lengths are multiples of 8 bits from 192 to (default) 384. */ - public static final String ALGO_AUTH_HMAC_SHA384 = "hmac(sha384)"; + public static final String AUTH_HMAC_SHA384 = "hmac(sha384)"; /** * SHA512 HMAC Authentication/Integrity Algorithm * * <p>Valid truncation lengths are multiples of 8 bits from 256 to (default) 512. */ - public static final String ALGO_AUTH_HMAC_SHA512 = "hmac(sha512)"; + public static final String AUTH_HMAC_SHA512 = "hmac(sha512)"; /** @hide */ @StringDef({ - ALGO_CRYPT_AES_CBC, - ALGO_AUTH_HMAC_MD5, - ALGO_AUTH_HMAC_SHA1, - ALGO_AUTH_HMAC_SHA256, - ALGO_AUTH_HMAC_SHA512 + CRYPT_AES_CBC, + AUTH_HMAC_MD5, + AUTH_HMAC_SHA1, + AUTH_HMAC_SHA256, + AUTH_HMAC_SHA512 }) @Retention(RetentionPolicy.SOURCE) public @interface AlgorithmName {} @@ -164,17 +164,17 @@ public final class IpSecAlgorithm implements Parcelable { private static boolean isTruncationLengthValid(String algo, int truncLenBits) { switch (algo) { - case ALGO_CRYPT_AES_CBC: + case CRYPT_AES_CBC: return (truncLenBits == 128 || truncLenBits == 192 || truncLenBits == 256); - case ALGO_AUTH_HMAC_MD5: + case AUTH_HMAC_MD5: return (truncLenBits >= 96 && truncLenBits <= 128); - case ALGO_AUTH_HMAC_SHA1: + case AUTH_HMAC_SHA1: return (truncLenBits >= 96 && truncLenBits <= 160); - case ALGO_AUTH_HMAC_SHA256: + case AUTH_HMAC_SHA256: return (truncLenBits >= 96 && truncLenBits <= 256); - case ALGO_AUTH_HMAC_SHA384: + case AUTH_HMAC_SHA384: return (truncLenBits >= 192 && truncLenBits <= 384); - case ALGO_AUTH_HMAC_SHA512: + case AUTH_HMAC_SHA512: return (truncLenBits >= 256 && truncLenBits <= 512); default: return false; diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java index 6852beb06529..f8702e2e00e7 100644 --- a/core/java/android/net/IpSecManager.java +++ b/core/java/android/net/IpSecManager.java @@ -193,15 +193,44 @@ public final class IpSecManager { * * @param direction {@link IpSecTransform#DIRECTION_IN} or {@link IpSecTransform#DIRECTION_OUT} * @param remoteAddress address of the remote. SPIs must be unique for each remoteAddress. - * @param requestedSpi the requested SPI, or '0' to allocate a random SPI. * @return the reserved SecurityParameterIndex * @throws ResourceUnavailableException indicating that too many SPIs are currently allocated * for this user * @throws SpiUnavailableException indicating that a particular SPI cannot be reserved */ public SecurityParameterIndex reserveSecurityParameterIndex( + int direction, InetAddress remoteAddress) + throws ResourceUnavailableException { + try { + return new SecurityParameterIndex( + mService, + direction, + remoteAddress, + IpSecManager.INVALID_SECURITY_PARAMETER_INDEX); + } catch (SpiUnavailableException unlikely) { + throw new ResourceUnavailableException("No SPIs available"); + } + } + + /** + * Reserve an SPI for traffic bound towards the specified remote address. + * + * <p>If successful, this SPI is guaranteed available until released by a call to {@link + * SecurityParameterIndex#close()}. + * + * @param direction {@link IpSecTransform#DIRECTION_IN} or {@link IpSecTransform#DIRECTION_OUT} + * @param remoteAddress address of the remote. SPIs must be unique for each remoteAddress. + * @param requestedSpi the requested SPI, or '0' to allocate a random SPI. + * @return the reserved SecurityParameterIndex + * @throws ResourceUnavailableException indicating that too many SPIs are currently allocated + * for this user + */ + public SecurityParameterIndex reserveSecurityParameterIndex( int direction, InetAddress remoteAddress, int requestedSpi) throws SpiUnavailableException, ResourceUnavailableException { + if (requestedSpi == IpSecManager.INVALID_SECURITY_PARAMETER_INDEX) { + throw new IllegalArgumentException("Requested SPI must be a valid (non-zero) SPI"); + } return new SecurityParameterIndex(mService, direction, remoteAddress, requestedSpi); } @@ -249,6 +278,23 @@ public final class IpSecManager { } /** + * Apply an active Transport Mode IPsec Transform to a stream socket to perform IPsec + * encapsulation of the traffic flowing between the socket and the remote InetAddress of that + * transform. For security reasons, attempts to send traffic to any IP address other than the + * address associated with that transform will throw an IOException. In addition, if the + * IpSecTransform is later deactivated, the socket will throw an IOException on any calls to + * send() or receive() until the transform is removed from the socket by calling {@link + * #removeTransportModeTransform(Socket, IpSecTransform)}; + * + * @param socket a socket file descriptor + * @param transform an {@link IpSecTransform}, which must be an active Transport Mode transform. + */ + public void applyTransportModeTransform(FileDescriptor socket, IpSecTransform transform) + throws IOException { + applyTransportModeTransform(new ParcelFileDescriptor(socket), transform); + } + + /** * Apply an active Tunnel Mode IPsec Transform to a network, which will tunnel all traffic to * and from that network's interface with IPsec (applies an outer IP header and IPsec Header to * all traffic, and expects an additional IP header and IPsec Header on all inbound traffic). @@ -289,6 +335,20 @@ public final class IpSecManager { removeTransportModeTransform(ParcelFileDescriptor.fromDatagramSocket(socket), transform); } + /** + * Remove a transform from a given stream socket. Once removed, traffic on the socket will not + * be encypted. This allows sockets that have been used for IPsec to be reclaimed for + * communication in the clear in the event socket reuse is desired. This operation will succeed + * regardless of the underlying state of a transform. If a transform is removed, communication + * on all sockets to which that transform was applied will fail until this method is called. + * + * @param socket a socket file descriptor that previously had a transform applied to it. + * @param transform the IPsec Transform that was previously applied to the given socket + */ + public void removeTransportModeTransform(FileDescriptor socket, IpSecTransform transform) { + removeTransportModeTransform(new ParcelFileDescriptor(socket), transform); + } + /* Call down to activate a transform */ private void removeTransportModeTransform(ParcelFileDescriptor pfd, IpSecTransform transform) { try { diff --git a/core/java/android/net/MatchAllNetworkSpecifier.java b/core/java/android/net/MatchAllNetworkSpecifier.java new file mode 100644 index 000000000000..7aafc93bb4a1 --- /dev/null +++ b/core/java/android/net/MatchAllNetworkSpecifier.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2017 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; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * MatchAllNetworkSpecifier is a marker class used by NetworkFactory classes to indicate + * that they accept (match) any network specifier in requests. + * + * The class must never be used as part of a network request (those semantics aren't specified). + * + * @hide + */ +public final class MatchAllNetworkSpecifier extends NetworkSpecifier implements Parcelable { + /** + * Utility method which verifies that the ns argument is not a MatchAllNetworkSpecifier and + * throws an IllegalArgumentException if it is. + */ + public static void checkNotMatchAllNetworkSpecifier(NetworkSpecifier ns) { + if (ns instanceof MatchAllNetworkSpecifier) { + throw new IllegalArgumentException("A MatchAllNetworkSpecifier is not permitted"); + } + } + + public boolean satisfiedBy(NetworkSpecifier other) { + /* + * The method is called by a NetworkRequest to see if it is satisfied by a proposed + * network (e.g. as offered by a network factory). Since MatchAllNetweorkSpecifier must + * not be used in network requests this method should never be called. + */ + throw new IllegalStateException( + "MatchAllNetworkSpecifier must not be used in NetworkRequests"); + } + + @Override + public boolean equals(Object o) { + return o instanceof MatchAllNetworkSpecifier; + } + + @Override + public int hashCode() { + return 0; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + // Nothing to write. + } + + public static final Parcelable.Creator<MatchAllNetworkSpecifier> CREATOR = + new Parcelable.Creator<MatchAllNetworkSpecifier>() { + public MatchAllNetworkSpecifier createFromParcel(Parcel in) { + return new MatchAllNetworkSpecifier(); + } + public MatchAllNetworkSpecifier[] newArray(int size) { + return new MatchAllNetworkSpecifier[size]; + } + }; +} diff --git a/core/java/android/net/NetworkBadging.java b/core/java/android/net/NetworkBadging.java index 4409d0a4ce73..b4ef69542bd1 100644 --- a/core/java/android/net/NetworkBadging.java +++ b/core/java/android/net/NetworkBadging.java @@ -56,7 +56,7 @@ public class NetworkBadging { * * @param signalLevel The level returned by {@link WifiManager#calculateSignalLevel(int, int)} * for a network. Must be between 0 and {@link WifiManager#RSSI_LEVELS}-1. - * @param badging {@see ScoredNetwork#Badging}, retrieved from + * @param badging {@see NetworkBadging#Badging}, retrieved from * {@link ScoredNetwork#calculateBadge(int)}. * @param theme The theme for the current application, may be null. * @return Drawable for the given icon @@ -140,7 +140,7 @@ public class NetworkBadging { * <p>This badge should be displayed with the badge signal resource retrieved from * {@link #getBadgedWifiSignalResource(int)}. * - * @param badging {@see ScoredNetwork#Badging} from {@link ScoredNetwork#calculateBadge(int)}. + * @param badging {@see NetworkBadging#Badging} from {@link ScoredNetwork#calculateBadge(int)}. * @return the @DrawableRes for the icon or {@link View#NO_ID} for * {@link NetworkBadging#BADGING_NONE} * @throws IllegalArgumentException for an invalid badging value. diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index a594befbd506..afca0b0e0bd3 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -18,9 +18,11 @@ package android.net; import android.os.Parcel; import android.os.Parcelable; -import android.text.TextUtils; + import com.android.internal.util.BitUtils; +import java.util.Objects; + /** * This class represents the capabilities of a network. This is used both to specify * needs to {@link ConnectivityManager} and when inspecting a network. @@ -33,6 +35,8 @@ import com.android.internal.util.BitUtils; * all cellular based connections are metered and all Wi-Fi based connections are not. */ public final class NetworkCapabilities implements Parcelable { + private static final String TAG = "NetworkCapabilities"; + /** * @hide */ @@ -205,19 +209,6 @@ public final class NetworkCapabilities implements Parcelable { (1 << NET_CAPABILITY_FOREGROUND); /** - * Network specifier for factories which want to match any network specifier - * (NS) in a request. Behavior: - * <li>Empty NS in request matches any network factory NS</li> - * <li>Empty NS in the network factory NS only matches a request with an - * empty NS</li> - * <li>"*" (this constant) NS in the network factory matches requests with - * any NS</li> - * - * @hide - */ - public static final String MATCH_ALL_REQUESTS_NETWORK_SPECIFIER = "*"; - - /** * Network capabilities that are not allowed in NetworkRequests. This exists because the * NetworkFactory / NetworkAgent model does not deal well with the situation where a * capability's presence cannot be known in advance. If such a capability is requested, then we @@ -579,63 +570,56 @@ public final class NetworkCapabilities implements Parcelable { this.mLinkDownBandwidthKbps == nc.mLinkDownBandwidthKbps); } - private String mNetworkSpecifier; + private NetworkSpecifier mNetworkSpecifier = null; + /** * Sets the optional bearer specific network specifier. * This has no meaning if a single transport is also not specified, so calling * this without a single transport set will generate an exception, as will * subsequently adding or removing transports after this is set. * </p> - * The interpretation of this {@code String} is bearer specific and bearers that use - * it should document their particulars. For example, Bluetooth may use some sort of - * device id while WiFi could used SSID and/or BSSID. Cellular may use carrier SPN (name) - * or Subscription ID. * - * @param networkSpecifier An {@code String} of opaque format used to specify the bearer - * specific network specifier where the bearer has a choice of - * networks. + * @param networkSpecifier A concrete, parcelable framework class that extends + * NetworkSpecifier. * @return This NetworkCapabilities instance, to facilitate chaining. * @hide */ - public NetworkCapabilities setNetworkSpecifier(String networkSpecifier) { - if (TextUtils.isEmpty(networkSpecifier) == false && Long.bitCount(mTransportTypes) != 1) { + public NetworkCapabilities setNetworkSpecifier(NetworkSpecifier networkSpecifier) { + if (networkSpecifier != null && Long.bitCount(mTransportTypes) != 1) { throw new IllegalStateException("Must have a single transport specified to use " + "setNetworkSpecifier"); } + mNetworkSpecifier = networkSpecifier; + return this; } /** * Gets the optional bearer specific network specifier. * - * @return The optional {@code String} specifying the bearer specific network specifier. - * See {@link #setNetworkSpecifier}. + * @return The optional {@link NetworkSpecifier} specifying the bearer specific network + * specifier. See {@link #setNetworkSpecifier}. * @hide */ - public String getNetworkSpecifier() { + public NetworkSpecifier getNetworkSpecifier() { return mNetworkSpecifier; } private void combineSpecifiers(NetworkCapabilities nc) { - String otherSpecifier = nc.getNetworkSpecifier(); - if (TextUtils.isEmpty(otherSpecifier)) return; - if (TextUtils.isEmpty(mNetworkSpecifier) == false) { + if (mNetworkSpecifier != null && !mNetworkSpecifier.equals(nc.mNetworkSpecifier)) { throw new IllegalStateException("Can't combine two networkSpecifiers"); } - setNetworkSpecifier(otherSpecifier); + setNetworkSpecifier(nc.mNetworkSpecifier); } + private boolean satisfiedBySpecifier(NetworkCapabilities nc) { - return (TextUtils.isEmpty(mNetworkSpecifier) || - mNetworkSpecifier.equals(nc.mNetworkSpecifier) || - MATCH_ALL_REQUESTS_NETWORK_SPECIFIER.equals(nc.mNetworkSpecifier)); + return mNetworkSpecifier == null || mNetworkSpecifier.satisfiedBy(nc.mNetworkSpecifier) + || nc.mNetworkSpecifier instanceof MatchAllNetworkSpecifier; } + private boolean equalsSpecifier(NetworkCapabilities nc) { - if (TextUtils.isEmpty(mNetworkSpecifier)) { - return TextUtils.isEmpty(nc.mNetworkSpecifier); - } else { - return mNetworkSpecifier.equals(nc.mNetworkSpecifier); - } + return Objects.equals(mNetworkSpecifier, nc.mNetworkSpecifier); } /** @@ -797,7 +781,7 @@ public final class NetworkCapabilities implements Parcelable { ((int)(mTransportTypes >> 32) * 7) + (mLinkUpBandwidthKbps * 11) + (mLinkDownBandwidthKbps * 13) + - (TextUtils.isEmpty(mNetworkSpecifier) ? 0 : mNetworkSpecifier.hashCode() * 17) + + Objects.hashCode(mNetworkSpecifier) * 17 + (mSignalStrength * 19)); } @@ -811,7 +795,7 @@ public final class NetworkCapabilities implements Parcelable { dest.writeLong(mTransportTypes); dest.writeInt(mLinkUpBandwidthKbps); dest.writeInt(mLinkDownBandwidthKbps); - dest.writeString(mNetworkSpecifier); + dest.writeParcelable((Parcelable) mNetworkSpecifier, flags); dest.writeInt(mSignalStrength); } @@ -825,7 +809,7 @@ public final class NetworkCapabilities implements Parcelable { netCap.mTransportTypes = in.readLong(); netCap.mLinkUpBandwidthKbps = in.readInt(); netCap.mLinkDownBandwidthKbps = in.readInt(); - netCap.mNetworkSpecifier = in.readString(); + netCap.mNetworkSpecifier = in.readParcelable(null); netCap.mSignalStrength = in.readInt(); return netCap; } diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index cb780090c46a..95a8bb472939 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -18,6 +18,7 @@ package android.net; import android.os.Parcel; import android.os.Parcelable; +import android.text.TextUtils; import java.util.Objects; @@ -259,10 +260,27 @@ public class NetworkRequest implements Parcelable { * networks. */ public Builder setNetworkSpecifier(String networkSpecifier) { - if (NetworkCapabilities.MATCH_ALL_REQUESTS_NETWORK_SPECIFIER.equals(networkSpecifier)) { - throw new IllegalArgumentException("Invalid network specifier - must not be '" - + NetworkCapabilities.MATCH_ALL_REQUESTS_NETWORK_SPECIFIER + "'"); - } + /* + * A StringNetworkSpecifier does not accept null or empty ("") strings. When network + * specifiers were strings a null string and an empty string were considered equivalent. + * Hence no meaning is attached to a null or empty ("") string. + */ + return setNetworkSpecifier(TextUtils.isEmpty(networkSpecifier) ? null + : new StringNetworkSpecifier(networkSpecifier)); + } + + /** + * Sets the optional bearer specific network specifier. + * This has no meaning if a single transport is also not specified, so calling + * this without a single transport set will generate an exception, as will + * subsequently adding or removing transports after this is set. + * </p> + * + * @param networkSpecifier A concrete, parcelable framework class that extends + * NetworkSpecifier. + */ + public Builder setNetworkSpecifier(NetworkSpecifier networkSpecifier) { + MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier(networkSpecifier); mNetworkCapabilities.setNetworkSpecifier(networkSpecifier); return this; } diff --git a/core/java/android/net/NetworkSpecifier.java b/core/java/android/net/NetworkSpecifier.java new file mode 100644 index 000000000000..87a2b05a4430 --- /dev/null +++ b/core/java/android/net/NetworkSpecifier.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2017 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; + +/** + * Describes specific properties of a network for use in a {@link NetworkRequest}. + * + * Applications cannot instantiate this class by themselves, but can obtain instances of + * subclasses of this class via other APIs. + */ +public abstract class NetworkSpecifier { + /** @hide */ + public NetworkSpecifier() {} + + /** + * Returns true if a request with this {@link NetworkSpecifier} is satisfied by a network + * with the given NetworkSpecifier. + * + * @hide + */ + public abstract boolean satisfiedBy(NetworkSpecifier other); +} diff --git a/core/java/android/net/ScoredNetwork.java b/core/java/android/net/ScoredNetwork.java index a664a8bf1ac1..666da0a455fa 100644 --- a/core/java/android/net/ScoredNetwork.java +++ b/core/java/android/net/ScoredNetwork.java @@ -73,29 +73,6 @@ public class ScoredNetwork implements Parcelable { /** A {@link NetworkKey} uniquely identifying this network. */ public final NetworkKey networkKey; - // TODO(b/35323372): Delete these once external references are switched. - /** @deprecated Use {@link NetworkBadging#Badging} instead. */ - @Deprecated - @IntDef({BADGING_NONE, BADGING_SD, BADGING_HD, BADGING_4K}) - @Retention(RetentionPolicy.SOURCE) - public @interface Badging {} - - /** @deprecated Use {@link NetworkBadging#BADGING_NONE} instead. */ - @Deprecated - public static final int BADGING_NONE = 0; - - /** @deprecated Use {@link NetworkBadging#BADGING_SD} instead. */ - @Deprecated - public static final int BADGING_SD = 10; - - /** @deprecated Use {@link NetworkBadging#BADGING_HD} instead. */ - @Deprecated - public static final int BADGING_HD = 20; - - /** @deprecated Use {@link NetworkBadging#BADGING_4K} instead. */ - @Deprecated - public static final int BADGING_4K = 30; - /** * The {@link RssiCurve} representing the scores for this network based on the RSSI. * diff --git a/core/java/android/net/StringNetworkSpecifier.java b/core/java/android/net/StringNetworkSpecifier.java new file mode 100644 index 000000000000..cb7f6bfce713 --- /dev/null +++ b/core/java/android/net/StringNetworkSpecifier.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2017 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; + +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; + +import com.android.internal.util.Preconditions; + +import java.util.Objects; + +/** @hide */ +public final class StringNetworkSpecifier extends NetworkSpecifier implements Parcelable { + /** + * Arbitrary string used to pass (additional) information to the network factory. + */ + public final String specifier; + + public StringNetworkSpecifier(String specifier) { + Preconditions.checkStringNotEmpty(specifier); + this.specifier = specifier; + } + + @Override + public boolean satisfiedBy(NetworkSpecifier other) { + return equals(other); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof StringNetworkSpecifier)) return false; + return TextUtils.equals(specifier, ((StringNetworkSpecifier) o).specifier); + } + + @Override + public int hashCode() { + return Objects.hashCode(specifier); + } + + @Override + public String toString() { + return specifier; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(specifier); + } + + public static final Parcelable.Creator<StringNetworkSpecifier> CREATOR = + new Parcelable.Creator<StringNetworkSpecifier>() { + public StringNetworkSpecifier createFromParcel(Parcel in) { + return new StringNetworkSpecifier(in.readString()); + } + public StringNetworkSpecifier[] newArray(int size) { + return new StringNetworkSpecifier[size]; + } + }; +} diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 15bd175949c4..ff0bc69ed325 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -16,9 +16,15 @@ package android.os; +import android.util.ExceptionUtils; import android.util.Log; import android.util.Slog; + import com.android.internal.util.FastPrintWriter; +import com.android.internal.util.FunctionalUtils; +import com.android.internal.util.FunctionalUtils.ThrowingRunnable; +import com.android.internal.util.FunctionalUtils.ThrowingSupplier; + import libcore.io.IoUtils; import java.io.FileDescriptor; @@ -26,7 +32,6 @@ import java.io.FileOutputStream; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.lang.reflect.Modifier; -import java.util.function.Supplier; /** * Base class for a remotable object, the core part of a lightweight @@ -251,14 +256,23 @@ public class Binder implements IBinder { * Convenience method for running the provided action enclosed in * {@link #clearCallingIdentity}/{@link #restoreCallingIdentity} * + * Any exception thrown by the given action will be caught and rethrown after the call to + * {@link #restoreCallingIdentity} + * * @hide */ - public static final void withCleanCallingIdentity(Runnable action) { + public static final void withCleanCallingIdentity(ThrowingRunnable action) { long callingIdentity = clearCallingIdentity(); + Throwable throwableToPropagate = null; try { action.run(); + } catch (Throwable throwable) { + throwableToPropagate = throwable; } finally { restoreCallingIdentity(callingIdentity); + if (throwableToPropagate != null) { + throw ExceptionUtils.propagate(throwableToPropagate); + } } } @@ -266,14 +280,24 @@ public class Binder implements IBinder { * Convenience method for running the provided action enclosed in * {@link #clearCallingIdentity}/{@link #restoreCallingIdentity} returning the result * + * Any exception thrown by the given action will be caught and rethrown after the call to + * {@link #restoreCallingIdentity} + * * @hide */ - public static final <T> T withCleanCallingIdentity(Supplier<T> action) { + public static final <T> T withCleanCallingIdentity(ThrowingSupplier<T> action) { long callingIdentity = clearCallingIdentity(); + Throwable throwableToPropagate = null; try { return action.get(); + } catch (Throwable throwable) { + throwableToPropagate = throwable; + return null; // overridden by throwing in finally block } finally { restoreCallingIdentity(callingIdentity); + if (throwableToPropagate != null) { + throw ExceptionUtils.propagate(throwableToPropagate); + } } } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index a6bf2d26abb3..6f4c9cf7d7ff 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -682,8 +682,10 @@ public class UserManager { * @see DevicePolicyManager#addUserRestriction(ComponentName, String) * @see DevicePolicyManager#clearUserRestriction(ComponentName, String) * @see #getUserRestrictions() + * @deprecated use {@link OemLockManager#setOemUnlockAllowedByCarrier(boolean, byte[])} instead. * @hide */ + @Deprecated @SystemApi public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock"; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 05bacae4bba3..539559d19c82 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -8844,6 +8844,15 @@ public final class Settings { public static final String CAPTIVE_PORTAL_FALLBACK_URL = "captive_portal_fallback_url"; /** + * A comma separated list of URLs used for captive portal detection in addition to the + * fallback HTTP url associated with the CAPTIVE_PORTAL_FALLBACK_URL settings. + * + * @hide + */ + public static final String CAPTIVE_PORTAL_OTHER_FALLBACK_URLS = + "captive_portal_other_fallback_urls"; + + /** * Whether to use HTTPS for network validation. This is enabled by default and the setting * needs to be set to 0 to disable it. This setting is a misnomer because captive portals * don't actually use HTTPS, but it's consistent with the other settings. diff --git a/core/java/android/provider/SettingsStringUtil.java b/core/java/android/provider/SettingsStringUtil.java index 3dfedea18323..a3dc9471a1d0 100644 --- a/core/java/android/provider/SettingsStringUtil.java +++ b/core/java/android/provider/SettingsStringUtil.java @@ -23,6 +23,7 @@ import android.text.TextUtils; import com.android.internal.util.ArrayUtils; +import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.function.Function; @@ -80,6 +81,12 @@ public class SettingsStringUtil { return s; } + public static String addAll(String delimitedElements, Collection<String> elements) { + final ColonDelimitedSet<String> set + = new ColonDelimitedSet.OfStrings(delimitedElements); + return set.addAll(elements) ? set.toString() : delimitedElements; + } + public static String add(String delimitedElements, String element) { final ColonDelimitedSet<String> set = new ColonDelimitedSet.OfStrings(delimitedElements); diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java index a4d3fb299734..5e49b8f0553f 100644 --- a/core/java/android/service/autofill/AutofillService.java +++ b/core/java/android/service/autofill/AutofillService.java @@ -34,6 +34,8 @@ import android.view.autofill.AutofillManager; import com.android.internal.os.SomeArgs; +import java.util.List; + //TODO(b/33197203): improve javadoc (of both class and methods); in particular, make sure the //life-cycle (and how state could be maintained on server-side) is well documented. @@ -103,24 +105,22 @@ public abstract class AutofillService extends Service { } @Override - public void onFillRequest(AssistStructure structure, Bundle extras, - IFillCallback callback, int flags) { + public void onFillRequest(FillRequest request, IFillCallback callback) { ICancellationSignal transport = CancellationSignal.createTransport(); try { callback.onCancellable(transport); } catch (RemoteException e) { e.rethrowFromSystemServer(); } - mHandlerCaller.obtainMessageIIOOOO(MSG_ON_FILL_REQUEST, flags, UNUSED_ARG, structure, - CancellationSignal.fromTransport(transport), extras, callback) + mHandlerCaller.obtainMessageOOO(MSG_ON_FILL_REQUEST, request, + CancellationSignal.fromTransport(transport), callback) .sendToTarget(); } @Override - public void onSaveRequest(AssistStructure structure, Bundle extras, - ISaveCallback callback) { - mHandlerCaller.obtainMessageOOO(MSG_ON_SAVE_REQUEST, structure, - extras, callback).sendToTarget(); + public void onSaveRequest(SaveRequest request, ISaveCallback callback) { + mHandlerCaller.obtainMessageOO(MSG_ON_SAVE_REQUEST, request, + callback).sendToTarget(); } }; @@ -131,23 +131,20 @@ public abstract class AutofillService extends Service { break; } case MSG_ON_FILL_REQUEST: { final SomeArgs args = (SomeArgs) msg.obj; - final AssistStructure structure = (AssistStructure) args.arg1; + final FillRequest request = (FillRequest) args.arg1; final CancellationSignal cancellation = (CancellationSignal) args.arg2; - final Bundle extras = (Bundle) args.arg3; - final IFillCallback callback = (IFillCallback) args.arg4; - final FillCallback fillCallback = new FillCallback(callback); - final int flags = msg.arg1; + final IFillCallback callback = (IFillCallback) args.arg3; + final FillCallback fillCallback = new FillCallback(callback, request.getId()); args.recycle(); - onFillRequest(structure, extras, flags, cancellation, fillCallback); + onFillRequest(request, cancellation, fillCallback); break; } case MSG_ON_SAVE_REQUEST: { final SomeArgs args = (SomeArgs) msg.obj; - final AssistStructure structure = (AssistStructure) args.arg1; - final Bundle extras = (Bundle) args.arg2; - final ISaveCallback callback = (ISaveCallback) args.arg3; + final SaveRequest request = (SaveRequest) args.arg1; + final ISaveCallback callback = (ISaveCallback) args.arg2; final SaveCallback saveCallback = new SaveCallback(callback); args.recycle(); - onSaveRequest(structure, extras, saveCallback); + onSaveRequest(request, saveCallback); break; } case MSG_DISCONNECT: { onDisconnected(); @@ -198,6 +195,28 @@ public abstract class AutofillService extends Service { * or {@link FillCallback#onFailure(CharSequence)}) * to notify the result of the request. * + * @param request the {@link FillRequest request} to handle. + * See {@link FillResponse} for examples of multiple-sections requests. + * @param cancellationSignal signal for observing cancellation requests. The system will use + * this to notify you that the fill result is no longer needed and you should stop + * handling this fill request in order to save resources. + * @param callback object used to notify the result of the request. + */ + public void onFillRequest(@NonNull FillRequest request, + @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback) { + onFillRequest(request.getStructure(), request.getClientState(), request.getFlags(), + cancellationSignal, callback); + } + + /** + * Called by the Android system do decide if an {@link Activity} can be autofilled by the + * service. + * + * <p>Service must call one of the {@link FillCallback} methods (like + * {@link FillCallback#onSuccess(FillResponse)} + * or {@link FillCallback#onFailure(CharSequence)}) + * to notify the result of the request. + * * @param structure {@link Activity}'s view structure. * @param data bundle containing data passed by the service in a last call to * {@link FillResponse.Builder#setExtras(Bundle)}, if any. This bundle allows your @@ -211,6 +230,7 @@ public abstract class AutofillService extends Service { * handling this fill request in order to save resources. * @param callback object used to notify the result of the request. */ + @Deprecated public abstract void onFillRequest(@NonNull AssistStructure structure, @Nullable Bundle data, int flags, @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback); @@ -222,6 +242,23 @@ public abstract class AutofillService extends Service { * {@link SaveCallback#onSuccess()} or {@link SaveCallback#onFailure(CharSequence)}) * to notify the result of the request. * + * @param request the {@link SaveRequest request} to handle. + * See {@link FillResponse} for examples of multiple-sections requests. + * @param callback object used to notify the result of the request. + */ + public void onSaveRequest(@NonNull SaveRequest request, @NonNull SaveCallback callback) { + List<FillContext> contexts = request.getFillContexts(); + onSaveRequest(contexts.get(contexts.size() - 1).getStructure(), + request.getClientState(), callback); + } + + /** + * Called when user requests service to save the fields of an {@link Activity}. + * + * <p>Service must call one of the {@link SaveCallback} methods (like + * {@link SaveCallback#onSuccess()} or {@link SaveCallback#onFailure(CharSequence)}) + * to notify the result of the request. + * * @param structure {@link Activity}'s view structure. * @param data bundle containing data passed by the service in a last call to * {@link FillResponse.Builder#setExtras(Bundle)}, if any. This bundle allows your @@ -231,6 +268,7 @@ public abstract class AutofillService extends Service { * See {@link FillResponse} for examples of multiple-sections requests. * @param callback object used to notify the result of the request. */ + @Deprecated public abstract void onSaveRequest(@NonNull AssistStructure structure, @Nullable Bundle data, @NonNull SaveCallback callback); diff --git a/core/java/android/service/autofill/FillCallback.java b/core/java/android/service/autofill/FillCallback.java index e8ad14f55261..a009be805ce7 100644 --- a/core/java/android/service/autofill/FillCallback.java +++ b/core/java/android/service/autofill/FillCallback.java @@ -27,11 +27,13 @@ import android.os.RemoteException; */ public final class FillCallback { private final IFillCallback mCallback; + private final int mRequestId; private boolean mCalled; /** @hide */ - public FillCallback(IFillCallback callback) { + public FillCallback(IFillCallback callback, int requestId) { mCallback = callback; + mRequestId = requestId; } /** @@ -47,7 +49,7 @@ public final class FillCallback { assertNotCalled(); mCalled = true; try { - mCallback.onSuccess(response); + mCallback.onSuccess(response, mRequestId); } catch (RemoteException e) { e.rethrowAsRuntimeException(); } diff --git a/core/java/android/service/autofill/FillContext.java b/core/java/android/service/autofill/FillContext.java new file mode 100644 index 000000000000..2efa08c00969 --- /dev/null +++ b/core/java/android/service/autofill/FillContext.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2017 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.service.autofill; + +import android.annotation.NonNull; +import android.app.assist.AssistStructure; +import android.os.Bundle; +import android.os.CancellationSignal; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * This class represents a context for each fill request made via {@link + * AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)}. + * It contains a snapshot of the UI state, the view ids that were returned by + * the {@link AutofillService autofill service} as both required to trigger a save + * and optional that can be saved, and the id of the corresponding {@link + * FillRequest}. + * <p> + * This context allows you to inspect the values for the interesting views + * in the context they appeared. Also a reference to the corresponding fill + * request is useful to store meta-data in the client state bundle passed + * to {@link FillResponse.Builder#setClientState(Bundle)} to avoid interpreting + * the UI state again while saving. + */ +public final class FillContext implements Parcelable { + private final int mRequestId; + private final @NonNull AssistStructure mStructure; + + /** @hide */ + public FillContext(int requestId, @NonNull AssistStructure structure) { + mRequestId = requestId; + mStructure = structure; + } + + private FillContext(Parcel parcel) { + this(parcel.readInt(), parcel.readParcelable(null)); + } + + /** + * Gets the id of the {@link FillRequest fill request} this context + * corresponds to. This is useful to associate your custom client + * state with every request to avoid reinterpreting the UI when saving + * user data. + * + * @return The request id. + */ + public int getRequestId() { + return mRequestId; + } + + /** + * @return The screen content. + */ + public AssistStructure getStructure() { + return mStructure; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(mRequestId); + parcel.writeParcelable(mStructure, flags); + } + + public static final Parcelable.Creator<FillContext> CREATOR = + new Parcelable.Creator<FillContext>() { + @Override + public FillContext createFromParcel(Parcel parcel) { + return new FillContext(parcel); + } + + @Override + public FillContext[] newArray(int size) { + return new FillContext[size]; + } + }; +} diff --git a/core/java/android/service/autofill/FillRequest.aidl b/core/java/android/service/autofill/FillRequest.aidl new file mode 100644 index 000000000000..2b1a8fea8a5e --- /dev/null +++ b/core/java/android/service/autofill/FillRequest.aidl @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2017, 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.service.autofill; + +parcelable FillRequest; diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java new file mode 100644 index 000000000000..aa6db4d092f2 --- /dev/null +++ b/core/java/android/service/autofill/FillRequest.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2017 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.service.autofill; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.assist.AssistStructure; +import android.os.Bundle; +import android.os.CancellationSignal; +import android.os.Parcel; +import android.os.Parcelable; +import com.android.internal.util.Preconditions; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * This class represents a request to an {@link AutofillService autofill provider} + * to interpret the screen and provide information to the system which views are + * interesting for saving and what are the possible ways to fill the inputs on + * the screen if applicable. + * + * @see AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback) + */ +public final class FillRequest implements Parcelable { + private static AtomicInteger sIdCounter = new AtomicInteger(); + + /** + * Indicates autofill was explicitly requested by the user. + */ + public static final int FLAG_MANUAL_REQUEST = 0x1; + + /** @hide */ + @IntDef( + flag = true, + value = {FLAG_MANUAL_REQUEST}) + @Retention(RetentionPolicy.SOURCE) + @interface RequestFlags{} + + private final int mId; + private final @RequestFlags int mFlags; + private final @NonNull AssistStructure mStructure; + private final @Nullable Bundle mClientState; + + /** @hide */ + public FillRequest(@NonNull AssistStructure structure, + @Nullable Bundle clientState, @RequestFlags int flags) { + this(sIdCounter.incrementAndGet(), structure, clientState, flags); + } + + private FillRequest(@NonNull Parcel parcel) { + mId = parcel.readInt(); + mStructure = parcel.readParcelable(null); + mClientState = parcel.readBundle(); + mFlags = parcel.readInt(); + } + + private FillRequest(int id, @NonNull AssistStructure structure, + @Nullable Bundle clientState, @RequestFlags int flags) { + mId = id; + mFlags = Preconditions.checkFlagsArgument(flags, FLAG_MANUAL_REQUEST); + mStructure = Preconditions.checkNotNull(structure, "structure"); + mClientState = clientState; + } + + /** + * @return The unique id of this request. + */ + public int getId() { + return mId; + } + + /** + * @return The flags associated with this request. + * + * @see #FLAG_MANUAL_REQUEST + */ + public @RequestFlags int getFlags() { + return mFlags; + } + + /** + * @return The structure capturing the UI state. + */ + public @NonNull AssistStructure getStructure() { + return mStructure; + } + + /** + * Gets the extra client state returned from the last {@link + * AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback) + * fill request}. + * <p> + * Once a {@link AutofillService#onSaveRequest(SaveRequest, SaveCallback) + * save request} is made the client state is cleared. + * + * @return The client state. + */ + public @Nullable Bundle getClientState() { + return mClientState; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(mId); + parcel.writeParcelable(mStructure, flags); + parcel.writeBundle(mClientState); + parcel.writeInt(mFlags); + } + + public static final Parcelable.Creator<FillRequest> CREATOR = + new Parcelable.Creator<FillRequest>() { + @Override + public FillRequest createFromParcel(Parcel parcel) { + return new FillRequest(parcel); + } + + @Override + public FillRequest[] newArray(int size) { + return new FillRequest[size]; + } + }; +} diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java index eab0d4c882d0..8c8060a608f0 100644 --- a/core/java/android/service/autofill/FillResponse.java +++ b/core/java/android/service/autofill/FillResponse.java @@ -132,25 +132,25 @@ import java.util.ArrayList; */ public final class FillResponse implements Parcelable { - private final ArrayList<Dataset> mDatasets; - private final SaveInfo mSaveInfo; - private final Bundle mExtras; - private final RemoteViews mPresentation; - private final IntentSender mAuthentication; - private AutofillId[] mAuthenticationIds; + private final @Nullable ArrayList<Dataset> mDatasets; + private final @Nullable SaveInfo mSaveInfo; + private final @Nullable Bundle mClientState; + private final @Nullable RemoteViews mPresentation; + private final @Nullable IntentSender mAuthentication; + private final @Nullable AutofillId[] mAuthenticationIds; private FillResponse(@NonNull Builder builder) { mDatasets = builder.mDatasets; mSaveInfo = builder.mSaveInfo; - mExtras = builder.mExtras; + mClientState = builder.mCLientState; mPresentation = builder.mPresentation; mAuthentication = builder.mAuthentication; mAuthenticationIds = builder.mAuthenticationIds; } /** @hide */ - public @Nullable Bundle getExtras() { - return mExtras; + public @Nullable Bundle getClientState() { + return mClientState; } /** @hide */ @@ -185,7 +185,7 @@ public final class FillResponse implements Parcelable { public static final class Builder { private ArrayList<Dataset> mDatasets; private SaveInfo mSaveInfo; - private Bundle mExtras; + private Bundle mCLientState; private RemoteViews mPresentation; private IntentSender mAuthentication; private AutofillId[] mAuthenticationIds; @@ -289,23 +289,35 @@ public final class FillResponse implements Parcelable { return this; } + @Deprecated + public Builder setExtras(@Nullable Bundle extras) { + throwIfDestroyed(); + mCLientState = extras; + return this; + } + /** - * Sets a {@link Bundle} that will be passed to subsequent APIs that + * Sets a {@link Bundle state} that will be passed to subsequent APIs that * manipulate this response. For example, they are passed to subsequent * calls to {@link AutofillService#onFillRequest( * android.app.assist.AssistStructure, Bundle, int, * android.os.CancellationSignal, FillCallback)} and {@link AutofillService#onSaveRequest( - * android.app.assist.AssistStructure, Bundle, SaveCallback)}. + * android.app.assist.AssistStructure, Bundle, SaveCallback)}. You can use + * this to store intermediate state that is persistent across multiple + * fill requests and the subsequent save request. * * <p>If this method is called on multiple {@link FillResponse} objects for the same * activity, just the latest bundle is passed back to the service. * - * @param extras The response extras. + * <p>Once a {@link AutofillService#onSaveRequest(SaveRequest, SaveCallback) + * save request} is made the client state is cleared. + * + * @param clientState The custom client state. * @return This builder. */ - public Builder setExtras(Bundle extras) { + public Builder setClientState(@Nullable Bundle clientState) { throwIfDestroyed(); - mExtras = extras; + mCLientState = clientState; return this; } @@ -344,7 +356,7 @@ public final class FillResponse implements Parcelable { return new StringBuilder( "FillResponse: [datasets=").append(mDatasets) .append(", saveInfo=").append(mSaveInfo) - .append(", hasExtras=").append(mExtras != null) + .append(", clientState=").append(mClientState != null) .append(", hasPresentation=").append(mPresentation != null) .append(", hasAuthentication=").append(mAuthentication != null) .append(", authenticationSize=").append(mAuthenticationIds != null @@ -365,7 +377,7 @@ public final class FillResponse implements Parcelable { public void writeToParcel(Parcel parcel, int flags) { parcel.writeTypedArrayList(mDatasets, flags); parcel.writeParcelable(mSaveInfo, flags); - parcel.writeParcelable(mExtras, flags); + parcel.writeParcelable(mClientState, flags); parcel.writeParcelableArray(mAuthenticationIds, flags); parcel.writeParcelable(mAuthentication, flags); parcel.writeParcelable(mPresentation, flags); diff --git a/core/java/android/service/autofill/IAutoFillService.aidl b/core/java/android/service/autofill/IAutoFillService.aidl index a8d86ca1cc79..23a1a3fee47c 100644 --- a/core/java/android/service/autofill/IAutoFillService.aidl +++ b/core/java/android/service/autofill/IAutoFillService.aidl @@ -16,10 +16,10 @@ package android.service.autofill; -import android.app.assist.AssistStructure; -import android.os.Bundle; +import android.service.autofill.FillRequest; import android.service.autofill.IFillCallback; import android.service.autofill.ISaveCallback; +import android.service.autofill.SaveRequest; import com.android.internal.os.IResultReceiver; /** @@ -29,8 +29,6 @@ import com.android.internal.os.IResultReceiver; */ oneway interface IAutoFillService { void onConnectedStateChanged(boolean connected); - void onFillRequest(in AssistStructure structure, in Bundle extras, - in IFillCallback callback, int flags); - void onSaveRequest(in AssistStructure structure, in Bundle extras, - in ISaveCallback callback); + void onFillRequest(in FillRequest request, in IFillCallback callback); + void onSaveRequest(in SaveRequest request, in ISaveCallback callback); } diff --git a/core/java/android/service/autofill/IFillCallback.aidl b/core/java/android/service/autofill/IFillCallback.aidl index 2bb3e9acd3e1..688ac84b9cd8 100644 --- a/core/java/android/service/autofill/IFillCallback.aidl +++ b/core/java/android/service/autofill/IFillCallback.aidl @@ -27,6 +27,6 @@ import android.service.autofill.FillResponse; */ interface IFillCallback { void onCancellable(in ICancellationSignal cancellation); - void onSuccess(in FillResponse response); + void onSuccess(in FillResponse response, int requestId); void onFailure(CharSequence message); } diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java index 4ad0f086691a..258d257813ca 100644 --- a/core/java/android/service/autofill/SaveInfo.java +++ b/core/java/android/service/autofill/SaveInfo.java @@ -140,7 +140,19 @@ public final class SaveInfo implements Parcelable { */ public static final int SAVE_DATA_TYPE_EMAIL_ADDRESS = 0x10; - private final int mType; + /** @hide */ + @IntDef( + flag = true, + value = { + SAVE_DATA_TYPE_GENERIC, + SAVE_DATA_TYPE_PASSWORD, + SAVE_DATA_TYPE_ADDRESS, + SAVE_DATA_TYPE_CREDIT_CARD, + SAVE_DATA_TYPE_EMAIL_ADDRESS}) + @Retention(RetentionPolicy.SOURCE) + @interface SaveDataType{} + + private final @SaveDataType int mType; private final CharSequence mNegativeActionTitle; private final IntentSender mNegativeActionListener; private final AutofillId[] mRequiredIds; @@ -177,7 +189,7 @@ public final class SaveInfo implements Parcelable { } /** @hide */ - public int getType() { + public @SaveDataType int getType() { return mType; } @@ -191,7 +203,7 @@ public final class SaveInfo implements Parcelable { */ public static final class Builder { - private final int mType; + private final @SaveDataType int mType; private CharSequence mNegativeActionTitle; private IntentSender mNegativeActionListener; // TODO(b/33197203): make mRequiredIds final once addSavableIds() is gone @@ -215,7 +227,7 @@ public final class SaveInfo implements Parcelable { * * @throws IllegalArgumentException if {@code requiredIds} is {@code null} or empty. */ - public Builder(int type, @NonNull AutofillId[] requiredIds) { + public Builder(@SaveDataType int type, @NonNull AutofillId[] requiredIds) { if (false) {// TODO(b/33197203): re-move when clients use it Preconditions.checkArgument(requiredIds != null && requiredIds.length > 0, "must have at least one required id: " + Arrays.toString(requiredIds)); @@ -230,7 +242,7 @@ public final class SaveInfo implements Parcelable { * // TODO(b/33197203): make sure is removed when clients migrated */ @Deprecated - public Builder(int type) { + public Builder(@SaveDataType int type) { this(type, null); } diff --git a/core/java/android/service/autofill/SaveRequest.aidl b/core/java/android/service/autofill/SaveRequest.aidl new file mode 100644 index 000000000000..7789b577714b --- /dev/null +++ b/core/java/android/service/autofill/SaveRequest.aidl @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2017, 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.service.autofill; + +parcelable SaveRequest; diff --git a/core/java/android/service/autofill/SaveRequest.java b/core/java/android/service/autofill/SaveRequest.java new file mode 100644 index 000000000000..9de931542cb9 --- /dev/null +++ b/core/java/android/service/autofill/SaveRequest.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2017 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.service.autofill; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.Bundle; +import android.os.CancellationSignal; +import android.os.Parcel; +import android.os.Parcelable; +import com.android.internal.util.Preconditions; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class represents a request to an {@link AutofillService + * autofill provider} to save applicable data entered by the user. + * + * @see AutofillService#onSaveRequest(SaveRequest, SaveCallback) + */ +public final class SaveRequest implements Parcelable { + private final @NonNull ArrayList<FillContext> mFillContexts; + private final @Nullable Bundle mClientState; + + /** @hide */ + public SaveRequest(@NonNull ArrayList<FillContext> fillContexts, + @Nullable Bundle clientState) { + mFillContexts = Preconditions.checkNotNull(fillContexts, "fillContexts"); + mClientState = clientState; + } + + private SaveRequest(@NonNull Parcel parcel) { + this(parcel.readTypedArrayList(null), parcel.readBundle()); + } + + /** + * @return The contexts associated with each previous fill request. + */ + public @NonNull List<FillContext> getFillContexts() { + return mFillContexts; + } + + /** + * Gets the extra client state returned from the last {@link + * AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)} + * fill request}. + * + * @return The client state. + */ + public @Nullable Bundle getClientState() { + return mClientState; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeTypedArrayList(mFillContexts, flags); + parcel.writeBundle(mClientState); + } + + public static final Creator<SaveRequest> CREATOR = + new Creator<SaveRequest>() { + @Override + public SaveRequest createFromParcel(Parcel parcel) { + return new SaveRequest(parcel); + } + + @Override + public SaveRequest[] newArray(int size) { + return new SaveRequest[size]; + } + }; +} diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 94505d37310d..6a15adeda9ab 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -462,7 +462,7 @@ public class DreamService extends Service implements Window.Callback { * @return The view if found or null otherwise. */ @Nullable - public View findViewById(@IdRes int id) { + public <T extends View> T findViewById(@IdRes int id) { return getWindow().findViewById(id); } diff --git a/core/java/android/service/oemlock/IOemLockService.aidl b/core/java/android/service/oemlock/IOemLockService.aidl new file mode 100644 index 000000000000..2c606f97ab9f --- /dev/null +++ b/core/java/android/service/oemlock/IOemLockService.aidl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2017 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.service.oemlock; + +/** + * Interface for communication with the OemLockService. + * + * @hide + */ +interface IOemLockService { + void setOemUnlockAllowedByCarrier(boolean allowed, in byte[] signature); + boolean isOemUnlockAllowedByCarrier(); + + void setOemUnlockAllowedByUser(boolean allowed); + boolean isOemUnlockAllowedByUser(); +} diff --git a/core/java/android/service/oemlock/OemLockManager.java b/core/java/android/service/oemlock/OemLockManager.java new file mode 100644 index 000000000000..c4fbe5ec7e1a --- /dev/null +++ b/core/java/android/service/oemlock/OemLockManager.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2017 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.service.oemlock; + +import android.annotation.Nullable; +import android.annotation.SystemApi; +import android.os.RemoteException; + +/** + * Interface for managing the OEM lock on the device. + * + * This will only be available if the device implements OEM lock protection. + * + * Multiple actors have an opinion on whether the device can be OEM unlocked and they must all be in + * agreement for unlock to be possible. + * + * @hide + */ +@SystemApi +public class OemLockManager { + private IOemLockService mService; + + /** @hide */ + public OemLockManager(IOemLockService service) { + mService = service; + } + + /** + * Sets whether the carrier has allowed this device to be OEM unlocked. + * + * Depending on the implementation, the validity of the request might need to be proved. This + * can be acheived by passing a signature that the system will use to verify the request is + * legitimate. + * + * All actors involved must agree for OEM unlock to be possible. + * + * @param allowed Whether the device should be allowed to be unlocked. + * @param signature Optional proof of request validity, {@code null} for none. + * @throws IllegalArgumentException if a signature is required but was not provided. + * @throws SecurityException if the wrong signature was provided. + * + * @see #isOemUnlockAllowedByCarrier() + */ + public void setOemUnlockAllowedByCarrier(boolean allowed, @Nullable byte[] signature) { + try { + mService.setOemUnlockAllowedByCarrier(allowed, signature); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Returns whether the carrier has allowed this device to be OEM unlocked. + * @return Whether OEM unlock is allowed by the carrier, or true if no OEM lock is present. + * + * @see #setOemUnlockAllowedByCarrier(boolean, byte[]) + */ + public boolean isOemUnlockAllowedByCarrier() { + try { + return mService.isOemUnlockAllowedByCarrier(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Sets whether the user has allowed this device to be unlocked. + * + * All actors involved must agree for OEM unlock to be possible. + * + * @param unlocked Whether the device should be made OEM unlocked. + * + * @see #isOemUnlockAllowedByUser() + */ + public void setOemUnlockAllowedByUser(boolean allowed) { + try { + mService.setOemUnlockAllowedByUser(allowed); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Returns whether, or not, the user has allowed this device to be OEM unlocked. + * @return Whether OEM unlock is allowed by the user, or true if no OEM lock is present. + * + * @see #setOemUnlockAllowedByUser(boolean) + */ + public boolean isOemUnlockAllowedByUser() { + try { + return mService.isOemUnlockAllowedByUser(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } +} diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java index cb021bc03087..326796afb3ad 100644 --- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java +++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java @@ -146,6 +146,8 @@ public class PersistentDataBlockManager { /** * Writes a byte enabling or disabling the ability to "OEM unlock" the device. + * + * @deprecated use {@link OemLockManager#setOemUnlockAllowedByUser(boolean)} instead. */ public void setOemUnlockEnabled(boolean enabled) { try { @@ -157,6 +159,8 @@ public class PersistentDataBlockManager { /** * Returns whether or not "OEM unlock" is enabled or disabled on this device. + * + * @deprecated use {@link OemLockManager#isOemUnlockAllowedByUser()} instead. */ public boolean getOemUnlockEnabled() { try { diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 6bbb0ff9861b..98780a7d73d5 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -16,6 +16,8 @@ package android.service.wallpaper; +import android.annotation.Nullable; +import android.app.WallpaperColors; import android.content.res.TypedArray; import android.graphics.Canvas; import android.util.MergedConfiguration; @@ -542,6 +544,24 @@ public abstract class WallpaperService extends Service { */ public void onSurfaceDestroyed(SurfaceHolder holder) { } + + /** + * Notifies the engine that wallpaper colors changed significantly. + * This will trigger a {@link #onComputeWallpaperColors()} call. + */ + public void invalidateColors() { + } + + /** + * Notifies the system about what colors the wallpaper is using. + * You might return null if no color information is available at the moment. In that case + * you might want to call {@link #invalidateColors()} in a near future. + * + * @return List of wallpaper colors and their weights. + */ + public @Nullable WallpaperColors onComputeWallpaperColors() { + return null; + } protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) { out.print(prefix); out.print("mInitializing="); out.print(mInitializing); diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 6dedbde01995..3e9fab1aee27 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -205,6 +205,7 @@ public final class Display { * </p> * * @see #getFlags + * @hide */ public static final int FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 1 << 5; diff --git a/core/java/android/view/NotificationHeaderView.java b/core/java/android/view/NotificationHeaderView.java index fe9197867484..20f7acebf6e5 100644 --- a/core/java/android/view/NotificationHeaderView.java +++ b/core/java/android/view/NotificationHeaderView.java @@ -94,8 +94,8 @@ public class NotificationHeaderView extends ViewGroup { super.onFinishInflate(); mAppName = findViewById(com.android.internal.R.id.app_name_text); mHeaderText = findViewById(com.android.internal.R.id.header_text); - mExpandButton = (ImageView) findViewById(com.android.internal.R.id.expand_button); - mIcon = (CachingIconView) findViewById(com.android.internal.R.id.icon); + mExpandButton = findViewById(com.android.internal.R.id.expand_button); + mIcon = findViewById(com.android.internal.R.id.icon); mProfileBadge = findViewById(com.android.internal.R.id.profile_badge); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 8b3e3fe17cc0..172ad8da5381 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -109,7 +109,6 @@ import android.widget.FrameLayout; import android.widget.ScrollBarDrawable; import com.android.internal.R; -import com.android.internal.util.Preconditions; import com.android.internal.view.TooltipPopup; import com.android.internal.view.menu.MenuBuilder; import com.android.internal.widget.ScrollBarUtils; @@ -321,7 +320,7 @@ import java.util.function.Predicate; * </pre></li> * <li>From the onCreate method of an Activity, find the Button * <pre class="prettyprint"> - * Button myButton = (Button) findViewById(R.id.my_button); + * Button myButton = findViewById(R.id.my_button); * </pre></li> * </ul> * <p> @@ -954,41 +953,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE}; - /** @hide */ - @IntDef({ - AUTOFILL_MODE_INHERIT, - AUTOFILL_MODE_AUTO, - AUTOFILL_MODE_MANUAL - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AutofillMode {} - - /** - * This view inherits the autofill state from it's parent. If there is no parent it is - * {@link #AUTOFILL_MODE_AUTO}. - * Use with {@link #setAutofillMode(int)} and <a href="#attr_android:autofillMode"> - * {@code android:autofillMode}. - */ - public static final int AUTOFILL_MODE_INHERIT = 0; - - /** - * Allows this view to automatically trigger an autofill request when it get focus. - * Use with {@link #setAutofillMode(int)} and <a href="#attr_android:autofillMode"> - * {@code android:autofillMode}. - */ - public static final int AUTOFILL_MODE_AUTO = 1; - - /** - * Do not trigger an autofill request if this view is focused. The user can still force - * an autofill request. - * <p>This does not prevent this field from being autofilled if an autofill operation is - * triggered from a different view.</p> - * - * Use with {@link #setAutofillMode(int)} and <a href="#attr_android:autofillMode">{@code - * android:autofillMode}. - */ - public static final int AUTOFILL_MODE_MANUAL = 2; - /** * This view contains an email address. * @@ -2762,7 +2726,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * 1 PFLAG3_IS_AUTOFILLED * 1 PFLAG3_FINGER_DOWN * 1 PFLAG3_FOCUSED_BY_DEFAULT - * 11 PFLAG3_AUTO_FILL_MODE_MASK + * __ unused * 11 PFLAG3_IMPORTANT_FOR_AUTOFILL * 1 PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE * 1 PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED @@ -2992,23 +2956,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static final int PFLAG3_FOCUSED_BY_DEFAULT = 0x40000; /** - * Shift for the place where the autofill mode is stored in the pflags - * - * @see #getAutofillMode() - * @see #setAutofillMode(int) - */ - private static final int PFLAG3_AUTOFILL_MODE_SHIFT = 19; - - /** - * Mask for autofill modes - * - * @see #getAutofillMode() - * @see #setAutofillMode(int) - */ - private static final int PFLAG3_AUTOFILL_MODE_MASK = (AUTOFILL_MODE_INHERIT - | AUTOFILL_MODE_AUTO | AUTOFILL_MODE_MANUAL) << PFLAG3_AUTOFILL_MODE_SHIFT; - - /** * Shift for the bits in {@link #mPrivateFlags3} related to the * "importantForAutofill" attribute. */ @@ -5055,11 +5002,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, setFocusedByDefault(a.getBoolean(attr, true)); } break; - case R.styleable.View_autofillMode: - if (a.peekValue(attr) != null) { - setAutofillMode(a.getInt(attr, AUTOFILL_MODE_INHERIT)); - } - break; case R.styleable.View_autofillHints: if (a.peekValue(attr) != null) { CharSequence[] rawHints = null; @@ -6849,8 +6791,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private void notifyEnterOrExitForAutoFillIfNeeded(boolean enter) { - if (isAutofillable() && isAttachedToWindow() - && getResolvedAutofillMode() == AUTOFILL_MODE_AUTO) { + if (isAutofillable() && isAttachedToWindow()) { AutofillManager afm = getAutofillManager(); if (afm != null) { if (enter && hasWindowFocus() && isFocused()) { @@ -9159,21 +9100,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Set autofill mode for the view. - * - * @param autofillMode One of {@link #AUTOFILL_MODE_INHERIT}, {@link #AUTOFILL_MODE_AUTO}, - * or {@link #AUTOFILL_MODE_MANUAL}. - * @attr ref android.R.styleable#View_autofillMode - */ - public void setAutofillMode(@AutofillMode int autofillMode) { - Preconditions.checkArgumentInRange(autofillMode, AUTOFILL_MODE_INHERIT, - AUTOFILL_MODE_MANUAL, "autofillMode"); - - mPrivateFlags3 &= ~PFLAG3_AUTOFILL_MODE_MASK; - mPrivateFlags3 |= autofillMode << PFLAG3_AUTOFILL_MODE_SHIFT; - } - - /** * Sets the hints that helps the autofill service to select the appropriate data to fill the * view. * @@ -9810,48 +9736,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Returns the autofill mode for this view. - * - * @return One of {@link #AUTOFILL_MODE_INHERIT}, {@link #AUTOFILL_MODE_AUTO}, or - * {@link #AUTOFILL_MODE_MANUAL}. - * @attr ref android.R.styleable#View_autofillMode - */ - @ViewDebug.ExportedProperty(mapping = { - @ViewDebug.IntToString(from = AUTOFILL_MODE_INHERIT, to = "AUTOFILL_MODE_INHERIT"), - @ViewDebug.IntToString(from = AUTOFILL_MODE_AUTO, to = "AUTOFILL_MODE_AUTO"), - @ViewDebug.IntToString(from = AUTOFILL_MODE_MANUAL, to = "AUTOFILL_MODE_MANUAL") - }) - @AutofillMode - public int getAutofillMode() { - return (mPrivateFlags3 & PFLAG3_AUTOFILL_MODE_MASK) >> PFLAG3_AUTOFILL_MODE_SHIFT; - } - - /** - * Returns the resolved autofill mode for this view. - * - * This is the same as {@link #getAutofillMode()} but if the mode is - * {@link #AUTOFILL_MODE_INHERIT} the parents autofill mode will be returned. - * - * @return One of {@link #AUTOFILL_MODE_AUTO}, or {@link #AUTOFILL_MODE_MANUAL}. If the auto- - * fill mode can not be resolved e.g. {@link #getAutofillMode()} is - * {@link #AUTOFILL_MODE_INHERIT} and the {@link View} is detached - * {@link #AUTOFILL_MODE_AUTO} is returned. - */ - public @AutofillMode int getResolvedAutofillMode() { - @AutofillMode int autofillMode = getAutofillMode(); - - if (autofillMode == AUTOFILL_MODE_INHERIT) { - if (mParent == null) { - return AUTOFILL_MODE_AUTO; - } else { - return mParent.getResolvedAutofillMode(); - } - } else { - return autofillMode; - } - } - - /** * Find the nearest view in the specified direction that can take focus. * This does not actually give focus to that view. * diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java index d5aab48afe32..cc11cb8205d5 100644 --- a/core/java/android/view/ViewParent.java +++ b/core/java/android/view/ViewParent.java @@ -659,17 +659,4 @@ public interface ViewParent { * @return true if the action was consumed by this ViewParent */ public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle arguments); - - /** - * Return the resolved autofill mode. - * - * @return One of {@link View#AUTOFILL_MODE_AUTO}, {@link View#AUTOFILL_MODE_MANUAL} if the - * autofill mode can be resolved. If the autofill mode cannot be resolved - * {@link View#AUTOFILL_MODE_AUTO}. - * - * @see View#getResolvedAutofillMode() - */ - default @View.AutofillMode int getResolvedAutofillMode() { - return View.AUTOFILL_MODE_AUTO; - } } diff --git a/core/java/android/view/ViewStub.java b/core/java/android/view/ViewStub.java index 85d10f199218..e9d1b8784914 100644 --- a/core/java/android/view/ViewStub.java +++ b/core/java/android/view/ViewStub.java @@ -58,7 +58,7 @@ import java.lang.ref.WeakReference; * The preferred way to perform the inflation of the layout resource is the following: * * <pre> - * ViewStub stub = (ViewStub) findViewById(R.id.stub); + * ViewStub stub = findViewById(R.id.stub); * View inflated = stub.inflate(); * </pre> * diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 41c209cc016a..ec6559cba39b 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -101,7 +101,10 @@ public final class AutofillManager { // Public flags start from the lowest bit /** * Indicates autofill was explicitly requested by the user. + * + * @deprecated Use {@link android.service.autofill.FillRequest#FLAG_MANUAL_REQUEST} */ + @Deprecated public static final int FLAG_MANUAL_REQUEST = 0x1; // Private flags start from the highest bit @@ -760,8 +763,8 @@ public final class AutofillManager { } } - private void requestShowFillUi(IBinder windowToken, AutofillId id, int width, int height, - Rect anchorBounds, IAutofillWindowPresenter presenter) { + private void requestShowFillUi(int sessionId, IBinder windowToken, AutofillId id, int width, + int height, Rect anchorBounds, IAutofillWindowPresenter presenter) { final View anchor = findAchorView(windowToken, id); if (anchor == null) { return; @@ -769,9 +772,15 @@ public final class AutofillManager { AutofillCallback callback = null; synchronized (mLock) { - if (getClientLocked().autofillCallbackRequestShowFillUi(anchor, width, height, - anchorBounds, presenter) && mCallback != null) { - callback = mCallback; + if (mSessionId == sessionId) { + AutofillClient client = getClientLocked(); + + if (client != null) { + if (client.autofillCallbackRequestShowFillUi(anchor, width, height, + anchorBounds, presenter) && mCallback != null) { + callback = mCallback; + } + } } } @@ -785,6 +794,23 @@ public final class AutofillManager { } } + private void authenticate(int sessionId, IntentSender intent, Intent fillInIntent) { + synchronized (mLock) { + if (sessionId == mSessionId) { + AutofillClient client = getClientLocked(); + if (client != null) { + client.autofillCallbackAuthenticate(intent, fillInIntent); + } + } + } + } + + private void setState(boolean enabled) { + synchronized (mLock) { + mEnabled = enabled; + } + } + /** * Sets a view as autofilled if the current value is the {code targetValue}. * @@ -804,80 +830,92 @@ public final class AutofillManager { } } - private void handleAutofill(IBinder windowToken, List<AutofillId> ids, + private void autofill(int sessionId, IBinder windowToken, List<AutofillId> ids, List<AutofillValue> values) { - final View root = WindowManagerGlobal.getInstance().getWindowView(windowToken); - if (root == null) { - return; - } - - final int itemCount = ids.size(); - int numApplied = 0; - ArrayMap<View, SparseArray<AutofillValue>> virtualValues = null; + synchronized (mLock) { + if (sessionId != mSessionId) { + return; + } - for (int i = 0; i < itemCount; i++) { - final AutofillId id = ids.get(i); - final AutofillValue value = values.get(i); - final int viewId = id.getViewId(); - final View view = root.findViewByAccessibilityIdTraversal(viewId); - if (view == null) { - Log.w(TAG, "autofill(): no View with id " + viewId); - continue; + final View root = WindowManagerGlobal.getInstance().getWindowView(windowToken); + if (root == null) { + return; } - if (id.isVirtual()) { - if (virtualValues == null) { - // Most likely there will be just one view with virtual children. - virtualValues = new ArrayMap<>(1); - } - SparseArray<AutofillValue> valuesByParent = virtualValues.get(view); - if (valuesByParent == null) { - // We don't know the size yet, but usually it will be just a few fields... - valuesByParent = new SparseArray<>(5); - virtualValues.put(view, valuesByParent); + + final int itemCount = ids.size(); + int numApplied = 0; + ArrayMap<View, SparseArray<AutofillValue>> virtualValues = null; + + for (int i = 0; i < itemCount; i++) { + final AutofillId id = ids.get(i); + final AutofillValue value = values.get(i); + final int viewId = id.getViewId(); + final View view = root.findViewByAccessibilityIdTraversal(viewId); + if (view == null) { + Log.w(TAG, "autofill(): no View with id " + viewId); + continue; } - valuesByParent.put(id.getVirtualChildId(), value); - } else { - synchronized (mLock) { + if (id.isVirtual()) { + if (virtualValues == null) { + // Most likely there will be just one view with virtual children. + virtualValues = new ArrayMap<>(1); + } + SparseArray<AutofillValue> valuesByParent = virtualValues.get(view); + if (valuesByParent == null) { + // We don't know the size yet, but usually it will be just a few fields... + valuesByParent = new SparseArray<>(5); + virtualValues.put(view, valuesByParent); + } + valuesByParent.put(id.getVirtualChildId(), value); + } else { // Mark the view as to be autofilled with 'value' if (mLastAutofilledData == null) { mLastAutofilledData = new ParcelableMap(itemCount - i); } mLastAutofilledData.put(id, value); - } - view.autofill(value); + view.autofill(value); - // Set as autofilled if the values match now, e.g. when the value was updated - // synchronously. - // If autofill happens async, the view is set to autofilled in notifyValueChanged. - setAutofilledIfValuesIs(view, value); + // Set as autofilled if the values match now, e.g. when the value was updated + // synchronously. + // If autofill happens async, the view is set to autofilled in + // notifyValueChanged. + setAutofilledIfValuesIs(view, value); - numApplied++; + numApplied++; + } } - } - if (virtualValues != null) { - for (int i = 0; i < virtualValues.size(); i++) { - final View parent = virtualValues.keyAt(i); - final SparseArray<AutofillValue> childrenValues = virtualValues.valueAt(i); - parent.autofill(childrenValues); - numApplied += childrenValues.size(); + if (virtualValues != null) { + for (int i = 0; i < virtualValues.size(); i++) { + final View parent = virtualValues.keyAt(i); + final SparseArray<AutofillValue> childrenValues = virtualValues.valueAt(i); + parent.autofill(childrenValues); + numApplied += childrenValues.size(); + } } - } - final LogMaker log = new LogMaker(MetricsProto.MetricsEvent.AUTOFILL_DATASET_APPLIED); - log.addTaggedData(MetricsProto.MetricsEvent.FIELD_AUTOFILL_NUM_VALUES, itemCount); - log.addTaggedData(MetricsProto.MetricsEvent.FIELD_AUTOFILL_NUM_VIEWS_FILLED, numApplied); - mMetricsLogger.write(log); + final LogMaker log = new LogMaker(MetricsProto.MetricsEvent.AUTOFILL_DATASET_APPLIED); + log.addTaggedData(MetricsProto.MetricsEvent.FIELD_AUTOFILL_NUM_VALUES, itemCount); + log.addTaggedData(MetricsProto.MetricsEvent.FIELD_AUTOFILL_NUM_VIEWS_FILLED, + numApplied); + mMetricsLogger.write(log); + } } - private void requestHideFillUi(IBinder windowToken, AutofillId id) { + private void requestHideFillUi(int sessionId, IBinder windowToken, AutofillId id) { final View anchor = findAchorView(windowToken, id); AutofillCallback callback = null; synchronized (mLock) { - if (getClientLocked().autofillCallbackRequestHideFillUi() && mCallback != null) { - callback = mCallback; + if (mSessionId == sessionId) { + AutofillClient client = getClientLocked(); + + if (client != null) { + if (client.autofillCallbackRequestHideFillUi() && mCallback != null) { + callback = mCallback; + } + } } } @@ -891,12 +929,14 @@ public final class AutofillManager { } } - private void notifyNoFillUi(IBinder windowToken, AutofillId id) { + private void notifyNoFillUi(int sessionId, IBinder windowToken, AutofillId id) { final View anchor = findAchorView(windowToken, id); - AutofillCallback callback; + AutofillCallback callback = null; synchronized (mLock) { - callback = mCallback; + if (mSessionId == sessionId && getClientLocked() != null) { + callback = mCallback; + } } if (callback != null) { @@ -999,73 +1039,57 @@ public final class AutofillManager { public void setState(boolean enabled) { final AutofillManager afm = mAfm.get(); if (afm != null) { - afm.mContext.getMainThreadHandler().post(() -> { - synchronized (afm.mLock) { - afm.mEnabled = enabled; - } - }); + afm.mContext.getMainThreadHandler().post(() -> afm.setState(enabled)); } } @Override - public void autofill(IBinder windowToken, List<AutofillId> ids, + public void autofill(int sessionId, IBinder windowToken, List<AutofillId> ids, List<AutofillValue> values) { // TODO(b/33197203): must keep the dataset so subsequent calls pass the same // dataset.extras to service final AutofillManager afm = mAfm.get(); if (afm != null) { - afm.mContext.getMainThreadHandler().post(() -> - afm.handleAutofill(windowToken, ids, values)); + afm.mContext.getMainThreadHandler().post( + () -> afm.autofill(sessionId, windowToken, ids, values)); } } @Override - public void authenticate(IntentSender intent, Intent fillInIntent) { + public void authenticate(int sessionId, IntentSender intent, Intent fillInIntent) { final AutofillManager afm = mAfm.get(); if (afm != null) { - afm.mContext.getMainThreadHandler().post(() -> { - if (afm.getClientLocked() != null) { - afm.getClientLocked().autofillCallbackAuthenticate(intent, fillInIntent); - } - }); + afm.mContext.getMainThreadHandler().post( + () -> afm.authenticate(sessionId, intent, fillInIntent)); } } @Override - public void requestShowFillUi(IBinder windowToken, AutofillId id, + public void requestShowFillUi(int sessionId, IBinder windowToken, AutofillId id, int width, int height, Rect anchorBounds, IAutofillWindowPresenter presenter) { final AutofillManager afm = mAfm.get(); if (afm != null) { - afm.mContext.getMainThreadHandler().post(() -> { - if (afm.getClientLocked() != null) { - afm.requestShowFillUi(windowToken, id, width, - height, anchorBounds, presenter); - } - }); + afm.mContext.getMainThreadHandler().post( + () -> afm.requestShowFillUi(sessionId, windowToken, id, width, height, + anchorBounds, presenter)); } } @Override - public void requestHideFillUi(IBinder windowToken, AutofillId id) { + public void requestHideFillUi(int sessionId, IBinder windowToken, AutofillId id) { final AutofillManager afm = mAfm.get(); if (afm != null) { - afm.mContext.getMainThreadHandler().post(() -> { - if (afm.getClientLocked() != null) { - afm.requestHideFillUi(windowToken, id); - } - }); + afm.mContext.getMainThreadHandler().post( + () -> afm.requestHideFillUi(sessionId, windowToken, id)); } } @Override - public void notifyNoFillUi(IBinder windowToken, AutofillId id) { + public void notifyNoFillUi(int sessionId, IBinder windowToken, AutofillId id) { final AutofillManager afm = mAfm.get(); if (afm != null) { - afm.mContext.getMainThreadHandler().post(() -> { - if (afm.getClientLocked() != null) { - afm.notifyNoFillUi(windowToken, id); - } - }); + afm.mContext.getMainThreadHandler().post( + () -> afm.notifyNoFillUi(sessionId, windowToken, id)); } } diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl index 176eaacb57ae..56f91ed6de9b 100644 --- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl +++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl @@ -40,28 +40,29 @@ oneway interface IAutoFillManagerClient { /** * Autofills the activity with the contents of a dataset. */ - void autofill(in IBinder windowToken, in List<AutofillId> ids, in List<AutofillValue> values); + void autofill(int sessionId, in IBinder windowToken, in List<AutofillId> ids, + in List<AutofillValue> values); /** * Authenticates a fill response or a data set. */ - void authenticate(in IntentSender intent, in Intent fillInIntent); + void authenticate(int sessionId, in IntentSender intent, in Intent fillInIntent); /** * Requests showing the fill UI. */ - void requestShowFillUi(in IBinder windowToken, in AutofillId id, int width, + void requestShowFillUi(int sessionId, in IBinder windowToken, in AutofillId id, int width, int height, in Rect anchorBounds, in IAutofillWindowPresenter presenter); /** * Requests hiding the fill UI. */ - void requestHideFillUi(in IBinder windowToken, in AutofillId id); + void requestHideFillUi(int sessionId, in IBinder windowToken, in AutofillId id); /** * Notifies no fill UI will be shown. */ - void notifyNoFillUi(in IBinder windowToken, in AutofillId id); + void notifyNoFillUi(int sessionId, in IBinder windowToken, in AutofillId id); /** * Starts the provided intent sender diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java index 2f12e9b5be83..28d9fcf57370 100644 --- a/core/java/android/view/inputmethod/EditorInfo.java +++ b/core/java/android/view/inputmethod/EditorInfo.java @@ -155,7 +155,7 @@ public class EditorInfo implements InputType, Parcelable { public static final int IME_ACTION_PREVIOUS = 0x00000007; /** - * Flag of {@link #imeOptions}: used to request that the IME does not update any personalized + * Flag of {@link #imeOptions}: used to request that the IME should not update any personalized * data such as typing history and personalized language model based on what the user typed on * this text editing object. Typical use cases are: * <ul> diff --git a/core/java/android/widget/AppSecurityPermissions.java b/core/java/android/widget/AppSecurityPermissions.java index 06d486813b1b..6df76fa2e09a 100644 --- a/core/java/android/widget/AppSecurityPermissions.java +++ b/core/java/android/widget/AppSecurityPermissions.java @@ -151,8 +151,8 @@ public class AppSecurityPermissions { mShowRevokeUI = showRevokeUI; mPackageName = packageName; - ImageView permGrpIcon = (ImageView) findViewById(R.id.perm_icon); - TextView permNameView = (TextView) findViewById(R.id.perm_name); + ImageView permGrpIcon = findViewById(R.id.perm_icon); + TextView permNameView = findViewById(R.id.perm_name); PackageManager pm = getContext().getPackageManager(); Drawable icon = null; diff --git a/core/java/android/widget/Button.java b/core/java/android/widget/Button.java index 09e09b7c2c9c..09ba553cbf3e 100644 --- a/core/java/android/widget/Button.java +++ b/core/java/android/widget/Button.java @@ -37,7 +37,7 @@ import android.widget.RemoteViews.RemoteView; * * setContentView(R.layout.content_layout_id); * - * final Button button = (Button) findViewById(R.id.button_id); + * final Button button = findViewById(R.id.button_id); * button.setOnClickListener(new View.OnClickListener() { * public void onClick(View v) { * // Perform action on click diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java index 0f0e6c30979d..be0967f162c4 100644 --- a/core/java/android/widget/DayPickerView.java +++ b/core/java/android/widget/DayPickerView.java @@ -124,13 +124,13 @@ class DayPickerView extends ViewGroup { addView(child); } - mPrevButton = (ImageButton) findViewById(R.id.prev); + mPrevButton = findViewById(R.id.prev); mPrevButton.setOnClickListener(mOnClickListener); - mNextButton = (ImageButton) findViewById(R.id.next); + mNextButton = findViewById(R.id.next); mNextButton.setOnClickListener(mOnClickListener); - mViewPager = (ViewPager) findViewById(R.id.day_picker_view_pager); + mViewPager = findViewById(R.id.day_picker_view_pager); mViewPager.setAdapter(mAdapter); mViewPager.setOnPageChangeListener(mOnPageChangedListener); diff --git a/core/java/android/widget/MultiAutoCompleteTextView.java b/core/java/android/widget/MultiAutoCompleteTextView.java index 2152e4338362..f348d73c1b42 100644 --- a/core/java/android/widget/MultiAutoCompleteTextView.java +++ b/core/java/android/widget/MultiAutoCompleteTextView.java @@ -43,7 +43,7 @@ import android.util.AttributeSet; * * ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, * android.R.layout.simple_dropdown_item_1line, COUNTRIES); - * MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.edit); + * MultiAutoCompleteTextView textView = findViewById(R.id.edit); * textView.setAdapter(adapter); * textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); * } diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 662e64099fc8..7bdd6dadf415 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -706,7 +706,7 @@ public class NumberPicker extends LinearLayout { // increment button if (!mHasSelectorWheel) { - mIncrementButton = (ImageButton) findViewById(R.id.increment); + mIncrementButton = findViewById(R.id.increment); mIncrementButton.setOnClickListener(onClickListener); mIncrementButton.setOnLongClickListener(onLongClickListener); } else { @@ -715,7 +715,7 @@ public class NumberPicker extends LinearLayout { // decrement button if (!mHasSelectorWheel) { - mDecrementButton = (ImageButton) findViewById(R.id.decrement); + mDecrementButton = findViewById(R.id.decrement); mDecrementButton.setOnClickListener(onClickListener); mDecrementButton.setOnLongClickListener(onLongClickListener); } else { @@ -723,7 +723,7 @@ public class NumberPicker extends LinearLayout { } // input text - mInputText = (EditText) findViewById(R.id.numberpicker_input); + mInputText = findViewById(R.id.numberpicker_input); mInputText.setOnFocusChangeListener(new OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 5505f2fef919..9245134fd266 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -1787,7 +1787,7 @@ public class RemoteViews implements Parcelable, Filter { @Override public Action initActionAsync(ViewTree root, ViewGroup rootParent, OnClickHandler handler) { - final TextView target = (TextView) root.findViewById(viewId); + final TextView target = root.findViewById(viewId); if (target == null) return ACTION_NOOP; TextViewDrawableAction copy = useIcons ? @@ -3688,12 +3688,12 @@ public class RemoteViews implements Parcelable, Filter { createTree(); } - public View findViewById(int id) { + public <T extends View> T findViewById(int id) { if (mChildren == null) { return mRoot.findViewById(id); } ViewTree tree = findViewTreeById(id); - return tree == null ? null : tree.mRoot; + return tree == null ? null : (T) tree.mRoot; } public void addChild(ViewTree child) { diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java index 7e2cadfc8c45..8de17c072b59 100644 --- a/core/java/android/widget/TabHost.java +++ b/core/java/android/widget/TabHost.java @@ -136,7 +136,7 @@ mTabHost.setup(); mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1"); */ public void setup() { - mTabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs); + mTabWidget = findViewById(com.android.internal.R.id.tabs); if (mTabWidget == null) { throw new RuntimeException( "Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'"); @@ -171,7 +171,7 @@ mTabHost.addTab(TAB_TAG_1, "Hello, world!", "Tab 1"); } }); - mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent); + mTabContent = findViewById(com.android.internal.R.id.tabcontent); if (mTabContent == null) { throw new RuntimeException( "Your TabHost must have a FrameLayout whose id attribute is " diff --git a/core/java/android/widget/TextInputTimePickerView.java b/core/java/android/widget/TextInputTimePickerView.java index 0183343e96e1..11b7514d6ac8 100644 --- a/core/java/android/widget/TextInputTimePickerView.java +++ b/core/java/android/widget/TextInputTimePickerView.java @@ -76,12 +76,12 @@ public class TextInputTimePickerView extends RelativeLayout { inflate(context, R.layout.time_picker_text_input_material, this); - mHourEditText = (EditText) findViewById(R.id.input_hour); - mMinuteEditText = (EditText) findViewById(R.id.input_minute); - mInputSeparatorView = (TextView) findViewById(R.id.input_separator); - mErrorLabel = (TextView) findViewById(R.id.label_error); - mHourLabel = (TextView) findViewById(R.id.label_hour); - mMinuteLabel = (TextView) findViewById(R.id.label_minute); + mHourEditText = findViewById(R.id.input_hour); + mMinuteEditText = findViewById(R.id.input_minute); + mInputSeparatorView = findViewById(R.id.input_separator); + mErrorLabel = findViewById(R.id.label_error); + mHourLabel = findViewById(R.id.label_hour); + mMinuteLabel = findViewById(R.id.label_minute); mHourEditText.addTextChangedListener(new TextWatcher() { @Override @@ -109,7 +109,7 @@ public class TextInputTimePickerView extends RelativeLayout { } }); - mAmPmSpinner = (Spinner) findViewById(R.id.am_pm_spinner); + mAmPmSpinner = findViewById(R.id.am_pm_spinner); final String[] amPmStrings = TimePicker.getAmPmStrings(context); ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(context, R.layout.simple_spinner_dropdown_item); diff --git a/core/java/android/widget/TwoLineListItem.java b/core/java/android/widget/TwoLineListItem.java index 0445ebd50926..553b86e1f0c2 100644 --- a/core/java/android/widget/TwoLineListItem.java +++ b/core/java/android/widget/TwoLineListItem.java @@ -70,8 +70,8 @@ public class TwoLineListItem extends RelativeLayout { protected void onFinishInflate() { super.onFinishInflate(); - mText1 = (TextView) findViewById(com.android.internal.R.id.text1); - mText2 = (TextView) findViewById(com.android.internal.R.id.text2); + mText1 = findViewById(com.android.internal.R.id.text1); + mText2 = findViewById(com.android.internal.R.id.text2); } /** diff --git a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java index ee5d339a19d3..032c7750c1d6 100644 --- a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java +++ b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java @@ -59,13 +59,13 @@ public class AccessibilityButtonChooserActivity extends Activity { String component = Settings.Secure.getString(getContentResolver(), Settings.Secure.ACCESSIBILITY_BUTTON_TARGET_COMPONENT); if (TextUtils.isEmpty(component)) { - TextView prompt = (TextView) findViewById(R.id.accessibility_button_prompt); + TextView prompt = findViewById(R.id.accessibility_button_prompt); prompt.setVisibility(View.VISIBLE); } mMagnificationTarget = new AccessibilityButtonTarget(this, MAGNIFICATION_COMPONENT_ID, R.string.accessibility_magnification_chooser_text, - R.drawable.resolver_icon_placeholder); + R.drawable.ic_accessibility_magnification); mTargets = getServiceAccessibilityButtonTargets(this); if (Settings.Secure.getInt(getContentResolver(), @@ -78,7 +78,7 @@ public class AccessibilityButtonChooserActivity extends Activity { finish(); } - GridView gridview = (GridView) findViewById(R.id.accessibility_button_chooser_grid); + GridView gridview = findViewById(R.id.accessibility_button_chooser_grid); gridview.setAdapter(new TargetAdapter()); gridview.setOnItemClickListener((parent, view, position, id) -> { onTargetSelected(mTargets.get(position)); diff --git a/core/java/com/android/internal/app/AlertActivity.java b/core/java/com/android/internal/app/AlertActivity.java index 35ffa71de56f..999a908251dd 100644 --- a/core/java/com/android/internal/app/AlertActivity.java +++ b/core/java/com/android/internal/app/AlertActivity.java @@ -67,10 +67,15 @@ public abstract class AlertActivity extends Activity implements DialogInterface @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + return dispatchPopulateAccessibilityEvent(this, event); + } + + public static boolean dispatchPopulateAccessibilityEvent(Activity act, + AccessibilityEvent event) { event.setClassName(Dialog.class.getName()); - event.setPackageName(getPackageName()); + event.setPackageName(act.getPackageName()); - ViewGroup.LayoutParams params = getWindow().getAttributes(); + ViewGroup.LayoutParams params = act.getWindow().getAttributes(); boolean isFullScreen = (params.width == ViewGroup.LayoutParams.MATCH_PARENT) && (params.height == ViewGroup.LayoutParams.MATCH_PARENT); event.setFullScreen(isFullScreen); @@ -86,8 +91,7 @@ public abstract class AlertActivity extends Activity implements DialogInterface * @see #mAlertParams */ protected void setupAlert() { - mAlertParams.apply(mAlert); - mAlert.installContent(); + mAlert.installContent(mAlertParams); } @Override diff --git a/core/java/com/android/internal/app/AlertController.java b/core/java/com/android/internal/app/AlertController.java index 95c291a9e8fe..46cb5461b682 100644 --- a/core/java/com/android/internal/app/AlertController.java +++ b/core/java/com/android/internal/app/AlertController.java @@ -247,6 +247,11 @@ public class AlertController { return false; } + public void installContent(AlertParams params) { + params.apply(this); + installContent(); + } + public void installContent() { int contentView = selectContentView(); mWindow.setContentView(contentView); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 622b70843cc2..b59667815922 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -287,7 +287,7 @@ public class ResolverActivity extends Activity { return; } - final ResolverDrawerLayout rdl = (ResolverDrawerLayout) findViewById(R.id.contentPanel); + final ResolverDrawerLayout rdl = findViewById(R.id.contentPanel); if (rdl != null) { rdl.setOnDismissedListener(new ResolverDrawerLayout.OnDismissedListener() { @Override @@ -922,10 +922,10 @@ public class ResolverActivity extends Activity { } - mAdapterView = (AbsListView) findViewById(R.id.resolver_list); + mAdapterView = findViewById(R.id.resolver_list); if (count == 0 && mAdapter.mPlaceholderCount == 0) { - final TextView emptyView = (TextView) findViewById(R.id.empty); + final TextView emptyView = findViewById(R.id.empty); emptyView.setVisibility(View.VISIBLE); mAdapterView.setVisibility(View.GONE); } else { @@ -959,7 +959,7 @@ public class ResolverActivity extends Activity { public void setTitleAndIcon() { if (mAdapter.getCount() == 0 && mAdapter.mPlaceholderCount == 0) { - final TextView titleView = (TextView) findViewById(R.id.title); + final TextView titleView = findViewById(R.id.title); if (titleView != null) { titleView.setVisibility(View.GONE); } @@ -970,14 +970,14 @@ public class ResolverActivity extends Activity { : getTitleForAction(getTargetIntent().getAction(), mDefaultTitleResId); if (!TextUtils.isEmpty(title)) { - final TextView titleView = (TextView) findViewById(R.id.title); + final TextView titleView = findViewById(R.id.title); if (titleView != null) { titleView.setText(title); } setTitle(title); // Try to initialize the title icon if we have a view for it and a title to match - final ImageView titleIcon = (ImageView) findViewById(R.id.title_icon); + final ImageView titleIcon = findViewById(R.id.title_icon); if (titleIcon != null) { ApplicationInfo ai = null; try { @@ -994,7 +994,7 @@ public class ResolverActivity extends Activity { } } - final ImageView iconView = (ImageView) findViewById(R.id.icon); + final ImageView iconView = findViewById(R.id.icon); final DisplayResolveInfo iconInfo = mAdapter.getFilteredItem(); if (iconView != null && iconInfo != null) { new LoadIconIntoViewTask(iconInfo, iconView).execute(); @@ -1003,7 +1003,7 @@ public class ResolverActivity extends Activity { public void resetAlwaysOrOnceButtonBar() { if (mSupportsAlwaysUseOption) { - final ViewGroup buttonLayout = (ViewGroup) findViewById(R.id.button_bar); + final ViewGroup buttonLayout = findViewById(R.id.button_bar); if (buttonLayout != null) { buttonLayout.setVisibility(View.VISIBLE); mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always); diff --git a/core/java/com/android/internal/app/SuggestedLocaleAdapter.java b/core/java/com/android/internal/app/SuggestedLocaleAdapter.java index cb2b0191b883..46f47a31441c 100644 --- a/core/java/com/android/internal/app/SuggestedLocaleAdapter.java +++ b/core/java/com/android/internal/app/SuggestedLocaleAdapter.java @@ -16,6 +16,10 @@ package com.android.internal.app; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Context; +import android.content.res.Configuration; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -57,6 +61,10 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable { private final boolean mCountryMode; private LayoutInflater mInflater; + private Locale mDisplayLocale = null; + // used to potentially cache a modified Context that uses mDisplayLocale + private Context mContextOverride = null; + public SuggestedLocaleAdapter(Set<LocaleStore.LocaleInfo> localeOptions, boolean countryMode) { mCountryMode = countryMode; mLocaleOptions = new ArrayList<>(localeOptions.size()); @@ -126,6 +134,31 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable { return position; } + /** + * Overrides the locale used to display localized labels. Setting the locale to null will reset + * the Adapter to use the default locale for the labels. + */ + public void setDisplayLocale(@NonNull Context context, @Nullable Locale locale) { + if (locale == null) { + mDisplayLocale = null; + mContextOverride = null; + } else if (!locale.equals(mDisplayLocale)) { + mDisplayLocale = locale; + final Configuration configOverride = new Configuration(); + configOverride.setLocale(locale); + mContextOverride = context.createConfigurationContext(configOverride); + } + } + + private void setTextTo(@NonNull TextView textView, int resId) { + if (mContextOverride == null) { + textView.setText(resId); + } else { + textView.setText(mContextOverride.getText(resId)); + // If mContextOverride is not null, mDisplayLocale can't be null either. + } + } + @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null && mInflater == null) { @@ -143,15 +176,16 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable { } TextView textView = (TextView) convertView; if (itemType == TYPE_HEADER_SUGGESTED) { - textView.setText(R.string.language_picker_section_suggested); + setTextTo(textView, R.string.language_picker_section_suggested); } else { if (mCountryMode) { - textView.setText(R.string.region_picker_section_all); + setTextTo(textView, R.string.region_picker_section_all); } else { - textView.setText(R.string.language_picker_section_all); + setTextTo(textView, R.string.language_picker_section_all); } } - textView.setTextLocale(Locale.getDefault()); + textView.setTextLocale( + mDisplayLocale != null ? mDisplayLocale : Locale.getDefault()); break; default: // Covers both null, and "reusing" a wrong kind of view diff --git a/core/java/com/android/internal/notification/NotificationAccessConfirmationActivityContract.java b/core/java/com/android/internal/notification/NotificationAccessConfirmationActivityContract.java new file mode 100644 index 000000000000..4ce6f609ef73 --- /dev/null +++ b/core/java/com/android/internal/notification/NotificationAccessConfirmationActivityContract.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2017 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 com.android.internal.notification; + +import android.content.ComponentName; +import android.content.Intent; + +public final class NotificationAccessConfirmationActivityContract { + private static final ComponentName COMPONENT_NAME = new ComponentName( + "com.android.settings", + "com.android.settings.notification.NotificationAccessConfirmationActivity"); + public static final String EXTRA_USER_ID = "user_id"; + public static final String EXTRA_COMPONENT_NAME = "component_name"; + public static final String EXTRA_PACKAGE_TITLE = "package_title"; + + public static Intent launcherIntent(int userId, ComponentName component, String packageTitle) { + return new Intent() + .setComponent(COMPONENT_NAME) + .putExtra(EXTRA_USER_ID, userId) + .putExtra(EXTRA_COMPONENT_NAME, component) + .putExtra(EXTRA_PACKAGE_TITLE, packageTitle); + } +} diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index c4540f59ebb1..baf6db93daaf 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -1688,7 +1688,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } }; } else { - ViewStub stub = (ViewStub) findViewById(R.id.action_mode_bar_stub); + ViewStub stub = findViewById(R.id.action_mode_bar_stub); if (stub != null) { mPrimaryActionModeView = (ActionBarContextView) stub.inflate(); mPrimaryActionModePopup = null; diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 7b966de86756..243916b4ade2 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -1593,7 +1593,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (featureId == FEATURE_PROGRESS || featureId == FEATURE_INDETERMINATE_PROGRESS) { updateProgressBars(value); } else if (featureId == FEATURE_CUSTOM_TITLE) { - FrameLayout titleContainer = (FrameLayout) findViewById(R.id.title_container); + FrameLayout titleContainer = findViewById(R.id.title_container); if (titleContainer != null) { mLayoutInflater.inflate(value, titleContainer); } @@ -2690,7 +2690,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { invalidatePanelMenu(FEATURE_ACTION_BAR); } } else { - mTitleView = (TextView) findViewById(R.id.title); + mTitleView = findViewById(R.id.title); if (mTitleView != null) { if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) { final View titleContainer = findViewById(R.id.title_container); @@ -2967,7 +2967,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (mContentParent == null && shouldInstallDecor) { installDecor(); } - mCircularProgressBar = (ProgressBar) findViewById(R.id.progress_circular); + mCircularProgressBar = findViewById(R.id.progress_circular); if (mCircularProgressBar != null) { mCircularProgressBar.setVisibility(View.INVISIBLE); } @@ -2981,7 +2981,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (mContentParent == null && shouldInstallDecor) { installDecor(); } - mHorizontalProgressBar = (ProgressBar) findViewById(R.id.progress_horizontal); + mHorizontalProgressBar = findViewById(R.id.progress_horizontal); if (mHorizontalProgressBar != null) { mHorizontalProgressBar.setVisibility(View.INVISIBLE); } diff --git a/core/java/com/android/internal/util/CollectionUtils.java b/core/java/com/android/internal/util/CollectionUtils.java index 287f68cf5a55..96b443d28abc 100644 --- a/core/java/com/android/internal/util/CollectionUtils.java +++ b/core/java/com/android/internal/util/CollectionUtils.java @@ -16,6 +16,8 @@ package com.android.internal.util; +import static com.android.internal.util.ArrayUtils.isEmpty; + import android.annotation.NonNull; import android.annotation.Nullable; @@ -64,7 +66,7 @@ public class CollectionUtils { */ public static @NonNull <I, O> List<O> map(@Nullable List<I> cur, Function<? super I, ? extends O> f) { - if (cur == null || cur.isEmpty()) return Collections.emptyList(); + if (isEmpty(cur)) return Collections.emptyList(); final ArrayList<O> result = new ArrayList<>(); for (int i = 0; i < cur.size(); i++) { result.add(f.apply(cur.get(i))); @@ -73,6 +75,30 @@ public class CollectionUtils { } /** + * {@link #map(List, Function)} + {@link #filter(List, java.util.function.Predicate)} + * + * Calling this is equivalent (but more memory efficient) to: + * + * {@code + * filter( + * map(cur, f), + * i -> { i != null }) + * } + */ + public static @NonNull <I, O> List<O> mapNotNull(@Nullable List<I> cur, + Function<? super I, ? extends O> f) { + if (isEmpty(cur)) return Collections.emptyList(); + final ArrayList<O> result = new ArrayList<>(); + for (int i = 0; i < cur.size(); i++) { + O transformed = f.apply(cur.get(i)); + if (transformed != null) { + result.add(transformed); + } + } + return result; + } + + /** * Returns the given list, or an immutable empty list if the provided list is null * * This can be used to guaranty null-safety without paying the price of extra allocations @@ -94,7 +120,7 @@ public class CollectionUtils { * Returns the elements of the given list that are of type {@code c} */ public static @NonNull <T> List<T> filter(@Nullable List<?> list, Class<T> c) { - if (ArrayUtils.isEmpty(list)) return Collections.emptyList(); + if (isEmpty(list)) return Collections.emptyList(); ArrayList<T> result = null; for (int i = 0; i < list.size(); i++) { final Object item = list.get(i); @@ -120,11 +146,42 @@ public class CollectionUtils { */ public static @Nullable <T> T find(@Nullable List<T> items, java.util.function.Predicate<T> predicate) { - if (ArrayUtils.isEmpty(items)) return null; + if (isEmpty(items)) return null; for (int i = 0; i < items.size(); i++) { final T item = items.get(i); if (predicate.test(item)) return item; } return null; } + + /** + * Similar to {@link List#add}, but with support for list values of {@code null} and + * {@link Collections#emptyList} + */ + public static @NonNull <T> List<T> add(@Nullable List<T> cur, T val) { + if (cur == null || cur == Collections.emptyList()) { + cur = new ArrayList<>(); + } + cur.add(val); + return cur; + } + + /** + * Similar to {@link List#remove}, but with support for list values of {@code null} and + * {@link Collections#emptyList} + */ + public static @NonNull <T> List<T> remove(@Nullable List<T> cur, T val) { + if (isEmpty(cur)) { + return emptyIfNull(cur); + } + cur.remove(val); + return cur; + } + + /** + * @return a list that will not be affected by mutations to the given original list. + */ + public static @NonNull <T> List<T> copyOf(@Nullable List<T> cur) { + return isEmpty(cur) ? Collections.emptyList() : new ArrayList<>(cur); + } } diff --git a/core/java/com/android/internal/util/FunctionalUtils.java b/core/java/com/android/internal/util/FunctionalUtils.java new file mode 100644 index 000000000000..9aeb0415b5fc --- /dev/null +++ b/core/java/com/android/internal/util/FunctionalUtils.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2017 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 com.android.internal.util; + +import java.util.function.Supplier; + +/** + * Utilities specific to functional programming + */ +public class FunctionalUtils { + private FunctionalUtils() {} + + /** + * An equivalent of {@link Runnable} that allows throwing checked exceptions + * + * This can be used to specify a lambda argument without forcing all the checked exceptions + * to be handled within it + */ + @FunctionalInterface + public interface ThrowingRunnable { + void run() throws Exception; + } + + /** + * An equivalent of {@link Supplier} that allows throwing checked exceptions + * + * This can be used to specify a lambda argument without forcing all the checked exceptions + * to be handled within it + */ + @FunctionalInterface + public interface ThrowingSupplier<T> { + T get() throws Exception; + } +} diff --git a/core/java/com/android/internal/util/Preconditions.java b/core/java/com/android/internal/util/Preconditions.java index 4e6857a72b43..e5d571672ce2 100644 --- a/core/java/com/android/internal/util/Preconditions.java +++ b/core/java/com/android/internal/util/Preconditions.java @@ -49,6 +49,23 @@ public class Preconditions { } /** + * Ensures that an expression checking an argument is true. + * + * @param expression the expression to check + * @param messageTemplate a printf-style message template to use if the check fails; will + * be converted to a string using {@link String#format(String, Object...)} + * @param messageArgs arguments for {@code messageTemplate} + * @throws IllegalArgumentException if {@code expression} is false + */ + public static void checkArgument(boolean expression, + final String messageTemplate, + final Object... messageArgs) { + if (!expression) { + throw new IllegalArgumentException(String.format(messageTemplate, messageArgs)); + } + } + + /** * Ensures that an string reference passed as a parameter to the calling * method is not empty. * diff --git a/core/java/com/android/internal/view/menu/ListMenuItemView.java b/core/java/com/android/internal/view/menu/ListMenuItemView.java index 919cf991d433..83a2838be07e 100644 --- a/core/java/com/android/internal/view/menu/ListMenuItemView.java +++ b/core/java/com/android/internal/view/menu/ListMenuItemView.java @@ -89,14 +89,14 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView setBackgroundDrawable(mBackground); - mTitleView = (TextView) findViewById(com.android.internal.R.id.title); + mTitleView = findViewById(com.android.internal.R.id.title); if (mTextAppearance != -1) { mTitleView.setTextAppearance(mTextAppearanceContext, mTextAppearance); } - mShortcutView = (TextView) findViewById(com.android.internal.R.id.shortcut); - mSubMenuArrowView = (ImageView) findViewById(com.android.internal.R.id.submenuarrow); + mShortcutView = findViewById(com.android.internal.R.id.shortcut); + mSubMenuArrowView = findViewById(com.android.internal.R.id.submenuarrow); if (mSubMenuArrowView != null) { mSubMenuArrowView.setImageDrawable(mSubMenuArrow); } diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java index c3a7460e5752..65cd4fa20341 100644 --- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java +++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java @@ -569,10 +569,10 @@ public class ActionBarOverlayLayout extends ViewGroup implements DecorContentPar void pullChildren() { if (mContent == null) { mContent = findViewById(com.android.internal.R.id.content); - mActionBarTop = (ActionBarContainer) findViewById( + mActionBarTop = findViewById( com.android.internal.R.id.action_bar_container); mDecorToolbar = getDecorToolbar(findViewById(com.android.internal.R.id.action_bar)); - mActionBarBottom = (ActionBarContainer) findViewById( + mActionBarBottom = findViewById( com.android.internal.R.id.split_action_bar); } } @@ -707,7 +707,7 @@ public class ActionBarOverlayLayout extends ViewGroup implements DecorContentPar mDecorToolbar.setSplitToolbar(splitActionBar); mDecorToolbar.setSplitWhenNarrow(splitWhenNarrow); - final ActionBarContextView cab = (ActionBarContextView) findViewById( + final ActionBarContextView cab = findViewById( com.android.internal.R.id.action_context_bar); cab.setSplitView(mActionBarBottom); cab.setSplitToolbar(splitActionBar); diff --git a/core/java/com/android/internal/widget/MediaNotificationView.java b/core/java/com/android/internal/widget/MediaNotificationView.java index f63afada7e38..afb2a5efcf95 100644 --- a/core/java/com/android/internal/widget/MediaNotificationView.java +++ b/core/java/com/android/internal/widget/MediaNotificationView.java @@ -152,7 +152,7 @@ public class MediaNotificationView extends FrameLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mRightIcon = (ImageView) findViewById(com.android.internal.R.id.right_icon); + mRightIcon = findViewById(com.android.internal.R.id.right_icon); mActions = findViewById(com.android.internal.R.id.media_actions); mHeader = findViewById(com.android.internal.R.id.notification_header); mMainColumn = findViewById(com.android.internal.R.id.notification_main_column); diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 3a03af60efce..0e67d304c66d 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -44,14 +44,6 @@ static jmethodID gBitmap_constructorMethodID; static jmethodID gBitmap_reinitMethodID; static jmethodID gBitmap_getAllocationByteCountMethodID; -static jfieldID gTransferParams_aFieldID; -static jfieldID gTransferParams_bFieldID; -static jfieldID gTransferParams_cFieldID; -static jfieldID gTransferParams_dFieldID; -static jfieldID gTransferParams_eFieldID; -static jfieldID gTransferParams_fFieldID; -static jfieldID gTransferParams_gFieldID; - namespace android { class BitmapWrapper { @@ -742,28 +734,8 @@ static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, if (colorType != kN32_SkColorType || xyzD50 == nullptr || transferParameters == nullptr) { colorSpace = GraphicsJNI::colorSpaceForType(colorType); } else { - SkColorSpaceTransferFn p; - p.fA = (float) env->GetDoubleField(transferParameters, gTransferParams_aFieldID); - p.fB = (float) env->GetDoubleField(transferParameters, gTransferParams_bFieldID); - p.fC = (float) env->GetDoubleField(transferParameters, gTransferParams_cFieldID); - p.fD = (float) env->GetDoubleField(transferParameters, gTransferParams_dFieldID); - p.fE = (float) env->GetDoubleField(transferParameters, gTransferParams_eFieldID); - p.fF = (float) env->GetDoubleField(transferParameters, gTransferParams_fFieldID); - p.fG = (float) env->GetDoubleField(transferParameters, gTransferParams_gFieldID); - - SkMatrix44 xyzMatrix(SkMatrix44::kIdentity_Constructor); - jfloat* array = env->GetFloatArrayElements(xyzD50, NULL); - xyzMatrix.setFloat(0, 0, array[0]); - xyzMatrix.setFloat(1, 0, array[1]); - xyzMatrix.setFloat(2, 0, array[2]); - xyzMatrix.setFloat(0, 1, array[3]); - xyzMatrix.setFloat(1, 1, array[4]); - xyzMatrix.setFloat(2, 1, array[5]); - xyzMatrix.setFloat(0, 2, array[6]); - xyzMatrix.setFloat(1, 2, array[7]); - xyzMatrix.setFloat(2, 2, array[8]); - env->ReleaseFloatArrayElements(xyzD50, array, 0); - + SkColorSpaceTransferFn p = GraphicsJNI::getNativeTransferParameters(env, transferParameters); + SkMatrix44 xyzMatrix = GraphicsJNI::getNativeXYZMatrix(env, xyzD50); colorSpace = SkColorSpace::MakeRGB(p, xyzMatrix); } @@ -1635,20 +1607,6 @@ static void Bitmap_copyColorSpace(JNIEnv* env, jobject, jlong srcBitmapPtr, jlon } /////////////////////////////////////////////////////////////////////////////// -static jclass make_globalref(JNIEnv* env, const char classname[]) -{ - jclass c = env->FindClass(classname); - SkASSERT(c); - return (jclass) env->NewGlobalRef(c); -} - -static jfieldID getFieldIDCheck(JNIEnv* env, jclass clazz, - const char fieldname[], const char type[]) -{ - jfieldID id = env->GetFieldID(clazz, fieldname, type); - SkASSERT(id); - return id; -} static const JNINativeMethod gBitmapMethods[] = { { "nativeCreate", "([IIIIIIZ[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)Landroid/graphics/Bitmap;", @@ -1706,20 +1664,11 @@ static const JNINativeMethod gBitmapMethods[] = { int register_android_graphics_Bitmap(JNIEnv* env) { - jclass transfer_params_class = FindClassOrDie(env, "android/graphics/ColorSpace$Rgb$TransferParameters"); - gTransferParams_aFieldID = GetFieldIDOrDie(env, transfer_params_class, "a", "D"); - gTransferParams_bFieldID = GetFieldIDOrDie(env, transfer_params_class, "b", "D"); - gTransferParams_cFieldID = GetFieldIDOrDie(env, transfer_params_class, "c", "D"); - gTransferParams_dFieldID = GetFieldIDOrDie(env, transfer_params_class, "d", "D"); - gTransferParams_eFieldID = GetFieldIDOrDie(env, transfer_params_class, "e", "D"); - gTransferParams_fFieldID = GetFieldIDOrDie(env, transfer_params_class, "f", "D"); - gTransferParams_gFieldID = GetFieldIDOrDie(env, transfer_params_class, "g", "D"); - - gBitmap_class = make_globalref(env, "android/graphics/Bitmap"); - gBitmap_nativePtr = getFieldIDCheck(env, gBitmap_class, "mNativePtr", "J"); - gBitmap_constructorMethodID = env->GetMethodID(gBitmap_class, "<init>", "(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V"); - gBitmap_reinitMethodID = env->GetMethodID(gBitmap_class, "reinit", "(IIZ)V"); - gBitmap_getAllocationByteCountMethodID = env->GetMethodID(gBitmap_class, "getAllocationByteCount", "()I"); + gBitmap_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Bitmap")); + gBitmap_nativePtr = GetFieldIDOrDie(env, gBitmap_class, "mNativePtr", "J"); + gBitmap_constructorMethodID = GetMethodIDOrDie(env, gBitmap_class, "<init>", "(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V"); + gBitmap_reinitMethodID = GetMethodIDOrDie(env, gBitmap_class, "reinit", "(IIZ)V"); + gBitmap_getAllocationByteCountMethodID = GetMethodIDOrDie(env, gBitmap_class, "getAllocationByteCount", "()I"); return android::RegisterMethodsOrDie(env, "android/graphics/Bitmap", gBitmapMethods, NELEM(gBitmapMethods)); } diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 3dc1be6a26e3..e714671027d6 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -27,6 +27,7 @@ jfieldID gOptions_justBoundsFieldID; jfieldID gOptions_sampleSizeFieldID; jfieldID gOptions_configFieldID; +jfieldID gOptions_colorSpaceFieldID; jfieldID gOptions_premultipliedFieldID; jfieldID gOptions_mutableFieldID; jfieldID gOptions_ditherFieldID; @@ -51,20 +52,6 @@ jmethodID gInsetStruct_constructorMethodID; jclass gBitmapConfig_class; jmethodID gBitmapConfig_nativeToConfigMethodID; -jclass gColorSpace_class; -jmethodID gColorSpace_getMethodID; -jmethodID gColorSpace_matchMethodID; - -jclass gColorSpaceRGB_class; -jmethodID gColorSpaceRGB_constructorMethodID; - -jclass gColorSpace_Named_class; -jfieldID gColorSpace_Named_sRGBFieldID; -jfieldID gColorSpace_Named_LinearExtendedSRGBFieldID; - -jclass gTransferParameters_class; -jmethodID gTransferParameters_constructorMethodID; - using namespace android; jstring encodedFormatToString(JNIEnv* env, SkEncodedImageFormat format) { @@ -243,70 +230,6 @@ static bool needsFineScale(const SkISize fullSize, const SkISize decodedSize, needsFineScale(fullSize.height(), decodedSize.height(), sampleSize); } -static jobject getColorSpace(JNIEnv* env, - sk_sp<SkColorSpace>& decodeColorSpace, SkColorType decodeColorType) { - jobject colorSpace = nullptr; - - // No need to match, we know what the output color space will be - if (decodeColorType == kRGBA_F16_SkColorType) { - jobject linearExtendedSRGB = env->GetStaticObjectField( - gColorSpace_Named_class, gColorSpace_Named_LinearExtendedSRGBFieldID); - colorSpace = env->CallStaticObjectMethod(gColorSpace_class, - gColorSpace_getMethodID, linearExtendedSRGB); - } else { - // Same here, no need to match - if (decodeColorSpace->isSRGB()) { - jobject sRGB = env->GetStaticObjectField( - gColorSpace_Named_class, gColorSpace_Named_sRGBFieldID); - colorSpace = env->CallStaticObjectMethod(gColorSpace_class, - gColorSpace_getMethodID, sRGB); - } else if (decodeColorSpace.get() != nullptr) { - // Try to match against known RGB color spaces using the CIE XYZ D50 - // conversion matrix and numerical transfer function parameters - SkMatrix44 xyzMatrix(SkMatrix44::kUninitialized_Constructor); - LOG_ALWAYS_FATAL_IF(!decodeColorSpace->toXYZD50(&xyzMatrix)); - - SkColorSpaceTransferFn transferParams; - // We can only handle numerical transfer functions at the moment - LOG_ALWAYS_FATAL_IF(!decodeColorSpace->isNumericalTransferFn(&transferParams)); - - jobject params = env->NewObject(gTransferParameters_class, - gTransferParameters_constructorMethodID, - transferParams.fA, transferParams.fB, transferParams.fC, - transferParams.fD, transferParams.fE, transferParams.fF, - transferParams.fG); - - jfloatArray xyzArray = env->NewFloatArray(9); - jfloat xyz[9] = { - xyzMatrix.getFloat(0, 0), - xyzMatrix.getFloat(1, 0), - xyzMatrix.getFloat(2, 0), - xyzMatrix.getFloat(0, 1), - xyzMatrix.getFloat(1, 1), - xyzMatrix.getFloat(2, 1), - xyzMatrix.getFloat(0, 2), - xyzMatrix.getFloat(1, 2), - xyzMatrix.getFloat(2, 2) - }; - env->SetFloatArrayRegion(xyzArray, 0, 9, xyz); - - colorSpace = env->CallStaticObjectMethod(gColorSpace_class, - gColorSpace_matchMethodID, xyzArray, params); - - if (colorSpace == nullptr) { - // We couldn't find an exact match, let's create a new color space - // instance with the 3x3 conversion matrix and transfer function - colorSpace = env->NewObject(gColorSpaceRGB_class, - gColorSpaceRGB_constructorMethodID, - env->NewStringUTF("Unknown"), xyzArray, params); - } - - env->DeleteLocalRef(xyzArray); - } - } - return colorSpace; -} - static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding, jobject options) { // This function takes ownership of the input stream. Since the SkAndroidCodec // will take ownership of the stream, we don't necessarily need to take ownership @@ -323,6 +246,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding float scale = 1.0f; bool requireUnpremultiplied = false; jobject javaBitmap = NULL; + sk_sp<SkColorSpace> prefColorSpace = nullptr; // Update with options supplied by the client. if (options != NULL) { @@ -346,6 +270,8 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding jobject jconfig = env->GetObjectField(options, gOptions_configFieldID); prefColorType = GraphicsJNI::getNativeBitmapColorType(env, jconfig); + jobject jcolorSpace = env->GetObjectField(options, gOptions_colorSpaceFieldID); + prefColorSpace = GraphicsJNI::getNativeColorSpace(env, jcolorSpace); isHardware = GraphicsJNI::isHardwareConfig(env, jconfig); isMutable = env->GetBooleanField(options, gOptions_mutableFieldID); requireUnpremultiplied = !env->GetBooleanField(options, gOptions_premultipliedFieldID); @@ -399,7 +325,8 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding // Set the decode colorType SkColorType decodeColorType = codec->computeOutputColorType(prefColorType); - sk_sp<SkColorSpace> decodeColorSpace = codec->computeOutputColorSpace(decodeColorType); + sk_sp<SkColorSpace> decodeColorSpace = codec->computeOutputColorSpace( + decodeColorType, prefColorSpace); // Set the options and return if the client only wants the size. if (options != NULL) { @@ -427,7 +354,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding env->SetObjectField(options, gOptions_outConfigFieldID, config); env->SetObjectField(options, gOptions_outColorSpaceFieldID, - getColorSpace(env, decodeColorSpace, decodeColorType)); + GraphicsJNI::getColorSpace(env, decodeColorSpace, decodeColorType)); if (onlyDecodeSize) { return nullptr; @@ -616,7 +543,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding paint.setBlendMode(SkBlendMode::kSrc); paint.setFilterQuality(kLow_SkFilterQuality); // bilinear filtering - SkCanvas canvas(outputBitmap); + SkCanvas canvas(outputBitmap, SkCanvas::ColorBehavior::kLegacy); canvas.scale(sx, sy); canvas.drawBitmap(decodingBitmap, 0.0f, 0.0f, &paint); } else { @@ -795,6 +722,8 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) { gOptions_sampleSizeFieldID = GetFieldIDOrDie(env, options_class, "inSampleSize", "I"); gOptions_configFieldID = GetFieldIDOrDie(env, options_class, "inPreferredConfig", "Landroid/graphics/Bitmap$Config;"); + gOptions_colorSpaceFieldID = GetFieldIDOrDie(env, options_class, "inPreferredColorSpace", + "Landroid/graphics/ColorSpace;"); gOptions_premultipliedFieldID = GetFieldIDOrDie(env, options_class, "inPremultiplied", "Z"); gOptions_mutableFieldID = GetFieldIDOrDie(env, options_class, "inMutable", "Z"); gOptions_ditherFieldID = GetFieldIDOrDie(env, options_class, "inDither", "Z"); @@ -827,29 +756,6 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) { gBitmapConfig_nativeToConfigMethodID = GetStaticMethodIDOrDie(env, gBitmapConfig_class, "nativeToConfig", "(I)Landroid/graphics/Bitmap$Config;"); - gColorSpace_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/ColorSpace")); - gColorSpace_getMethodID = GetStaticMethodIDOrDie(env, gColorSpace_class, - "get", "(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace;"); - gColorSpace_matchMethodID = GetStaticMethodIDOrDie(env, gColorSpace_class, "match", - "([FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)Landroid/graphics/ColorSpace;"); - - gColorSpaceRGB_class = MakeGlobalRefOrDie(env, - FindClassOrDie(env, "android/graphics/ColorSpace$Rgb")); - gColorSpaceRGB_constructorMethodID = GetMethodIDOrDie(env, gColorSpaceRGB_class, - "<init>", "(Ljava/lang/String;[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)V"); - - gColorSpace_Named_class = MakeGlobalRefOrDie(env, - FindClassOrDie(env, "android/graphics/ColorSpace$Named")); - gColorSpace_Named_sRGBFieldID = GetStaticFieldIDOrDie(env, - gColorSpace_Named_class, "SRGB", "Landroid/graphics/ColorSpace$Named;"); - gColorSpace_Named_LinearExtendedSRGBFieldID = GetStaticFieldIDOrDie(env, - gColorSpace_Named_class, "LINEAR_EXTENDED_SRGB", "Landroid/graphics/ColorSpace$Named;"); - - gTransferParameters_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, - "android/graphics/ColorSpace$Rgb$TransferParameters")); - gTransferParameters_constructorMethodID = GetMethodIDOrDie(env, gTransferParameters_class, - "<init>", "(DDDDDDD)V"); - return android::RegisterMethodsOrDie(env, "android/graphics/BitmapFactory", gMethods, NELEM(gMethods)); } diff --git a/core/jni/android/graphics/BitmapFactory.h b/core/jni/android/graphics/BitmapFactory.h index 76db41dca53f..1ee49fa0af77 100644 --- a/core/jni/android/graphics/BitmapFactory.h +++ b/core/jni/android/graphics/BitmapFactory.h @@ -8,6 +8,7 @@ extern jclass gOptions_class; extern jfieldID gOptions_justBoundsFieldID; extern jfieldID gOptions_sampleSizeFieldID; extern jfieldID gOptions_configFieldID; +extern jfieldID gOptions_colorSpaceFieldID; extern jfieldID gOptions_premultipliedFieldID; extern jfieldID gOptions_ditherFieldID; extern jfieldID gOptions_purgeableFieldID; @@ -17,9 +18,14 @@ extern jfieldID gOptions_preferQualityOverSpeedFieldID; extern jfieldID gOptions_widthFieldID; extern jfieldID gOptions_heightFieldID; extern jfieldID gOptions_mimeFieldID; +extern jfieldID gOptions_outConfigFieldID; +extern jfieldID gOptions_outColorSpaceFieldID; extern jfieldID gOptions_mCancelID; extern jfieldID gOptions_bitmapFieldID; +extern jclass gBitmapConfig_class; +extern jmethodID gBitmapConfig_nativeToConfigMethodID; + jstring encodedFormatToString(JNIEnv* env, SkEncodedImageFormat format); jobject decodeBitmap(JNIEnv* env, void* data, size_t size); diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp index 3247851a0ede..5022b22e8ea7 100644 --- a/core/jni/android/graphics/BitmapRegionDecoder.cpp +++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp @@ -132,11 +132,14 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, jint in bool requireUnpremul = false; jobject javaBitmap = NULL; bool isHardware = false; + sk_sp<SkColorSpace> colorSpace = nullptr; // Update the default options with any options supplied by the client. if (NULL != options) { sampleSize = env->GetIntField(options, gOptions_sampleSizeFieldID); jobject jconfig = env->GetObjectField(options, gOptions_configFieldID); colorType = GraphicsJNI::getNativeBitmapColorType(env, jconfig); + jobject jcolorSpace = env->GetObjectField(options, gOptions_colorSpaceFieldID); + colorSpace = GraphicsJNI::getNativeColorSpace(env, jcolorSpace); isHardware = GraphicsJNI::isHardwareConfig(env, jconfig); requireUnpremul = !env->GetBooleanField(options, gOptions_premultipliedFieldID); javaBitmap = env->GetObjectField(options, gOptions_bitmapFieldID); @@ -148,8 +151,16 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, jint in env->SetIntField(options, gOptions_widthFieldID, -1); env->SetIntField(options, gOptions_heightFieldID, -1); env->SetObjectField(options, gOptions_mimeFieldID, 0); + env->SetObjectField(options, gOptions_outConfigFieldID, 0); + env->SetObjectField(options, gOptions_outColorSpaceFieldID, 0); } + SkBitmapRegionDecoder* brd = reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle); + + SkColorType decodeColorType = brd->computeOutputColorType(colorType); + sk_sp<SkColorSpace> decodeColorSpace = brd->computeOutputColorSpace( + decodeColorType, colorSpace); + // Recycle a bitmap if possible. android::Bitmap* recycledBitmap = nullptr; size_t recycledBytes = 0; @@ -168,17 +179,16 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, jint in if (javaBitmap) { allocator = &recycleAlloc; // We are required to match the color type of the recycled bitmap. - colorType = recycledBitmap->info().colorType(); + decodeColorType = recycledBitmap->info().colorType(); } else { allocator = &heapAlloc; } // Decode the region. SkIRect subset = SkIRect::MakeXYWH(inputX, inputY, inputWidth, inputHeight); - SkBitmapRegionDecoder* brd = - reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle); SkBitmap bitmap; - if (!brd->decodeRegion(&bitmap, allocator, subset, sampleSize, colorType, requireUnpremul)) { + if (!brd->decodeRegion(&bitmap, allocator, subset, sampleSize, + decodeColorType, requireUnpremul, decodeColorSpace)) { return nullObjectReturn("Failed to decode region."); } @@ -186,11 +196,23 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, jint in if (NULL != options) { env->SetIntField(options, gOptions_widthFieldID, bitmap.width()); env->SetIntField(options, gOptions_heightFieldID, bitmap.height()); + env->SetObjectField(options, gOptions_mimeFieldID, encodedFormatToString(env, (SkEncodedImageFormat)brd->getEncodedFormat())); if (env->ExceptionCheck()) { return nullObjectReturn("OOM in encodedFormatToString()"); } + + jint configID = GraphicsJNI::colorTypeToLegacyBitmapConfig(decodeColorType); + if (isHardware) { + configID = GraphicsJNI::kHardware_LegacyBitmapConfig; + } + jobject config = env->CallStaticObjectMethod(gBitmapConfig_class, + gBitmapConfig_nativeToConfigMethodID, configID); + env->SetObjectField(options, gOptions_outConfigFieldID, config); + + env->SetObjectField(options, gOptions_outColorSpaceFieldID, + GraphicsJNI::getColorSpace(env, decodeColorSpace, decodeColorType)); } // If we may have reused a bitmap, we need to indicate that the pixels have changed. diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index e66587a9d8fe..452d0a941c7b 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -6,6 +6,7 @@ #include "jni.h" #include "JNIHelp.h" #include "GraphicsJNI.h" +#include "core_jni_helpers.h" #include "SkCanvas.h" #include "SkMath.h" @@ -17,6 +18,8 @@ #include <Caches.h> #include <TextureCache.h> +using namespace android; + void doThrowNPE(JNIEnv* env) { jniThrowNullPointerException(env, NULL); } @@ -178,6 +181,32 @@ static jclass gVMRuntime_class; static jmethodID gVMRuntime_newNonMovableArray; static jmethodID gVMRuntime_addressOf; +static jfieldID gTransferParams_aFieldID; +static jfieldID gTransferParams_bFieldID; +static jfieldID gTransferParams_cFieldID; +static jfieldID gTransferParams_dFieldID; +static jfieldID gTransferParams_eFieldID; +static jfieldID gTransferParams_fFieldID; +static jfieldID gTransferParams_gFieldID; + +static jclass gColorSpace_class; +static jfieldID gColorSpace_IlluminantD50FieldID; +static jmethodID gColorSpace_adaptMethodID; +static jmethodID gColorSpace_getMethodID; +static jmethodID gColorSpace_matchMethodID; + +static jclass gColorSpaceRGB_class; +static jmethodID gColorSpaceRGB_getTransferParametersMethodID; +static jmethodID gColorSpaceRGB_getTransformMethodID; +static jmethodID gColorSpaceRGB_constructorMethodID; + +static jclass gColorSpace_Named_class; +static jfieldID gColorSpace_Named_sRGBFieldID; +static jfieldID gColorSpace_Named_LinearExtendedSRGBFieldID; + +static jclass gTransferParameters_class; +static jmethodID gTransferParameters_constructorMethodID; + /////////////////////////////////////////////////////////////////////////////// void GraphicsJNI::get_jrect(JNIEnv* env, jobject obj, int* L, int* T, int* R, int* B) @@ -328,7 +357,7 @@ SkColorType GraphicsJNI::legacyBitmapConfigToColorType(jint legacyConfig) { } void GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap, SkBitmap* outBitmap) { - android::bitmap::toBitmap(env, bitmap).getSkBitmap(outBitmap); + bitmap::toBitmap(env, bitmap).getSkBitmap(outBitmap); } SkPixelRef* GraphicsJNI::refSkPixelRef(JNIEnv* env, jobject jbitmap) { @@ -464,6 +493,125 @@ bool GraphicsJNI::isColorSpaceSRGB(SkColorSpace* colorSpace) { return colorSpace == nullptr || colorSpace->isSRGB(); } +SkColorSpaceTransferFn GraphicsJNI::getNativeTransferParameters(JNIEnv* env, jobject transferParams) { + SkColorSpaceTransferFn p; + p.fA = (float) env->GetDoubleField(transferParams, gTransferParams_aFieldID); + p.fB = (float) env->GetDoubleField(transferParams, gTransferParams_bFieldID); + p.fC = (float) env->GetDoubleField(transferParams, gTransferParams_cFieldID); + p.fD = (float) env->GetDoubleField(transferParams, gTransferParams_dFieldID); + p.fE = (float) env->GetDoubleField(transferParams, gTransferParams_eFieldID); + p.fF = (float) env->GetDoubleField(transferParams, gTransferParams_fFieldID); + p.fG = (float) env->GetDoubleField(transferParams, gTransferParams_gFieldID); + return p; +} + +SkMatrix44 GraphicsJNI::getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50) { + SkMatrix44 xyzMatrix(SkMatrix44::kIdentity_Constructor); + jfloat* array = env->GetFloatArrayElements(xyzD50, NULL); + xyzMatrix.setFloat(0, 0, array[0]); + xyzMatrix.setFloat(1, 0, array[1]); + xyzMatrix.setFloat(2, 0, array[2]); + xyzMatrix.setFloat(0, 1, array[3]); + xyzMatrix.setFloat(1, 1, array[4]); + xyzMatrix.setFloat(2, 1, array[5]); + xyzMatrix.setFloat(0, 2, array[6]); + xyzMatrix.setFloat(1, 2, array[7]); + xyzMatrix.setFloat(2, 2, array[8]); + env->ReleaseFloatArrayElements(xyzD50, array, 0); + return xyzMatrix; +} + +sk_sp<SkColorSpace> GraphicsJNI::getNativeColorSpace(JNIEnv* env, jobject colorSpace) { + if (colorSpace == nullptr) return nullptr; + if (!env->IsInstanceOf(colorSpace, gColorSpaceRGB_class)) { + doThrowIAE(env, "The color space must be an RGB color space"); + } + + jobject transferParams = env->CallObjectMethod(colorSpace, + gColorSpaceRGB_getTransferParametersMethodID); + if (transferParams == nullptr) { + doThrowIAE(env, "The color space must use an ICC parametric transfer function"); + } + + jfloatArray illuminantD50 = (jfloatArray) env->GetStaticObjectField(gColorSpace_class, + gColorSpace_IlluminantD50FieldID); + jobject colorSpaceD50 = env->CallStaticObjectMethod(gColorSpace_class, + gColorSpace_adaptMethodID, colorSpace, illuminantD50); + + jfloatArray xyzD50 = (jfloatArray) env->CallObjectMethod(colorSpaceD50, + gColorSpaceRGB_getTransformMethodID); + + SkMatrix44 xyzMatrix = getNativeXYZMatrix(env, xyzD50); + SkColorSpaceTransferFn transferFunction = getNativeTransferParameters(env, transferParams); + + return SkColorSpace::MakeRGB(transferFunction, xyzMatrix); +} + + +jobject GraphicsJNI::getColorSpace(JNIEnv* env, sk_sp<SkColorSpace>& decodeColorSpace, + SkColorType decodeColorType) { + jobject colorSpace = nullptr; + + // No need to match, we know what the output color space will be + if (decodeColorType == kRGBA_F16_SkColorType) { + jobject linearExtendedSRGB = env->GetStaticObjectField( + gColorSpace_Named_class, gColorSpace_Named_LinearExtendedSRGBFieldID); + colorSpace = env->CallStaticObjectMethod(gColorSpace_class, + gColorSpace_getMethodID, linearExtendedSRGB); + } else { + // Same here, no need to match + if (decodeColorSpace->isSRGB()) { + jobject sRGB = env->GetStaticObjectField( + gColorSpace_Named_class, gColorSpace_Named_sRGBFieldID); + colorSpace = env->CallStaticObjectMethod(gColorSpace_class, + gColorSpace_getMethodID, sRGB); + } else if (decodeColorSpace.get() != nullptr) { + // Try to match against known RGB color spaces using the CIE XYZ D50 + // conversion matrix and numerical transfer function parameters + SkMatrix44 xyzMatrix(SkMatrix44::kUninitialized_Constructor); + LOG_ALWAYS_FATAL_IF(!decodeColorSpace->toXYZD50(&xyzMatrix)); + + SkColorSpaceTransferFn transferParams; + // We can only handle numerical transfer functions at the moment + LOG_ALWAYS_FATAL_IF(!decodeColorSpace->isNumericalTransferFn(&transferParams)); + + jobject params = env->NewObject(gTransferParameters_class, + gTransferParameters_constructorMethodID, + transferParams.fA, transferParams.fB, transferParams.fC, + transferParams.fD, transferParams.fE, transferParams.fF, + transferParams.fG); + + jfloatArray xyzArray = env->NewFloatArray(9); + jfloat xyz[9] = { + xyzMatrix.getFloat(0, 0), + xyzMatrix.getFloat(1, 0), + xyzMatrix.getFloat(2, 0), + xyzMatrix.getFloat(0, 1), + xyzMatrix.getFloat(1, 1), + xyzMatrix.getFloat(2, 1), + xyzMatrix.getFloat(0, 2), + xyzMatrix.getFloat(1, 2), + xyzMatrix.getFloat(2, 2) + }; + env->SetFloatArrayRegion(xyzArray, 0, 9, xyz); + + colorSpace = env->CallStaticObjectMethod(gColorSpace_class, + gColorSpace_matchMethodID, xyzArray, params); + + if (colorSpace == nullptr) { + // We couldn't find an exact match, let's create a new color space + // instance with the 3x3 conversion matrix and transfer function + colorSpace = env->NewObject(gColorSpaceRGB_class, + gColorSpaceRGB_constructorMethodID, + env->NewStringUTF("Unknown"), xyzArray, params); + } + + env->DeleteLocalRef(xyzArray); + } + } + return colorSpace; +} + /////////////////////////////////////////////////////////////////////////////// bool HeapAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) { mStorage = android::Bitmap::allocateHeapBitmap(bitmap, ctable); @@ -577,74 +725,97 @@ bool AshmemPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) //////////////////////////////////////////////////////////////////////////////// -static jclass make_globalref(JNIEnv* env, const char classname[]) -{ - jclass c = env->FindClass(classname); - SkASSERT(c); - return (jclass) env->NewGlobalRef(c); -} - -static jfieldID getFieldIDCheck(JNIEnv* env, jclass clazz, - const char fieldname[], const char type[]) -{ - jfieldID id = env->GetFieldID(clazz, fieldname, type); - SkASSERT(id); - return id; -} - int register_android_graphics_Graphics(JNIEnv* env) { jmethodID m; jclass c; - gRect_class = make_globalref(env, "android/graphics/Rect"); - gRect_leftFieldID = getFieldIDCheck(env, gRect_class, "left", "I"); - gRect_topFieldID = getFieldIDCheck(env, gRect_class, "top", "I"); - gRect_rightFieldID = getFieldIDCheck(env, gRect_class, "right", "I"); - gRect_bottomFieldID = getFieldIDCheck(env, gRect_class, "bottom", "I"); + gRect_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Rect")); + gRect_leftFieldID = GetFieldIDOrDie(env, gRect_class, "left", "I"); + gRect_topFieldID = GetFieldIDOrDie(env, gRect_class, "top", "I"); + gRect_rightFieldID = GetFieldIDOrDie(env, gRect_class, "right", "I"); + gRect_bottomFieldID = GetFieldIDOrDie(env, gRect_class, "bottom", "I"); - gRectF_class = make_globalref(env, "android/graphics/RectF"); - gRectF_leftFieldID = getFieldIDCheck(env, gRectF_class, "left", "F"); - gRectF_topFieldID = getFieldIDCheck(env, gRectF_class, "top", "F"); - gRectF_rightFieldID = getFieldIDCheck(env, gRectF_class, "right", "F"); - gRectF_bottomFieldID = getFieldIDCheck(env, gRectF_class, "bottom", "F"); + gRectF_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/RectF")); + gRectF_leftFieldID = GetFieldIDOrDie(env, gRectF_class, "left", "F"); + gRectF_topFieldID = GetFieldIDOrDie(env, gRectF_class, "top", "F"); + gRectF_rightFieldID = GetFieldIDOrDie(env, gRectF_class, "right", "F"); + gRectF_bottomFieldID = GetFieldIDOrDie(env, gRectF_class, "bottom", "F"); - gPoint_class = make_globalref(env, "android/graphics/Point"); - gPoint_xFieldID = getFieldIDCheck(env, gPoint_class, "x", "I"); - gPoint_yFieldID = getFieldIDCheck(env, gPoint_class, "y", "I"); + gPoint_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Point")); + gPoint_xFieldID = GetFieldIDOrDie(env, gPoint_class, "x", "I"); + gPoint_yFieldID = GetFieldIDOrDie(env, gPoint_class, "y", "I"); - gPointF_class = make_globalref(env, "android/graphics/PointF"); - gPointF_xFieldID = getFieldIDCheck(env, gPointF_class, "x", "F"); - gPointF_yFieldID = getFieldIDCheck(env, gPointF_class, "y", "F"); + gPointF_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/PointF")); + gPointF_xFieldID = GetFieldIDOrDie(env, gPointF_class, "x", "F"); + gPointF_yFieldID = GetFieldIDOrDie(env, gPointF_class, "y", "F"); - gBitmapRegionDecoder_class = make_globalref(env, "android/graphics/BitmapRegionDecoder"); - gBitmapRegionDecoder_constructorMethodID = env->GetMethodID(gBitmapRegionDecoder_class, "<init>", "(J)V"); + gBitmapRegionDecoder_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/BitmapRegionDecoder")); + gBitmapRegionDecoder_constructorMethodID = GetMethodIDOrDie(env, gBitmapRegionDecoder_class, "<init>", "(J)V"); - gBitmapConfig_class = make_globalref(env, "android/graphics/Bitmap$Config"); - gBitmapConfig_nativeInstanceID = getFieldIDCheck(env, gBitmapConfig_class, - "nativeInt", "I"); + gBitmapConfig_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Bitmap$Config")); + gBitmapConfig_nativeInstanceID = GetFieldIDOrDie(env, gBitmapConfig_class, "nativeInt", "I"); - gCanvas_class = make_globalref(env, "android/graphics/Canvas"); - gCanvas_nativeInstanceID = getFieldIDCheck(env, gCanvas_class, "mNativeCanvasWrapper", "J"); + gCanvas_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Canvas")); + gCanvas_nativeInstanceID = GetFieldIDOrDie(env, gCanvas_class, "mNativeCanvasWrapper", "J"); - gPicture_class = make_globalref(env, "android/graphics/Picture"); - gPicture_nativeInstanceID = getFieldIDCheck(env, gPicture_class, "mNativePicture", "J"); + gPicture_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Picture")); + gPicture_nativeInstanceID = GetFieldIDOrDie(env, gPicture_class, "mNativePicture", "J"); - gRegion_class = make_globalref(env, "android/graphics/Region"); - gRegion_nativeInstanceID = getFieldIDCheck(env, gRegion_class, "mNativeRegion", "J"); - gRegion_constructorMethodID = env->GetMethodID(gRegion_class, "<init>", - "(JI)V"); + gRegion_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Region")); + gRegion_nativeInstanceID = GetFieldIDOrDie(env, gRegion_class, "mNativeRegion", "J"); + gRegion_constructorMethodID = GetMethodIDOrDie(env, gRegion_class, "<init>", "(JI)V"); c = env->FindClass("java/lang/Byte"); gByte_class = (jclass) env->NewGlobalRef( env->GetStaticObjectField(c, env->GetStaticFieldID(c, "TYPE", "Ljava/lang/Class;"))); - gVMRuntime_class = make_globalref(env, "dalvik/system/VMRuntime"); + gVMRuntime_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "dalvik/system/VMRuntime")); m = env->GetStaticMethodID(gVMRuntime_class, "getRuntime", "()Ldalvik/system/VMRuntime;"); gVMRuntime = env->NewGlobalRef(env->CallStaticObjectMethod(gVMRuntime_class, m)); - gVMRuntime_newNonMovableArray = env->GetMethodID(gVMRuntime_class, "newNonMovableArray", + gVMRuntime_newNonMovableArray = GetMethodIDOrDie(env, gVMRuntime_class, "newNonMovableArray", "(Ljava/lang/Class;I)Ljava/lang/Object;"); - gVMRuntime_addressOf = env->GetMethodID(gVMRuntime_class, "addressOf", "(Ljava/lang/Object;)J"); + gVMRuntime_addressOf = GetMethodIDOrDie(env, gVMRuntime_class, "addressOf", "(Ljava/lang/Object;)J"); + + jclass transfer_params_class = FindClassOrDie(env, "android/graphics/ColorSpace$Rgb$TransferParameters"); + gTransferParams_aFieldID = GetFieldIDOrDie(env, transfer_params_class, "a", "D"); + gTransferParams_bFieldID = GetFieldIDOrDie(env, transfer_params_class, "b", "D"); + gTransferParams_cFieldID = GetFieldIDOrDie(env, transfer_params_class, "c", "D"); + gTransferParams_dFieldID = GetFieldIDOrDie(env, transfer_params_class, "d", "D"); + gTransferParams_eFieldID = GetFieldIDOrDie(env, transfer_params_class, "e", "D"); + gTransferParams_fFieldID = GetFieldIDOrDie(env, transfer_params_class, "f", "D"); + gTransferParams_gFieldID = GetFieldIDOrDie(env, transfer_params_class, "g", "D"); + + gColorSpace_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/ColorSpace")); + gColorSpace_IlluminantD50FieldID = GetStaticFieldIDOrDie(env, + gColorSpace_class, "ILLUMINANT_D50", "[F"); + gColorSpace_adaptMethodID = GetStaticMethodIDOrDie(env, gColorSpace_class, "adapt", + "(Landroid/graphics/ColorSpace;[F)Landroid/graphics/ColorSpace;"); + gColorSpace_getMethodID = GetStaticMethodIDOrDie(env, gColorSpace_class, + "get", "(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace;"); + gColorSpace_matchMethodID = GetStaticMethodIDOrDie(env, gColorSpace_class, "match", + "([FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)Landroid/graphics/ColorSpace;"); + + gColorSpaceRGB_class = MakeGlobalRefOrDie(env, + FindClassOrDie(env, "android/graphics/ColorSpace$Rgb")); + gColorSpaceRGB_constructorMethodID = GetMethodIDOrDie(env, gColorSpaceRGB_class, + "<init>", "(Ljava/lang/String;[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)V"); + gColorSpaceRGB_getTransferParametersMethodID = GetMethodIDOrDie(env, gColorSpaceRGB_class, + "getTransferParameters", "()Landroid/graphics/ColorSpace$Rgb$TransferParameters;"); + gColorSpaceRGB_getTransformMethodID = GetMethodIDOrDie(env, gColorSpaceRGB_class, + "getTransform", "()[F"); + + gColorSpace_Named_class = MakeGlobalRefOrDie(env, + FindClassOrDie(env, "android/graphics/ColorSpace$Named")); + gColorSpace_Named_sRGBFieldID = GetStaticFieldIDOrDie(env, + gColorSpace_Named_class, "SRGB", "Landroid/graphics/ColorSpace$Named;"); + gColorSpace_Named_LinearExtendedSRGBFieldID = GetStaticFieldIDOrDie(env, + gColorSpace_Named_class, "LINEAR_EXTENDED_SRGB", "Landroid/graphics/ColorSpace$Named;"); + + gTransferParameters_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, + "android/graphics/ColorSpace$Rgb$TransferParameters")); + gTransferParameters_constructorMethodID = GetMethodIDOrDie(env, gTransferParameters_class, + "<init>", "(DDDDDDD)V"); return 0; } diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index 7d7c88159a55..7fbea2589730 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -10,6 +10,7 @@ #include "SkPoint.h" #include "SkRect.h" #include "SkColorSpace.h" +#include "SkMatrix44.h" #include <jni.h> #include <hwui/Canvas.h> #include <hwui/Bitmap.h> @@ -112,6 +113,13 @@ public: static sk_sp<SkColorSpace> linearColorSpace(); static sk_sp<SkColorSpace> colorSpaceForType(SkColorType type); static bool isColorSpaceSRGB(SkColorSpace* colorSpace); + + static SkColorSpaceTransferFn getNativeTransferParameters(JNIEnv* env, jobject transferParams); + static SkMatrix44 getNativeXYZMatrix(JNIEnv* env, jfloatArray xyzD50); + static sk_sp<SkColorSpace> getNativeColorSpace(JNIEnv* env, jobject colorSpace); + + static jobject getColorSpace(JNIEnv* env, sk_sp<SkColorSpace>& decodeColorSpace, + SkColorType decodeColorType); }; class HeapAllocator : public SkBRDAllocator { diff --git a/core/jni/android/graphics/Typeface.cpp b/core/jni/android/graphics/Typeface.cpp index 95d43c6c8203..86c97a1e558c 100644 --- a/core/jni/android/graphics/Typeface.cpp +++ b/core/jni/android/graphics/Typeface.cpp @@ -87,7 +87,8 @@ static jint Typeface_getBaseWeight(JNIEnv* env, jobject obj, jlong faceHandle) { return face->fBaseWeight; } -static jlong Typeface_createFromArray(JNIEnv *env, jobject, jlongArray familyArray) { +static jlong Typeface_createFromArray(JNIEnv *env, jobject, jlongArray familyArray, + int weight, int italic) { ScopedLongArrayRO families(env, familyArray); std::vector<std::shared_ptr<minikin::FontFamily>> familyVec; familyVec.reserve(families.size()); @@ -95,7 +96,8 @@ static jlong Typeface_createFromArray(JNIEnv *env, jobject, jlongArray familyArr FontFamilyWrapper* family = reinterpret_cast<FontFamilyWrapper*>(families[i]); familyVec.emplace_back(family->family); } - return reinterpret_cast<jlong>(Typeface::createFromFamilies(std::move(familyVec))); + return reinterpret_cast<jlong>( + Typeface::createFromFamilies(std::move(familyVec), weight, italic)); } static void Typeface_setDefault(JNIEnv *env, jobject, jlong faceHandle) { @@ -133,7 +135,7 @@ static const JNINativeMethod gTypefaceMethods[] = { { "nativeUnref", "(J)V", (void*)Typeface_unref }, { "nativeGetStyle", "(J)I", (void*)Typeface_getStyle }, { "nativeGetBaseWeight", "(J)I", (void*)Typeface_getBaseWeight }, - { "nativeCreateFromArray", "([J)J", + { "nativeCreateFromArray", "([JII)J", (void*)Typeface_createFromArray }, { "nativeSetDefault", "(J)V", (void*)Typeface_setDefault }, { "nativeGetSupportedAxes", "(J)[I", (void*)Typeface_getSupportedAxes }, diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f92a46bb5a5d..8869593c2194 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1526,6 +1526,16 @@ <permission android:name="android.permission.DVB_DEVICE" android:protectionLevel="signature|privileged" /> + <!-- @SystemApi Allows reading and enabling/disabling the OEM unlock allowed by carrier state + @hide <p>Not for use by third-party applications. --> + <permission android:name="android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE" + android:protectionLevel="signature|privileged" /> + + <!-- @SystemApi Allows reading and enabling/disabling the OEM unlock allowed by user state + @hide <p>Not for use by third-party applications. --> + <permission android:name="android.permission.MANAGE_USER_OEM_UNLOCK_STATE" + android:protectionLevel="signature|privileged" /> + <!-- @SystemApi Allows reading the OEM unlock state @hide <p>Not for use by third-party applications. --> <permission android:name="android.permission.READ_OEM_UNLOCK_STATE" @@ -3546,6 +3556,11 @@ android:process=":ui"> </activity> + <activity android:name="com.android.settings.notification.NotificationAccessConfirmationActivity" + android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.Alert" + android:excludeFromRecents="true"> + </activity> + <receiver android:name="com.android.server.BootReceiver" android:systemUserOnly="true"> <intent-filter android:priority="1000"> diff --git a/core/res/res/drawable-hdpi/ic_accessibility_magnification.png b/core/res/res/drawable-hdpi/ic_accessibility_magnification.png Binary files differnew file mode 100755 index 000000000000..a91bc6ec90ed --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_accessibility_magnification.png diff --git a/core/res/res/drawable-mdpi/ic_accessibility_magnification.png b/core/res/res/drawable-mdpi/ic_accessibility_magnification.png Binary files differnew file mode 100755 index 000000000000..9ec51075a5ed --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_accessibility_magnification.png diff --git a/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png Binary files differnew file mode 100755 index 000000000000..0b3a32ed1792 --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_accessibility_magnification.png diff --git a/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png Binary files differnew file mode 100755 index 000000000000..3eeb1c9f8dd8 --- /dev/null +++ b/core/res/res/drawable-xxhdpi/ic_accessibility_magnification.png diff --git a/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png b/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png Binary files differnew file mode 100755 index 000000000000..7d376126b4d7 --- /dev/null +++ b/core/res/res/drawable-xxxhdpi/ic_accessibility_magnification.png diff --git a/core/res/res/layout/autofill_dataset_picker.xml b/core/res/res/layout/autofill_dataset_picker.xml index 5a835b7e8f4f..528efca49fc3 100644 --- a/core/res/res/layout/autofill_dataset_picker.xml +++ b/core/res/res/layout/autofill_dataset_picker.xml @@ -15,6 +15,7 @@ --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/autofill_dataset_picker" android:layout_width="fill_parent" android:layout_height="fill_parent" style="@style/AutofillDatasetPicker"> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 5ede1c954ce5..4fb21fae8908 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -430,10 +430,9 @@ <flag name="adjustNothing" value="0x30" /> </attr> - <!-- Flag allowing you to disable the preview animation for a window. - The default value is false; if set to true, the system can never - use the window's theme to show a preview of it before your - actual instance is shown to the user. --> + <!-- Flag allowing you to disable the splash screen for a window. The default value is + false; if set to true, the system can never use the window's theme to show a splash + screen before your actual instance is shown to the user. --> <attr name="windowDisablePreview" format="boolean" /> <!-- Flag indicating that this window should not be displayed at all. @@ -1372,6 +1371,22 @@ Corresponds to {@link android.view.inputmethod.EditorInfo#IME_ACTION_PREVIOUS}. --> <flag name="actionPrevious" value="0x00000007" /> + <!-- Used to request that the IME should not update any personalized data such as typing + history and personalized language model based on what the user typed on this text + editing object. Typical use cases are: + <ul> + <li>When the application is in a special mode, where user's activities are expected + to be not recorded in the application's history. Some web browsers and chat + applications may have this kind of modes.</li> + <li>When storing typing history does not make much sense. Specifying this flag in + typing games may help to avoid typing history from being filled up with words that + the user is less likely to type in their daily life. Another example is that when + the application already knows that the expected input is not a valid word (e.g. a + promotion code that is not a valid word in any natural language).</li> + </ul> + <p>Applications need to be aware that the flag is not a guarantee, and some IMEs may + not respect it.</p> --> + <flag name="flagNoPersonalizedLearning" value="0x1000000" /> <!-- Used to request that the IME never go into fullscreen mode. Applications need to be aware that the flag is not a guarantee, and not all IMEs will respect it. @@ -2049,6 +2064,17 @@ Corresponds to setting {@link android.view.View#SYSTEM_UI_FLAG_LIGHT_STATUS_BAR} on the decor view. --> <attr name="windowLightStatusBar" format="boolean" /> + + <!-- Reference to a drawable to be used as the splash screen content of the window. This + drawable will be placed on top of the {@link android.R.attr#windowBackground} with its + bounds inset by the system bars. If the drawable should not be inset by the system + bars, use a fullscreen theme. + <p> + Note that even if no splashscreen content is set on the theme, the system may still + show a splash screen using the other attributes on the theme, like the + {@link android.R.attr#windowBackground}. + --> + <attr name="windowSplashscreenContent" format="reference" /> </declare-styleable> <!-- The set of attributes that describe a AlertDialog's theme. --> @@ -2294,18 +2320,7 @@ <enum name="auto" value="0x00000010" /> </attr> - <!-- Controls the autofill behavior for this view. --> - <attr name="autofillMode"> - <!-- Inherit the behavior from the parent. If there is no parent it is auto. This is the - default value for this attribute.--> - <enum name="inherit" value="0" /> - <!-- Allows this view to automatically trigger an autofill request when it get focus. - --> - <enum name="auto" value="1" /> - <!-- Do not trigger an autofill request when this view is focused. The user can still - manually force an autofill request for this view. --> - <enum name="manual" value="2" /> - </attr> + <attr name="__removed3" /> <!-- Describes the content of a view so that a autofill service can fill in the appropriate data. Multiple hints can be combined in a comma separated list or an array of strings diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 31ece50c37fa..213d6cafa72b 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2797,7 +2797,7 @@ <public name="numericModifiers" /> <public name="fontProviderAuthority" /> <public name="fontProviderQuery" /> - <public name="autofillMode" /> + <public name="__removed3" /> <public name="primaryContentAlpha" /> <public name="secondaryContentAlpha" /> <public name="requiredFeature" /> @@ -2816,6 +2816,7 @@ <public name="iconSpaceReserved"/> <public name="defaultFocusHighlightEnabled" /> <public name="persistentFeature"/> + <public name="windowSplashscreenContent" /> </public-group> <public-group type="style" first-id="0x010302e0"> @@ -2835,7 +2836,6 @@ <public name="paste_as_plain_text" /> </public-group> - <!-- =============================================================== DO NOT ADD UN-GROUPED ITEMS HERE diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 44a4af723307..74cbe27a75ad 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -19,6 +19,9 @@ <!-- Private symbols that we need to reference from framework code. See frameworks/base/core/res/MakeJavaSymbols.sed for how to easily generate this. + + Can be referenced in java code as: com.android.internal.R.<type>.<name> + and in layout xml as: "@*android:<type>/<name>" --> <java-symbol type="id" name="account_name" /> <java-symbol type="id" name="account_row_icon" /> @@ -2857,6 +2860,7 @@ <java-symbol type="id" name="accessibility_button_target_icon" /> <java-symbol type="id" name="accessibility_button_target_label" /> <java-symbol type="string" name="accessibility_magnification_chooser_text" /> + <java-symbol type="drawable" name="ic_accessibility_magnification" /> <!-- com.android.internal.widget.RecyclerView --> <java-symbol type="id" name="item_touch_helper_previous_elevation"/> @@ -2867,6 +2871,7 @@ <!-- com.android.server.autofill --> <java-symbol type="layout" name="autofill_save"/> <java-symbol type="layout" name="autofill_dataset_picker"/> + <java-symbol type="id" name="autofill_dataset_picker"/> <java-symbol type="id" name="autofill_dataset_list"/> <java-symbol type="id" name="autofill" /> <java-symbol type="id" name="autofill_save_title" /> diff --git a/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java b/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java index 6bcf8fc43d10..0e1e6ac98672 100644 --- a/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java +++ b/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java @@ -27,6 +27,6 @@ public class BasicAnimatorActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.animator_basic); - mAnimatingButton = (Button) findViewById(R.id.animatingButton); + mAnimatingButton = findViewById(R.id.animatingButton); } } diff --git a/core/tests/coretests/src/android/os/BrightnessLimit.java b/core/tests/coretests/src/android/os/BrightnessLimit.java index f4a5e09033ed..43cd373ef850 100644 --- a/core/tests/coretests/src/android/os/BrightnessLimit.java +++ b/core/tests/coretests/src/android/os/BrightnessLimit.java @@ -40,7 +40,7 @@ public class BrightnessLimit extends Activity implements OnClickListener { setContentView(R.layout.brightness_limit); - Button b = (Button) findViewById(R.id.go); + Button b = findViewById(R.id.go); b.setOnClickListener(this); } diff --git a/core/tests/coretests/src/android/view/Disabled.java b/core/tests/coretests/src/android/view/Disabled.java index fa921071874d..d3c7470bd0f9 100644 --- a/core/tests/coretests/src/android/view/Disabled.java +++ b/core/tests/coretests/src/android/view/Disabled.java @@ -34,16 +34,16 @@ public class Disabled extends Activity implements OnClickListener { setContentView(R.layout.disabled); // Find our buttons - Button disabledButton = (Button) findViewById(R.id.disabledButton); + Button disabledButton = findViewById(R.id.disabledButton); disabledButton.setEnabled(false); // Find our buttons - Button disabledButtonA = (Button) findViewById(R.id.disabledButtonA); + Button disabledButtonA = findViewById(R.id.disabledButtonA); disabledButtonA.setOnClickListener(this); } public void onClick(View v) { - Button disabledButtonB = (Button) findViewById(R.id.disabledButtonB); + Button disabledButtonB = findViewById(R.id.disabledButtonB); disabledButtonB.setEnabled(!disabledButtonB.isEnabled()); } } diff --git a/core/tests/coretests/src/android/view/DrawableBgMinSize.java b/core/tests/coretests/src/android/view/DrawableBgMinSize.java index a75b23aaee04..58bfb8a77064 100644 --- a/core/tests/coretests/src/android/view/DrawableBgMinSize.java +++ b/core/tests/coretests/src/android/view/DrawableBgMinSize.java @@ -58,14 +58,14 @@ public class DrawableBgMinSize extends Activity implements OnClickListener { mBackgroundDrawable = getResources().getDrawable(R.drawable.drawable_background); mBigBackgroundDrawable = getResources().getDrawable(R.drawable.big_drawable_background); - mChangeBackgroundsButton = (Button) findViewById(R.id.change_backgrounds); + mChangeBackgroundsButton = findViewById(R.id.change_backgrounds); mChangeBackgroundsButton.setOnClickListener(this); - mTextView = (TextView) findViewById(R.id.text_view); - mLinearLayout = (LinearLayout) findViewById(R.id.linear_layout); - mRelativeLayout = (RelativeLayout) findViewById(R.id.relative_layout); - mFrameLayout = (FrameLayout) findViewById(R.id.frame_layout); - mAbsoluteLayout = (AbsoluteLayout) findViewById(R.id.absolute_layout); + mTextView = findViewById(R.id.text_view); + mLinearLayout = findViewById(R.id.linear_layout); + mRelativeLayout = findViewById(R.id.relative_layout); + mFrameLayout = findViewById(R.id.frame_layout); + mAbsoluteLayout = findViewById(R.id.absolute_layout); changeBackgrounds(mBackgroundDrawable); } diff --git a/core/tests/coretests/src/android/view/PopupWindowVisibility.java b/core/tests/coretests/src/android/view/PopupWindowVisibility.java index 6e11ede201db..85ce04fae71b 100644 --- a/core/tests/coretests/src/android/view/PopupWindowVisibility.java +++ b/core/tests/coretests/src/android/view/PopupWindowVisibility.java @@ -45,13 +45,13 @@ public class PopupWindowVisibility extends Activity implements OnClickListener { mFrame = findViewById(R.id.frame); - mHide = (Button) findViewById(R.id.hide); + mHide = findViewById(R.id.hide); mHide.setOnClickListener(this); - mShow = (Button) findViewById(R.id.show); + mShow = findViewById(R.id.show); mShow.setOnClickListener(this); - Spinner spinner = (Spinner) findViewById(R.id.spinner); + Spinner spinner = findViewById(R.id.spinner); ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mStrings); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -59,7 +59,7 @@ public class PopupWindowVisibility extends Activity implements OnClickListener { ArrayAdapter<String> autoAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); - AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.auto); + AutoCompleteTextView textView = findViewById(R.id.auto); textView.setAdapter(autoAdapter); } diff --git a/core/tests/coretests/src/android/view/PreDrawListener.java b/core/tests/coretests/src/android/view/PreDrawListener.java index 981c6c06ce7f..60bbee483173 100644 --- a/core/tests/coretests/src/android/view/PreDrawListener.java +++ b/core/tests/coretests/src/android/view/PreDrawListener.java @@ -75,9 +75,9 @@ public class PreDrawListener extends Activity implements OnClickListener { super.onCreate(icicle); setContentView(R.layout.pre_draw_listener); - mFrame = (MyLinearLayout) findViewById(R.id.frame); + mFrame = findViewById(R.id.frame); - Button mGoButton = (Button) findViewById(R.id.go); + Button mGoButton = findViewById(R.id.go); mGoButton.setOnClickListener(this); } diff --git a/core/tests/coretests/src/android/view/Visibility.java b/core/tests/coretests/src/android/view/Visibility.java index 97ff252eb034..031568c5a446 100644 --- a/core/tests/coretests/src/android/view/Visibility.java +++ b/core/tests/coretests/src/android/view/Visibility.java @@ -37,9 +37,9 @@ public class Visibility extends Activity { mVictim = findViewById(R.id.victim); // Find our buttons - Button visibleButton = (Button) findViewById(R.id.vis); - Button invisibleButton = (Button) findViewById(R.id.invis); - Button goneButton = (Button) findViewById(R.id.gone); + Button visibleButton = findViewById(R.id.vis); + Button invisibleButton = findViewById(R.id.invis); + Button goneButton = findViewById(R.id.gone); // Wire each button to a click listener visibleButton.setOnClickListener(mVisibleListener); diff --git a/core/tests/coretests/src/android/view/VisibilityCallback.java b/core/tests/coretests/src/android/view/VisibilityCallback.java index 7290a62f3133..f98a0a882764 100644 --- a/core/tests/coretests/src/android/view/VisibilityCallback.java +++ b/core/tests/coretests/src/android/view/VisibilityCallback.java @@ -45,9 +45,9 @@ public class VisibilityCallback extends Activity { mVictim = (MonitoredTextView)findViewById(R.id.victim); // Find our buttons - Button visibleButton = (Button) findViewById(R.id.vis); - Button invisibleButton = (Button) findViewById(R.id.invis); - Button goneButton = (Button) findViewById(R.id.gone); + Button visibleButton = findViewById(R.id.vis); + Button invisibleButton = findViewById(R.id.invis); + Button goneButton = findViewById(R.id.gone); // Wire each button to a click listener visibleButton.setOnClickListener(mVisibleListener); diff --git a/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java b/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java index f6cec26f3e08..b4e05aa26de7 100644 --- a/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java +++ b/core/tests/coretests/src/android/widget/AutoCompleteTextViewSimple.java @@ -47,7 +47,7 @@ public class AutoCompleteTextViewSimple extends Activity // setup layout & views setContentView(R.layout.autocompletetextview_simple); - mTextView = (AutoCompleteTextView) findViewById(R.id.autocompletetextview1); + mTextView = findViewById(R.id.autocompletetextview1); // configure callbacks used for monitoring mTextView.setOnItemClickListener(this); diff --git a/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java b/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java index f7d91aa31357..f6b0520fbadb 100644 --- a/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java +++ b/core/tests/coretests/src/android/widget/focus/DescendantFocusability.java @@ -40,13 +40,13 @@ public class DescendantFocusability extends Activity { setContentView(R.layout.descendant_focusability); - beforeDescendants = (ViewGroup) findViewById(R.id.beforeDescendants); + beforeDescendants = findViewById(R.id.beforeDescendants); beforeDescendantsChild = (Button) beforeDescendants.getChildAt(0); - afterDescendants = (ViewGroup) findViewById(R.id.afterDescendants); + afterDescendants = findViewById(R.id.afterDescendants); afterDescendantsChild = (Button) afterDescendants.getChildAt(0); - blocksDescendants = (ViewGroup) findViewById(R.id.blocksDescendants); + blocksDescendants = findViewById(R.id.blocksDescendants); blocksDescendantsChild = (Button) blocksDescendants.getChildAt(0); } diff --git a/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java b/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java index 93245e7b8116..b3d5ec5e5099 100644 --- a/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java +++ b/core/tests/coretests/src/android/widget/focus/FocusAfterRemoval.java @@ -35,10 +35,10 @@ public class FocusAfterRemoval extends Activity { super.onCreate(icicle); setContentView(R.layout.focus_after_removal); - final LinearLayout left = (LinearLayout) findViewById(R.id.leftLayout); + final LinearLayout left = findViewById(R.id.leftLayout); // top left makes parent layout GONE - Button topLeftButton = (Button) findViewById(R.id.topLeftButton); + Button topLeftButton = findViewById(R.id.topLeftButton); topLeftButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { @@ -48,7 +48,7 @@ public class FocusAfterRemoval extends Activity { // bottom left makes parent layout INVISIBLE // top left makes parent layout GONE - Button bottomLeftButton = (Button) findViewById(R.id.bottomLeftButton); + Button bottomLeftButton = findViewById(R.id.bottomLeftButton); bottomLeftButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { @@ -57,7 +57,7 @@ public class FocusAfterRemoval extends Activity { }); // top right button makes top right button GONE - final Button topRightButton = (Button) findViewById(R.id.topRightButton); + final Button topRightButton = findViewById(R.id.topRightButton); topRightButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { @@ -66,7 +66,7 @@ public class FocusAfterRemoval extends Activity { }); // bottom right button makes bottom right button INVISIBLE - final Button bottomRightButton = (Button) findViewById(R.id.bottomRightButton); + final Button bottomRightButton = findViewById(R.id.bottomRightButton); bottomRightButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { diff --git a/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java b/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java index db082ec6a5b7..acd632f3402b 100644 --- a/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java +++ b/core/tests/coretests/src/android/widget/focus/LinearLayoutGrid.java @@ -33,7 +33,7 @@ public class LinearLayoutGrid extends Activity { } public ViewGroup getRootView() { - return (ViewGroup) findViewById(R.id.layout); + return findViewById(R.id.layout); } public Button getButtonAt(int column, int row) { @@ -51,11 +51,11 @@ public class LinearLayoutGrid extends Activity { private LinearLayout getColumn(int column) { switch (column) { case 0: - return (LinearLayout) findViewById(R.id.column1); + return findViewById(R.id.column1); case 1: - return (LinearLayout) findViewById(R.id.column2); + return findViewById(R.id.column2); case 2: - return (LinearLayout) findViewById(R.id.column3); + return findViewById(R.id.column3); default: throw new IllegalArgumentException("column out of range"); } diff --git a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java index ceb0e953cf5c..b9082011f8b4 100644 --- a/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java +++ b/core/tests/coretests/src/android/widget/focus/ListWithFooterViewAndNewLabels.java @@ -54,7 +54,7 @@ public class ListWithFooterViewAndNewLabels extends ListActivity { setListAdapter(mMyAdapter); // not in list - Button topButton = (Button) findViewById(R.id.button); + Button topButton = findViewById(R.id.button); topButton.setText("click to add new item"); topButton.setOnClickListener(new View.OnClickListener() { diff --git a/core/tests/coretests/src/android/widget/focus/RequestFocus.java b/core/tests/coretests/src/android/widget/focus/RequestFocus.java index 21d762a55061..4daf0b4206b0 100644 --- a/core/tests/coretests/src/android/widget/focus/RequestFocus.java +++ b/core/tests/coretests/src/android/widget/focus/RequestFocus.java @@ -34,7 +34,7 @@ public class RequestFocus extends Activity { setContentView(R.layout.focus_after_removal); // bottom right button starts with the focus. - final Button bottomRightButton = (Button) findViewById(R.id.bottomRightButton); + final Button bottomRightButton = findViewById(R.id.bottomRightButton); bottomRightButton.requestFocus(); bottomRightButton.setText("I should have focus"); } diff --git a/core/tests/coretests/src/android/widget/gridview/GridPadding.java b/core/tests/coretests/src/android/widget/gridview/GridPadding.java index 0b9e4c5c146b..c3156dcbb819 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridPadding.java +++ b/core/tests/coretests/src/android/widget/gridview/GridPadding.java @@ -40,7 +40,7 @@ public class GridPadding extends Activity { values[i] = String.valueOf(i); } - mGridView = (GridView) findViewById(R.id.grid); + mGridView = findViewById(R.id.grid); mGridView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values)); } diff --git a/core/tests/coretests/src/android/widget/gridview/GridScrollListener.java b/core/tests/coretests/src/android/widget/gridview/GridScrollListener.java index 4290941426de..0ce5a31c8539 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridScrollListener.java +++ b/core/tests/coretests/src/android/widget/gridview/GridScrollListener.java @@ -46,8 +46,8 @@ public class GridScrollListener extends Activity implements AbsListView.OnScroll values[i] = ((Integer)i).toString(); } - mText = (TextView) findViewById(R.id.text); - mGridView = (GridView) findViewById(R.id.grid); + mText = findViewById(R.id.text); + mGridView = findViewById(R.id.grid); mGridView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values)); diff --git a/core/tests/coretests/src/android/widget/gridview/GridThrasher.java b/core/tests/coretests/src/android/widget/gridview/GridThrasher.java index 0ef5db951a29..ad89bb6ab90c 100644 --- a/core/tests/coretests/src/android/widget/gridview/GridThrasher.java +++ b/core/tests/coretests/src/android/widget/gridview/GridThrasher.java @@ -115,9 +115,9 @@ public class GridThrasher extends Activity implements AdapterView.OnItemSelected setContentView(R.layout.grid_thrasher); - mText = (TextView) findViewById(R.id.text); + mText = findViewById(R.id.text); mAdapter = new ThrashListAdapter(this); - GridView g = (GridView) findViewById(R.id.grid); + GridView g = findViewById(R.id.grid); g.setAdapter(mAdapter); mHandler.postDelayed(mThrash, 5000); diff --git a/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java b/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java index fe2525f5f3ba..83331caa6069 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java +++ b/core/tests/coretests/src/android/widget/layout/linear/LLEditTextThenButton.java @@ -36,9 +36,9 @@ public class LLEditTextThenButton extends Activity { setContentView(R.layout.linear_layout_edittext_then_button); - mLayout = (LinearLayout) findViewById(R.id.layout); - mEditText = (EditText) findViewById(R.id.editText); - mButton = (Button) findViewById(R.id.button); + mLayout = findViewById(R.id.layout); + mEditText = findViewById(R.id.editText); + mButton = findViewById(R.id.button); } public LinearLayout getLayout() { diff --git a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java index 3d0144f9f8cc..ab2f060eafc2 100644 --- a/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java +++ b/core/tests/coretests/src/android/widget/layout/linear/LLOfButtons1.java @@ -37,7 +37,7 @@ public class LLOfButtons1 extends Activity { protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.linear_layout_buttons); - mFirstButton = (Button) findViewById(R.id.button1); + mFirstButton = findViewById(R.id.button1); mFirstButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { @@ -48,7 +48,7 @@ public class LLOfButtons1 extends Activity { } public LinearLayout getLayout() { - return (LinearLayout) findViewById(R.id.layout); + return findViewById(R.id.layout); } public Button getFirstButton() { diff --git a/core/tests/coretests/src/android/widget/listview/ListDividers.java b/core/tests/coretests/src/android/widget/listview/ListDividers.java index 3928c03e01a5..9b5a0879d6ba 100644 --- a/core/tests/coretests/src/android/widget/listview/ListDividers.java +++ b/core/tests/coretests/src/android/widget/listview/ListDividers.java @@ -40,7 +40,7 @@ public class ListDividers extends Activity { values[i] = ((Integer) i).toString(); } - mListView = (ListView) findViewById(android.R.id.list); + mListView = findViewById(android.R.id.list); mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values)); diff --git a/core/tests/coretests/src/android/widget/listview/ListFilter.java b/core/tests/coretests/src/android/widget/listview/ListFilter.java index 9e9d1b05cabe..c2ac90e7c47c 100644 --- a/core/tests/coretests/src/android/widget/listview/ListFilter.java +++ b/core/tests/coretests/src/android/widget/listview/ListFilter.java @@ -46,10 +46,10 @@ public class ListFilter extends ListActivity implements OnClickListener { getListView().setTextFilterEnabled(true); mFrame = findViewById(R.id.frame); - mHide = (Button) findViewById(R.id.hide); + mHide = findViewById(R.id.hide); mHide.setOnClickListener(this); - mShow = (Button) findViewById(R.id.show); + mShow = findViewById(R.id.show); mShow.setOnClickListener(this); } diff --git a/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java b/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java index 5f09ff6209c6..a373a5b19be3 100644 --- a/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java +++ b/core/tests/coretests/src/android/widget/listview/ListInHorizontal.java @@ -43,7 +43,7 @@ public class ListInHorizontal extends Activity { values[i] = ((Integer) i).toString(); } - mListView = (ListView) findViewById(R.id.list); + mListView = findViewById(R.id.list); mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values)); diff --git a/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java b/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java index d5d726191ae3..76814fb480cd 100644 --- a/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java +++ b/core/tests/coretests/src/android/widget/listview/ListRecyclerProfiling.java @@ -38,14 +38,14 @@ public class ListRecyclerProfiling extends Activity { values[i] = ((Integer) i).toString(); } - ListView listView = (ListView) findViewById(R.id.list); + ListView listView = findViewById(R.id.list); ViewDebug.startRecyclerTracing("SimpleList", listView); listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values)); - ImageButton stopProfiling = (ImageButton) findViewById(R.id.pause); + ImageButton stopProfiling = findViewById(R.id.pause); stopProfiling.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { ViewDebug.stopRecyclerTracing(); diff --git a/core/tests/coretests/src/android/widget/listview/ListScrollListener.java b/core/tests/coretests/src/android/widget/listview/ListScrollListener.java index 58a31dc4f2cb..f349dc6ac13a 100644 --- a/core/tests/coretests/src/android/widget/listview/ListScrollListener.java +++ b/core/tests/coretests/src/android/widget/listview/ListScrollListener.java @@ -46,7 +46,7 @@ public class ListScrollListener extends ListActivity implements AbsListView.OnSc values[i] = ((Integer)i).toString(); } - mText = (TextView) findViewById(R.id.text); + mText = findViewById(R.id.text); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values)); diff --git a/core/tests/coretests/src/android/widget/listview/ListThrasher.java b/core/tests/coretests/src/android/widget/listview/ListThrasher.java index ba3d5901fab5..0237a9551ce5 100644 --- a/core/tests/coretests/src/android/widget/listview/ListThrasher.java +++ b/core/tests/coretests/src/android/widget/listview/ListThrasher.java @@ -112,7 +112,7 @@ public class ListThrasher extends ListActivity implements AdapterView.OnItemSele setContentView(R.layout.list_thrasher); - mText = (TextView) findViewById(R.id.text); + mText = findViewById(R.id.text); mAdapter = new ThrashListAdapter(this); setListAdapter(mAdapter); diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java index 9cc85441e631..afc275f25181 100644 --- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java +++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisible.java @@ -43,8 +43,8 @@ public class RequestRectangleVisible extends Activity { final Rect rect = new Rect(); final View childToMakeVisible = findViewById(R.id.childToMakeVisible); - final TextView topBlob = (TextView) findViewById(R.id.topBlob); - final TextView bottomBlob = (TextView) findViewById(R.id.bottomBlob); + final TextView topBlob = findViewById(R.id.topBlob); + final TextView bottomBlob = findViewById(R.id.bottomBlob); // estimate to get blobs larger than screen int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); diff --git a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java index 0e2586d2d856..731b25a08926 100644 --- a/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java +++ b/core/tests/coretests/src/android/widget/scroll/RequestRectangleVisibleWithInternalScroll.java @@ -53,11 +53,11 @@ public class RequestRectangleVisibleWithInternalScroll extends Activity { setContentView(R.layout.scroll_to_rect_with_internal_scroll); - mTextBlob = (TextView) findViewById(R.id.blob); + mTextBlob = findViewById(R.id.blob); mTextBlob.scrollBy(0, scrollYofBlob); - mScrollToBlob = (Button) findViewById(R.id.scrollToBlob); + mScrollToBlob = findViewById(R.id.scrollToBlob); mScrollToBlob.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { diff --git a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java index 4d0892c35aaf..027ea0f83350 100644 --- a/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java +++ b/core/tests/coretests/src/android/widget/scroll/ScrollViewButtonsAndLabels.java @@ -66,8 +66,8 @@ public class ScrollViewButtonsAndLabels extends Activity { int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); mNumGroups = screenHeight / 30; - mScrollView = (ScrollView) findViewById(R.id.scrollView); - mLinearLayout = (LinearLayout) findViewById(R.id.layout); + mScrollView = findViewById(R.id.scrollView); + mLinearLayout = findViewById(R.id.layout); LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index ec653d0849b1..7f07f03dde61 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -40,6 +40,7 @@ applications that come with the platform <privapp-permissions package="com.android.defcontainer"> <permission name="android.permission.ACCESS_CACHE_FILESYSTEM"/> + <permission name="android.permission.ALLOCATE_AGGRESSIVE"/> <permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.WRITE_MEDIA_STORAGE"/> </privapp-permissions> diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 919068500e6f..7a8e4873a7c9 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -916,9 +916,8 @@ public final class Bitmap implements Parcelable { * @param hasAlpha If the bitmap is ARGB_8888 or RGBA_16F this flag can be used to * mark the bitmap as opaque. Doing so will clear the bitmap in black * instead of transparent. - * @param colorSpace The color space of the bitmap. If null, - * {@link ColorSpace.Named#SRGB sRGB} is assumed. This argument is - * ignored if the config is not {@link Config#ARGB_8888}. + * @param colorSpace The color space of the bitmap. If null or if the config is not + * {@link Config#ARGB_8888}, {@link ColorSpace.Named#SRGB sRGB} is assumed. * * @throws IllegalArgumentException if the width or height are <= 0, if * Config is Config.HARDWARE (because hardware bitmaps are always @@ -968,9 +967,8 @@ public final class Bitmap implements Parcelable { * @param hasAlpha If the bitmap is ARGB_8888 or RGBA_16F this flag can be used to * mark the bitmap as opaque. Doing so will clear the bitmap in black * instead of transparent. - * @param colorSpace The color space of the bitmap. If null, - * {@link ColorSpace.Named#SRGB sRGB} is assumed. This argument is - * ignored if the config is not {@link Config#ARGB_8888}. + * @param colorSpace The color space of the bitmap. If null or if the config is not + * {@link Config#ARGB_8888}, {@link ColorSpace.Named#SRGB sRGB} is assumed. * * @throws IllegalArgumentException if the width or height are <= 0, if * Config is Config.HARDWARE (because hardware bitmaps are always diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index ceedc1fdb360..3b272c8ddec7 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -43,7 +43,6 @@ public class BitmapFactory { * the same result from the decoder as if null were passed. */ public Options() { - inDither = false; inScaled = true; inPremultiplied = true; } @@ -114,8 +113,8 @@ public class BitmapFactory { /** * If set to true, the decoder will return null (no bitmap), but - * the out... fields will still be set, allowing the caller to query - * the bitmap without having to allocate the memory for its pixels. + * the <code>out...</code> fields will still be set, allowing the caller to + * query the bitmap without having to allocate the memory for its pixels. */ public boolean inJustDecodeBounds; @@ -144,6 +143,35 @@ public class BitmapFactory { public Bitmap.Config inPreferredConfig = Bitmap.Config.ARGB_8888; /** + * <p>If this is non-null, the decoder will try to decode into this + * color space. If it is null, or the request cannot be met, + * the decoder will pick either the color space embedded in the image + * or the color space best suited for the requested image configuration + * (for instance {@link ColorSpace.Named#SRGB sRGB} for + * the {@link Bitmap.Config#ARGB_8888} configuration).</p> + * + * <p>{@link Bitmap.Config#RGBA_F16} always uses the + * {@link ColorSpace.Named#LINEAR_EXTENDED_SRGB scRGB} color space). + * Bitmaps in other configurations without an embedded color space are + * assumed to be in the {@link ColorSpace.Named#SRGB sRGB} color space.</p> + * + * <p class="note">Only {@link ColorSpace.Model#RGB} color spaces are + * currently supported. An <code>IllegalArgumentException</code> will + * be thrown by the decode methods when setting a non-RGB color space + * such as {@link ColorSpace.Named#CIE_LAB Lab}.</p> + * + * <p class="note">The specified color space's transfer function must be + * an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve}. An + * <code>IllegalArgumentException</code> will be thrown by the decode methods + * if calling {@link ColorSpace.Rgb#getTransferParameters()} on the + * specified color space returns null.</p> + * + * <p>After decode, the bitmap's color space is stored in + * {@link #outColorSpace}.</p> + */ + public ColorSpace inPreferredColorSpace = null; + + /** * If true (which is the default), the resulting bitmap will have its * color channels pre-multipled by the alpha channel. * @@ -403,9 +431,22 @@ public class BitmapFactory { } static void validate(Options opts) { - if (opts != null && opts.inMutable && opts.inPreferredConfig == Bitmap.Config.HARDWARE) { + if (opts == null) return; + + if (opts.inMutable && opts.inPreferredConfig == Bitmap.Config.HARDWARE) { throw new IllegalArgumentException("Bitmaps with Config.HARWARE are always immutable"); } + + if (opts.inPreferredColorSpace != null) { + if (!(opts.inPreferredColorSpace instanceof ColorSpace.Rgb)) { + throw new IllegalArgumentException("The destination color space must use the " + + "RGB color model"); + } + if (((ColorSpace.Rgb) opts.inPreferredColorSpace).getTransferParameters() == null) { + throw new IllegalArgumentException("The destination color space must use an " + + "ICC parametric transfer function"); + } + } } } @@ -421,7 +462,9 @@ public class BitmapFactory { * size be returned (in opts.outWidth and opts.outHeight) * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} * is {@link android.graphics.Bitmap.Config#HARDWARE} - * and {@link BitmapFactory.Options#inMutable} is set. + * and {@link BitmapFactory.Options#inMutable} is set, if the specified color space + * is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer + * function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} */ public static Bitmap decodeFile(String pathName, Options opts) { validate(opts); @@ -463,7 +506,9 @@ public class BitmapFactory { * resources, which we pass to be able to scale the bitmap accordingly. * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} * is {@link android.graphics.Bitmap.Config#HARDWARE} - * and {@link BitmapFactory.Options#inMutable} is set. + * and {@link BitmapFactory.Options#inMutable} is set, if the specified color space + * is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer + * function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} */ public static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, Options opts) { @@ -501,7 +546,9 @@ public class BitmapFactory { * size be returned (in opts.outWidth and opts.outHeight) * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} * is {@link android.graphics.Bitmap.Config#HARDWARE} - * and {@link BitmapFactory.Options#inMutable} is set. + * and {@link BitmapFactory.Options#inMutable} is set, if the specified color space + * is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer + * function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} */ public static Bitmap decodeResource(Resources res, int id, Options opts) { validate(opts); @@ -559,7 +606,9 @@ public class BitmapFactory { * size be returned (in opts.outWidth and opts.outHeight) * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} * is {@link android.graphics.Bitmap.Config#HARDWARE} - * and {@link BitmapFactory.Options#inMutable} is set. + * and {@link BitmapFactory.Options#inMutable} is set, if the specified color space + * is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer + * function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} */ public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts) { if ((offset | length) < 0 || data.length < offset + length) { @@ -641,7 +690,9 @@ public class BitmapFactory { * size be returned (in opts.outWidth and opts.outHeight) * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} * is {@link android.graphics.Bitmap.Config#HARDWARE} - * and {@link BitmapFactory.Options#inMutable} is set. + * and {@link BitmapFactory.Options#inMutable} is set, if the specified color space + * is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer + * function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} * * <p class="note">Prior to {@link android.os.Build.VERSION_CODES#KITKAT}, * if {@link InputStream#markSupported is.markSupported()} returns true, @@ -720,7 +771,9 @@ public class BitmapFactory { * @return the decoded bitmap, or null * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} * is {@link android.graphics.Bitmap.Config#HARDWARE} - * and {@link BitmapFactory.Options#inMutable} is set. + * and {@link BitmapFactory.Options#inMutable} is set, if the specified color space + * is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer + * function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} */ public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) { validate(opts); diff --git a/graphics/java/android/graphics/BitmapRegionDecoder.java b/graphics/java/android/graphics/BitmapRegionDecoder.java index 04abca1f4bd4..2da27c7dfdbf 100644 --- a/graphics/java/android/graphics/BitmapRegionDecoder.java +++ b/graphics/java/android/graphics/BitmapRegionDecoder.java @@ -180,7 +180,9 @@ public final class BitmapRegionDecoder { * decoded. * @throws IllegalArgumentException if {@link BitmapFactory.Options#inPreferredConfig} * is {@link android.graphics.Bitmap.Config#HARDWARE} - * and {@link BitmapFactory.Options#inMutable} is set. + * and {@link BitmapFactory.Options#inMutable} is set, if the specified color space + * is not {@link ColorSpace.Model#RGB RGB}, or if the specified color space's transfer + * function is not an {@link ColorSpace.Rgb.TransferParameters ICC parametric curve} */ public Bitmap decodeRegion(Rect rect, BitmapFactory.Options options) { BitmapFactory.Options.validate(options); diff --git a/graphics/java/android/graphics/Color.java b/graphics/java/android/graphics/Color.java index 218b857ce83c..8cbf921f6a34 100644 --- a/graphics/java/android/graphics/Color.java +++ b/graphics/java/android/graphics/Color.java @@ -538,7 +538,7 @@ public class Color { /** * Returns the value of the alpha component in the range \([0..1]\). * Calling this method is equivalent to - * <code>getComponent(getComponentCount())</code>. + * <code>getComponent(getComponentCount() - 1)</code>. * * @see #red() * @see #green() @@ -690,9 +690,8 @@ public class Color { * Returns the color space encoded in the specified color long. * * @param color The color long whose color space to extract - * @return A non-null color space instance. If the color long encodes - * an unknown or invalid color space, the {@link ColorSpace.Named#SRGB sRGB} - * color space is returned + * @return A non-null color space instance + * @throws IllegalArgumentException If the encoded color space is invalid or unknown * * @see #red(long) * @see #green(long) @@ -787,6 +786,7 @@ public class Color { * * @param color The color to test * @return True if the color is in the sRGB color space, false otherwise + * @throws IllegalArgumentException If the encoded color space is invalid or unknown * * @see #isInColorSpace(long, ColorSpace) * @see #isWideGamut(long) @@ -802,6 +802,7 @@ public class Color { * * @param color The color to test * @return True if the color is in a wide-gamut color space, false otherwise + * @throws IllegalArgumentException If the encoded color space is invalid or unknown * * @see #isInColorSpace(long, ColorSpace) * @see #isSrgb(long) @@ -831,6 +832,7 @@ public class Color { * a color space conversion is applied if needed. * * @return An ARGB color in the sRGB color space + * @throws IllegalArgumentException If the encoded color space is invalid or unknown */ @ColorInt public static int toArgb(@ColorLong long color) { @@ -873,6 +875,7 @@ public class Color { * * @param color The color long to create a <code>Color</code> from * @return A non-null instance of {@link Color} + * @throws IllegalArgumentException If the encoded color space is invalid or unknown */ @NonNull public static Color valueOf(@ColorLong long color) { @@ -1100,6 +1103,7 @@ public class Color { * @param color The color long to convert * @param colorSpace The destination color space * @return A color long in the destination color space + * @throws IllegalArgumentException If the encoded color space is invalid or unknown */ @ColorLong public static long convert(@ColorLong long color, @NonNull ColorSpace colorSpace) { @@ -1206,7 +1210,7 @@ public class Color { * @return A value between 0 (darkest black) and 1 (lightest white) * * @throws IllegalArgumentException If the specified color's color space - * does not use the {@link ColorSpace.Model#RGB RGB} color model + * is unknown or does not use the {@link ColorSpace.Model#RGB RGB} color model */ public static float luminance(@ColorLong long color) { ColorSpace colorSpace = colorSpace(color); diff --git a/graphics/java/android/graphics/ColorSpace.java b/graphics/java/android/graphics/ColorSpace.java index 8f78319e8380..67504cfe323b 100644 --- a/graphics/java/android/graphics/ColorSpace.java +++ b/graphics/java/android/graphics/ColorSpace.java @@ -1338,9 +1338,8 @@ public abstract class ColorSpace { } /** - * <p>Returns an instance of {@link ColorSpace} whose ID matches the specified - * ID. If the ID is < 0 or > {@link #MAX_ID}, calling this method is equivalent - * to calling <code>get(Named.SRGB)</code>.</p> + * <p>Returns an instance of {@link ColorSpace} whose ID matches the + * specified ID.</p> * * <p>This method always returns the same instance for a given ID.</p> * @@ -1348,11 +1347,14 @@ public abstract class ColorSpace { * * @param index An integer ID between {@link #MIN_ID} and {@link #MAX_ID} * @return A non-null {@link ColorSpace} instance + * @throws IllegalArgumentException If the ID does not match the ID of one of the + * {@link Named named color spaces} */ @NonNull static ColorSpace get(@IntRange(from = MIN_ID, to = MAX_ID) int index) { if (index < 0 || index > Named.values().length) { - return get(Named.SRGB); + throw new IllegalArgumentException("Invalid ID, must be in the range [0.." + + Named.values().length + "]"); } return sNamedColorSpaces[index]; } diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index 2aca7824539e..97d3e5ee5609 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -173,7 +173,8 @@ public class Typeface { if (sFallbackFonts != null) { synchronized (sDynamicTypefaceCache) { final String key = Builder.createAssetUid( - mgr, path, 0 /* ttcIndex */, null /* axes */); + mgr, path, 0 /* ttcIndex */, null /* axes */, + RESOLVE_BY_FONT_TABLE /* weight */, RESOLVE_BY_FONT_TABLE /* italic */); Typeface typeface = sDynamicTypefaceCache.get(key); if (typeface != null) return typeface; @@ -186,7 +187,8 @@ public class Typeface { return null; } FontFamily[] families = {fontFamily}; - typeface = createFromFamiliesWithDefault(families); + typeface = createFromFamiliesWithDefault(families, + RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE); sDynamicTypefaceCache.put(key, typeface); return typeface; } @@ -251,10 +253,12 @@ public class Typeface { fontFamily.allowUnsupportedFont(); fontFamily.freeze(); FontFamily[] familyChain = { fontFamily }; - typeface = createFromFamiliesWithDefault(familyChain); + typeface = createFromFamiliesWithDefault(familyChain, + RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE); synchronized (sDynamicTypefaceCache) { final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */, - null /* axes */); + null /* axes */, RESOLVE_BY_FONT_TABLE /* weight */, + RESOLVE_BY_FONT_TABLE /* italic */); sDynamicTypefaceCache.put(key, typeface); } return typeface; @@ -268,7 +272,8 @@ public class Typeface { */ public static Typeface findFromCache(AssetManager mgr, String path) { synchronized (sDynamicTypefaceCache) { - final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */, null /* axes */); + final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */, null /* axes */, + RESOLVE_BY_FONT_TABLE /* weight */, RESOLVE_BY_FONT_TABLE /* italic */); Typeface typeface = sDynamicTypefaceCache.get(key); if (typeface != null) { return typeface; @@ -406,7 +411,9 @@ public class Typeface { FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR); return; } - Typeface typeface = Typeface.createFromFamiliesWithDefault(new FontFamily[] { fontFamily }); + Typeface typeface = Typeface.createFromFamiliesWithDefault( + new FontFamily[] { fontFamily }, + RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE); synchronized (sDynamicTypefaceCache) { String key = createProviderUid(request.getProviderAuthority(), request.getQuery()); sDynamicTypefaceCache.put(key, typeface); @@ -715,7 +722,7 @@ public class Typeface { * @return Unique id for a given AssetManager and asset path. */ private static String createAssetUid(final AssetManager mgr, String path, int ttcIndex, - @Nullable FontVariationAxis[] axes) { + @Nullable FontVariationAxis[] axes, int weight, int italic) { final SparseArray<String> pkgs = mgr.getAssignedPackageIdentifiers(); final StringBuilder builder = new StringBuilder(); final int size = pkgs.size(); @@ -727,6 +734,10 @@ public class Typeface { builder.append("-"); builder.append(Integer.toString(ttcIndex)); builder.append("-"); + builder.append(Integer.toString(weight)); + builder.append("-"); + builder.append(Integer.toString(italic)); + builder.append("-"); if (axes != null) { for (FontVariationAxis axis : axes) { builder.append(axis.getTag()); @@ -791,7 +802,7 @@ public class Typeface { * @return Newly created Typeface. May return null if some parameters are invalid. */ public Typeface build() { - if (mFd != null) { // set source by setSourceFromFile(FileDescriptor) + if (mFd != null) { // Builder is created with file descriptor. try (FileInputStream fis = new FileInputStream(mFd)) { FileChannel channel = fis.getChannel(); long size = channel.size(); @@ -806,12 +817,13 @@ public class Typeface { return resolveFallbackTypeface(); } FontFamily[] families = { fontFamily }; - return createFromFamiliesWithDefault(families); + return createFromFamiliesWithDefault(families, mWeight, mItalic); } catch (IOException e) { return resolveFallbackTypeface(); } - } else if (mAssetManager != null) { // set source by setSourceFromAsset() - final String key = createAssetUid(mAssetManager, mPath, mTtcIndex, mAxes); + } else if (mAssetManager != null) { // Builder is created with asset manager. + final String key = createAssetUid( + mAssetManager, mPath, mTtcIndex, mAxes, mWeight, mItalic); synchronized (sLock) { Typeface typeface = sDynamicTypefaceCache.get(key); if (typeface != null) return typeface; @@ -825,11 +837,11 @@ public class Typeface { return resolveFallbackTypeface(); } FontFamily[] families = { fontFamily }; - typeface = createFromFamiliesWithDefault(families); + typeface = createFromFamiliesWithDefault(families, mWeight, mItalic); sDynamicTypefaceCache.put(key, typeface); return typeface; } - } else if (mPath != null) { // set source by setSourceFromFile(File) + } else if (mPath != null) { // Builder is created with file path. final FontFamily fontFamily = new FontFamily(); if (!fontFamily.addFont(mPath, mTtcIndex, mAxes, mWeight, mItalic)) { fontFamily.abortCreation(); @@ -839,7 +851,7 @@ public class Typeface { return resolveFallbackTypeface(); } FontFamily[] families = { fontFamily }; - return createFromFamiliesWithDefault(families); + return createFromFamiliesWithDefault(families, mWeight, mItalic); } else if (mFonts != null) { final FontFamily fontFamily = new FontFamily(); boolean atLeastOneFont = false; @@ -865,7 +877,7 @@ public class Typeface { } fontFamily.freeze(); FontFamily[] families = { fontFamily }; - return createFromFamiliesWithDefault(families); + return createFromFamiliesWithDefault(families, mWeight, mItalic); } // Must not reach here. @@ -969,7 +981,7 @@ public class Typeface { if (typeface != null) return typeface; final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */, - null /* axes */); + null /* axes */, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE); typeface = sDynamicTypefaceCache.get(key); if (typeface != null) return typeface; @@ -984,7 +996,8 @@ public class Typeface { fontFamily.allowUnsupportedFont(); fontFamily.freeze(); final FontFamily[] families = { fontFamily }; - typeface = createFromFamiliesWithDefault(families); + typeface = createFromFamiliesWithDefault(families, RESOLVE_BY_FONT_TABLE, + RESOLVE_BY_FONT_TABLE); sDynamicTypefaceCache.put(key, typeface); return typeface; } else { @@ -1037,7 +1050,8 @@ public class Typeface { fontFamily.allowUnsupportedFont(); fontFamily.freeze(); FontFamily[] families = { fontFamily }; - return createFromFamiliesWithDefault(families); + return createFromFamiliesWithDefault(families, RESOLVE_BY_FONT_TABLE, + RESOLVE_BY_FONT_TABLE); } else { fontFamily.abortCreation(); } @@ -1055,16 +1069,25 @@ public class Typeface { for (int i = 0; i < families.length; i++) { ptrArray[i] = families[i].mNativePtr; } - return new Typeface(nativeCreateFromArray(ptrArray)); + return new Typeface(nativeCreateFromArray( + ptrArray, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)); } /** * Create a new typeface from an array of font families, including * also the font families in the fallback list. - * + * @param weight the weight for this family. {@link RESOLVE_BY_FONT_TABLE} can be used. In that + * case, the table information in the first family's font is used. If the first + * family has multiple fonts, the closest to the regular weight and upright font + * is used. + * @param italic the italic information for this family. {@link RESOLVE_BY_FONT_TABLE} can be + * used. In that case, the table information in the first family's font is used. + * If the first family has multiple fonts, the closest to the regular weight and + * upright font is used. * @param families array of font families */ - private static Typeface createFromFamiliesWithDefault(FontFamily[] families) { + private static Typeface createFromFamiliesWithDefault(FontFamily[] families, + int weight, int italic) { long[] ptrArray = new long[families.length + sFallbackFonts.length]; for (int i = 0; i < families.length; i++) { ptrArray[i] = families[i].mNativePtr; @@ -1072,7 +1095,7 @@ public class Typeface { for (int i = 0; i < sFallbackFonts.length; i++) { ptrArray[i + families.length] = sFallbackFonts[i].mNativePtr; } - return new Typeface(nativeCreateFromArray(ptrArray)); + return new Typeface(nativeCreateFromArray(ptrArray, weight, italic)); } // don't allow clients to call this directly @@ -1112,6 +1135,7 @@ public class Typeface { // Treat as system error since reaching here means that a system pre-installed font // can't be used by our font stack. Log.e(TAG, "Unable to load Family: " + family.getName() + ":" + family.getLanguage()); + return null; } return fontFamily; } @@ -1137,7 +1161,10 @@ public class Typeface { for (int i = 0; i < fontConfig.getFamilies().length; i++) { FontConfig.Family f = fontConfig.getFamilies()[i]; if (i == 0 || f.getName() == null) { - familyList.add(makeFamilyFromParsed(f, bufferForPath)); + FontFamily family = makeFamilyFromParsed(f, bufferForPath); + if (family != null) { + familyList.add(family); + } } } sFallbackFonts = familyList.toArray(new FontFamily[familyList.size()]); @@ -1154,8 +1181,12 @@ public class Typeface { typeface = sDefaultTypeface; } else { FontFamily fontFamily = makeFamilyFromParsed(f, bufferForPath); + if (fontFamily == null) { + continue; + } FontFamily[] families = { fontFamily }; - typeface = Typeface.createFromFamiliesWithDefault(families); + typeface = Typeface.createFromFamiliesWithDefault(families, + RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE); } systemFonts.put(f.getName(), typeface); } @@ -1262,7 +1293,7 @@ public class Typeface { private static native void nativeUnref(long native_instance); private static native int nativeGetStyle(long native_instance); private static native int nativeGetBaseWeight(long native_instance); - private static native long nativeCreateFromArray(long[] familyArray); + private static native long nativeCreateFromArray(long[] familyArray, int weight, int italic); private static native void nativeSetDefault(long native_instance); private static native int[] nativeGetSupportedAxes(long native_instance); } diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index ed6e52245243..d95acff8a38e 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -60,7 +60,8 @@ SkiaCanvas::SkiaCanvas(SkCanvas* canvas, XformToSRGB xformToSRGB) SkiaCanvas::SkiaCanvas(const SkBitmap& bitmap) { sk_sp<SkColorSpace> cs = bitmap.refColorSpace(); - mCanvasOwned = std::unique_ptr<SkCanvas>(new SkCanvas(bitmap)); + mCanvasOwned = + std::unique_ptr<SkCanvas>(new SkCanvas(bitmap, SkCanvas::ColorBehavior::kLegacy)); mCanvasWrapper = SkCreateColorSpaceXformCanvas(mCanvasOwned.get(), cs == nullptr ? SkColorSpace::MakeSRGB() : std::move(cs)); mCanvas = mCanvasWrapper.get(); @@ -83,7 +84,8 @@ void SkiaCanvas::reset(SkCanvas* skiaCanvas) { void SkiaCanvas::setBitmap(const SkBitmap& bitmap) { sk_sp<SkColorSpace> cs = bitmap.refColorSpace(); - std::unique_ptr<SkCanvas> newCanvas = std::unique_ptr<SkCanvas>(new SkCanvas(bitmap)); + std::unique_ptr<SkCanvas> newCanvas = + std::unique_ptr<SkCanvas>(new SkCanvas(bitmap, SkCanvas::ColorBehavior::kLegacy)); std::unique_ptr<SkCanvas> newCanvasWrapper = SkCreateColorSpaceXformCanvas(newCanvas.get(), cs == nullptr ? SkColorSpace::MakeSRGB() : std::move(cs)); diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp index 86709ee3a1fa..4fb4b53346e0 100644 --- a/libs/hwui/hwui/Typeface.cpp +++ b/libs/hwui/hwui/Typeface.cpp @@ -39,14 +39,22 @@ namespace android { -// Resolve the 1..9 weight based on base weight and bold flag +// This indicates that the passed information should be resolved by OS/2 table. +// This value must be the same as the android.graphics.Typeface$Builder.RESOLVE_BY_FONT_TABLE. +constexpr int RESOLVE_BY_FONT_TABLE = -1; + +// Resolve the 1..10 weight based on base weight and bold flag static void resolveStyle(Typeface* typeface) { - int weight = typeface->fBaseWeight / 100; + // TODO: Better to use raw base weight value for font selection instead of dividing by 100. + int weight = (typeface->fBaseWeight + 50) / 100; if (typeface->fSkiaStyle & SkTypeface::kBold) { weight += 3; } - if (weight > 9) { - weight = 9; + if (weight > 10) { + weight = 10; + } + if (weight < 1) { + weight = 1; } bool italic = (typeface->fSkiaStyle & SkTypeface::kItalic) != 0; typeface->fStyle = minikin::FontStyle(weight, italic); @@ -115,26 +123,50 @@ Typeface* Typeface::createWeightAlias(Typeface* src, int weight) { } Typeface* Typeface::createFromFamilies( - std::vector<std::shared_ptr<minikin::FontFamily>>&& families) { + std::vector<std::shared_ptr<minikin::FontFamily>>&& families, + int weight, int italic) { Typeface* result = new Typeface; result->fFontCollection.reset(new minikin::FontCollection(families)); - if (families.empty()) { - ALOGW("createFromFamilies creating empty collection"); - result->fSkiaStyle = SkTypeface::kNormal; - } else { + + if (weight == RESOLVE_BY_FONT_TABLE || italic == RESOLVE_BY_FONT_TABLE) { + int weightFromFont; + bool italicFromFont; + const minikin::FontStyle defaultStyle; - const std::shared_ptr<minikin::FontFamily>& firstFamily = families[0]; - const minikin::MinikinFont* mf = firstFamily->getClosestMatch(defaultStyle).font; + const minikin::MinikinFont* mf = + families.empty() ? nullptr : families[0]->getClosestMatch(defaultStyle).font; if (mf != nullptr) { SkTypeface* skTypeface = reinterpret_cast<const MinikinFontSkia*>(mf)->GetSkTypeface(); - // TODO: probably better to query more precise style from family, will be important - // when we open up API to access 100..900 weights - result->fSkiaStyle = skTypeface->style(); + const SkFontStyle& style = skTypeface->fontStyle(); + weightFromFont = style.weight(); + italicFromFont = style.slant() != SkFontStyle::kUpright_Slant; } else { - result->fSkiaStyle = SkTypeface::kNormal; + // We can't obtain any information from fonts. Just use default values. + weightFromFont = SkFontStyle::kNormal_Weight; + italicFromFont = false; + } + + if (weight == RESOLVE_BY_FONT_TABLE) { + weight = weightFromFont; + } + if (italic == RESOLVE_BY_FONT_TABLE) { + italic = italicFromFont? 1 : 0; } } - result->fBaseWeight = 400; + + // Sanitize the invalid value passed from public API. + if (weight < 0) { + weight = SkFontStyle::kNormal_Weight; + } + + result->fBaseWeight = weight; + // This bold detection comes from SkTypefae.h + const bool isBold = weight >= SkFontStyle::kSemiBold_Weight; + const bool isItalic = italic == 1; + // TODO: remove fSkiaStyle + result->fSkiaStyle = isBold ? + (isItalic ? SkTypeface::kBoldItalic : SkTypeface::kBold) : + (isItalic ? SkTypeface::kItalic : SkTypeface::kNormal); resolveStyle(result); return result; } @@ -165,7 +197,7 @@ void Typeface::setRobotoTypefaceForTest() { Typeface* hwTypeface = new Typeface(); hwTypeface->fFontCollection = collection; hwTypeface->fSkiaStyle = SkTypeface::kNormal; - hwTypeface->fBaseWeight = 400; + hwTypeface->fBaseWeight = SkFontStyle::kSemiBold_Weight; hwTypeface->fStyle = minikin::FontStyle(4 /* weight */, false /* italic */); Typeface::setDefault(hwTypeface); diff --git a/libs/hwui/hwui/Typeface.h b/libs/hwui/hwui/Typeface.h index 27ee4a2a35aa..e35a7b46c4b2 100644 --- a/libs/hwui/hwui/Typeface.h +++ b/libs/hwui/hwui/Typeface.h @@ -50,7 +50,8 @@ struct ANDROID_API Typeface { static Typeface* createWeightAlias(Typeface* src, int baseweight); static Typeface* createFromFamilies( - std::vector<std::shared_ptr<minikin::FontFamily>>&& families); + std::vector<std::shared_ptr<minikin::FontFamily>>&& families, + int weight, int italic); static void setDefault(Typeface* face); diff --git a/libs/hwui/tests/unit/SkiaCanvasTests.cpp b/libs/hwui/tests/unit/SkiaCanvasTests.cpp index 0d1eba4af2f9..0aecb8540e4e 100644 --- a/libs/hwui/tests/unit/SkiaCanvasTests.cpp +++ b/libs/hwui/tests/unit/SkiaCanvasTests.cpp @@ -104,14 +104,20 @@ TEST(SkiaCanvas, colorSpaceXform) { skBitmap.lockPixels(); ASSERT_EQ(0xFF0000FF, *skBitmap.getAddr32(0, 0)); + // Create a software canvas with an Adobe color space. + SkiaCanvas adobeSkCanvas(adobeSkBitmap); + adobeSkCanvas.drawBitmap(*bitmap, 0, 0, nullptr); + // The result should be less than fully red, since we convert to Adobe RGB at draw time. + ASSERT_EQ(0xFF0000DC, *adobeSkBitmap.getAddr32(0, 0)); + // Now try in kDefer mode. This is a little strange given that, in practice, all software // canvases are kImmediate. SkCanvas skCanvas(skBitmap); SkiaCanvas deferCanvas(&skCanvas, Canvas::XformToSRGB::kDefer); deferCanvas.drawBitmap(*adobeBitmap, 0, 0, nullptr); - // The result should be as initialized, since we deferred the conversion to sRGB. + // The result should be as before, since we deferred the conversion to sRGB. skBitmap.lockPixels(); - ASSERT_EQ(0xFF0000F0, *skBitmap.getAddr32(0, 0)); + ASSERT_EQ(0xFF0000DC, *skBitmap.getAddr32(0, 0)); // Test picture recording. We will kDefer the xform at recording time, but handle it when // we playback to the software canvas. @@ -121,9 +127,9 @@ TEST(SkiaCanvas, colorSpaceXform) { picCanvas.drawBitmap(*adobeBitmap, 0, 0, nullptr); sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); - // Playback to a deferred canvas. The result should be as initialized. + // Playback to a deferred canvas. The result should be as before. deferCanvas.asSkCanvas()->drawPicture(picture); - ASSERT_EQ(0xFF0000F0, *skBitmap.getAddr32(0, 0)); + ASSERT_EQ(0xFF0000DC, *skBitmap.getAddr32(0, 0)); // Playback to an immediate canvas. The result should be fully red. canvas.asSkCanvas()->drawPicture(picture); diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java index 15f27a1c6510..1b55380ed5a9 100644 --- a/media/java/android/media/tv/TvContract.java +++ b/media/java/android/media/tv/TvContract.java @@ -1182,6 +1182,7 @@ public final class TvContract { ASPECT_RATIO_3_2, ASPECT_RATIO_1_1, ASPECT_RATIO_2_3, + ASPECT_RATIO_4_3, }) @Retention(RetentionPolicy.SOURCE) public @interface AspectRatio {} @@ -1203,12 +1204,20 @@ public final class TvContract { int ASPECT_RATIO_3_2 = 1; /** + * The aspect ratio for 4:3. + * + * @see #COLUMN_POSTER_ART_ASPECT_RATIO + * @see #COLUMN_THUMBNAIL_ASPECT_RATIO + */ + int ASPECT_RATIO_4_3 = 2; + + /** * The aspect ratio for 1:1. * * @see #COLUMN_POSTER_ART_ASPECT_RATIO * @see #COLUMN_THUMBNAIL_ASPECT_RATIO */ - int ASPECT_RATIO_1_1 = 2; + int ASPECT_RATIO_1_1 = 3; /** * The aspect ratio for 2:3. @@ -1216,7 +1225,7 @@ public final class TvContract { * @see #COLUMN_POSTER_ART_ASPECT_RATIO * @see #COLUMN_THUMBNAIL_ASPECT_RATIO */ - int ASPECT_RATIO_2_3 = 3; + int ASPECT_RATIO_2_3 = 4; /** @hide */ @IntDef({ @@ -1341,6 +1350,7 @@ public final class TvContract { * <p>The value should match one of the followings: * {@link #ASPECT_RATIO_16_9}, * {@link #ASPECT_RATIO_3_2}, + * {@link #ASPECT_RATIO_4_3}, * {@link #ASPECT_RATIO_1_1}, and * {@link #ASPECT_RATIO_2_3}. * @@ -1354,6 +1364,7 @@ public final class TvContract { * <p>The value should match one of the followings: * {@link #ASPECT_RATIO_16_9}, * {@link #ASPECT_RATIO_3_2}, + * {@link #ASPECT_RATIO_4_3}, * {@link #ASPECT_RATIO_1_1}, and * {@link #ASPECT_RATIO_2_3}. * diff --git a/media/mca/samples/CameraEffectsRecordingSample/java/android/media/filterfw/samples/CameraEffectsRecordingSample.java b/media/mca/samples/CameraEffectsRecordingSample/java/android/media/filterfw/samples/CameraEffectsRecordingSample.java index c0c303426573..0b62bca9a7ec 100644 --- a/media/mca/samples/CameraEffectsRecordingSample/java/android/media/filterfw/samples/CameraEffectsRecordingSample.java +++ b/media/mca/samples/CameraEffectsRecordingSample/java/android/media/filterfw/samples/CameraEffectsRecordingSample.java @@ -45,8 +45,8 @@ public class CameraEffectsRecordingSample extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); - mRunButton = (Button) findViewById(R.id.runbutton); - mCameraView = (SurfaceView) findViewById(R.id.cameraview); + mRunButton = findViewById(R.id.runbutton); + mCameraView = findViewById(R.id.cameraview); mRunButton.setOnClickListener(mRunButtonClick); Intent intent = getIntent(); diff --git a/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothMidiDevice.java b/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothMidiDevice.java index 444705cfc79f..ece700dc8b6d 100644 --- a/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothMidiDevice.java +++ b/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothMidiDevice.java @@ -100,8 +100,8 @@ public final class BluetoothMidiDevice { int newState) { String intentAction; if (newState == BluetoothProfile.STATE_CONNECTED) { - Log.i(TAG, "Connected to GATT server."); - Log.i(TAG, "Attempting to start service discovery:" + + Log.d(TAG, "Connected to GATT server."); + Log.d(TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices()); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { Log.i(TAG, "Disconnected from GATT server."); @@ -112,24 +112,24 @@ public final class BluetoothMidiDevice { @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { - List<BluetoothGattService> services = mBluetoothGatt.getServices(); - for (BluetoothGattService service : services) { - if (MIDI_SERVICE.equals(service.getUuid())) { - Log.d(TAG, "found MIDI_SERVICE"); - List<BluetoothGattCharacteristic> characteristics - = service.getCharacteristics(); - for (BluetoothGattCharacteristic characteristic : characteristics) { - if (MIDI_CHARACTERISTIC.equals(characteristic.getUuid())) { - Log.d(TAG, "found MIDI_CHARACTERISTIC"); - mCharacteristic = characteristic; - - // Specification says to read the characteristic first and then - // switch to receiving notifications - mBluetoothGatt.readCharacteristic(characteristic); - break; - } - } - break; + BluetoothGattService service = gatt.getService(MIDI_SERVICE); + if (service != null) { + Log.d(TAG, "found MIDI_SERVICE"); + BluetoothGattCharacteristic characteristic + = service.getCharacteristic(MIDI_CHARACTERISTIC); + if (characteristic != null) { + Log.d(TAG, "found MIDI_CHARACTERISTIC"); + mCharacteristic = characteristic; + + // Request a lower Connection Interval for better latency. + boolean result = gatt.requestConnectionPriority( + BluetoothGatt.CONNECTION_PRIORITY_HIGH); + Log.d(TAG, "requestConnectionPriority(CONNECTION_PRIORITY_HIGH):" + + result); + + // Specification says to read the characteristic first and then + // switch to receiving notifications + mBluetoothGatt.readCharacteristic(characteristic); } } } else { diff --git a/media/tests/EffectsTest/src/com/android/effectstest/BassBoostTest.java b/media/tests/EffectsTest/src/com/android/effectstest/BassBoostTest.java index 1a10d6422184..cce2acc5869a 100644 --- a/media/tests/EffectsTest/src/com/android/effectstest/BassBoostTest.java +++ b/media/tests/EffectsTest/src/com/android/effectstest/BassBoostTest.java @@ -70,7 +70,7 @@ public class BassBoostTest extends Activity implements OnCheckedChangeListener { setContentView(R.layout.bassboosttest); - mSessionText = (EditText) findViewById(R.id.sessionEdit); + mSessionText = findViewById(R.id.sessionEdit); mSessionText.setOnKeyListener(mSessionKeyListener); mSessionText.setText(Integer.toString(sSession)); diff --git a/media/tests/EffectsTest/src/com/android/effectstest/EnvReverbTest.java b/media/tests/EffectsTest/src/com/android/effectstest/EnvReverbTest.java index 594e8446faa7..1731dba88757 100644 --- a/media/tests/EffectsTest/src/com/android/effectstest/EnvReverbTest.java +++ b/media/tests/EffectsTest/src/com/android/effectstest/EnvReverbTest.java @@ -73,9 +73,9 @@ public class EnvReverbTest extends Activity implements OnCheckedChangeListener, ToggleButton button; setContentView(R.layout.envreverbtest); - ImageView playPause = (ImageView) findViewById(R.id.playPause1); - ImageView stop = (ImageView) findViewById(R.id.stop1); - textView = (TextView) findViewById(R.id.sessionText); + ImageView playPause = findViewById(R.id.playPause1); + ImageView stop = findViewById(R.id.stop1); + textView = findViewById(R.id.sessionText); if (sPlayerController == null) { sPlayerController = new SimplePlayer(this, R.id.playPause1, playPause, R.id.stop1, stop, textView, diff --git a/media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java b/media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java index f30a26f39c64..fd5695603ee2 100644 --- a/media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java +++ b/media/tests/EffectsTest/src/com/android/effectstest/EqualizerTest.java @@ -72,7 +72,7 @@ public class EqualizerTest extends Activity implements OnCheckedChangeListener { setContentView(R.layout.equalizertest); - mSessionText = (EditText) findViewById(R.id.sessionEdit); + mSessionText = findViewById(R.id.sessionEdit); mSessionText.setOnKeyListener(mSessionKeyListener); mSessionText.setText(Integer.toString(sSession)); diff --git a/media/tests/EffectsTest/src/com/android/effectstest/VirtualizerTest.java b/media/tests/EffectsTest/src/com/android/effectstest/VirtualizerTest.java index bb32e6fa7603..4f2180fac5e5 100644 --- a/media/tests/EffectsTest/src/com/android/effectstest/VirtualizerTest.java +++ b/media/tests/EffectsTest/src/com/android/effectstest/VirtualizerTest.java @@ -70,7 +70,7 @@ public class VirtualizerTest extends Activity implements OnCheckedChangeListener setContentView(R.layout.virtualizertest); - mSessionText = (EditText) findViewById(R.id.sessionEdit); + mSessionText = findViewById(R.id.sessionEdit); mSessionText.setOnKeyListener(mSessionKeyListener); mSessionText.setText(Integer.toString(sSession)); diff --git a/media/tests/EffectsTest/src/com/android/effectstest/VisualizerTest.java b/media/tests/EffectsTest/src/com/android/effectstest/VisualizerTest.java index 60583e0adf72..7db1d8d8625e 100644 --- a/media/tests/EffectsTest/src/com/android/effectstest/VisualizerTest.java +++ b/media/tests/EffectsTest/src/com/android/effectstest/VisualizerTest.java @@ -72,7 +72,7 @@ public class VisualizerTest extends Activity implements OnCheckedChangeListener setContentView(R.layout.visualizertest); - mSessionText = (EditText) findViewById(R.id.sessionEdit); + mSessionText = findViewById(R.id.sessionEdit); mSessionText.setOnKeyListener(mSessionKeyListener); mSessionText.setText(Integer.toString(sSession)); diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/Camera2SurfaceViewActivity.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/Camera2SurfaceViewActivity.java index c3dd842903ec..963b20d11243 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/Camera2SurfaceViewActivity.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/Camera2SurfaceViewActivity.java @@ -43,7 +43,7 @@ public class Camera2SurfaceViewActivity extends Activity implements SurfaceHolde super.onCreate(savedInstanceState); setContentView(R.layout.surface_view_2); - mSurfaceView = (SurfaceView) findViewById(R.id.surface_view); + mSurfaceView = findViewById(R.id.surface_view); mSurfaceView.getHolder().addCallback(this); //Acquire the full wake lock to keep the device up diff --git a/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/NativeMidi.java b/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/NativeMidi.java index 0969b10b1f90..b0ca0bb74548 100644 --- a/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/NativeMidi.java +++ b/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/NativeMidi.java @@ -269,12 +269,12 @@ public class NativeMidi extends Activity super.onCreate(savedInstanceState); setContentView(R.layout.main); - mCallbackStatusTextView = (TextView) findViewById(R.id.callback_status); - mJavaMidiStatusTextView = (TextView) findViewById(R.id.java_midi_status); - mMessagesTextView = (TextView) findViewById(R.id.messages); - mMessagesContainer = (TouchableScrollView) findViewById(R.id.messages_scroll); - mMidiDevicesRadioGroup = (RadioGroup) findViewById(R.id.devices); - RadioButton deviceNone = (RadioButton) findViewById(R.id.device_none); + mCallbackStatusTextView = findViewById(R.id.callback_status); + mJavaMidiStatusTextView = findViewById(R.id.java_midi_status); + mMessagesTextView = findViewById(R.id.messages); + mMessagesContainer = findViewById(R.id.messages_scroll); + mMidiDevicesRadioGroup = findViewById(R.id.devices); + RadioButton deviceNone = findViewById(R.id.device_none); deviceNone.setOnClickListener(new MidiOutputPortSelector()); AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); diff --git a/media/tests/ScoAudioTest/src/com/android/scoaudiotest/ScoAudioTest.java b/media/tests/ScoAudioTest/src/com/android/scoaudiotest/ScoAudioTest.java index 7e21876accb2..8427d16d9760 100644 --- a/media/tests/ScoAudioTest/src/com/android/scoaudiotest/ScoAudioTest.java +++ b/media/tests/ScoAudioTest/src/com/android/scoaudiotest/ScoAudioTest.java @@ -97,8 +97,8 @@ public class ScoAudioTest extends Activity { setContentView(R.layout.scoaudiotest); - mScoStateTxt = (TextView) findViewById(R.id.scoStateTxt); - mVdStateTxt = (TextView) findViewById(R.id.vdStateTxt); + mScoStateTxt = findViewById(R.id.scoStateTxt); + mVdStateTxt = findViewById(R.id.vdStateTxt); IntentFilter intentFilter = new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED); @@ -112,7 +112,7 @@ public class ScoAudioTest extends Activity { mMediaControllers[0] = new SimplePlayerController(this, R.id.playPause1, R.id.stop1, R.raw.sine440_mo_16b_16k, AudioManager.STREAM_BLUETOOTH_SCO); - TextView name = (TextView) findViewById(R.id.playPause1Text); + TextView name = findViewById(R.id.playPause1Text); name.setText("VOICE_CALL stream"); mScoButton = (ToggleButton)findViewById(R.id.ForceScoButton); @@ -135,7 +135,7 @@ public class ScoAudioTest extends Activity { mTtsParams.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE); - mSpeakText = (EditText) findViewById(R.id.speakTextEdit); + mSpeakText = findViewById(R.id.speakTextEdit); mSpeakText.setOnKeyListener(mSpeakKeyListener); mSpeakText.setText("sco audio test sentence"); mTtsToFileButton = (ToggleButton)findViewById(R.id.TtsToFileButton); @@ -143,7 +143,7 @@ public class ScoAudioTest extends Activity { mTtsToFile = true; mTtsToFileButton.setChecked(mTtsToFile); - mModeSpinner = (Spinner) findViewById(R.id.modeSpinner); + mModeSpinner = findViewById(R.id.modeSpinner); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mModeStrings); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -208,12 +208,12 @@ public class ScoAudioTest extends Activity { mForceScoOn = isChecked; AudioManager mngr = mAudioManager; boolean useVirtualCall = false; - CheckBox box = (CheckBox) findViewById(R.id.useSecondAudioManager); + CheckBox box = findViewById(R.id.useSecondAudioManager); if (box.isChecked()) { Log.i(TAG, "Using 2nd audio manager"); mngr = mAudioManager2; } - box = (CheckBox) findViewById(R.id.useVirtualCallCheckBox); + box = findViewById(R.id.useVirtualCallCheckBox); useVirtualCall = box.isChecked(); if (mForceScoOn) { @@ -278,8 +278,8 @@ public class ScoAudioTest extends Activity { mPlayPauseButtonId = playPausebuttonId; mStopButtonId = stopButtonId; mFileNameBase = fileName; - mPlayPauseButton = (ImageButton) findViewById(playPausebuttonId); - ImageButton stop = (ImageButton) findViewById(stopButtonId); + mPlayPauseButton = findViewById(playPausebuttonId); + ImageButton stop = findViewById(stopButtonId); mPlayPauseButton.setOnClickListener(this); mPlayPauseButton.requestFocus(); @@ -294,8 +294,8 @@ public class ScoAudioTest extends Activity { mStopButtonId = stopButtonId; mFileNameBase = ""; mFileResId = fileResId; - mPlayPauseButton = (ImageButton) findViewById(playPausebuttonId); - ImageButton stop = (ImageButton) findViewById(stopButtonId); + mPlayPauseButton = findViewById(playPausebuttonId); + ImageButton stop = findViewById(stopButtonId); mPlayPauseButton.setOnClickListener(this); mPlayPauseButton.requestFocus(); diff --git a/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java b/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java index 7fa57367301e..9fa7a6646c9c 100644 --- a/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java +++ b/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java @@ -173,13 +173,13 @@ public class BackupRestoreConfirmation extends Activity { setContentView(layoutId); // Same resource IDs for each layout variant (backup / restore) - mStatusView = (TextView) findViewById(R.id.package_name); - mAllowButton = (Button) findViewById(R.id.button_allow); - mDenyButton = (Button) findViewById(R.id.button_deny); + mStatusView = findViewById(R.id.package_name); + mAllowButton = findViewById(R.id.button_allow); + mDenyButton = findViewById(R.id.button_deny); - mCurPassword = (TextView) findViewById(R.id.password); - mEncPassword = (TextView) findViewById(R.id.enc_password); - TextView curPwDesc = (TextView) findViewById(R.id.password_desc); + mCurPassword = findViewById(R.id.password); + mEncPassword = findViewById(R.id.enc_password); + TextView curPwDesc = findViewById(R.id.password_desc); mAllowButton.setOnClickListener(new View.OnClickListener() { @Override @@ -214,7 +214,7 @@ public class BackupRestoreConfirmation extends Activity { curPwDesc.setVisibility(View.GONE); mCurPassword.setVisibility(View.GONE); if (layoutId == R.layout.confirm_backup) { - TextView encPwDesc = (TextView) findViewById(R.id.enc_password_desc); + TextView encPwDesc = findViewById(R.id.enc_password_desc); if (mIsEncrypted) { encPwDesc.setText(R.string.backup_enc_password_required); monitorEncryptionPassword(); diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index 6394c64b74cc..5d20cf38e21b 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -117,7 +117,7 @@ public class CaptivePortalLoginActivity extends Activity { } mCm.registerNetworkCallback(builder.build(), mNetworkCallback); - final WebView myWebView = (WebView) findViewById(R.id.webview); + final WebView myWebView = findViewById(R.id.webview); myWebView.clearCache(true); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); @@ -184,7 +184,7 @@ public class CaptivePortalLoginActivity extends Activity { @Override public void onBackPressed() { - WebView myWebView = (WebView) findViewById(R.id.webview); + WebView myWebView = findViewById(R.id.webview); if (myWebView.canGoBack() && mWebViewClient.allowBack()) { myWebView.goBack(); } else { @@ -326,7 +326,7 @@ public class CaptivePortalLoginActivity extends Activity { // For internally generated pages, leave URL bar listing prior URL as this is the URL // the page refers to. if (!url.startsWith(INTERNAL_ASSETS)) { - final TextView myUrlBar = (TextView) findViewById(R.id.url_bar); + final TextView myUrlBar = findViewById(R.id.url_bar); myUrlBar.setText(url); } testForCaptivePortal(); @@ -407,7 +407,7 @@ public class CaptivePortalLoginActivity extends Activity { private class MyWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { - final ProgressBar myProgressBar = (ProgressBar) findViewById(R.id.progress_bar); + final ProgressBar myProgressBar = findViewById(R.id.progress_bar); myProgressBar.setProgress(newProgress); } } diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java index a5820f2da56c..6276ce3f0b98 100644 --- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java +++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java @@ -91,7 +91,7 @@ public class CaptivePortalLoginActivity extends Activity { setContentView(R.layout.activity_captive_portal_login); getActionBar().setDisplayShowHomeEnabled(false); - mWebView = (WebView) findViewById(R.id.webview); + mWebView = findViewById(R.id.webview); mWebView.clearCache(true); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); @@ -113,7 +113,7 @@ public class CaptivePortalLoginActivity extends Activity { @Override public void onBackPressed() { - WebView myWebView = (WebView) findViewById(R.id.webview); + WebView myWebView = findViewById(R.id.webview); if (myWebView.canGoBack() && mWebViewClient.allowBack()) { myWebView.goBack(); } else { @@ -328,7 +328,7 @@ public class CaptivePortalLoginActivity extends Activity { // For internally generated pages, leave URL bar listing prior URL as this is the URL // the page refers to. if (!url.startsWith(INTERNAL_ASSETS)) { - final TextView myUrlBar = (TextView) findViewById(R.id.url_bar); + final TextView myUrlBar = findViewById(R.id.url_bar); myUrlBar.setText(url); } if (mNetwork != null) { @@ -412,7 +412,7 @@ public class CaptivePortalLoginActivity extends Activity { private class MyWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { - final ProgressBar myProgressBar = (ProgressBar) findViewById(R.id.progress_bar); + final ProgressBar myProgressBar = findViewById(R.id.progress_bar); myProgressBar.setProgress(newProgress); } } diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index 14b9de59bf5a..b145290d0ce6 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -34,6 +34,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import com.android.companiondevicemanager.DeviceDiscoveryService.DeviceFilterPair; +import com.android.internal.util.Preconditions; public class DeviceChooserActivity extends Activity { @@ -65,7 +66,7 @@ public class DeviceChooserActivity extends Activity { } else { setContentView(R.layout.device_chooser); setTitle(Html.fromHtml(getString(R.string.chooser_title, getCallingAppName()), 0)); - mDeviceListView = (ListView) findViewById(R.id.device_list); + mDeviceListView = findViewById(R.id.device_list); final DeviceDiscoveryService.DevicesAdapter adapter = getService().mDevicesAdapter; mDeviceListView.setAdapter(adapter); adapter.registerDataSetObserver(new DataSetObserver() { @@ -78,22 +79,35 @@ public class DeviceChooserActivity extends Activity { } mPairButton = findViewById(R.id.button_pair); - mPairButton.setOnClickListener((view) -> - onPairTapped(getService().mSelectedDevice)); + mPairButton.setOnClickListener(v -> onPairTapped(getService().mSelectedDevice)); updatePairButtonEnabled(); mCancelButton = findViewById(R.id.button_cancel); - mCancelButton.setOnClickListener((view) -> { - setResult(RESULT_CANCELED); - finish(); - }); + mCancelButton.setOnClickListener(v -> cancel()); + } + + private void cancel() { + getService().onCancel(); + setResult(RESULT_CANCELED); + finish(); + } + + @Override + protected void onPause() { + super.onPause(); + if (!isFinishing()) { + cancel(); + } } private CharSequence getCallingAppName() { try { final PackageManager packageManager = getPackageManager(); + String callingPackage = Preconditions.checkStringNotEmpty( + getCallingPackage(), + "This activity must be called for result"); return packageManager.getApplicationLabel( - packageManager.getApplicationInfo(getCallingPackage(), 0)); + packageManager.getApplicationInfo(callingPackage, 0)); } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException(e); } @@ -101,7 +115,7 @@ public class DeviceChooserActivity extends Activity { @Override public void setTitle(CharSequence title) { - final TextView titleView = (TextView) findViewById(R.id.title); + final TextView titleView = findViewById(R.id.title); final int padding = getPadding(getResources()); titleView.setPadding(padding, padding, padding, padding); titleView.setText(title); diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java index 1b6aca1ba65e..246bd2bc7ce0 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java @@ -110,6 +110,11 @@ public class DeviceDiscoveryService extends Service { private final ScanCallback mBLEScanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { + if (DEBUG) { + Log.i(LOG_TAG, + "BLE.onScanResult(callbackType = " + callbackType + ", result = " + result + + ")"); + } final DeviceFilterPair<ScanResult> deviceFilterPair = DeviceFilterPair.findMatch(result, mBLEFilters); if (deviceFilterPair == null) return; @@ -126,6 +131,10 @@ public class DeviceDiscoveryService extends Service { private BroadcastReceiver mBluetoothDeviceFoundBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + if (DEBUG) { + Log.i(LOG_TAG, + "BL.onReceive(context = " + context + ", intent = " + intent + ")"); + } final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); final DeviceFilterPair<BluetoothDevice> deviceFilterPair = DeviceFilterPair.findMatch(device, mBluetoothFilters); @@ -191,7 +200,8 @@ public class DeviceDiscoveryService extends Service { mBLEScanFilters = CollectionUtils.map(mBLEFilters, BluetoothLEDeviceFilter::getScanFilter); reset(); - } + } else if (DEBUG) Log.i(LOG_TAG, "startDiscovery: duplicate request: " + request); + if (!ArrayUtils.isEmpty(mDevicesFound)) { onReadyToShowUI(); } @@ -221,6 +231,7 @@ public class DeviceDiscoveryService extends Service { } private void reset() { + if (DEBUG) Log.i(LOG_TAG, "reset()"); mDevicesFound.clear(); mSelectedDevice = null; mDevicesAdapter.notifyDataSetChanged(); @@ -294,6 +305,14 @@ public class DeviceDiscoveryService extends Service { } } + void onCancel() { + try { + mServiceCallback.onDeviceSelectionCancel(); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + class DevicesAdapter extends ArrayAdapter<DeviceFilterPair> { //TODO wifi icon private Drawable BLUETOOTH_ICON = icon(android.R.drawable.stat_sys_data_bluetooth); @@ -369,8 +388,15 @@ public class DeviceDiscoveryService extends Service { public static <T extends Parcelable> DeviceFilterPair<T> findMatch( T dev, @Nullable List<? extends DeviceFilter<T>> filters) { if (isEmpty(filters)) return new DeviceFilterPair<>(dev, null); - final DeviceFilter<T> matchingFilter = CollectionUtils.find(filters, (f) -> f.matches(dev)); - return matchingFilter != null ? new DeviceFilterPair<>(dev, matchingFilter) : null; + final DeviceFilter<T> matchingFilter + = CollectionUtils.find(filters, f -> f.matches(dev)); + + DeviceFilterPair<T> result = matchingFilter != null + ? new DeviceFilterPair<>(dev, matchingFilter) + : null; + if (DEBUG) Log.i(LOG_TAG, "findMatch(dev = " + dev + ", filters = " + filters + + ") -> " + result); + return result; } public String getDisplayName() { diff --git a/packages/DefaultContainerService/AndroidManifest.xml b/packages/DefaultContainerService/AndroidManifest.xml index 55d000c14ad1..e399fb170759 100644 --- a/packages/DefaultContainerService/AndroidManifest.xml +++ b/packages/DefaultContainerService/AndroidManifest.xml @@ -1,5 +1,6 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.defcontainer" coreApp="true"> + <uses-permission android:name="android.permission.ALLOCATE_AGGRESSIVE"/> <uses-permission android:name="android.permission.ASEC_ACCESS"/> <uses-permission android:name="android.permission.ASEC_CREATE"/> <uses-permission android:name="android.permission.ASEC_DESTROY"/> diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java index 37a68e0c557a..934787774637 100644 --- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java +++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java @@ -30,6 +30,7 @@ import android.content.pm.PackageParser.PackageLite; import android.content.pm.PackageParser.PackageParserException; import android.content.res.ObbInfo; import android.content.res.ObbScanner; +import android.os.Binder; import android.os.Environment; import android.os.Environment.UserEnvironment; import android.os.FileUtils; @@ -179,6 +180,15 @@ public class DefaultContainerService extends IntentService { return ret; } + final int recommendedInstallLocation; + final long token = Binder.clearCallingIdentity(); + try { + recommendedInstallLocation = PackageHelper.resolveInstallLocation(context, + pkg.packageName, pkg.installLocation, sizeBytes, flags); + } finally { + Binder.restoreCallingIdentity(token); + } + ret.packageName = pkg.packageName; ret.splitNames = pkg.splitNames; ret.versionCode = pkg.versionCode; @@ -186,8 +196,7 @@ public class DefaultContainerService extends IntentService { ret.splitRevisionCodes = pkg.splitRevisionCodes; ret.installLocation = pkg.installLocation; ret.verifiers = pkg.verifiers; - ret.recommendedInstallLocation = PackageHelper.resolveInstallLocation(context, - pkg.packageName, pkg.installLocation, sizeBytes, flags); + ret.recommendedInstallLocation = recommendedInstallLocation; ret.multiArch = pkg.multiArch; return ret; diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java b/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java index f59f0d97d24b..689e38142988 100644 --- a/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java +++ b/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java @@ -82,7 +82,7 @@ public class NekoLand extends Activity implements PrefsListener { mPrefs = new PrefState(this); mPrefs.setListener(this); - final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.holder); + final RecyclerView recyclerView = findViewById(R.id.holder); mAdapter = new CatAdapter(); recyclerView.setAdapter(mAdapter); recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); diff --git a/packages/Osu/src/com/android/hotspot2/app/MainActivity.java b/packages/Osu/src/com/android/hotspot2/app/MainActivity.java index ae0a45c78ff9..7fd2238703f1 100644 --- a/packages/Osu/src/com/android/hotspot2/app/MainActivity.java +++ b/packages/Osu/src/com/android/hotspot2/app/MainActivity.java @@ -123,7 +123,7 @@ public class MainActivity extends Activity { if (osuData.size() > 0) { noOsuView.setVisibility(View.GONE); osuListAdapter = new OsuListAdapter(this, osuData); - osuListView = (ListView) findViewById(R.id.profile_list); + osuListView = findViewById(R.id.profile_list); osuListView.setAdapter(osuListAdapter); osuListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override diff --git a/packages/Osu/src/com/android/hotspot2/osu/OSUWebView.java b/packages/Osu/src/com/android/hotspot2/osu/OSUWebView.java index afbd0d151b3d..a6778c82021a 100644 --- a/packages/Osu/src/com/android/hotspot2/osu/OSUWebView.java +++ b/packages/Osu/src/com/android/hotspot2/osu/OSUWebView.java @@ -37,7 +37,7 @@ public class OSUWebView extends Activity { setContentView(R.layout.osu_web_view); getActionBar().setDisplayShowHomeEnabled(false); - final WebView myWebView = (WebView) findViewById(R.id.webview); + final WebView myWebView = findViewById(R.id.webview); myWebView.clearCache(true); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java index 4cce166db645..ccdec6216679 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java @@ -1290,11 +1290,11 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat private void bindUi() { // Summary mSummaryContainer = findViewById(R.id.summary_content); - mSummaryCopies = (TextView) findViewById(R.id.copies_count_summary); - mSummaryPaperSize = (TextView) findViewById(R.id.paper_size_summary); + mSummaryCopies = findViewById(R.id.copies_count_summary); + mSummaryPaperSize = findViewById(R.id.paper_size_summary); // Options container - mOptionsContent = (PrintContentView) findViewById(R.id.options_content); + mOptionsContent = findViewById(R.id.options_content); mOptionsContent.setOptionsStateChangeListener(this); mOptionsContent.setOpenOptionsController(this); @@ -1302,7 +1302,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat OnClickListener clickListener = new MyClickListener(); // Copies - mCopiesEditText = (EditText) findViewById(R.id.copies_edittext); + mCopiesEditText = findViewById(R.id.copies_edittext); mCopiesEditText.setOnFocusChangeListener(mSelectAllOnFocusListener); mCopiesEditText.setText(MIN_COPIES_STRING); mCopiesEditText.setSelection(mCopiesEditText.getText().length()); @@ -1311,28 +1311,28 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat // Destination. mPrintersObserver = new PrintersObserver(); mDestinationSpinnerAdapter.registerDataSetObserver(mPrintersObserver); - mDestinationSpinner = (Spinner) findViewById(R.id.destination_spinner); + mDestinationSpinner = findViewById(R.id.destination_spinner); mDestinationSpinner.setAdapter(mDestinationSpinnerAdapter); mDestinationSpinner.setOnItemSelectedListener(itemSelectedListener); // Media size. mMediaSizeSpinnerAdapter = new ArrayAdapter<>( this, android.R.layout.simple_spinner_dropdown_item, android.R.id.text1); - mMediaSizeSpinner = (Spinner) findViewById(R.id.paper_size_spinner); + mMediaSizeSpinner = findViewById(R.id.paper_size_spinner); mMediaSizeSpinner.setAdapter(mMediaSizeSpinnerAdapter); mMediaSizeSpinner.setOnItemSelectedListener(itemSelectedListener); // Color mode. mColorModeSpinnerAdapter = new ArrayAdapter<>( this, android.R.layout.simple_spinner_dropdown_item, android.R.id.text1); - mColorModeSpinner = (Spinner) findViewById(R.id.color_spinner); + mColorModeSpinner = findViewById(R.id.color_spinner); mColorModeSpinner.setAdapter(mColorModeSpinnerAdapter); mColorModeSpinner.setOnItemSelectedListener(itemSelectedListener); // Duplex mode. mDuplexModeSpinnerAdapter = new ArrayAdapter<>( this, android.R.layout.simple_spinner_dropdown_item, android.R.id.text1); - mDuplexModeSpinner = (Spinner) findViewById(R.id.duplex_spinner); + mDuplexModeSpinner = findViewById(R.id.duplex_spinner); mDuplexModeSpinner.setAdapter(mDuplexModeSpinnerAdapter); mDuplexModeSpinner.setOnItemSelectedListener(itemSelectedListener); @@ -1345,32 +1345,32 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat ORIENTATION_PORTRAIT, orientationLabels[0])); mOrientationSpinnerAdapter.add(new SpinnerItem<>( ORIENTATION_LANDSCAPE, orientationLabels[1])); - mOrientationSpinner = (Spinner) findViewById(R.id.orientation_spinner); + mOrientationSpinner = findViewById(R.id.orientation_spinner); mOrientationSpinner.setAdapter(mOrientationSpinnerAdapter); mOrientationSpinner.setOnItemSelectedListener(itemSelectedListener); // Range options ArrayAdapter<SpinnerItem<Integer>> rangeOptionsSpinnerAdapter = new ArrayAdapter<>( this, android.R.layout.simple_spinner_dropdown_item, android.R.id.text1); - mRangeOptionsSpinner = (Spinner) findViewById(R.id.range_options_spinner); + mRangeOptionsSpinner = findViewById(R.id.range_options_spinner); mRangeOptionsSpinner.setAdapter(rangeOptionsSpinnerAdapter); mRangeOptionsSpinner.setOnItemSelectedListener(itemSelectedListener); updatePageRangeOptions(PrintDocumentInfo.PAGE_COUNT_UNKNOWN); // Page range - mPageRangeTitle = (TextView) findViewById(R.id.page_range_title); - mPageRangeEditText = (EditText) findViewById(R.id.page_range_edittext); + mPageRangeTitle = findViewById(R.id.page_range_title); + mPageRangeEditText = findViewById(R.id.page_range_edittext); mPageRangeEditText.setVisibility(View.GONE); mPageRangeTitle.setVisibility(View.GONE); mPageRangeEditText.setOnFocusChangeListener(mSelectAllOnFocusListener); mPageRangeEditText.addTextChangedListener(new RangeTextWatcher()); // Advanced options button. - mMoreOptionsButton = (Button) findViewById(R.id.more_options_button); + mMoreOptionsButton = findViewById(R.id.more_options_button); mMoreOptionsButton.setOnClickListener(clickListener); // Print button - mPrintButton = (ImageView) findViewById(R.id.print_button); + mPrintButton = findViewById(R.id.print_button); mPrintButton.setOnClickListener(clickListener); // The UI is now initialized diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java index 6f0caa244281..a9a6cbd47699 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java @@ -134,7 +134,7 @@ public final class SelectPrinterActivity extends Activity implements LOADER_ID_PRINT_REGISTRY_INT); // Hook up the list view. - mListView = (ListView) findViewById(android.R.id.list); + mListView = findViewById(android.R.id.list); final DestinationAdapter adapter = new DestinationAdapter(); adapter.registerDataSetObserver(new DataSetObserver() { @Override @@ -411,7 +411,7 @@ public final class SelectPrinterActivity extends Activity implements View emptyView = findViewById(R.id.empty_print_state); mListView.setEmptyView(emptyView); } - TextView titleView = (TextView) findViewById(R.id.title); + TextView titleView = findViewById(R.id.title); View progressBar = findViewById(R.id.progress_bar); if (mEnabledPrintServices.size() == 0) { titleView.setText(R.string.print_no_print_services); diff --git a/packages/PrintSpooler/src/com/android/printspooler/widget/PrintContentView.java b/packages/PrintSpooler/src/com/android/printspooler/widget/PrintContentView.java index 0bb4bfa18513..8b00ed053b26 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/widget/PrintContentView.java +++ b/packages/PrintSpooler/src/com/android/printspooler/widget/PrintContentView.java @@ -136,12 +136,12 @@ public final class PrintContentView extends ViewGroup implements View.OnClickLis @Override protected void onFinishInflate() { mStaticContent = findViewById(R.id.static_content); - mSummaryContent = (ViewGroup) findViewById(R.id.summary_content); + mSummaryContent = findViewById(R.id.summary_content); mDynamicContent = findViewById(R.id.dynamic_content); mDraggableContent = findViewById(R.id.draggable_content); mPrintButton = findViewById(R.id.print_button); mMoreOptionsButton = findViewById(R.id.more_options_button); - mOptionsContainer = (ViewGroup) findViewById(R.id.options_container); + mOptionsContainer = findViewById(R.id.options_container); mEmbeddedContentContainer = findViewById(R.id.embedded_content_container); mEmbeddedContentScrim = findViewById(R.id.embedded_content_scrim); mExpandCollapseHandle = findViewById(R.id.expand_collapse_handle); diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index dfa162743436..8a86c13abb7d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -1502,7 +1502,8 @@ public class ApplicationsState { @Override public boolean filterApp(AppEntry entry) { - return (entry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0; + return !AppUtils.isInstant(entry.info) + && (entry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0; } }; diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/UsageView.java b/packages/SettingsLib/src/com/android/settingslib/graph/UsageView.java index c6a45bcf1e9f..e2c05a193882 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/UsageView.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/UsageView.java @@ -35,15 +35,15 @@ public class UsageView extends FrameLayout { public UsageView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.usage_view, this); - mUsageGraph = (UsageGraph) findViewById(R.id.usage_graph); + mUsageGraph = findViewById(R.id.usage_graph); mLabels = new TextView[] { - (TextView) findViewById(R.id.label_bottom), - (TextView) findViewById(R.id.label_middle), - (TextView) findViewById(R.id.label_top), + findViewById(R.id.label_bottom), + findViewById(R.id.label_middle), + findViewById(R.id.label_top), }; mBottomLabels = new TextView[] { - (TextView) findViewById(R.id.label_start), - (TextView) findViewById(R.id.label_end), + findViewById(R.id.label_start), + findViewById(R.id.label_end), }; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.UsageView, 0, 0); if (a.hasValue(R.styleable.UsageView_sideLabels)) { @@ -64,15 +64,15 @@ public class UsageView extends FrameLayout { if (a.hasValue(R.styleable.UsageView_android_gravity)) { int gravity = a.getInt(R.styleable.UsageView_android_gravity, 0); if (gravity == Gravity.END) { - LinearLayout layout = (LinearLayout) findViewById(R.id.graph_label_group); - LinearLayout labels = (LinearLayout) findViewById(R.id.label_group); + LinearLayout layout = findViewById(R.id.graph_label_group); + LinearLayout labels = findViewById(R.id.label_group); // Swap the children order. layout.removeView(labels); layout.addView(labels); // Set gravity. labels.setGravity(Gravity.END); // Swap the bottom space order. - LinearLayout bottomLabels = (LinearLayout) findViewById(R.id.bottom_label_group); + LinearLayout bottomLabels = findViewById(R.id.bottom_label_group); View bottomSpace = bottomLabels.findViewById(R.id.bottom_label_space); bottomLabels.removeView(bottomSpace); bottomLabels.addView(bottomSpace); diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java index c680b2a2ce4b..fed18fa1bcb0 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java @@ -201,6 +201,22 @@ public class ApplicationsStateTest { } @Test + public void testFilterWithDomainUrls() { + mEntry.info.privateFlags |= ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS; + // should included updated system apps + when(mEntry.info.isInstantApp()).thenReturn(false); + assertThat(ApplicationsState.FILTER_WITH_DOMAIN_URLS.filterApp(mEntry)) + .isTrue(); + mEntry.info.privateFlags &= ~ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS; + assertThat(ApplicationsState.FILTER_WITH_DOMAIN_URLS.filterApp(mEntry)) + .isFalse(); + mEntry.info.privateFlags |= ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS; + when(mEntry.info.isInstantApp()).thenReturn(true); + assertThat(ApplicationsState.FILTER_WITH_DOMAIN_URLS.filterApp(mEntry)) + .isFalse(); + } + + @Test public void testDisabledFilterRejectsInstantApp() { mEntry.info.enabled = false; assertThat(ApplicationsState.FILTER_DISABLED.filterApp(mEntry)).isTrue(); diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1.xml deleted file mode 100644 index e055de77ebe5..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_1.xml +++ /dev/null @@ -1,32 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32.0dp" - android:height="32.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M10.0,14.6l-8.0,8.0l8.0,0.0l0,-8z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillAlpha="0.3" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="#FFFFFF"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_2.xml b/packages/SystemUI/res/drawable/ic_qs_signal_2.xml deleted file mode 100644 index 8a488170e438..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_2.xml +++ /dev/null @@ -1,32 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32.0dp" - android:height="32.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M14.0,10.6l-12.0,12.0l12.0,0.0L14.0,10.6z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillAlpha="0.3" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="#FFFFFF"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3.xml deleted file mode 100644 index 39cc94cad4db..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_3.xml +++ /dev/null @@ -1,32 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32.0dp" - android:height="32.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillAlpha="0.3" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M14.1,14.1l2.9,0.0 0.0,-6.5 -15.0,15.0 12.1,0.0z" - android:fillColor="#FFFFFF"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4.xml deleted file mode 100644 index 012e95e985ce..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_4.xml +++ /dev/null @@ -1,28 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32.0dp" - android:height="32.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="#FFFFFF"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change.xml b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change.xml deleted file mode 100644 index 96e2fd4e5f82..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change.xml +++ /dev/null @@ -1,36 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="32dp" - android:height="32dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:name="dot1" - android:fillColor="#FFFFFFFF" - android:pathData="M9.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> - <path - android:name="dot2" - android:fillColor="#4DFFFFFF" - android:pathData="M14.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> - <path - android:name="dot3" - android:fillColor="#4DFFFFFF" - android:pathData="M19.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> - <path - android:fillColor="#4DFFFFFF" - android:pathData="M2.0,22.0l6.0,0.0 0.0,-4.0 14.0,0.0 0.0,-16.0z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml deleted file mode 100644 index 2186aa82e83f..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml +++ /dev/null @@ -1,27 +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. ---> -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - android:drawable="@drawable/ic_qs_signal_carrier_network_change" > - <target - android:name="dot1" - android:animation="@anim/ic_qs_signal_blink_1"/> - <target - android:name="dot2" - android:animation="@anim/ic_qs_signal_blink_2"/> - <target - android:name="dot3" - android:animation="@anim/ic_qs_signal_blink_3"/> -</animated-vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml deleted file mode 100644 index 326373ddc9e8..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32dp" - android:height="32dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#4DFFFFFF" - android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml deleted file mode 100644 index 8baa4ebd0c26..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml +++ /dev/null @@ -1,28 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32dp" - android:height="32dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#4DFFFFFF" - android:pathData="M2.0,22.0l20.0,0.0 0.0,-20.0z"/> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M10.1,13.9l-8.1,8.1 8.1,0.0z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml deleted file mode 100644 index bf19a718e0fc..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml +++ /dev/null @@ -1,28 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32dp" - android:height="32dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#4DFFFFFF" - android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml deleted file mode 100644 index 01839e8589ef..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml +++ /dev/null @@ -1,28 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32dp" - android:height="32dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#4DFFFFFF" - android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml deleted file mode 100644 index 48151ad78a6c..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="32dp" - android:height="32dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml deleted file mode 100644 index 8bc872a99951..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_0.xml +++ /dev/null @@ -1,28 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17.0dp" - android:height="17.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillColor="?attr/backgroundColor"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="?attr/fillColor"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml deleted file mode 100644 index e267d25b43d9..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17dp" - android:height="17dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?attr/backgroundColor" - android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml deleted file mode 100644 index 8fa7630b0fae..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_1.xml +++ /dev/null @@ -1,31 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17.0dp" - android:height="17.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M10.0,14.6l-8.0,8.0l8.0,0.0l0,-8z" - android:fillColor="?attr/fillColor"/> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillColor="?attr/backgroundColor"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="?attr/fillColor"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml deleted file mode 100644 index 60822f409aee..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml +++ /dev/null @@ -1,28 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17dp" - android:height="17dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?attr/backgroundColor" - android:pathData="M2.0,22.0l20.0,0.0 0.0,-20.0z"/> - <path - android:fillColor="?attr/fillColor" - android:pathData="M10.1,13.9l-8.1,8.1 8.1,0.0z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml deleted file mode 100644 index 2a660a39d510..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_2.xml +++ /dev/null @@ -1,31 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17.0dp" - android:height="17.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M14.0,10.6l-12.0,12.0l12.0,0.0L14.0,10.6z" - android:fillColor="?attr/fillColor"/> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillColor="?attr/backgroundColor"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="?attr/fillColor"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml deleted file mode 100644 index 5e68eeda3b24..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml +++ /dev/null @@ -1,28 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17dp" - android:height="17dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?attr/backgroundColor" - android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> - <path - android:fillColor="?attr/fillColor" - android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml deleted file mode 100644 index 9e0a43353eea..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_3.xml +++ /dev/null @@ -1,31 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17.0dp" - android:height="17.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillColor="?attr/backgroundColor"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="?attr/fillColor"/> - <path - android:pathData="M14.1,14.1l2.9,0.0 0.0,-6.5 -15.0,15.0 12.1,0.0z" - android:fillColor="?attr/fillColor"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml deleted file mode 100644 index 599b34ae56a3..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml +++ /dev/null @@ -1,28 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17dp" - android:height="17dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?attr/backgroundColor" - android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> - <path - android:fillColor="?attr/fillColor" - android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml deleted file mode 100644 index 01f670311750..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_4.xml +++ /dev/null @@ -1,28 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17.0dp" - android:height="17.0dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:pathData="M14.1,14.1l7.9,0.0 0.0,-11.5 -20.0,20.0 12.1,0.0z" - android:fillColor="?attr/fillColor"/> - <path - android:pathData="M21.9,17.0l-1.1,-1.1 -1.9,1.9 -1.9,-1.9 -1.1,1.1 1.9,1.9 -1.9,1.9 1.1,1.1 1.9,-1.9 1.9,1.9 1.1,-1.1 -1.9,-1.9z" - android:fillColor="?attr/fillColor"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml deleted file mode 100644 index b66d89a4c6bb..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -Copyright (C) 2014 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:autoMirrored="true" - android:width="17dp" - android:height="17dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?attr/singleToneColor" - android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml deleted file mode 100644 index f69ffe49b138..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml +++ /dev/null @@ -1,36 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="17dp" - android:height="17dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:name="dot1" - android:fillColor="?attr/fillColor" - android:pathData="M9.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> - <path - android:name="dot2" - android:fillColor="?attr/backgroundColor" - android:pathData="M14.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> - <path - android:name="dot3" - android:fillColor="?attr/backgroundColor" - android:pathData="M19.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> - <path - android:fillColor="?attr/backgroundColor" - android:pathData="M2.0,22.0l6.0,0.0 0.0,-4.0 14.0,0.0 0.0,-16.0z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml deleted file mode 100644 index 275f037778c0..000000000000 --- a/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml +++ /dev/null @@ -1,27 +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. ---> -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - android:drawable="@drawable/stat_sys_signal_carrier_network_change" > - <target - android:name="dot1" - android:animation="@anim/ic_signal_blink_1"/> - <target - android:name="dot2" - android:animation="@anim/ic_signal_blink_2"/> - <target - android:name="dot3" - android:animation="@anim/ic_signal_blink_3"/> -</animated-vector> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 6d8a07784a30..9c7a6a00a4fb 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -760,4 +760,6 @@ <dimen name="default_gear_space">18dp</dimen> <dimen name="cell_overlay_padding">18dp</dimen> + <dimen name="signal_icon_size">17dp</dimen> + </resources> diff --git a/packages/SystemUI/res/values/styles_tv.xml b/packages/SystemUI/res/values/styles_tv.xml index 3f0caab23ab4..0c4fd23ca107 100644 --- a/packages/SystemUI/res/values/styles_tv.xml +++ b/packages/SystemUI/res/values/styles_tv.xml @@ -21,5 +21,6 @@ <style name="PipTheme" parent="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:backgroundDimEnabled">false</item> + <item name="android:windowDisablePreview">true</item> </style> </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/EmergencyCarrierArea.java b/packages/SystemUI/src/com/android/keyguard/EmergencyCarrierArea.java index 0a89d9b15e26..e98ef0607951 100644 --- a/packages/SystemUI/src/com/android/keyguard/EmergencyCarrierArea.java +++ b/packages/SystemUI/src/com/android/keyguard/EmergencyCarrierArea.java @@ -37,8 +37,8 @@ public class EmergencyCarrierArea extends AlphaOptimizedLinearLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mCarrierText = (CarrierText) findViewById(R.id.carrier_text); - mEmergencyButton = (EmergencyButton) findViewById(R.id.emergency_call_button); + mCarrierText = findViewById(R.id.carrier_text); + mEmergencyButton = findViewById(R.id.emergency_call_button); // The emergency button overlaps the carrier text, only noticeable when highlighted. // So temporarily hide the carrier text while the emergency button is pressed. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 5aa673b40124..abc3b94777b0 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -98,7 +98,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout mSecurityMessageDisplay = KeyguardMessageArea.findSecurityMessageDisplay(this); mEcaView = findViewById(R.id.keyguard_selector_fade_container); - EmergencyButton button = (EmergencyButton) findViewById(R.id.emergency_call_button); + EmergencyButton button = findViewById(R.id.emergency_call_button); if (button != null) { button.setCallback(this); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java index dd5544d2cdad..27a3f7d44890 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java @@ -143,7 +143,7 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { @Override protected void onFinishInflate() { mSecurityContainer = - (KeyguardSecurityContainer) findViewById(R.id.keyguard_security_container); + findViewById(R.id.keyguard_security_container); mLockPatternUtils = new LockPatternUtils(mContext); mSecurityContainer.setLockPatternUtils(mLockPatternUtils); mSecurityContainer.setSecurityCallback(this); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java index 590d8d5de672..c1cff9e8f735 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java @@ -79,11 +79,11 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { protected void onFinishInflate() { super.onFinishInflate(); - mContainer = (ViewGroup) findViewById(R.id.container); - mRow0 = (ViewGroup) findViewById(R.id.row0); - mRow1 = (ViewGroup) findViewById(R.id.row1); - mRow2 = (ViewGroup) findViewById(R.id.row2); - mRow3 = (ViewGroup) findViewById(R.id.row3); + mContainer = findViewById(R.id.container); + mRow0 = findViewById(R.id.row0); + mRow1 = findViewById(R.id.row1); + mRow2 = findViewById(R.id.row2); + mRow3 = findViewById(R.id.row3); mDivider = findViewById(R.id.divider); mViews = new View[][]{ new View[]{ diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java index d49ff975473d..b6184a883210 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java @@ -174,7 +174,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView mImm = (InputMethodManager) getContext().getSystemService( Context.INPUT_METHOD_SERVICE); - mPasswordEntry = (TextView) findViewById(getPasswordTextViewId()); + mPasswordEntry = findViewById(getPasswordTextViewId()); mPasswordEntryDisabler = new TextViewInputDisabler(mPasswordEntry); mPasswordEntry.setKeyListener(TextKeyListener.getInstance()); mPasswordEntry.setInputType(InputType.TYPE_CLASS_TEXT diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java index c2b57ffa6113..3c9a6b9dcdec 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java @@ -140,7 +140,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit mLockPatternUtils = mLockPatternUtils == null ? new LockPatternUtils(mContext) : mLockPatternUtils; - mLockPatternView = (LockPatternView) findViewById(R.id.lockPatternView); + mLockPatternView = findViewById(R.id.lockPatternView); mLockPatternView.setSaveEnabled(false); mLockPatternView.setOnPatternListener(new UnlockPatternListener()); @@ -150,9 +150,9 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit mSecurityMessageDisplay = (KeyguardMessageArea) KeyguardMessageArea.findSecurityMessageDisplay(this); mEcaView = findViewById(R.id.keyguard_selector_fade_container); - mContainer = (ViewGroup) findViewById(R.id.container); + mContainer = findViewById(R.id.container); - EmergencyButton button = (EmergencyButton) findViewById(R.id.emergency_call_button); + EmergencyButton button = findViewById(R.id.emergency_call_button); if (button != null) { button.setCallback(this); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java index 108b466e44af..c04ae68dab36 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -171,7 +171,7 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView @Override protected void onFinishInflate() { - mPasswordEntry = (PasswordTextView) findViewById(getPasswordTextViewId()); + mPasswordEntry = findViewById(getPasswordTextViewId()); mPasswordEntry.setOnKeyListener(this); // Set selected property on so the view can send accessibility events. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 8cdb906a0e56..b447979be45d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -160,7 +160,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } protected void onFinishInflate() { - mSecurityViewFlipper = (KeyguardSecurityViewFlipper) findViewById(R.id.view_flipper); + mSecurityViewFlipper = findViewById(R.id.view_flipper); mSecurityViewFlipper.setLockPatternUtils(mLockPatternUtils); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java index 839d3cec5e96..0cf890037f55 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java @@ -144,7 +144,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (mEcaView instanceof EmergencyCarrierArea) { ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true); } - mSimImageView = (ImageView) findViewById(R.id.keyguard_sim); + mSimImageView = findViewById(R.id.keyguard_sim); } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java index 3871448cb617..fb3cee74ab68 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java @@ -187,7 +187,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { if (mEcaView instanceof EmergencyCarrierArea) { ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true); } - mSimImageView = (ImageView) findViewById(R.id.keyguard_sim); + mSimImageView = findViewById(R.id.keyguard_sim); } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java index b2b0ee463a97..162faa595ed3 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java @@ -115,14 +115,14 @@ public class KeyguardStatusView extends GridLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mClockContainer = (ViewGroup) findViewById(R.id.keyguard_clock_container); - mAlarmStatusView = (TextView) findViewById(R.id.alarm_status); - mDateView = (TextClock) findViewById(R.id.date_view); - mClockView = (TextClock) findViewById(R.id.clock_view); + mClockContainer = findViewById(R.id.keyguard_clock_container); + mAlarmStatusView = findViewById(R.id.alarm_status); + mDateView = findViewById(R.id.date_view); + mClockView = findViewById(R.id.clock_view); mDateView.setShowCurrentUserTime(true); mClockView.setShowCurrentUserTime(true); - mOwnerInfo = (TextView) findViewById(R.id.owner_info); - mBatteryDoze = (ChargingView) findViewById(R.id.battery_doze); + mOwnerInfo = findViewById(R.id.owner_info); + mBatteryDoze = findViewById(R.id.battery_doze); mVisibleInDoze = new View[]{mBatteryDoze, mClockView}; boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index f8d1bfbc18be..7a6ac571f9e0 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -165,11 +165,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private int mPhoneState; private boolean mKeyguardIsVisible; - /** - * If true, fingerprint was already authenticated and we don't need to start listening again - * until the Keyguard has been dismissed. - */ - private boolean mFingerprintAlreadyAuthenticated; private boolean mGoingToSleep; private boolean mBouncer; private boolean mBootCompleted; @@ -409,11 +404,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void onFingerprintAuthenticated(int userId) { Trace.beginSection("KeyGuardUpdateMonitor#onFingerPrintAuthenticated"); mUserFingerprintAuthenticated.put(userId, true); - - // If fingerprint unlocking is allowed, this event will lead to a Keyguard dismiss or to a - // wake-up (if Keyguard is not showing), so we don't need to listen until Keyguard is - // fully gone. - mFingerprintAlreadyAuthenticated = isUnlockingWithFingerprintAllowed(); + // Don't send cancel if authentication succeeds + mFingerprintCancelSignal = null; for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -922,7 +914,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } mGoingToSleep = true; - mFingerprintAlreadyAuthenticated = false; updateFingerprintListeningState(); } @@ -1092,8 +1083,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean shouldListenForFingerprint() { return (mKeyguardIsVisible || !mDeviceInteractive || mBouncer || mGoingToSleep) - && !mSwitchingUser && !mFingerprintAlreadyAuthenticated - && !isFingerprintDisabled(getCurrentUser()); + && !mSwitchingUser && !isFingerprintDisabled(getCurrentUser()); } private void startListeningForFingerprint() { @@ -1416,9 +1406,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { cb.onKeyguardVisibilityChangedRaw(showing); } } - if (!showing) { - mFingerprintAlreadyAuthenticated = false; - } updateFingerprintListeningState(); } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java index abcf27d28976..1d032e8aba48 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java @@ -137,7 +137,7 @@ public class AssistOrbView extends FrameLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mLogo = (ImageView) findViewById(R.id.search_logo); + mLogo = findViewById(R.id.search_logo); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java index f3fb1efb7dec..ec56e15dbd8d 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java @@ -33,6 +33,8 @@ public interface DozeHost { boolean isPulsingBlocked(); void startPendingIntentDismissingKeyguard(PendingIntent intent); + void abortPulsing(); + void extendPulse(); interface Callback { default void onNotificationHeadsUp() {} diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java index f27521e20bbc..1cc5fb956c99 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java @@ -58,12 +58,15 @@ public class DozeMachine { /** Pulse is done showing. Followed by transition to DOZE or DOZE_AOD. */ DOZE_PULSE_DONE, /** Doze is done. DozeService is finished. */ - FINISH; + FINISH, + /** AOD, but the display is temporarily off. */ + DOZE_AOD_PAUSED; boolean canPulse() { switch (this) { case DOZE: case DOZE_AOD: + case DOZE_AOD_PAUSED: return true; default: return false; @@ -85,6 +88,7 @@ public class DozeMachine { case UNINITIALIZED: case INITIALIZED: case DOZE: + case DOZE_AOD_PAUSED: return Display.STATE_OFF; case DOZE_PULSING: case DOZE_AOD: @@ -241,6 +245,11 @@ public class DozeMachine { if (mState == State.FINISH) { return State.FINISH; } + if ((mState == State.DOZE_AOD_PAUSED || mState == State.DOZE_AOD || mState == State.DOZE) + && requestedState == State.DOZE_PULSE_DONE) { + Log.i(TAG, "Dropping pulse done because current state is already done: " + mState); + return mState; + } if (requestedState == State.DOZE_REQUEST_PULSE && !mState.canPulse()) { Log.i(TAG, "Dropping pulse request because current state can't pulse: " + mState); return mState; diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 2ac06579f259..73f522244a60 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -22,6 +22,8 @@ import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.hardware.TriggerEvent; import android.hardware.TriggerEventListener; @@ -40,6 +42,7 @@ import com.android.systemui.util.wakelock.WakeLock; import java.io.PrintWriter; import java.util.List; +import java.util.function.Consumer; public class DozeSensors { @@ -55,18 +58,22 @@ public class DozeSensors { private final DozeParameters mDozeParameters; private final AmbientDisplayConfiguration mConfig; private final WakeLock mWakeLock; + private final Consumer<Boolean> mProxCallback; private final Callback mCallback; private final Handler mHandler = new Handler(); + private final ProxSensor mProxSensor; public DozeSensors(Context context, SensorManager sensorManager, DozeParameters dozeParameters, - AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback) { + AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback, + Consumer<Boolean> proxCallback) { mContext = context; mSensorManager = sensorManager; mDozeParameters = dozeParameters; mConfig = config; mWakeLock = wakeLock; + mProxCallback = proxCallback; mResolver = mContext.getContentResolver(); mSensors = new TriggerSensor[] { @@ -86,6 +93,8 @@ public class DozeSensors { true /* configured */, DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP) }; + + mProxSensor = new ProxSensor(); mCallback = callback; } @@ -129,6 +138,10 @@ public class DozeSensors { } } + public void setProxListening(boolean listen) { + mProxSensor.setRegistered(listen); + } + private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) { @Override public void onChange(boolean selfChange, Uri uri, int userId) { @@ -152,6 +165,43 @@ public class DozeSensors { } } + private class ProxSensor implements SensorEventListener { + + boolean mRegistered; + Boolean mCurrentlyFar; + + void setRegistered(boolean register) { + if (mRegistered == register) { + // Send an update even if we don't re-register. + mHandler.post(() -> { + if (mCurrentlyFar != null) { + mProxCallback.accept(mCurrentlyFar); + } + }); + return; + } + if (register) { + mRegistered = mSensorManager.registerListener(this, + mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), + SensorManager.SENSOR_DELAY_NORMAL, mHandler); + } else { + mSensorManager.unregisterListener(this); + mRegistered = false; + mCurrentlyFar = null; + } + } + + @Override + public void onSensorChanged(SensorEvent event) { + mCurrentlyFar = event.values[0] >= event.sensor.getMaximumRange(); + mProxCallback.accept(mCurrentlyFar); + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + } + private class TriggerSensor extends TriggerEventListener { final Sensor mSensor; final boolean mConfigured; diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 1b9bf73847b5..9b3593b9cbdd 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -46,6 +46,7 @@ import java.io.PrintWriter; public class DozeTriggers implements DozeMachine.Part { private static final String TAG = "DozeTriggers"; + private static final boolean DEBUG = DozeService.DEBUG; /** adb shell am broadcast -a com.android.systemui.doze.pulse com.android.systemui */ private static final String PULSE_ACTION = "com.android.systemui.doze.pulse"; @@ -81,7 +82,7 @@ public class DozeTriggers implements DozeMachine.Part { mWakeLock = wakeLock; mAllowPulseTriggers = allowPulseTriggers; mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters, config, - wakeLock, this::onSensor); + wakeLock, this::onSensor, this::onProximityFar); mUiModeManager = mContext.getSystemService(UiModeManager.class); } @@ -113,6 +114,22 @@ public class DozeTriggers implements DozeMachine.Part { } } + private void onProximityFar(boolean far) { + final boolean near = !far; + DozeMachine.State state = mMachine.getState(); + if (near && state == DozeMachine.State.DOZE_PULSING) { + if (DEBUG) Log.i(TAG, "Prox NEAR, ending pulse"); + mMachine.requestState(DozeMachine.State.DOZE_PULSE_DONE); + } + if (far && state == DozeMachine.State.DOZE_AOD_PAUSED) { + if (DEBUG) Log.i(TAG, "Prox FAR, unpausing AOD"); + mMachine.requestState(DozeMachine.State.DOZE_AOD); + } else if (near && state == DozeMachine.State.DOZE_AOD) { + if (DEBUG) Log.i(TAG, "Prox NEAR, pausing AOD"); + mMachine.requestState(DozeMachine.State.DOZE_AOD_PAUSED); + } + } + private void onCarMode() { mMachine.requestState(DozeMachine.State.FINISH); } @@ -131,15 +148,21 @@ public class DozeTriggers implements DozeMachine.Part { break; case DOZE: case DOZE_AOD: + case DOZE_AOD_PAUSED: + mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE); mDozeSensors.setListening(true); if (oldState != DozeMachine.State.INITIALIZED) { mDozeSensors.reregisterAllSensors(); } break; + case DOZE_PULSING: + mDozeSensors.setProxListening(true); + break; case FINISH: mBroadcastReceiver.unregister(mContext); mDozeHost.removeCallback(mHostCallback); mDozeSensors.setListening(false); + mDozeSensors.setProxListening(false); break; default: } @@ -156,6 +179,7 @@ public class DozeTriggers implements DozeMachine.Part { private void requestPulse(final int reason, boolean performedProxCheck) { Assert.isMainThread(); + mDozeHost.extendPulse(); if (mPulsePending || !mAllowPulseTriggers || !canPulse()) { return; } @@ -286,6 +310,8 @@ public class DozeTriggers implements DozeMachine.Part { } private class TriggerReceiver extends BroadcastReceiver { + private boolean mRegistered; + @Override public void onReceive(Context context, Intent intent) { if (PULSE_ACTION.equals(intent.getAction())) { @@ -301,14 +327,22 @@ public class DozeTriggers implements DozeMachine.Part { } public void register(Context context) { + if (mRegistered) { + return; + } IntentFilter filter = new IntentFilter(PULSE_ACTION); filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE); filter.addAction(Intent.ACTION_USER_SWITCHED); context.registerReceiver(this, filter); + mRegistered = true; } public void unregister(Context context) { + if (!mRegistered) { + return; + } context.unregisterReceiver(this); + mRegistered = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java index f577654c724c..6098a20a0c64 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java @@ -75,11 +75,14 @@ public class DozeUi implements DozeMachine.Part { scheduleTimeTick(); break; case DOZE: + case DOZE_AOD_PAUSED: unscheduleTimeTick(); break; case DOZE_REQUEST_PULSE: pulseWhileDozing(DozeLog.PULSE_REASON_NOTIFICATION /* TODO */); break; + case DOZE_PULSE_DONE: + mHost.abortPulsing(); case INITIALIZED: mHost.startDozing(); break; diff --git a/packages/SystemUI/src/com/android/systemui/egg/MLandActivity.java b/packages/SystemUI/src/com/android/systemui/egg/MLandActivity.java index cdda45f6b02c..f06ea451d4d0 100644 --- a/packages/SystemUI/src/com/android/systemui/egg/MLandActivity.java +++ b/packages/SystemUI/src/com/android/systemui/egg/MLandActivity.java @@ -30,8 +30,8 @@ public class MLandActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mland); - mLand = (MLand) findViewById(R.id.world); - mLand.setScoreFieldHolder((ViewGroup) findViewById(R.id.scores)); + mLand = findViewById(R.id.world); + mLand.setScoreFieldHolder(findViewById(R.id.scores)); final View welcome = findViewById(R.id.welcome); mLand.setSplash(welcome); final int numControllers = mLand.getGameControllers().size(); diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java index 2b6ea1572e6c..8ac97f3306be 100644 --- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java +++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java @@ -35,6 +35,7 @@ import android.view.View; import com.android.settingslib.applications.InterestingConfigChanges; import com.android.systemui.Dependency; import com.android.systemui.plugins.Plugin; +import com.android.systemui.util.leak.LeakDetector; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -77,6 +78,11 @@ public class FragmentHostManager { public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) { FragmentHostManager.this.onFragmentViewDestroyed(f); } + + @Override + public void onFragmentDestroyed(FragmentManager fm, Fragment f) { + Dependency.get(LeakDetector.class).trackGarbage(f); + } }; mFragments.getFragmentManager().registerFragmentLifecycleCallbacks(mLifecycleCallbacks, true); @@ -157,7 +163,7 @@ public class FragmentHostManager { // TODO: Do something? } - private View findViewById(int id) { + private <T extends View> T findViewById(int id) { return mRootView.findViewById(id); } @@ -245,7 +251,7 @@ public class FragmentHostManager { @Override @Nullable - public View onFindViewById(int id) { + public <T extends View> T onFindViewById(int id) { return FragmentHostManager.this.findViewById(id); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java index c06e56a06a67..ac0670348af2 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java @@ -188,13 +188,14 @@ public class PipMenuActivity extends Activity { mDismissButton.setOnClickListener((v) -> { dismissPip(); }); - mActionsGroup = (LinearLayout) findViewById(R.id.actions_group); + mActionsGroup = findViewById(R.id.actions_group); mBetweenActionPaddingLand = getResources().getDimensionPixelSize( R.dimen.pip_between_action_padding_land); - mExpandButton = (ImageView) findViewById(R.id.expand_button); + mExpandButton = findViewById(R.id.expand_button); updateFromIntent(getIntent()); setTitle(R.string.pip_menu_title); + setDisablePreviewScreenshots(true); } @Override @@ -392,8 +393,8 @@ public class PipMenuActivity extends Activity { } private void updateActionViews(Rect stackBounds) { - ViewGroup expandContainer = (ViewGroup) findViewById(R.id.expand_container); - ViewGroup actionsContainer = (ViewGroup) findViewById(R.id.actions_container); + ViewGroup expandContainer = findViewById(R.id.expand_container); + ViewGroup actionsContainer = findViewById(R.id.actions_container); actionsContainer.setOnTouchListener((v, ev) -> { // Do nothing, prevent click through to parent return true; diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index c3c09a015bd3..3f26fddb1b3c 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -662,6 +662,7 @@ public class PipTouchHandler implements TunerService.Tunable { mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), mMovementBounds, true /* allowMenuTimeout */); } else { + mMenuController.hideMenu(); mMotionHelper.expandPip(); } return true; diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipControlButtonView.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipControlButtonView.java index 59cb0860fdfd..40a63d7d92c0 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipControlButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipControlButtonView.java @@ -77,9 +77,9 @@ public class PipControlButtonView extends RelativeLayout { .getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.tv_pip_control_button, this); - mIconImageView = (ImageView) findViewById(R.id.icon); - mButtonImageView = (ImageView) findViewById(R.id.button); - mDescriptionTextView = (TextView) findViewById(R.id.desc); + mIconImageView = findViewById(R.id.icon); + mButtonImageView = findViewById(R.id.button); + mDescriptionTextView = findViewById(R.id.desc); int[] values = new int[] {android.R.attr.src, android.R.attr.text}; TypedArray typedArray = diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipControlsView.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipControlsView.java index a2aff2df52e9..4c81907c35f7 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipControlsView.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipControlsView.java @@ -107,7 +107,7 @@ public class PipControlsView extends LinearLayout { public void onFinishInflate() { super.onFinishInflate(); - mFullButtonView = (PipControlButtonView) findViewById(R.id.full_button); + mFullButtonView = findViewById(R.id.full_button); mFullButtonView.setOnFocusChangeListener(mFocusChangeListener); mFullButtonView.setOnClickListener(new View.OnClickListener() { @Override @@ -116,7 +116,7 @@ public class PipControlsView extends LinearLayout { } }); - mCloseButtonView = (PipControlButtonView) findViewById(R.id.close_button); + mCloseButtonView = findViewById(R.id.close_button); mCloseButtonView.setOnFocusChangeListener(mFocusChangeListener); mCloseButtonView.setOnClickListener(new View.OnClickListener() { @Override @@ -128,7 +128,7 @@ public class PipControlsView extends LinearLayout { } }); - mPlayPauseButtonView = (PipControlButtonView) findViewById(R.id.play_pause_button); + mPlayPauseButtonView = findViewById(R.id.play_pause_button); mPlayPauseButtonView.setOnFocusChangeListener(mFocusChangeListener); mPlayPauseButtonView.setOnClickListener(new View.OnClickListener() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipMenuActivity.java index 01d86b67eaf7..9945079445a8 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipMenuActivity.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipMenuActivity.java @@ -44,7 +44,7 @@ public class PipMenuActivity extends Activity implements PipManager.Listener { mPipManager.addListener(this); mRestorePipSizeWhenClose = true; - mPipControlsView = (PipControlsView) findViewById(R.id.pip_controls); + mPipControlsView = findViewById(R.id.pip_controls); mFadeInAnimation = AnimatorInflater.loadAnimator( this, R.anim.tv_pip_menu_fade_in_animation); mFadeInAnimation.setTarget(mPipControlsView); diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipOnboardingActivity.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipOnboardingActivity.java index 57952f43bc17..423530a70c04 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipOnboardingActivity.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipOnboardingActivity.java @@ -65,7 +65,7 @@ public class PipOnboardingActivity extends Activity implements PipManager.Listen mEnterAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { - ImageView button = (ImageView) findViewById(R.id.remote_button); + ImageView button = findViewById(R.id.remote_button); ((AnimationDrawable) button.getDrawable()).start(); } }); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java index d2a291944d8d..f124e8686749 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java @@ -92,14 +92,14 @@ public class QSDetail extends LinearLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mDetailContent = (ViewGroup) findViewById(android.R.id.content); - mDetailSettingsButton = (TextView) findViewById(android.R.id.button2); - mDetailDoneButton = (TextView) findViewById(android.R.id.button1); + mDetailContent = findViewById(android.R.id.content); + mDetailSettingsButton = findViewById(android.R.id.button2); + mDetailDoneButton = findViewById(android.R.id.button1); mQsDetailHeader = findViewById(R.id.qs_detail_header); mQsDetailHeaderTitle = (TextView) mQsDetailHeader.findViewById(android.R.id.title); mQsDetailHeaderSwitch = (Switch) mQsDetailHeader.findViewById(android.R.id.toggle); - mQsDetailHeaderProgress = (ImageView) findViewById(R.id.qs_detail_header_progress); + mQsDetailHeaderProgress = findViewById(R.id.qs_detail_header_progress); updateDetailText(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java index efc066865d34..f91aa9a6d0b0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java @@ -76,7 +76,7 @@ public class QSDetailItems extends FrameLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mItemList = (AutoSizingList) findViewById(android.R.id.list); + mItemList = findViewById(android.R.id.list); mItemList.setVisibility(GONE); mItemList.setAdapter(mAdapter); mEmpty = findViewById(android.R.id.empty); diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 596d3bc6e8f6..30053e35ef05 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -82,7 +82,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene LayoutInflater.from(getContext()).inflate(R.layout.qs_customize_panel_content, this); - mToolbar = (Toolbar) findViewById(com.android.internal.R.id.action_bar); + mToolbar = findViewById(com.android.internal.R.id.action_bar); TypedValue value = new TypedValue(); mContext.getTheme().resolveAttribute(android.R.attr.homeAsUpIndicator, value, true); mToolbar.setNavigationIcon( @@ -98,7 +98,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene mContext.getString(com.android.internal.R.string.reset)); mToolbar.setTitle(R.string.qs_edit); - mRecyclerView = (RecyclerView) findViewById(android.R.id.list); + mRecyclerView = findViewById(android.R.id.list); mTileAdapter = new TileAdapter(getContext()); mRecyclerView.setAdapter(mTileAdapter); mTileAdapter.getItemTouchHelper().attachToRecyclerView(mRecyclerView); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 1151c8cb4b50..92ff17a1f029 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -163,7 +163,6 @@ public class CellularTile extends QSTileImpl<SignalState> { boolean enabled; boolean wifiEnabled; boolean airplaneModeEnabled; - int mobileSignalIconId; String signalContentDescription; int dataTypeIconId; String dataContentDescription; @@ -193,7 +192,6 @@ public class CellularTile extends QSTileImpl<SignalState> { return; } mInfo.enabled = qsIcon.visible; - mInfo.mobileSignalIconId = qsIcon.icon; mInfo.signalContentDescription = qsIcon.contentDescription; mInfo.dataTypeIconId = qsType; mInfo.dataContentDescription = typeContentDescription; @@ -210,7 +208,6 @@ public class CellularTile extends QSTileImpl<SignalState> { mInfo.noSim = show; if (mInfo.noSim) { // Make sure signal gets cleared out when no sims. - mInfo.mobileSignalIconId = 0; mInfo.dataTypeIconId = 0; // Show a No SIMs description to avoid emergency calls message. mInfo.enabled = true; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java index 9cd79f84cb89..7224ae6a1e15 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java @@ -98,21 +98,21 @@ public class DataUsageDetailView extends LinearLayout { usageColor = Utils.getColorAccent(mContext); } - final TextView title = (TextView) findViewById(android.R.id.title); + final TextView title = findViewById(android.R.id.title); title.setText(titleId); - final TextView usage = (TextView) findViewById(R.id.usage_text); + final TextView usage = findViewById(R.id.usage_text); usage.setText(formatBytes(bytes)); usage.setTextColor(usageColor); - final DataUsageGraph graph = (DataUsageGraph) findViewById(R.id.usage_graph); + final DataUsageGraph graph = findViewById(R.id.usage_graph); graph.setLevels(info.limitLevel, info.warningLevel, info.usageLevel); - final TextView carrier = (TextView) findViewById(R.id.usage_carrier_text); + final TextView carrier = findViewById(R.id.usage_carrier_text); carrier.setText(info.carrier); - final TextView period = (TextView) findViewById(R.id.usage_period_text); + final TextView period = findViewById(R.id.usage_period_text); period.setText(info.period); - final TextView infoTop = (TextView) findViewById(R.id.usage_info_top_text); + final TextView infoTop = findViewById(R.id.usage_info_top_text); infoTop.setVisibility(top != null ? View.VISIBLE : View.GONE); infoTop.setText(top); - final TextView infoBottom = (TextView) findViewById(R.id.usage_info_bottom_text); + final TextView infoBottom = findViewById(R.id.usage_info_bottom_text); infoBottom.setVisibility(bottom != null ? View.VISIBLE : View.GONE); infoBottom.setText(bottom); boolean showLevel = info.warningLevel > 0 || info.limitLevel > 0; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java index c485a9ecbf6a..1e9a618c3324 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java @@ -117,8 +117,8 @@ public class UserDetailItemView extends LinearLayout { @Override protected void onFinishInflate() { - mAvatar = (UserAvatarView) findViewById(R.id.user_picture); - mName = (TextView) findViewById(R.id.user_name); + mAvatar = findViewById(R.id.user_picture); + mName = findViewById(R.id.user_name); if (mRegularTypeface == null) { mRegularTypeface = mName.getTypeface(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index f0a9bc3f80be..143d934dd002 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -325,7 +325,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD // Set the Recents layout setContentView(R.layout.recents); takeKeyEvents(true); - mRecentsView = (RecentsView) findViewById(R.id.recents_view); + mRecentsView = findViewById(R.id.recents_view); mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java index b8be5800764a..e34987b1d47a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -222,8 +222,8 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks @Override protected void onFinishInflate() { // Bind the views - mHeaderView = (TaskViewHeader) findViewById(R.id.task_view_bar); - mThumbnailView = (TaskViewThumbnail) findViewById(R.id.task_view_thumbnail); + mHeaderView = findViewById(R.id.task_view_bar); + mThumbnailView = findViewById(R.id.task_view_thumbnail); mThumbnailView.updateClipToTaskBar(mHeaderView); mActionButtonView = findViewById(R.id.lock_to_app_fab); mActionButtonView.setOutlineProvider(new ViewOutlineProvider() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java index 311f8ffe258f..ae922fcc218e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java @@ -244,12 +244,12 @@ public class TaskViewHeader extends FrameLayout SystemServicesProxy ssp = Recents.getSystemServices(); // Initialize the icon and description views - mIconView = (ImageView) findViewById(R.id.icon); + mIconView = findViewById(R.id.icon); mIconView.setOnLongClickListener(this); - mTitleView = (TextView) findViewById(R.id.title); - mDismissButton = (ImageView) findViewById(R.id.dismiss_task); + mTitleView = findViewById(R.id.title); + mDismissButton = findViewById(R.id.dismiss_task); if (ssp.hasFreeformWorkspaceSupport()) { - mMoveTaskButton = (ImageView) findViewById(R.id.move_task); + mMoveTaskButton = findViewById(R.id.move_task); } onConfigurationChanged(); diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java index 7d847a3ea111..6918a6309ae1 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java @@ -54,8 +54,8 @@ public class BrightnessDialog extends Activity { R.layout.quick_settings_brightness_dialog, null); setContentView(v); - final ImageView icon = (ImageView) findViewById(R.id.brightness_icon); - final ToggleSliderView slider = (ToggleSliderView) findViewById(R.id.brightness_slider); + final ImageView icon = findViewById(R.id.brightness_icon); + final ToggleSliderView slider = findViewById(R.id.brightness_slider); mBrightnessController = new BrightnessController(this, icon, slider); } diff --git a/packages/SystemUI/src/com/android/systemui/settings/ToggleSliderView.java b/packages/SystemUI/src/com/android/systemui/settings/ToggleSliderView.java index afe89ec2a9ac..5b234e9c5576 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/ToggleSliderView.java +++ b/packages/SystemUI/src/com/android/systemui/settings/ToggleSliderView.java @@ -60,13 +60,13 @@ public class ToggleSliderView extends RelativeLayout implements ToggleSlider { final TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.ToggleSliderView, defStyle, 0); - mToggle = (CompoundButton) findViewById(R.id.toggle); + mToggle = findViewById(R.id.toggle); mToggle.setOnCheckedChangeListener(mCheckListener); - mSlider = (ToggleSeekBar) findViewById(R.id.slider); + mSlider = findViewById(R.id.slider); mSlider.setOnSeekBarChangeListener(mSeekListener); - mLabel = (TextView) findViewById(R.id.label); + mLabel = findViewById(R.id.label); mLabel.setText(a.getString(R.styleable.ToggleSliderView_text)); mSlider.setAccessibilityLabel(getContentDescription().toString()); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index c48ecdbe838a..da56e62f3c6e 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -269,9 +269,9 @@ public class DividerView extends FrameLayout implements OnTouchListener, @Override protected void onFinishInflate() { super.onFinishInflate(); - mHandle = (DividerHandleView) findViewById(R.id.docked_divider_handle); + mHandle = findViewById(R.id.docked_divider_handle); mBackground = findViewById(R.id.docked_divider_background); - mMinimizedShadow = (MinimizedDockShadow) findViewById(R.id.minimized_dock_shadow); + mMinimizedShadow = findViewById(R.id.minimized_dock_shadow); mHandle.setOnTouchListener(this); mDividerWindowWidth = getResources().getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_divider_thickness); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java index d4997ead8292..469f3ad45c56 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java @@ -203,10 +203,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView @Override protected void onFinishInflate() { super.onFinishInflate(); - mBackgroundNormal = (NotificationBackgroundView) findViewById(R.id.backgroundNormal); - mFakeShadow = (FakeShadowView) findViewById(R.id.fake_shadow); + mBackgroundNormal = findViewById(R.id.backgroundNormal); + mFakeShadow = findViewById(R.id.fake_shadow); mShadowHidden = mFakeShadow.getVisibility() != VISIBLE; - mBackgroundDimmed = (NotificationBackgroundView) findViewById(R.id.backgroundDimmed); + mBackgroundDimmed = findViewById(R.id.backgroundDimmed); mBackgroundNormal.setCustomBackground(R.drawable.notification_material_bg); mBackgroundDimmed.setCustomBackground(R.drawable.notification_material_bg_dim); updateBackground(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutAppItemLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutAppItemLayout.java index 507b66524c0b..5377deef337e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutAppItemLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutAppItemLayout.java @@ -44,8 +44,8 @@ public class KeyboardShortcutAppItemLayout extends RelativeLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) { - ImageView shortcutIcon = (ImageView) findViewById(R.id.keyboard_shortcuts_icon); - TextView shortcutKeyword = (TextView) findViewById(R.id.keyboard_shortcuts_keyword); + ImageView shortcutIcon = findViewById(R.id.keyboard_shortcuts_icon); + TextView shortcutKeyword = findViewById(R.id.keyboard_shortcuts_keyword); int totalMeasuredWidth = MeasureSpec.getSize(widthMeasureSpec); int totalPadding = getPaddingLeft() + getPaddingRight(); int availableWidth = totalMeasuredWidth - totalPadding; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java index fab4e592a9aa..7928575df4d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java @@ -151,7 +151,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G pkg, mAppUid, false /* includeDeleted */); String channelsDescText; - mNumChannelsView = (TextView) (findViewById(R.id.num_channels_desc)); + mNumChannelsView = findViewById(R.id.num_channels_desc); if (isSingleDefaultChannel) { channelsDescText = mContext.getString(R.string.notification_default_channel_desc); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java index 2a1e06347763..fee24b7b7645 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java @@ -306,6 +306,10 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl } private void snapBack(View animView, float velocity) { + if (mFadeAnimator != null) { + mFadeAnimator.cancel(); + } + mHandler.removeCallbacks(mCheckForDrag); mMenuSnappedTo = false; mSnapping = true; mSwipeHelper.snap(animView, 0 /* leftTarget */, velocity); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 51345c20abe1..b134fc542776 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -79,7 +79,7 @@ public class NotificationShelf extends ActivatableNotificationView implements @Override protected void onFinishInflate() { super.onFinishInflate(); - mShelfIcons = (NotificationIconContainer) findViewById(R.id.content); + mShelfIcons = findViewById(R.id.content); mShelfIcons.setClipChildren(false); mShelfIcons.setClipToPadding(false); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java index 0de3e0244fa4..4a3f112f0406 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java @@ -63,9 +63,9 @@ public class NotificationSnooze extends LinearLayout createOptionViews(); // Snackbar - mSelectedOptionText = (TextView) findViewById(R.id.snooze_option_default); + mSelectedOptionText = findViewById(R.id.snooze_option_default); mSelectedOptionText.setOnClickListener(this); - mUndoButton = (TextView) findViewById(R.id.undo); + mUndoButton = findViewById(R.id.undo); mUndoButton.setOnClickListener(this); // Default to first option in list @@ -102,7 +102,7 @@ public class NotificationSnooze extends LinearLayout } private void createOptionViews() { - mSnoozeOptionView = (ViewGroup) findViewById(R.id.snooze_options); + mSnoozeOptionView = findViewById(R.id.snooze_options); mSnoozeOptionView.removeAllViews(); mSnoozeOptionView.setVisibility(View.GONE); final Resources res = getResources(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index c5e1438c272e..dc254f9fdc1e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -42,6 +42,7 @@ import android.widget.LinearLayout; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.statusbar.phone.SignalDrawable; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.DarkIconDispatcher; import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver; @@ -177,22 +178,22 @@ public class SignalClusterView extends LinearLayout implements NetworkController protected void onFinishInflate() { super.onFinishInflate(); - mVpn = (ImageView) findViewById(R.id.vpn); - mEthernetGroup = (ViewGroup) findViewById(R.id.ethernet_combo); - mEthernet = (ImageView) findViewById(R.id.ethernet); - mEthernetDark = (ImageView) findViewById(R.id.ethernet_dark); - mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo); - mWifi = (ImageView) findViewById(R.id.wifi_signal); - mWifiDark = (ImageView) findViewById(R.id.wifi_signal_dark); - mWifiActivityIn = (ImageView) findViewById(R.id.wifi_in); - mWifiActivityOut= (ImageView) findViewById(R.id.wifi_out); - mAirplane = (ImageView) findViewById(R.id.airplane); - mNoSims = (ImageView) findViewById(R.id.no_sims); - mNoSimsDark = (ImageView) findViewById(R.id.no_sims_dark); + mVpn = findViewById(R.id.vpn); + mEthernetGroup = findViewById(R.id.ethernet_combo); + mEthernet = findViewById(R.id.ethernet); + mEthernetDark = findViewById(R.id.ethernet_dark); + mWifiGroup = findViewById(R.id.wifi_combo); + mWifi = findViewById(R.id.wifi_signal); + mWifiDark = findViewById(R.id.wifi_signal_dark); + mWifiActivityIn = findViewById(R.id.wifi_in); + mWifiActivityOut= findViewById(R.id.wifi_out); + mAirplane = findViewById(R.id.airplane); + mNoSims = findViewById(R.id.no_sims); + mNoSimsDark = findViewById(R.id.no_sims_dark); mNoSimsCombo = findViewById(R.id.no_sims_combo); mWifiAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer); mWifiSignalSpacer = findViewById(R.id.wifi_signal_spacer); - mMobileSignalGroup = (LinearLayout) findViewById(R.id.mobile_signal_group); + mMobileSignalGroup = findViewById(R.id.mobile_signal_group); maybeScaleVpnAndNoSimsIcons(); } @@ -327,15 +328,6 @@ public class SignalClusterView extends LinearLayout implements NetworkController if (hasCorrectSubs(subs)) { return; } - // Clear out all old subIds. - for (PhoneState state : mPhoneStates) { - if (state.mMobile != null) { - state.maybeStopAnimatableDrawable(state.mMobile); - } - if (state.mMobileDark != null) { - state.maybeStopAnimatableDrawable(state.mMobileDark); - } - } mPhoneStates.clear(); if (mMobileSignalGroup != null) { mMobileSignalGroup.removeAllViews(); @@ -428,16 +420,6 @@ public class SignalClusterView extends LinearLayout implements NetworkController } for (PhoneState state : mPhoneStates) { - if (state.mMobile != null) { - state.maybeStopAnimatableDrawable(state.mMobile); - state.mMobile.setImageDrawable(null); - state.mLastMobileStrengthId = -1; - } - if (state.mMobileDark != null) { - state.maybeStopAnimatableDrawable(state.mMobileDark); - state.mMobileDark.setImageDrawable(null); - state.mLastMobileStrengthId = -1; - } if (state.mMobileType != null) { state.mMobileType.setImageDrawable(null); state.mLastMobileTypeId = -1; @@ -654,7 +636,6 @@ public class SignalClusterView extends LinearLayout implements NetworkController private int mMobileStrengthId = 0, mMobileTypeId = 0; private int mLastMobileStrengthId = -1; private int mLastMobileTypeId = -1; - private int mLastMobileActivityId = -1; private boolean mIsMobileTypeIconWide; private String mMobileDescription, mMobileTypeDescription; @@ -681,13 +662,18 @@ public class SignalClusterView extends LinearLayout implements NetworkController mMobileRoaming = root.findViewById(R.id.mobile_roaming); mMobileActivityIn = root.findViewById(R.id.mobile_in); mMobileActivityOut = root.findViewById(R.id.mobile_out); + // TODO: Remove the 2 instances because now the drawable can handle darkness. + mMobile.setImageDrawable(new SignalDrawable(mMobile.getContext())); + SignalDrawable drawable = new SignalDrawable(mMobileDark.getContext()); + drawable.setDarkIntensity(1); + mMobileDark.setImageDrawable(drawable); } public boolean apply(boolean isSecondaryIcon) { if (mMobileVisible && !mIsAirplaneMode) { if (mLastMobileStrengthId != mMobileStrengthId) { - updateAnimatableIcon(mMobile, mMobileStrengthId); - updateAnimatableIcon(mMobileDark, mMobileStrengthId); + mMobile.getDrawable().setLevel(mMobileStrengthId); + mMobileDark.getDrawable().setLevel(mMobileStrengthId); mLastMobileStrengthId = mMobileStrengthId; } @@ -724,49 +710,6 @@ public class SignalClusterView extends LinearLayout implements NetworkController return mMobileVisible; } - private void updateAnimatableIcon(ImageView view, int resId) { - maybeStopAnimatableDrawable(view); - setIconForView(view, resId); - maybeStartAnimatableDrawable(view); - } - - private void maybeStopAnimatableDrawable(ImageView view) { - Drawable drawable = view.getDrawable(); - - // Check if the icon has been scaled. If it has retrieve the actual drawable out of the - // wrapper. - if (drawable instanceof ScalingDrawableWrapper) { - drawable = ((ScalingDrawableWrapper) drawable).getDrawable(); - } - - if (drawable instanceof Animatable) { - Animatable ad = (Animatable) drawable; - if (ad.isRunning()) { - ad.stop(); - } - } - } - - private void maybeStartAnimatableDrawable(ImageView view) { - Drawable drawable = view.getDrawable(); - - // Check if the icon has been scaled. If it has retrieve the actual drawable out of the - // wrapper. - if (drawable instanceof ScalingDrawableWrapper) { - drawable = ((ScalingDrawableWrapper) drawable).getDrawable(); - } - - if (drawable instanceof Animatable) { - Animatable ad = (Animatable) drawable; - if (ad instanceof AnimatedVectorDrawable) { - ((AnimatedVectorDrawable) ad).forceAnimationOnUI(); - } - if (!ad.isRunning()) { - ad.start(); - } - } - } - public void populateAccessibilityEvent(AccessibilityEvent event) { if (mMobileVisible && mMobileGroup != null && mMobileGroup.getContentDescription() != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java index d530759c7d3d..6cbbd6cd1f18 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java @@ -40,8 +40,8 @@ class CarNavigationBarView extends NavigationBarView { @Override public void onFinishInflate() { - mNavButtons = (LinearLayout) findViewById(R.id.nav_buttons); - mLightsOutButtons = (LinearLayout) findViewById(R.id.lights_out); + mNavButtons = findViewById(R.id.nav_buttons); + mLightsOutButtons = findViewById(R.id.lights_out); } public void addButton(CarNavigationButton button, CarNavigationButton lightsOutButton){ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java index f46fc6769b17..2de358f1c292 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java @@ -41,13 +41,13 @@ public class CarNavigationButton extends RelativeLayout { @Override public void onFinishInflate() { super.onFinishInflate(); - mIcon = (AlphaOptimizedImageButton) findViewById(R.id.car_nav_button_icon); + mIcon = findViewById(R.id.car_nav_button_icon); mIcon.setScaleType(ImageView.ScaleType.CENTER); mIcon.setClickable(false); mIcon.setBackgroundColor(android.R.color.transparent); mIcon.setAlpha(UNSELECTED_ALPHA); - mMoreIcon = (AlphaOptimizedImageButton) findViewById(R.id.car_nav_button_more_icon); + mMoreIcon = findViewById(R.id.car_nav_button_more_icon); mMoreIcon.setClickable(false); mMoreIcon.setBackgroundColor(android.R.color.transparent); mMoreIcon.setVisibility(INVISIBLE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/ConnectedDeviceSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/ConnectedDeviceSignalController.java index 67f8426586ea..677fa81a12cd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/ConnectedDeviceSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/ConnectedDeviceSignalController.java @@ -11,6 +11,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.telephony.SignalStrength; import android.util.Log; import android.util.TypedValue; import android.view.View; @@ -18,6 +19,7 @@ import android.widget.ImageView; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.ScalingDrawableWrapper; +import com.android.systemui.statusbar.phone.SignalDrawable; import com.android.systemui.statusbar.policy.BluetoothController; import static com.android.systemui.statusbar.phone.StatusBar.DEBUG; @@ -47,12 +49,12 @@ public class ConnectedDeviceSignalController extends BroadcastReceiver implement * Note that the icon is the same for 0 and 1. */ private static final int[] SIGNAL_STRENGTH_ICONS = { - R.drawable.stat_sys_signal_0_fully, - R.drawable.stat_sys_signal_0_fully, - R.drawable.stat_sys_signal_1_fully, - R.drawable.stat_sys_signal_2_fully, - R.drawable.stat_sys_signal_3_fully, - R.drawable.stat_sys_signal_4_fully, + 0, + 0, + 1, + 2, + 3, + 4, }; private static final int INVALID_SIGNAL = -1; @@ -65,6 +67,7 @@ public class ConnectedDeviceSignalController extends BroadcastReceiver implement private final ImageView mNetworkSignalView; private final float mIconScaleFactor; + private final SignalDrawable mSignalDrawable; private BluetoothHeadsetClient mBluetoothHeadsetClient; @@ -79,6 +82,9 @@ public class ConnectedDeviceSignalController extends BroadcastReceiver implement TypedValue typedValue = new TypedValue(); context.getResources().getValue(R.dimen.status_bar_icon_scale_factor, typedValue, true); mIconScaleFactor = typedValue.getFloat(); + mSignalDrawable = new SignalDrawable(mNetworkSignalView.getContext()); + mNetworkSignalView.setImageDrawable( + new ScalingDrawableWrapper(mSignalDrawable, mIconScaleFactor)); if (mAdapter == null) { return; @@ -187,14 +193,12 @@ public class ConnectedDeviceSignalController extends BroadcastReceiver implement } } - private void setNetworkSignalIcon(int iconId) { + private void setNetworkSignalIcon(int level) { // Setting the icon on a child view of mSignalView, so toggle this container visible. mSignalsView.setVisibility(View.VISIBLE); - // Using mNetworkSignalView's context to get the Drawable in order to preserve the theme. - Drawable icon = mNetworkSignalView.getContext().getDrawable(iconId); - - mNetworkSignalView.setImageDrawable(new ScalingDrawableWrapper(icon, mIconScaleFactor)); + mSignalDrawable.setLevel(SignalDrawable.getState(level, + SignalStrength.NUM_SIGNAL_STRENGTH_BINS, false)); mNetworkSignalView.setVisibility(View.VISIBLE); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index c3f8d9711b9c..40776ea92db7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -158,6 +158,10 @@ public class DozeParameters { return sPickupSubtypePerformsProxMatcher.isIn(subType); } + public int getPulseVisibleDurationExtended() { + return 2 * getPulseVisibleDuration(); + } + /** * Parses a spec of the form `1,2,3,!5,*`. The resulting object will match numbers that are diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index b78f7482b9f3..c5f23c5e066a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -30,6 +30,7 @@ import com.android.keyguard.KeyguardStatusView; import com.android.systemui.Interpolators; import com.android.systemui.doze.DozeHost; import com.android.systemui.doze.DozeLog; +import com.android.systemui.doze.DozeTriggers; /** * Controller which handles all the doze animations of the scrims. @@ -43,8 +44,6 @@ public class DozeScrimController { private final ScrimController mScrimController; private final Context mContext; - private final View mStackScroller; - private final NotificationPanelView mNotificationPanelView; private boolean mDozing; private DozeHost.PulseCallback mPulseCallback; @@ -53,24 +52,22 @@ public class DozeScrimController { private Animator mBehindAnimator; private float mInFrontTarget; private float mBehindTarget; + private boolean mDozingAborted; - public DozeScrimController(ScrimController scrimController, Context context, - View stackScroller, NotificationPanelView notificationPanelView) { + public DozeScrimController(ScrimController scrimController, Context context) { mContext = context; - mStackScroller = stackScroller; mScrimController = scrimController; mDozeParameters = new DozeParameters(context); - mNotificationPanelView = notificationPanelView; } public void setDozing(boolean dozing, boolean animate) { if (mDozing == dozing) return; mDozing = dozing; if (mDozing) { + mDozingAborted = false; abortAnimations(); mScrimController.setDozeBehindAlpha(1f); mScrimController.setDozeInFrontAlpha(mDozeParameters.getAlwaysOn() ? 0f : 1f); - mNotificationPanelView.setDark(true); } else { cancelPulsing(); if (animate) { @@ -85,8 +82,6 @@ public class DozeScrimController { mScrimController.setDozeBehindAlpha(0f); mScrimController.setDozeInFrontAlpha(0f); } - // TODO: animate - mNotificationPanelView.setDark(false); } } @@ -116,10 +111,19 @@ public class DozeScrimController { cancelPulsing(); if (mDozing) { mScrimController.setDozeBehindAlpha(1f); - mScrimController.setDozeInFrontAlpha(1f); + mScrimController.setDozeInFrontAlpha( + mDozeParameters.getAlwaysOn() && !mDozingAborted ? 0f : 1f); } } + /** + * Aborts dozing immediately. + */ + public void abortDoze() { + mDozingAborted = true; + abortPulsing(); + } + public void onScreenTurnedOn() { if (isPulsing()) { final boolean pickupOrDoubleTap = mPulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP @@ -139,12 +143,17 @@ public class DozeScrimController { return mDozing; } + public void extendPulse() { + mHandler.removeCallbacks(mPulseOut); + } + private void cancelPulsing() { if (DEBUG) Log.d(TAG, "Cancel pulsing"); if (mPulseCallback != null) { mHandler.removeCallbacks(mPulseIn); mHandler.removeCallbacks(mPulseOut); + mHandler.removeCallbacks(mPulseOutExtended); pulseFinished(); } } @@ -271,12 +280,23 @@ public class DozeScrimController { if (DEBUG) Log.d(TAG, "Pulse in finished, mDozing=" + mDozing); if (!mDozing) return; mHandler.postDelayed(mPulseOut, mDozeParameters.getPulseVisibleDuration()); + mHandler.postDelayed(mPulseOutExtended, + mDozeParameters.getPulseVisibleDurationExtended()); + } + }; + + private final Runnable mPulseOutExtended = new Runnable() { + @Override + public void run() { + mHandler.removeCallbacks(mPulseOut); + mPulseOut.run(); } }; private final Runnable mPulseOut = new Runnable() { @Override public void run() { + mHandler.removeCallbacks(mPulseOutExtended); if (DEBUG) Log.d(TAG, "Pulse out, mDozing=" + mDozing); if (!mDozing) return; startScrimAnimation(true /* inFront */, mDozeParameters.getAlwaysOn() ? 0 : 1, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java index 2bb3cbc31ceb..92069142a61f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java @@ -221,7 +221,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { case MODE_WAKE_AND_UNLOCK: Trace.beginSection("MODE_WAKE_AND_UNLOCK"); mStatusBarWindowManager.setStatusBarFocusable(false); - mDozeScrimController.abortPulsing(); + mDozeScrimController.abortDoze(); mKeyguardViewMediator.onWakeAndUnlocking(); mScrimController.setWakeAndUnlocking(); if (mStatusBar.getNavigationBarView() != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 9a49d67d70d6..41a60e24e700 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -227,14 +227,14 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL protected void onFinishInflate() { super.onFinishInflate(); mLockPatternUtils = new LockPatternUtils(mContext); - mPreviewContainer = (ViewGroup) findViewById(R.id.preview_container); - mRightAffordanceView = (KeyguardAffordanceView) findViewById(R.id.camera_button); - mLeftAffordanceView = (KeyguardAffordanceView) findViewById(R.id.left_button); - mLockIcon = (LockIcon) findViewById(R.id.lock_icon); - mIndicationArea = (ViewGroup) findViewById(R.id.keyguard_indication_area); - mEnterpriseDisclosure = (TextView) findViewById( + mPreviewContainer = findViewById(R.id.preview_container); + mRightAffordanceView = findViewById(R.id.camera_button); + mLeftAffordanceView = findViewById(R.id.left_button); + mLockIcon = findViewById(R.id.lock_icon); + mIndicationArea = findViewById(R.id.keyguard_indication_area); + mEnterpriseDisclosure = findViewById( R.id.keyguard_indication_enterprise_disclosure); - mIndicationText = (TextView) findViewById(R.id.keyguard_indication_text); + mIndicationText = findViewById(R.id.keyguard_indication_text); watchForCameraPolicyChanges(); updateCameraVisibility(); mUnlockMethodCache = UnlockMethodCache.getInstance(getContext()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 307a8c7b16dc..f1b449891529 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -231,9 +231,9 @@ public class NotificationPanelView extends PanelView implements @Override protected void onFinishInflate() { super.onFinishInflate(); - mKeyguardStatusBar = (KeyguardStatusBarView) findViewById(R.id.keyguard_header); - mKeyguardStatusView = (KeyguardStatusView) findViewById(R.id.keyguard_status_view); - mClockView = (TextView) findViewById(R.id.clock_view); + mKeyguardStatusBar = findViewById(R.id.keyguard_header); + mKeyguardStatusView = findViewById(R.id.keyguard_status_view); + mClockView = findViewById(R.id.clock_view); mNotificationContainerParent = (NotificationsQuickSettingsContainer) findViewById(R.id.notification_container_parent); @@ -242,13 +242,13 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.setOnHeightChangedListener(this); mNotificationStackScroller.setOverscrollTopChangedListener(this); mNotificationStackScroller.setOnEmptySpaceClickListener(this); - mKeyguardBottomArea = (KeyguardBottomAreaView) findViewById(R.id.keyguard_bottom_area); + mKeyguardBottomArea = findViewById(R.id.keyguard_bottom_area); mQsNavbarScrim = findViewById(R.id.qs_navbar_scrim); mAffordanceHelper = new KeyguardAffordanceHelper(this, getContext()); mKeyguardBottomArea.setAffordanceHelper(mAffordanceHelper); mLastOrientation = getResources().getConfiguration().orientation; - mQsFrame = (FrameLayout) findViewById(R.id.qs_frame); + mQsFrame = findViewById(R.id.qs_frame); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 4dc593b856e6..916b603f54fa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -75,7 +75,7 @@ public class PhoneStatusBarView extends PanelBar { @Override public void onFinishInflate() { mBarTransitions.init(); - mBattery = (DarkReceiver) findViewById(R.id.battery); + mBattery = findViewById(R.id.battery); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java new file mode 100644 index 000000000000..a9eb20ba3a57 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2017 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 com.android.systemui.statusbar.phone; + +import android.animation.ArgbEvaluator; +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.graphics.Path; +import android.graphics.Path.Direction; +import android.graphics.Path.FillType; +import android.graphics.Path.Op; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.util.Log; + +import com.android.settingslib.R; +import com.android.settingslib.Utils; + +public class SignalDrawable extends Drawable { + + private static final String TAG = "SignalDrawable"; + + private static final int NUM_DOTS = 3; + + private static final float VIEWPORT = 24f; + private static final float PAD = 2f / VIEWPORT; + private static final float CUT_OUT = 7.9f / VIEWPORT; + + private static final float DOT_SIZE = 3f / VIEWPORT; + private static final float DOT_PADDING = 1f / VIEWPORT; + private static final float DOT_CUT_WIDTH = (DOT_SIZE * 3) + (DOT_PADDING * 5); + private static final float DOT_CUT_HEIGHT = (DOT_SIZE * 1) + (DOT_PADDING * 1); + + private static final float[] FIT = {2.26f, -3.02f, 1.76f}; + + // All of these are masks to push all of the drawable state into one int for easy callbacks + // and flow through sysui. + private static final int LEVEL_MASK = 0xff; + private static final int NUM_LEVEL_SHIFT = 8; + private static final int NUM_LEVEL_MASK = 0xff << NUM_LEVEL_SHIFT; + private static final int STATE_SHIFT = 16; + private static final int STATE_MASK = 0xff << STATE_SHIFT; + private static final int STATE_NONE = 0; + private static final int STATE_EMPTY = 1; + private static final int STATE_CUT = 2; + private static final int STATE_CARRIER_CHANGE = 3; + + private static final long DOT_DELAY = 1000; + + private static float[][] X_PATH = new float[][]{ + {21.9f / VIEWPORT, 17.0f / VIEWPORT}, + {-1.1f / VIEWPORT, -1.1f / VIEWPORT}, + {-1.9f / VIEWPORT, 1.9f / VIEWPORT}, + {-1.9f / VIEWPORT, -1.9f / VIEWPORT}, + {-1.1f / VIEWPORT, 1.1f / VIEWPORT}, + {1.9f / VIEWPORT, 1.9f / VIEWPORT}, + {-1.9f / VIEWPORT, 1.9f / VIEWPORT}, + {1.1f / VIEWPORT, 1.1f / VIEWPORT}, + {1.9f / VIEWPORT, -1.9f / VIEWPORT}, + {1.9f / VIEWPORT, 1.9f / VIEWPORT}, + {1.1f / VIEWPORT, -1.1f / VIEWPORT}, + {-1.9f / VIEWPORT, -1.9f / VIEWPORT}, + }; + + private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint mForegroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final int mDarkModeBackgroundColor; + private final int mDarkModeFillColor; + private final int mLightModeBackgroundColor; + private final int mLightModeFillColor; + private final Path mFullPath = new Path(); + private final Path mForegroundPath = new Path(); + private final Path mXPath = new Path(); + private final int mIntrinsicSize; + private final Handler mHandler; + private float mOldDarkIntensity = -1; + private float mNumLevels = 1; + private int mLevel; + private int mState; + private boolean mVisible; + private boolean mAnimating; + private int mCurrentDot; + + public SignalDrawable(Context context) { + mDarkModeBackgroundColor = + Utils.getDefaultColor(context, R.color.dark_mode_icon_color_dual_tone_background); + mDarkModeFillColor = + Utils.getDefaultColor(context, R.color.dark_mode_icon_color_dual_tone_fill); + mLightModeBackgroundColor = + Utils.getDefaultColor(context, R.color.light_mode_icon_color_dual_tone_background); + mLightModeFillColor = + Utils.getDefaultColor(context, R.color.light_mode_icon_color_dual_tone_fill); + mIntrinsicSize = context.getResources().getDimensionPixelSize(R.dimen.signal_icon_size); + mHandler = new Handler(); + setDarkIntensity(0); + } + + @Override + public int getIntrinsicWidth() { + return mIntrinsicSize; + } + + @Override + public int getIntrinsicHeight() { + return mIntrinsicSize; + } + + public void setNumLevels(int levels) { + if (levels == mNumLevels) return; + mNumLevels = levels; + invalidateSelf(); + } + + private void setSignalState(int state) { + if (state == mState) return; + mState = state; + updateAnimation(); + invalidateSelf(); + } + + private void updateAnimation() { + boolean shouldAnimate = (mState == STATE_CARRIER_CHANGE) && mVisible; + if (shouldAnimate == mAnimating) return; + mAnimating = shouldAnimate; + if (shouldAnimate) { + mChangeDot.run(); + } else { + mHandler.removeCallbacks(mChangeDot); + } + } + + @Override + protected boolean onLevelChange(int state) { + setNumLevels(getNumLevels(state)); + setSignalState(getState(state)); + int level = getLevel(state); + if (level != mLevel) { + mLevel = level; + invalidateSelf(); + } + return true; + } + + public void setDarkIntensity(float darkIntensity) { + if (darkIntensity == mOldDarkIntensity) { + return; + } + mPaint.setColor(getBackgroundColor(darkIntensity)); + mForegroundPaint.setColor(getFillColor(darkIntensity)); + mOldDarkIntensity = darkIntensity; + invalidateSelf(); + } + + private int getFillColor(float darkIntensity) { + return getColorForDarkIntensity( + darkIntensity, mLightModeFillColor, mDarkModeFillColor); + } + + private int getBackgroundColor(float darkIntensity) { + return getColorForDarkIntensity( + darkIntensity, mLightModeBackgroundColor, mDarkModeBackgroundColor); + } + + private int getColorForDarkIntensity(float darkIntensity, int lightColor, int darkColor) { + return (int) ArgbEvaluator.getInstance().evaluate(darkIntensity, lightColor, darkColor); + } + + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + invalidateSelf(); + } + + @Override + public void draw(@NonNull Canvas canvas) { + mFullPath.reset(); + mFullPath.setFillType(FillType.WINDING); + float width = getBounds().width(); + float height = getBounds().height(); + float padding = (PAD * width); + mFullPath.moveTo(width - padding, height - padding); + mFullPath.lineTo(width - padding, padding); + mFullPath.lineTo(padding, height - padding); + mFullPath.lineTo(width - padding, height - padding); + + if (mState == STATE_CARRIER_CHANGE) { + float cutWidth = (DOT_CUT_WIDTH * width); + float cutHeight = (DOT_CUT_HEIGHT * width); + float dotSize = (DOT_SIZE * height); + float dotPadding = (DOT_PADDING * height); + + mFullPath.moveTo(width - padding, height - padding); + mFullPath.rLineTo(-cutWidth, 0); + mFullPath.rLineTo(0, -cutHeight); + mFullPath.rLineTo(cutWidth, 0); + mFullPath.rLineTo(0, cutHeight); + float dotSpacing = dotPadding * 2 + dotSize; + float x = width - padding - dotSize; + float y = height - padding - dotSize; + mForegroundPath.reset(); + drawDot(mFullPath, mForegroundPath, x, y, dotSize, 2); + drawDot(mFullPath, mForegroundPath, x - dotSpacing, y, dotSize, 1); + drawDot(mFullPath, mForegroundPath, x - dotSpacing * 2, y, dotSize, 0); + } else if (mState == STATE_CUT) { + float cut = (CUT_OUT * width); + mFullPath.moveTo(width - padding, height - padding); + mFullPath.rLineTo(-cut, 0); + mFullPath.rLineTo(0, -cut); + mFullPath.rLineTo(cut, 0); + mFullPath.rLineTo(0, cut); + } + + mPaint.setStyle(mState == STATE_EMPTY ? Style.STROKE : Style.FILL); + mForegroundPaint.setStyle(mState == STATE_EMPTY ? Style.STROKE : Style.FILL); + + if (mState != STATE_CARRIER_CHANGE) { + mForegroundPath.reset(); + int sigWidth = Math.round(calcFit(mLevel / (mNumLevels - 1)) * (width - 2 * padding)); + mForegroundPath.addRect(padding, padding, padding + sigWidth, height - padding, + Direction.CW); + mForegroundPath.op(mFullPath, Op.INTERSECT); + } + + canvas.drawPath(mFullPath, mPaint); + canvas.drawPath(mForegroundPath, mForegroundPaint); + if (mState == STATE_CUT) { + mXPath.reset(); + mXPath.moveTo(X_PATH[0][0] * width, X_PATH[0][1] * height); + for (int i = 1; i < X_PATH.length; i++) { + mXPath.rLineTo(X_PATH[i][0] * width, X_PATH[i][1] * height); + } + canvas.drawPath(mXPath, mForegroundPaint); + } + } + + private void drawDot(Path fullPath, Path foregroundPath, float x, float y, float dotSize, + int i) { + Path p = (i == mCurrentDot) ? foregroundPath : fullPath; + p.addRect(x, y, x + dotSize, y + dotSize, Direction.CW); + } + + // This is a fit line based on previous values of provided in assets, but if + // you look at the a plot of this actual fit, it makes a lot of sense, what it does + // is compress the areas that are very visually easy to see changes (the middle sections) + // and spread out the sections that are hard to see (each end of the icon). + // The current fit is cubic, but pretty easy to change the way the code is written (just add + // terms to the end of FIT). + private float calcFit(float v) { + float ret = 0; + float t = v; + for (int i = 0; i < FIT.length; i++) { + ret += FIT[i] * t; + t *= v; + } + return ret; + } + + @Override + public int getAlpha() { + return mPaint.getAlpha(); + } + + @Override + public void setAlpha(@IntRange(from = 0, to = 255) int alpha) { + mPaint.setAlpha(alpha); + mForegroundPaint.setAlpha(alpha); + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + mPaint.setColorFilter(colorFilter); + mForegroundPaint.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return 255; + } + + @Override + public boolean setVisible(boolean visible, boolean restart) { + mVisible = visible; + updateAnimation(); + return super.setVisible(visible, restart); + } + + private final Runnable mChangeDot = new Runnable() { + @Override + public void run() { + if (++mCurrentDot == NUM_DOTS) { + mCurrentDot = 0; + } + invalidateSelf(); + mHandler.postDelayed(mChangeDot, DOT_DELAY); + } + }; + + public static int getLevel(int fullState) { + return fullState & LEVEL_MASK; + } + + public static int getState(int fullState) { + return (fullState & STATE_MASK) >> STATE_SHIFT; + } + + public static int getNumLevels(int fullState) { + return (fullState & NUM_LEVEL_MASK) >> NUM_LEVEL_SHIFT; + } + + public static int getState(int level, int numLevels, boolean cutOut) { + return ((cutOut ? STATE_CUT : 0) << STATE_SHIFT) + | (numLevels << NUM_LEVEL_SHIFT) + | level; + } + + public static int getCarrierChangeState(int numLevels) { + return (STATE_CARRIER_CHANGE << STATE_SHIFT) | (numLevels << NUM_LEVEL_SHIFT); + } + + public static int getEmptyState(int numLevels) { + return (STATE_EMPTY << STATE_SHIFT) | (numLevels << NUM_LEVEL_SHIFT); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d3cb6a4a8782..fbf53e396b3c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1114,8 +1114,7 @@ public class StatusBar extends SystemUI implements DemoMode, } mHeadsUpManager.addListener(mScrimController); mStackScroller.setScrimController(mScrimController); - mDozeScrimController = new DozeScrimController(mScrimController, context, mStackScroller, - mNotificationPanel); + mDozeScrimController = new DozeScrimController(mScrimController, context); // Other icons mVolumeComponent = getComponent(VolumeComponent.class); @@ -4332,6 +4331,7 @@ public class StatusBar extends SystemUI implements DemoMode, mStackScroller.setDark(mDozing, animate, mWakeUpTouchLocation); mScrimController.setDozing(mDozing); mKeyguardIndicationController.setDozing(mDozing); + mNotificationPanel.setDark(mDozing); // Immediately abort the dozing from the doze scrim controller in case of wake-and-unlock // for pulsing so the Keyguard fade-out animation scrim can take over. @@ -4958,6 +4958,7 @@ public class StatusBar extends SystemUI implements DemoMode, mDozing = mDozingRequested && mState == StatusBarState.KEYGUARD || mFingerprintUnlockController.getMode() == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING; + mStatusBarWindowManager.setDozing(mDozing); updateDozingState(); Trace.endSection(); } @@ -5065,6 +5066,16 @@ public class StatusBar extends SystemUI implements DemoMode, StatusBar.this.startPendingIntentDismissingKeyguard(intent); } + @Override + public void abortPulsing() { + mDozeScrimController.abortPulsing(); + } + + @Override + public void extendPulse() { + mDozeScrimController.extendPulse(); + } + } // Begin Extra BaseStatusBar methods. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index deb0070ccbc0..0326e4025a79 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -118,7 +118,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; } - if (state.keyguardShowing && !state.backdropShowing) { + if (state.keyguardShowing && !state.backdropShowing && !state.dozing) { mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; } else { mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; @@ -357,6 +357,11 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D apply(mCurrentState); } + public void setDozing(boolean dozing) { + mCurrentState.dozing = dozing; + apply(mCurrentState); + } + public void setBarHeight(int barHeight) { mBarHeight = barHeight; apply(mCurrentState); @@ -404,6 +409,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D boolean remoteInputActive; boolean forcePluginOpen; + boolean dozing; private boolean isKeyguardShowingAndNotOccluded() { return keyguardShowing && !keyguardOccluded; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 1848d4ea438b..1a09d75be632 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -255,6 +255,9 @@ public class StatusBarWindowView extends FrameLayout { if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { mStackScrollLayout.closeControlsIfOutsideTouch(ev); } + if (mService.isDozing()) { + mService.mDozeScrimController.extendPulse(); + } return super.dispatchTouchEvent(ev); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 91acf0488999..67b5596e34c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -36,6 +36,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.cdma.EriInfo; import com.android.systemui.R; +import com.android.systemui.statusbar.phone.SignalDrawable; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config; @@ -233,6 +234,29 @@ public class MobileSignalController extends SignalController< mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_IWLAN, TelephonyIcons.WFC); } + private int getNumLevels() { + return SignalStrength.NUM_SIGNAL_STRENGTH_BINS; + } + + @Override + public int getCurrentIconId() { + if (mCurrentState.iconGroup == TelephonyIcons.CARRIER_NETWORK_CHANGE) { + return SignalDrawable.getCarrierChangeState(getNumLevels()); + } else if (mCurrentState.connected) { + return SignalDrawable.getState(mCurrentState.level, getNumLevels(), + mCurrentState.inetCondition == 0); + } else if (mCurrentState.enabled) { + return SignalDrawable.getEmptyState(getNumLevels()); + } else { + return 0; + } + } + + @Override + public int getQsCurrentIconId() { + return getCurrentIconId(); + } + @Override public void notifyListeners(SignalCallback callback) { MobileIconGroup icons = getIcons(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index bc3eec9795f7..c21f444d0bf3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -32,6 +32,7 @@ import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.telephony.ServiceState; +import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; @@ -872,11 +873,11 @@ public class NetworkControllerImpl extends BroadcastReceiver if (args.containsKey("roam")) { controller.getState().roaming = "show".equals(args.getString("roam")); } - int[][] icons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH; String level = args.getString("level"); if (level != null) { controller.getState().level = level.equals("null") ? -1 - : Math.min(Integer.parseInt(level), icons[0].length - 1); + : Math.min(Integer.parseInt(level), + SignalStrength.NUM_SIGNAL_STRENGTH_BINS); controller.getState().connected = controller.getState().level >= 0; } String activity = args.getString("activity"); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index 784f25e25a56..37b0de400c9e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -101,9 +101,9 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene protected void onFinishInflate() { super.onFinishInflate(); - mProgressBar = (ProgressBar) findViewById(R.id.remote_input_progress); + mProgressBar = findViewById(R.id.remote_input_progress); - mSendButton = (ImageButton) findViewById(R.id.remote_input_send); + mSendButton = findViewById(R.id.remote_input_send); mSendButton.setOnClickListener(this); mEditText = (RemoteEditText) getChildAt(0); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java index faa1a28ace8b..9f6157492a38 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SplitClockView.java @@ -59,8 +59,8 @@ public class SplitClockView extends LinearLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mTimeView = (TextClock) findViewById(R.id.time_view); - mAmPmView = (TextClock) findViewById(R.id.am_pm_view); + mTimeView = findViewById(R.id.time_view); + mAmPmView = findViewById(R.id.am_pm_view); mTimeView.setShowCurrentUserTime(true); mAmPmView.setShowCurrentUserTime(true); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java index 6b2361e64da0..aaa0568a72cd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -20,196 +20,20 @@ import com.android.systemui.R; import com.android.systemui.statusbar.policy.MobileSignalController.MobileIconGroup; class TelephonyIcons { - //***** Signal strength icons - - static final int TELEPHONY_NUM_LEVELS = 5; - - //GSM/UMTS - static final int TELEPHONY_NO_NETWORK = R.drawable.stat_sys_signal_null; - - static final int[][] TELEPHONY_SIGNAL_STRENGTH = { - { R.drawable.stat_sys_signal_0, - R.drawable.stat_sys_signal_1, - R.drawable.stat_sys_signal_2, - R.drawable.stat_sys_signal_3, - R.drawable.stat_sys_signal_4 }, - { R.drawable.stat_sys_signal_0_fully, - R.drawable.stat_sys_signal_1_fully, - R.drawable.stat_sys_signal_2_fully, - R.drawable.stat_sys_signal_3_fully, - R.drawable.stat_sys_signal_4_fully } - }; - - static final int QS_TELEPHONY_NO_NETWORK = R.drawable.ic_qs_signal_no_signal; - - static final int[][] QS_TELEPHONY_SIGNAL_STRENGTH = { - { R.drawable.ic_qs_signal_0, - R.drawable.ic_qs_signal_1, - R.drawable.ic_qs_signal_2, - R.drawable.ic_qs_signal_3, - R.drawable.ic_qs_signal_4 }, - { R.drawable.ic_qs_signal_full_0, - R.drawable.ic_qs_signal_full_1, - R.drawable.ic_qs_signal_full_2, - R.drawable.ic_qs_signal_full_3, - R.drawable.ic_qs_signal_full_4 } - }; - - static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING = { - { R.drawable.stat_sys_signal_0, - R.drawable.stat_sys_signal_1, - R.drawable.stat_sys_signal_2, - R.drawable.stat_sys_signal_3, - R.drawable.stat_sys_signal_4 }, - { R.drawable.stat_sys_signal_0_fully, - R.drawable.stat_sys_signal_1_fully, - R.drawable.stat_sys_signal_2_fully, - R.drawable.stat_sys_signal_3_fully, - R.drawable.stat_sys_signal_4_fully } - }; - - //CarrierNetworkChange - static final int[][] TELEPHONY_CARRIER_NETWORK_CHANGE = { - { R.drawable.stat_sys_signal_carrier_network_change_animation, - R.drawable.stat_sys_signal_carrier_network_change_animation, - R.drawable.stat_sys_signal_carrier_network_change_animation, - R.drawable.stat_sys_signal_carrier_network_change_animation, - R.drawable.stat_sys_signal_carrier_network_change_animation }, - { R.drawable.stat_sys_signal_carrier_network_change_animation, - R.drawable.stat_sys_signal_carrier_network_change_animation, - R.drawable.stat_sys_signal_carrier_network_change_animation, - R.drawable.stat_sys_signal_carrier_network_change_animation, - R.drawable.stat_sys_signal_carrier_network_change_animation } - }; - - static final int[][] QS_TELEPHONY_CARRIER_NETWORK_CHANGE = { - { R.drawable.ic_qs_signal_carrier_network_change_animation, - R.drawable.ic_qs_signal_carrier_network_change_animation, - R.drawable.ic_qs_signal_carrier_network_change_animation, - R.drawable.ic_qs_signal_carrier_network_change_animation, - R.drawable.ic_qs_signal_carrier_network_change_animation }, - { R.drawable.ic_qs_signal_carrier_network_change_animation, - R.drawable.ic_qs_signal_carrier_network_change_animation, - R.drawable.ic_qs_signal_carrier_network_change_animation, - R.drawable.ic_qs_signal_carrier_network_change_animation, - R.drawable.ic_qs_signal_carrier_network_change_animation } - }; - //***** Data connection icons - //GSM/UMTS - static final int[][] DATA_G = { - { R.drawable.stat_sys_data_fully_connected_g, - R.drawable.stat_sys_data_fully_connected_g, - R.drawable.stat_sys_data_fully_connected_g, - R.drawable.stat_sys_data_fully_connected_g }, - { R.drawable.stat_sys_data_fully_connected_g, - R.drawable.stat_sys_data_fully_connected_g, - R.drawable.stat_sys_data_fully_connected_g, - R.drawable.stat_sys_data_fully_connected_g } - }; - static final int QS_DATA_G = R.drawable.ic_qs_signal_g; - - static final int[][] DATA_3G = { - { R.drawable.stat_sys_data_fully_connected_3g, - R.drawable.stat_sys_data_fully_connected_3g, - R.drawable.stat_sys_data_fully_connected_3g, - R.drawable.stat_sys_data_fully_connected_3g }, - { R.drawable.stat_sys_data_fully_connected_3g, - R.drawable.stat_sys_data_fully_connected_3g, - R.drawable.stat_sys_data_fully_connected_3g, - R.drawable.stat_sys_data_fully_connected_3g } - }; - static final int QS_DATA_3G = R.drawable.ic_qs_signal_3g; - - static final int[][] DATA_E = { - { R.drawable.stat_sys_data_fully_connected_e, - R.drawable.stat_sys_data_fully_connected_e, - R.drawable.stat_sys_data_fully_connected_e, - R.drawable.stat_sys_data_fully_connected_e }, - { R.drawable.stat_sys_data_fully_connected_e, - R.drawable.stat_sys_data_fully_connected_e, - R.drawable.stat_sys_data_fully_connected_e, - R.drawable.stat_sys_data_fully_connected_e } - }; - static final int QS_DATA_E = R.drawable.ic_qs_signal_e; - - //3.5G - static final int[][] DATA_H = { - { R.drawable.stat_sys_data_fully_connected_h, - R.drawable.stat_sys_data_fully_connected_h, - R.drawable.stat_sys_data_fully_connected_h, - R.drawable.stat_sys_data_fully_connected_h }, - { R.drawable.stat_sys_data_fully_connected_h, - R.drawable.stat_sys_data_fully_connected_h, - R.drawable.stat_sys_data_fully_connected_h, - R.drawable.stat_sys_data_fully_connected_h } - }; - static final int QS_DATA_H = R.drawable.ic_qs_signal_h; - - //CDMA - // Use 3G icons for EVDO data and 1x icons for 1XRTT data - static final int[][] DATA_1X = { - { R.drawable.stat_sys_data_fully_connected_1x, - R.drawable.stat_sys_data_fully_connected_1x, - R.drawable.stat_sys_data_fully_connected_1x, - R.drawable.stat_sys_data_fully_connected_1x }, - { R.drawable.stat_sys_data_fully_connected_1x, - R.drawable.stat_sys_data_fully_connected_1x, - R.drawable.stat_sys_data_fully_connected_1x, - R.drawable.stat_sys_data_fully_connected_1x } - }; - static final int QS_DATA_1X = R.drawable.ic_qs_signal_1x; - - // LTE and eHRPD - static final int[][] DATA_4G = { - { R.drawable.stat_sys_data_fully_connected_4g, - R.drawable.stat_sys_data_fully_connected_4g, - R.drawable.stat_sys_data_fully_connected_4g, - R.drawable.stat_sys_data_fully_connected_4g }, - { R.drawable.stat_sys_data_fully_connected_4g, - R.drawable.stat_sys_data_fully_connected_4g, - R.drawable.stat_sys_data_fully_connected_4g, - R.drawable.stat_sys_data_fully_connected_4g } - }; - static final int QS_DATA_4G = R.drawable.ic_qs_signal_4g; - - static final int[][] DATA_4G_PLUS = { - { R.drawable.stat_sys_data_fully_connected_4g_plus, - R.drawable.stat_sys_data_fully_connected_4g_plus, - R.drawable.stat_sys_data_fully_connected_4g_plus, - R.drawable.stat_sys_data_fully_connected_4g_plus }, - { R.drawable.stat_sys_data_fully_connected_4g_plus, - R.drawable.stat_sys_data_fully_connected_4g_plus, - R.drawable.stat_sys_data_fully_connected_4g_plus, - R.drawable.stat_sys_data_fully_connected_4g_plus } - }; - static final int QS_DATA_4G_PLUS = R.drawable.ic_qs_signal_4g_plus; - - // LTE branded "LTE" - static final int[][] DATA_LTE = { - { R.drawable.stat_sys_data_fully_connected_lte, - R.drawable.stat_sys_data_fully_connected_lte, - R.drawable.stat_sys_data_fully_connected_lte, - R.drawable.stat_sys_data_fully_connected_lte }, - { R.drawable.stat_sys_data_fully_connected_lte, - R.drawable.stat_sys_data_fully_connected_lte, - R.drawable.stat_sys_data_fully_connected_lte, - R.drawable.stat_sys_data_fully_connected_lte } - }; - static final int QS_DATA_LTE = R.drawable.ic_qs_signal_lte; static final int QS_DATA_LTE_PLUS = R.drawable.ic_qs_signal_lte_plus; static final int FLIGHT_MODE_ICON = R.drawable.stat_sys_airplane_mode; - static final int ROAMING_ICON = R.drawable.stat_sys_roaming; + static final int ICON_LTE = R.drawable.stat_sys_data_fully_connected_lte; static final int ICON_LTE_PLUS = R.drawable.stat_sys_data_fully_connected_lte_plus; static final int ICON_G = R.drawable.stat_sys_data_fully_connected_g; @@ -219,29 +43,19 @@ class TelephonyIcons { static final int ICON_4G = R.drawable.stat_sys_data_fully_connected_4g; static final int ICON_4G_PLUS = R.drawable.stat_sys_data_fully_connected_4g_plus; static final int ICON_1X = R.drawable.stat_sys_data_fully_connected_1x; - static final int ICON_CARRIER_NETWORK_CHANGE = - R.drawable.stat_sys_signal_carrier_network_change_animation; static final int ICON_DATA_DISABLED = R.drawable.stat_sys_data_disabled; - static final int QS_ICON_LTE = R.drawable.ic_qs_signal_lte; - static final int QS_ICON_3G = R.drawable.ic_qs_signal_3g; - static final int QS_ICON_4G = R.drawable.ic_qs_signal_4g; - static final int QS_ICON_4G_PLUS = R.drawable.ic_qs_signal_4g_plus; - static final int QS_ICON_1X = R.drawable.ic_qs_signal_1x; - static final int QS_ICON_CARRIER_NETWORK_CHANGE = - R.drawable.ic_qs_signal_carrier_network_change_animation; - static final int QS_ICON_DATA_DISABLED = R.drawable.ic_qs_data_disabled; static final MobileIconGroup CARRIER_NETWORK_CHANGE = new MobileIconGroup( "CARRIER_NETWORK_CHANGE", - TelephonyIcons.TELEPHONY_CARRIER_NETWORK_CHANGE, - TelephonyIcons.QS_TELEPHONY_CARRIER_NETWORK_CHANGE, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.ICON_CARRIER_NETWORK_CHANGE, - TelephonyIcons.QS_ICON_CARRIER_NETWORK_CHANGE, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_carrier_network_change_mode, 0, @@ -251,12 +65,12 @@ class TelephonyIcons { static final MobileIconGroup THREE_G = new MobileIconGroup( "3G", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_3g, TelephonyIcons.ICON_3G, @@ -266,36 +80,36 @@ class TelephonyIcons { static final MobileIconGroup WFC = new MobileIconGroup( "WFC", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], 0, 0, false, 0 ); static final MobileIconGroup UNKNOWN = new MobileIconGroup( "Unknown", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], 0, 0, false, 0 ); static final MobileIconGroup E = new MobileIconGroup( "E", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_edge, TelephonyIcons.ICON_E, @@ -305,12 +119,12 @@ class TelephonyIcons { static final MobileIconGroup ONE_X = new MobileIconGroup( "1X", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_cdma, TelephonyIcons.ICON_1X, @@ -320,12 +134,12 @@ class TelephonyIcons { static final MobileIconGroup G = new MobileIconGroup( "G", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_gprs, TelephonyIcons.ICON_G, @@ -335,12 +149,12 @@ class TelephonyIcons { static final MobileIconGroup H = new MobileIconGroup( "H", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_3_5g, TelephonyIcons.ICON_H, @@ -350,12 +164,12 @@ class TelephonyIcons { static final MobileIconGroup FOUR_G = new MobileIconGroup( "4G", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_4g, TelephonyIcons.ICON_4G, @@ -365,12 +179,12 @@ class TelephonyIcons { static final MobileIconGroup FOUR_G_PLUS = new MobileIconGroup( "4G+", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0,0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_4g_plus, TelephonyIcons.ICON_4G_PLUS, @@ -380,12 +194,12 @@ class TelephonyIcons { static final MobileIconGroup LTE = new MobileIconGroup( "LTE", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_lte, TelephonyIcons.ICON_LTE, @@ -395,12 +209,12 @@ class TelephonyIcons { static final MobileIconGroup LTE_PLUS = new MobileIconGroup( "LTE+", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_data_connection_lte_plus, TelephonyIcons.ICON_LTE_PLUS, @@ -410,12 +224,12 @@ class TelephonyIcons { static final MobileIconGroup DATA_DISABLED = new MobileIconGroup( "DataDisabled", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + null, + null, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + 0, + 0, AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], R.string.accessibility_cell_data_off, TelephonyIcons.ICON_DATA_DISABLED, diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java index 4e4832c5f33a..10b6ff5cdfdc 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java @@ -60,10 +60,10 @@ public class ZenFooter extends LinearLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mIcon = (ImageView) findViewById(R.id.volume_zen_icon); - mSummaryLine1 = (TextView) findViewById(R.id.volume_zen_summary_line_1); - mSummaryLine2 = (TextView) findViewById(R.id.volume_zen_summary_line_2); - mEndNowButton = (TextView) findViewById(R.id.volume_zen_end_now); + mIcon = findViewById(R.id.volume_zen_icon); + mSummaryLine1 = findViewById(R.id.volume_zen_summary_line_1); + mSummaryLine2 = findViewById(R.id.volume_zen_summary_line_2); + mEndNowButton = findViewById(R.id.volume_zen_end_now); mConfigurableTexts.add(mSummaryLine1); mConfigurableTexts.add(mSummaryLine2); mConfigurableTexts.add(mEndNowButton, R.string.volume_zen_end_now); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 19b4b173c42d..505e1d8346fd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -31,6 +31,7 @@ import android.telephony.TelephonyManager; import android.util.Log; import com.android.internal.telephony.cdma.EriInfo; import com.android.settingslib.net.DataUsageController; +import com.android.systemui.statusbar.phone.SignalDrawable; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; @@ -66,12 +67,10 @@ import static org.mockito.Mockito.when; public class NetworkControllerBaseTest extends SysuiTestCase { private static final String TAG = "NetworkControllerBaseTest"; protected static final int DEFAULT_LEVEL = 2; - protected static final int DEFAULT_SIGNAL_STRENGTH = - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL]; - protected static final int DEFAULT_QS_SIGNAL_STRENGTH = - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL]; + protected static final int DEFAULT_SIGNAL_STRENGTH = DEFAULT_LEVEL; + protected static final int DEFAULT_QS_SIGNAL_STRENGTH = DEFAULT_LEVEL; protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G; - protected static final int DEFAULT_QS_ICON = TelephonyIcons.QS_ICON_3G; + protected static final int DEFAULT_QS_ICON = TelephonyIcons.QS_DATA_3G; protected NetworkControllerImpl mNetworkController; protected MobileSignalController mMobileSignalController; @@ -315,8 +314,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(), anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean()); IconState iconState = iconArg.getValue(); + int state = SignalDrawable.getState(icon, SignalStrength.NUM_SIGNAL_STRENGTH_BINS, + false); assertEquals("Visibility in, quick settings", visible, iconState.visible); - assertEquals("Signal icon in, quick settings", icon, iconState.icon); + assertEquals("Signal icon in, quick settings", state, iconState.icon); assertEquals("Data icon in, quick settings", typeIcon, (int) typeIconArg.getValue()); assertEquals("Data direction in, in quick settings", dataIn, (boolean) dataInArg.getValue()); @@ -330,6 +331,11 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, boolean roaming) { + verifyLastMobileDataIndicators(visible, icon, typeIcon, roaming, true); + } + + protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, + boolean roaming, boolean inet) { ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); @@ -342,7 +348,9 @@ public class NetworkControllerBaseTest extends SysuiTestCase { anyInt(), eq(roaming)); IconState iconState = iconArg.getValue(); - assertEquals("Signal icon in status bar", icon, iconState.icon); + int state = icon == -1 ? 0 + : SignalDrawable.getState(icon, SignalStrength.NUM_SIGNAL_STRENGTH_BINS, !inet); + assertEquals("Signal icon in status bar", state, iconState.icon); assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue()); assertEquals("Visibility in status bar", visible, iconState.visible); } @@ -367,13 +375,15 @@ public class NetworkControllerBaseTest extends SysuiTestCase { IconState iconState = iconArg.getValue(); + int state = SignalDrawable.getState(icon, SignalStrength.NUM_SIGNAL_STRENGTH_BINS, + false); assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue()); - assertEquals("Signal icon in status bar", icon, iconState.icon); + assertEquals("Signal icon in status bar", state, iconState.icon); assertEquals("Visibility in status bar", visible, iconState.visible); iconState = qsIconArg.getValue(); assertEquals("Visibility in quick settings", qsVisible, iconState.visible); - assertEquals("Signal icon in quick settings", qsIcon, iconState.icon); + assertEquals("Signal icon in quick settings", state, iconState.icon); assertEquals("Data icon in quick settings", qsTypeIcon, (int) qsTypeIconArg.getValue()); assertEquals("Data direction in in quick settings", dataIn, (boolean) dataInArg.getValue()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index e47f75066dce..dfe00f95fe4d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -24,7 +24,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { public void test3gDataIcon() { setupDefaultSignal(); - verifyDataIndicators(TelephonyIcons.DATA_3G[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_3G, TelephonyIcons.QS_DATA_3G); } @@ -34,7 +34,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { updateDataConnectionState(TelephonyManager.DATA_CONNECTED, TelephonyManager.NETWORK_TYPE_GSM); - verifyDataIndicators(TelephonyIcons.DATA_G[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_G, TelephonyIcons.QS_DATA_G); } @@ -44,7 +44,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { updateDataConnectionState(TelephonyManager.DATA_CONNECTED, TelephonyManager.NETWORK_TYPE_CDMA); - verifyDataIndicators(TelephonyIcons.DATA_1X[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_1X, TelephonyIcons.QS_DATA_1X); } @@ -54,7 +54,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { updateDataConnectionState(TelephonyManager.DATA_CONNECTED, TelephonyManager.NETWORK_TYPE_EDGE); - verifyDataIndicators(TelephonyIcons.DATA_E[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_E, TelephonyIcons.QS_DATA_E); } @@ -64,7 +64,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { updateDataConnectionState(TelephonyManager.DATA_CONNECTED, TelephonyManager.NETWORK_TYPE_LTE); - verifyDataIndicators(TelephonyIcons.DATA_LTE[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_LTE, TelephonyIcons.QS_DATA_LTE); } @@ -74,7 +74,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { updateDataConnectionState(TelephonyManager.DATA_CONNECTED, TelephonyManager.NETWORK_TYPE_HSPA); - verifyDataIndicators(TelephonyIcons.DATA_H[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_H, TelephonyIcons.QS_DATA_H); } @@ -103,7 +103,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { updateDataConnectionState(TelephonyManager.DATA_CONNECTED, TelephonyManager.NETWORK_TYPE_LTE); - verifyDataIndicators(TelephonyIcons.DATA_4G[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_4G, TelephonyIcons.QS_DATA_4G); } @@ -147,7 +147,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { // the after work. mNetworkController.handleConfigurationChanged(); - verifyDataIndicators(TelephonyIcons.DATA_4G[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_4G, TelephonyIcons.QS_DATA_4G); } @@ -157,13 +157,13 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { updateDataConnectionState(TelephonyManager.DATA_CONNECTED, TelephonyManager.NETWORK_TYPE_LTE); - verifyDataIndicators(TelephonyIcons.DATA_LTE[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_LTE, TelephonyIcons.QS_DATA_LTE); when(mServiceState.getDataNetworkType()) .thenReturn(TelephonyManager.NETWORK_TYPE_HSPA); updateServiceState(); - verifyDataIndicators(TelephonyIcons.DATA_H[1][0 /* No direction */], + verifyDataIndicators(TelephonyIcons.ICON_H, TelephonyIcons.QS_DATA_H); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index 1555856c1875..1627925ae1bc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -30,6 +30,7 @@ import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; import com.android.settingslib.net.DataUsageController; import com.android.systemui.R; +import com.android.systemui.statusbar.phone.SignalDrawable; import org.junit.Test; import org.junit.runner.RunWith; @@ -60,7 +61,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mMockSubDefaults, mock(DeviceProvisionedController.class)); setupNetworkController(); - verifyLastMobileDataIndicators(false, 0, 0); + verifyLastMobileDataIndicators(false, -1, 0); } @Test @@ -132,45 +133,45 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { @Test public void testSignalStrength() { - for (int testStrength = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - testStrength <= SignalStrength.SIGNAL_STRENGTH_GREAT; testStrength++) { + for (int testStrength = 0; + testStrength < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; testStrength++) { setupDefaultSignal(); setLevel(testStrength); verifyLastMobileDataIndicators(true, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][testStrength], DEFAULT_ICON); + testStrength, DEFAULT_ICON); // Verify low inet number indexing. setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, true); verifyLastMobileDataIndicators(true, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[0][testStrength], DEFAULT_ICON); + testStrength, DEFAULT_ICON, false, false); } } @Test public void testCdmaSignalStrength() { - for (int testStrength = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - testStrength <= SignalStrength.SIGNAL_STRENGTH_GREAT; testStrength++) { + for (int testStrength = 0; + testStrength < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; testStrength++) { setupDefaultSignal(); setCdma(); setLevel(testStrength); verifyLastMobileDataIndicators(true, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][testStrength], - TelephonyIcons.DATA_1X[1][0 /* No direction */]); + testStrength, + TelephonyIcons.ICON_1X); } } @Test public void testSignalRoaming() { - for (int testStrength = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - testStrength <= SignalStrength.SIGNAL_STRENGTH_GREAT; testStrength++) { + for (int testStrength = 0; + testStrength < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; testStrength++) { setupDefaultSignal(); setGsmRoaming(true); setLevel(testStrength); verifyLastMobileDataIndicators(true, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][testStrength], + testStrength, DEFAULT_ICON, true); } } @@ -185,8 +186,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { setLevel(testStrength); verifyLastMobileDataIndicators(true, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][testStrength], - TelephonyIcons.DATA_1X[1][0 /* No direction */], true); + testStrength, + TelephonyIcons.ICON_1X, true); } } @@ -198,7 +199,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { setLevel(testStrength); verifyLastQsMobileDataIndicators(true, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][testStrength], + testStrength, DEFAULT_QS_ICON, false, false); } } @@ -212,8 +213,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { setLevel(testStrength); verifyLastQsMobileDataIndicators(true, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][testStrength], - TelephonyIcons.QS_ICON_1X, false, false); + testStrength, + TelephonyIcons.QS_DATA_1X, false, false); } } @@ -223,7 +224,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { setConnectivity(mMobileSignalController.mTransportType, false, false); setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true); - verifyLastMobileDataIndicators(true, TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][2], 0); + verifyLastMobileDataIndicators(true, DEFAULT_LEVEL, 0); } // Some tests of actual NetworkController code, just internals not display stuff @@ -418,7 +419,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { updateDataActivity(TelephonyManager.DATA_ACTIVITY_IN); verifyLastQsMobileDataIndicators(true /* visible */, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL] /* icon */, + DEFAULT_LEVEL /* icon */, DEFAULT_QS_ICON /* typeIcon */, true /* dataIn */, false /* dataOut */); @@ -432,11 +433,10 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { updateDataActivity(TelephonyManager.DATA_ACTIVITY_OUT); verifyLastQsMobileDataIndicators(true /* visible */, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL] /* icon */, + DEFAULT_LEVEL /* icon */, DEFAULT_QS_ICON /* typeIcon */, false /* dataIn */, true /* dataOut */); - } @Test @@ -446,7 +446,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { updateDataActivity(TelephonyManager.DATA_ACTIVITY_INOUT); verifyLastQsMobileDataIndicators(true /* visible */, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL] /* icon */, + DEFAULT_LEVEL /* icon */, DEFAULT_QS_ICON /* typeIcon */, true /* dataIn */, true /* dataOut */); @@ -460,7 +460,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { updateDataActivity(TelephonyManager.DATA_ACTIVITY_NONE); verifyLastQsMobileDataIndicators(true /* visible */, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL] /* icon */, + DEFAULT_LEVEL /* icon */, DEFAULT_QS_ICON /* typeIcon */, false /* dataIn */, false /* dataOut */); @@ -476,7 +476,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { // Verify baseline verifyLastMobileDataIndicators(true /* visible */, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][strength] /* strengthIcon */, + strength /* strengthIcon */, DEFAULT_ICON /* typeIcon */); // API call is made @@ -484,7 +484,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { // Carrier network change is true, show special indicator verifyLastMobileDataIndicators(true /* visible */, - TelephonyIcons.TELEPHONY_CARRIER_NETWORK_CHANGE[0][0] /* strengthIcon */, + SignalDrawable.getCarrierChangeState(SignalStrength.NUM_SIGNAL_STRENGTH_BINS), 0 /* typeIcon */); // Revert back @@ -492,7 +492,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { // Verify back in previous state verifyLastMobileDataIndicators(true /* visible */, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][strength] /* strengthIcon */, + strength /* strengthIcon */, DEFAULT_ICON /* typeIcon */); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java index 483a8371b85b..73fa5aa180bf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java @@ -218,7 +218,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true); setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); verifyLastMobileDataIndicators(true, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][DEFAULT_LEVEL], + DEFAULT_LEVEL, 0, true); } diff --git a/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/ClientTest.java b/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/ClientTest.java index 78fd174313b7..63b6a11c71ef 100644 --- a/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/ClientTest.java +++ b/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/ClientTest.java @@ -49,21 +49,21 @@ public class ClientTest extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.main); - Button addpbtn = (Button) findViewById(R.id.addpkg); - Button procbtn = (Button) findViewById(R.id.procmsg); - Button delbtn = (Button) findViewById(R.id.delpkg); + Button addpbtn = findViewById(R.id.addpkg); + Button procbtn = findViewById(R.id.procmsg); + Button delbtn = findViewById(R.id.delpkg); Log.v(LOG_TAG, "activity created!!"); addpbtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - EditText app_id = (EditText) findViewById(R.id.app_id); - EditText cont = (EditText) findViewById(R.id.cont); - EditText pkg = (EditText) findViewById(R.id.pkg); - EditText cls = (EditText) findViewById(R.id.cls); - RadioButton act = (RadioButton) findViewById(R.id.act); - CheckBox sig = (CheckBox) findViewById(R.id.sig); - CheckBox ftr = (CheckBox) findViewById(R.id.ftr); + EditText app_id = findViewById(R.id.app_id); + EditText cont = findViewById(R.id.cont); + EditText pkg = findViewById(R.id.pkg); + EditText cls = findViewById(R.id.cls); + RadioButton act = findViewById(R.id.act); + CheckBox sig = findViewById(R.id.sig); + CheckBox ftr = findViewById(R.id.ftr); try { if (!mWapPushMan.addPackage( @@ -93,11 +93,11 @@ public class ClientTest extends Activity { delbtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - EditText app_id = (EditText) findViewById(R.id.app_id); - EditText cont = (EditText) findViewById(R.id.cont); - EditText pkg = (EditText) findViewById(R.id.pkg); - EditText cls = (EditText) findViewById(R.id.cls); - // CheckBox delall = (CheckBox) findViewById(R.id.delall); + EditText app_id = findViewById(R.id.app_id); + EditText cont = findViewById(R.id.cont); + EditText pkg = findViewById(R.id.pkg); + EditText cls = findViewById(R.id.cls); + // CheckBox delall = findViewById(R.id.delall); // Log.d(LOG_TAG, "button clicked"); try { @@ -115,9 +115,9 @@ public class ClientTest extends Activity { procbtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - EditText pdu = (EditText) findViewById(R.id.pdu); - EditText app_id = (EditText) findViewById(R.id.app_id); - EditText cont = (EditText) findViewById(R.id.cont); + EditText pdu = findViewById(R.id.pdu); + EditText app_id = findViewById(R.id.app_id); + EditText cont = findViewById(R.id.cont); // WapPushOverSms wap = new WapPushOverSms(); // wap.dispatchWapPdu(strToHex(pdu.getText().toString())); diff --git a/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java b/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java index a319beb6bbe9..f878b4d11f72 100644 --- a/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java +++ b/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java @@ -88,7 +88,7 @@ public class WallpaperCropActivity extends Activity { protected void init() { setContentView(R.layout.wallpaper_cropper); - mCropView = (CropView) findViewById(R.id.cropView); + mCropView = findViewById(R.id.cropView); Intent cropIntent = getIntent(); final Uri imageUri = cropIntent.getData(); diff --git a/samples/training/network-usage/src/com/example/android/networkusage/NetworkActivity.java b/samples/training/network-usage/src/com/example/android/networkusage/NetworkActivity.java index b7ed3314ef1c..27d230b5737b 100644 --- a/samples/training/network-usage/src/com/example/android/networkusage/NetworkActivity.java +++ b/samples/training/network-usage/src/com/example/android/networkusage/NetworkActivity.java @@ -158,7 +158,7 @@ public class NetworkActivity extends Activity { setContentView(R.layout.main); // The specified network connection is not available. Displays error message. - WebView myWebView = (WebView) findViewById(R.id.webview); + WebView myWebView = findViewById(R.id.webview); myWebView.loadData(getResources().getString(R.string.connection_error), "text/html", null); } @@ -205,7 +205,7 @@ public class NetworkActivity extends Activity { protected void onPostExecute(String result) { setContentView(R.layout.main); // Displays the HTML string in the UI via a WebView - WebView myWebView = (WebView) findViewById(R.id.webview); + WebView myWebView = findViewById(R.id.webview); myWebView.loadData(result, "text/html", null); } } diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index 63bf373316e1..57ef6d01a96b 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -48,6 +48,7 @@ import android.os.UserManager; import android.provider.Settings; import android.service.autofill.AutofillService; import android.service.autofill.AutofillServiceInfo; +import android.service.autofill.FillRequest; import android.service.autofill.IAutoFillService; import android.text.TextUtils; import android.util.LocalLog; @@ -169,7 +170,8 @@ final class AutofillManagerServiceImpl { structure.sanitizeForParceling(true); // TODO(b/33197203): Need to pipe the bundle - session.mRemoteFillService.onFillRequest(structure, null, session.mFlags); + FillRequest request = new FillRequest(structure, null, session.mFlags); + session.mRemoteFillService.onFillRequest(request); } }; diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index dd520ac43a80..3badcfcb61cd 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -20,12 +20,10 @@ import static com.android.server.autofill.Helper.DEBUG; import android.annotation.NonNull; import android.annotation.Nullable; -import android.app.assist.AssistStructure; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.os.Bundle; import android.os.IBinder; import android.os.IBinder.DeathRecipient; import android.os.ICancellationSignal; @@ -33,10 +31,12 @@ import android.os.Message; import android.os.RemoteException; import android.os.UserHandle; import android.service.autofill.AutofillService; +import android.service.autofill.FillRequest; import android.service.autofill.FillResponse; import android.service.autofill.IAutoFillService; import android.service.autofill.IFillCallback; import android.service.autofill.ISaveCallback; +import android.service.autofill.SaveRequest; import android.text.format.DateUtils; import android.util.Slog; @@ -88,7 +88,7 @@ final class RemoteFillService implements DeathRecipient { public interface FillServiceCallbacks { void onFillRequestSuccess(@Nullable FillResponse response, - @NonNull String servicePackageName); + @NonNull String servicePackageName, int requestId); void onFillRequestFailure(@Nullable CharSequence message, @NonNull String servicePackageName); void onSaveRequestSuccess(@NonNull String servicePackageName); @@ -134,17 +134,16 @@ final class RemoteFillService implements DeathRecipient { mCallbacks.onServiceDied(this); } - public void onFillRequest(@NonNull AssistStructure structure, @Nullable Bundle extras, - int flags) { + public void onFillRequest(@NonNull FillRequest request) { cancelScheduledUnbind(); - final PendingFillRequest request = new PendingFillRequest(structure, extras, this, flags); - mHandler.obtainMessageO(MyHandler.MSG_ON_PENDING_REQUEST, request).sendToTarget(); + final PendingFillRequest pendingRequest = new PendingFillRequest(request, this); + mHandler.obtainMessageO(MyHandler.MSG_ON_PENDING_REQUEST, pendingRequest).sendToTarget(); } - public void onSaveRequest(@NonNull AssistStructure structure, @Nullable Bundle extras) { + public void onSaveRequest(@NonNull SaveRequest request) { cancelScheduledUnbind(); - final PendingSaveRequest request = new PendingSaveRequest(structure, extras, this); - mHandler.obtainMessageO(MyHandler.MSG_ON_PENDING_REQUEST, request).sendToTarget(); + final PendingSaveRequest pendingRequest = new PendingSaveRequest(request, this); + mHandler.obtainMessageO(MyHandler.MSG_ON_PENDING_REQUEST, pendingRequest).sendToTarget(); } // Note: we are dumping without a lock held so this is a bit racy but @@ -253,10 +252,11 @@ final class RemoteFillService implements DeathRecipient { } private void dispatchOnFillRequestSuccess(PendingRequest pendingRequest, - FillResponse response) { + FillResponse response, int requestId) { mHandler.getHandler().post(() -> { if (handleResponseCallbackCommon(pendingRequest)) { - mCallbacks.onFillRequestSuccess(response, mComponentName.getPackageName()); + mCallbacks.onFillRequestSuccess(response, mComponentName.getPackageName(), + requestId); } }); } @@ -392,18 +392,13 @@ final class RemoteFillService implements DeathRecipient { private static final class PendingFillRequest extends PendingRequest { private final Object mLock = new Object(); private final WeakReference<RemoteFillService> mWeakService; - private final AssistStructure mStructure; - private final Bundle mExtras; + private final FillRequest mRequest; private final IFillCallback mCallback; private ICancellationSignal mCancellation; private boolean mCancelled; - private int mFlags; - public PendingFillRequest(AssistStructure structure, - Bundle extras, RemoteFillService service, int flags) { - mStructure = structure; - mExtras = extras; - mFlags = flags; + public PendingFillRequest(FillRequest request, RemoteFillService service) { + mRequest = request; mWeakService = new WeakReference<>(service); mCallback = new IFillCallback.Stub() { @Override @@ -425,11 +420,11 @@ final class RemoteFillService implements DeathRecipient { } @Override - public void onSuccess(FillResponse response) { + public void onSuccess(FillResponse response, int requestId) { RemoteFillService remoteService = mWeakService.get(); if (remoteService != null) { remoteService.dispatchOnFillRequestSuccess( - PendingFillRequest.this, response); + PendingFillRequest.this, response, requestId); } } @@ -449,8 +444,7 @@ final class RemoteFillService implements DeathRecipient { RemoteFillService remoteService = mWeakService.get(); if (remoteService != null) { try { - remoteService.mAutoFillService.onFillRequest(mStructure, - mExtras, mCallback, mFlags); + remoteService.mAutoFillService.onFillRequest(mRequest, mCallback); } catch (RemoteException e) { Slog.e(LOG_TAG, "Error calling on fill request", e); cancel(); @@ -481,14 +475,12 @@ final class RemoteFillService implements DeathRecipient { private static final class PendingSaveRequest extends PendingRequest { private final WeakReference<RemoteFillService> mWeakService; - private final AssistStructure mStructure; - private final Bundle mExtras; + private final SaveRequest mRequest; private final ISaveCallback mCallback; - public PendingSaveRequest(@NonNull AssistStructure structure, @Nullable Bundle extras, + public PendingSaveRequest(@NonNull SaveRequest request, @NonNull RemoteFillService service) { - mStructure = structure; - mExtras = extras; + mRequest = request; mWeakService = new WeakReference<>(service); mCallback = new ISaveCallback.Stub() { @Override @@ -516,7 +508,7 @@ final class RemoteFillService implements DeathRecipient { final RemoteFillService service = mWeakService.get(); if (service != null) { try { - service.mAutoFillService.onSaveRequest(mStructure, mExtras, mCallback); + service.mAutoFillService.onSaveRequest(mRequest, mCallback); } catch (RemoteException e) { Slog.e(LOG_TAG, "Error calling on save request", e); } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 67b52825f3b6..5feb81db4a0b 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -44,11 +44,15 @@ import android.os.Parcelable; import android.os.RemoteException; import android.service.autofill.AutofillService; import android.service.autofill.Dataset; +import android.service.autofill.FillContext; +import android.service.autofill.FillRequest; import android.service.autofill.FillResponse; import android.service.autofill.SaveInfo; +import android.service.autofill.SaveRequest; import android.util.ArrayMap; import android.util.DebugUtils; import android.util.Slog; +import android.util.SparseArray; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; @@ -125,7 +129,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState RemoteFillService mRemoteFillService; @GuardedBy("mLock") - private ArrayList<FillResponse> mResponses; + private SparseArray<FillResponse> mResponses; /** * Response that requires a service authentitcation request. @@ -156,7 +160,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * and used on subsequent {@code onFillRequest()} and {@code onSaveRequest()} calls. */ @GuardedBy("mLock") - private Bundle mExtras; + private Bundle mClientState; /** * Flags used to start the session. @@ -222,7 +226,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // FillServiceCallbacks @Override public void onFillRequestSuccess(@Nullable FillResponse response, - @NonNull String servicePackageName) { + @NonNull String servicePackageName, int requestId) { if (response == null) { if ((mFlags & FLAG_MANUAL_REQUEST) != 0) { getUiForShowing().showError(R.string.autofill_error_cannot_autofill); @@ -243,7 +247,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // TODO(b/33197203 , b/35707731): make sure it's ignored if there is one already mResponseWaitingAuth = response; } - processResponseLocked(response); + processResponseLocked(response, requestId); } final LogMaker log = (new LogMaker(MetricsEvent.AUTOFILL_REQUEST)) @@ -343,9 +347,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (id.equals(mCurrentViewId)) { try { final ViewState view = mViewStates.get(id); - mClient.requestShowFillUi(mWindowToken, id, width, height, - view.getVirtualBounds(), - presenter); + mClient.requestShowFillUi(this.id, mWindowToken, id, width, height, + view.getVirtualBounds(), presenter); } catch (RemoteException e) { Slog.e(TAG, "Error requesting to show fill UI", e); } @@ -363,7 +366,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState public void requestHideFillUi(AutofillId id) { synchronized (mLock) { try { - mClient.requestHideFillUi(mWindowToken, id); + mClient.requestHideFillUi(this.id, mWindowToken, id); } catch (RemoteException e) { Slog.e(TAG, "Error requesting to hide fill UI", e); } @@ -395,12 +398,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState AutofillManager.EXTRA_AUTHENTICATION_RESULT); if (result instanceof FillResponse) { mMetricsLogger.action(MetricsEvent.AUTOFILL_AUTHENTICATED, mPackageName); + final int requestIndex = mResponses.indexOfValue(mResponseWaitingAuth); mResponseWaitingAuth = null; - processResponseLocked((FillResponse) result); + if (requestIndex >= 0) { + final int requestId = mResponses.keyAt(requestIndex); + processResponseLocked((FillResponse) result, requestId); + } else { + Slog.e(TAG, "Error cannot find id for auth response"); + } } else if (result instanceof Dataset) { final Dataset dataset = (Dataset) result; for (int i = 0; i < mResponses.size(); i++) { - final FillResponse response = mResponses.get(i); + final FillResponse response = mResponses.valueAt(i); final int index = response.getDatasets().indexOf(mDatasetWaitingAuth); if (index >= 0) { response.getDatasets().set(index, dataset); @@ -441,12 +450,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return true; } - final FillResponse response = mResponses.get(mResponses.size() - 1); + final int lastResponseIdx = getLastResponseIndex(); + if (lastResponseIdx < 0) { + Slog.d(TAG, "showSaveLocked(): mResponses=" + mResponses + + ", mViewStates=" + mViewStates); + return true; + } + final FillResponse response = mResponses.valueAt(lastResponseIdx); final SaveInfo saveInfo = response.getSaveInfo(); if (DEBUG) { - Slog.d(TAG, - "showSaveLocked(): mResponses=" + mResponses + ", mViewStates=" + mViewStates); + Slog.d(TAG, "showSaveLocked(): mResponses=" + mResponses + + ", mViewStates=" + mViewStates); } /* @@ -573,7 +588,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mStructure.dump(); } - mRemoteFillService.onSaveRequest(mStructure, mExtras); + // TODO(b/33197203): Implement partitioning properly + final int lastResponseIdx = getLastResponseIndex(); + final int requestId = mResponses.keyAt(lastResponseIdx); + final FillContext fillContext = new FillContext(requestId, mStructure); + final ArrayList fillContexts = new ArrayList(1); + fillContexts.add(fillContext); + + final SaveRequest saveRequest = new SaveRequest(fillContexts, mClientState); + mRemoteFillService.onSaveRequest(saveRequest); } void updateLocked(AutofillId id, Rect virtualBounds, AutofillValue value, int flags) { @@ -586,7 +609,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } viewState = new ViewState(this, id, value, this, ViewState.STATE_INITIAL); mViewStates.put(id, viewState); - } else if ((flags & FLAG_VIEW_ENTERED) != 0) { + } else if (mStructure != null && (flags & FLAG_VIEW_ENTERED) != 0) { viewState = startPartitionLocked(id, value); } else { if (VERBOSE) Slog.v(TAG, "Ignored " + getFlagAsString(flags) + " for " + id); @@ -687,7 +710,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState overlay.focused = id.equals(viewState.id); node.setAutofillOverlay(overlay); } - mRemoteFillService.onFillRequest(mStructure, mExtras, 0); + + FillRequest request = new FillRequest(mStructure, mClientState, 0); + mRemoteFillService.onFillRequest(request); return newViewState; } @@ -716,7 +741,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } if (!mHasCallback) return; try { - mClient.notifyNoFillUi(mWindowToken, mCurrentViewId); + mClient.notifyNoFillUi(id, mWindowToken, mCurrentViewId); } catch (RemoteException e) { Slog.e(TAG, "Error notifying client no fill UI: windowToken=" + mWindowToken + " id=" + mCurrentViewId, e); @@ -724,17 +749,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } - private void processResponseLocked(FillResponse response) { + private void processResponseLocked(FillResponse response, int requestId) { if (DEBUG) { Slog.d(TAG, "processResponseLocked(mCurrentViewId=" + mCurrentViewId + "):" + response); } if (mResponses == null) { - mResponses = new ArrayList<>(4); + mResponses = new SparseArray<>(4); } - mResponses.add(response); + mResponses.put(requestId, response); if (response != null) { - mExtras = response.getExtras(); + mClientState = response.getClientState(); } setViewStatesLocked(response, ViewState.STATE_FILLABLE); @@ -852,7 +877,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState private void startAuthentication(IntentSender intent, Intent fillInIntent) { try { synchronized (mLock) { - mClient.authenticate(intent, fillInIntent); + mClient.authenticate(id, intent, fillInIntent); } } catch (RemoteException e) { Slog.e(TAG, "Error launching auth intent", e); @@ -885,7 +910,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } pw.print(prefix); pw.print("mHasCallback: "); pw.println(mHasCallback); - pw.print(prefix); pw.print("mExtras: "); pw.println(Helper.bundleToString(mExtras)); + pw.print(prefix); pw.print("mClientState: "); pw.println( + Helper.bundleToString(mClientState)); mRemoteFillService.dump(prefix, pw); } @@ -895,7 +921,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (DEBUG) { Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset); } - mClient.autofill(mWindowToken, dataset.getFieldIds(), dataset.getFieldValues()); + mClient.autofill(id, mWindowToken, dataset.getFieldIds(), dataset.getFieldValues()); setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED); } catch (RemoteException e) { Slog.w(TAG, "Error autofilling activity: " + e); @@ -962,4 +988,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState destroyLocked(); mService.removeSessionLocked(id); } + + private int getLastResponseIndex() { + // The response ids are monotonically increasing so + // we just find the largest id which is the last. We + // do not rely on the internal ordering in sparse + // array to avoid - wow this stopped working!? + int lastResponseIdx = -1; + int lastResponseId = -1; + final int responseCount = mResponses.size(); + for (int i = 0; i < responseCount; i++) { + if (mResponses.keyAt(i) > lastResponseId) { + lastResponseIdx = i; + } + } + return lastResponseIdx; + } } diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java index 4449da92b19c..ab6a3a7cd78b 100644 --- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java +++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java @@ -161,7 +161,8 @@ public final class AutoFillUI { log.setType(MetricsProto.MetricsEvent.TYPE_DETAIL); hideFillUiUiThread(); if (mCallback != null) { - mCallback.authenticate(response.getAuthentication(), response.getExtras()); + mCallback.authenticate(response.getAuthentication(), + response.getClientState()); } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 50c0a124fb8a..45b03849f228 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -55,6 +55,7 @@ import android.net.LinkProperties.CompareResult; import android.net.Network; import android.net.NetworkAgent; import android.net.NetworkCapabilities; +import android.net.MatchAllNetworkSpecifier; import android.net.NetworkConfig; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; @@ -4044,11 +4045,8 @@ public class ConnectivityService extends IConnectivityManager.Stub throw new IllegalArgumentException("Bad timeout specified"); } - if (NetworkCapabilities.MATCH_ALL_REQUESTS_NETWORK_SPECIFIER - .equals(networkCapabilities.getNetworkSpecifier())) { - throw new IllegalArgumentException("Invalid network specifier - must not be '" - + NetworkCapabilities.MATCH_ALL_REQUESTS_NETWORK_SPECIFIER + "'"); - } + MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier( + networkCapabilities.getNetworkSpecifier()); NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType, nextNetworkRequestId(), type); @@ -4117,6 +4115,9 @@ public class ConnectivityService extends IConnectivityManager.Stub enforceMeteredApnPolicy(networkCapabilities); ensureRequestableCapabilities(networkCapabilities); + MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier( + networkCapabilities.getNetworkSpecifier()); + NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE, nextNetworkRequestId(), NetworkRequest.Type.REQUEST); NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation); @@ -4178,6 +4179,9 @@ public class ConnectivityService extends IConnectivityManager.Stub nc.addCapability(NET_CAPABILITY_FOREGROUND); } + MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier( + networkCapabilities.getNetworkSpecifier()); + NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(), NetworkRequest.Type.LISTEN); NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder); @@ -4195,6 +4199,9 @@ public class ConnectivityService extends IConnectivityManager.Stub enforceAccessPermission(); } + MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier( + networkCapabilities.getNetworkSpecifier()); + NetworkRequest networkRequest = new NetworkRequest( new NetworkCapabilities(networkCapabilities), TYPE_NONE, nextNetworkRequestId(), NetworkRequest.Type.LISTEN); diff --git a/services/core/java/com/android/server/OemLockService.java b/services/core/java/com/android/server/OemLockService.java new file mode 100644 index 000000000000..03f82a8e5d8e --- /dev/null +++ b/services/core/java/com/android/server/OemLockService.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2017 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 com.android.server; + +import android.Manifest; +import android.annotation.Nullable; +import android.app.ActivityManager; +import android.content.Context; +import android.os.Binder; +import android.os.IBinder; +import android.os.UserHandle; +import android.os.UserManager; +import android.service.oemlock.IOemLockService; +import android.service.persistentdata.PersistentDataBlockManager; + +/** + * Service for managing the OEM lock state of the device. + * + * The current implementation is a wrapper around the previous implementation of OEM lock. + * - the DISALLOW_OEM_UNLOCK user restriction was set if the carrier disallowed unlock + * - the user allows unlock in settings which calls PDBM.setOemUnlockEnabled() + */ +public class OemLockService extends SystemService { + private Context mContext; + + public OemLockService(Context context) { + super(context); + mContext = context; + } + + @Override + public void onStart() { + publishBinderService(Context.OEM_LOCK_SERVICE, mService); + } + + private boolean doIsOemUnlockAllowedByCarrier() { + return !UserManager.get(mContext).hasUserRestriction(UserManager.DISALLOW_OEM_UNLOCK); + } + + private boolean doIsOemUnlockAllowedByUser() { + final PersistentDataBlockManager pdbm = (PersistentDataBlockManager) + mContext.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); + + final long token = Binder.clearCallingIdentity(); + try { + return pdbm.getOemUnlockEnabled(); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + /** + * Implements the binder interface for the service. + */ + private final IBinder mService = new IOemLockService.Stub() { + @Override + public void setOemUnlockAllowedByCarrier(boolean allowed, @Nullable byte[] signature) { + enforceManageCarrierOemUnlockPermission(); + enforceUserIsAdmin(); + + // Note: this implementation does not require a signature + + // Continue using user restriction for backwards compatibility + final UserHandle userHandle = UserHandle.of(UserHandle.getCallingUserId()); + final long token = Binder.clearCallingIdentity(); + try { + UserManager.get(mContext) + .setUserRestriction(UserManager.DISALLOW_OEM_UNLOCK, !allowed, userHandle); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public boolean isOemUnlockAllowedByCarrier() { + enforceManageCarrierOemUnlockPermission(); + return doIsOemUnlockAllowedByCarrier(); + } + + @Override + public void setOemUnlockAllowedByUser(boolean allowedByUser) { + if (ActivityManager.isUserAMonkey()) { + // Prevent a monkey from changing this + return; + } + + enforceManageUserOemUnlockPermission(); + enforceUserIsAdmin(); + + final PersistentDataBlockManager pdbm = (PersistentDataBlockManager) + mContext.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); + + final long token = Binder.clearCallingIdentity(); + try { + // The method name is misleading as it really just means whether or not the device + // can be unlocked but doesn't actually do any unlocking. + pdbm.setOemUnlockEnabled(allowedByUser); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public boolean isOemUnlockAllowedByUser() { + enforceManageUserOemUnlockPermission(); + return doIsOemUnlockAllowedByUser(); + } + }; + + private void enforceManageCarrierOemUnlockPermission() { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE, + "Can't manage OEM unlock allowed by carrier"); + } + + private void enforceManageUserOemUnlockPermission() { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.MANAGE_USER_OEM_UNLOCK_STATE, + "Can't manage OEM unlock allowed by user"); + } + + private void enforceUserIsAdmin() { + final int userId = UserHandle.getCallingUserId(); + final long token = Binder.clearCallingIdentity(); + try { + if (!UserManager.get(mContext).isUserAdmin(userId)) { + throw new SecurityException("Must be an admin user"); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } +} diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e5212b709c1e..6b0a73b25e71 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -10534,8 +10534,10 @@ public class ActivityManagerService extends IActivityManager.Stub if (stackId == PINNED_STACK_ID) { final PinnedActivityStack pinnedStack = mStackSupervisor.getStack(PINNED_STACK_ID); - pinnedStack.animateResizePinnedStack(null /* sourceBounds */, destBounds, - animationDuration); + if (pinnedStack != null) { + pinnedStack.animateResizePinnedStack(null /* sourceBounds */, + destBounds, animationDuration); + } } else { throw new IllegalArgumentException("Stack: " + stackId + " doesn't support animated resize."); @@ -23883,6 +23885,15 @@ public class ActivityManagerService extends IActivityManager.Stub } } + @Override + public long getActivityStartInitiatedTime(IBinder token) { + final ActivityRecord r = ActivityRecord.forTokenLocked(token); + if (r != null) { + return r.mStartInitiatedTimeMs; + } + return 0; + } + void updateApplicationInfoLocked(@NonNull List<String> packagesToUpdate, int userId) { final PackageManagerInternal packageManager = getPackageManagerInternalLocked(); final boolean updateFrameworkRes = packagesToUpdate.contains("android"); diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 276b267edb5b..17c7dde11726 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -341,6 +341,12 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo private final Rect mBounds = new Rect(); /** + * Denotes the timestamp at which this activity start was last initiated in the + * {@link SystemClock#uptimeMillis()} time base. + */ + long mStartInitiatedTimeMs; + + /** * Temp configs used in {@link #ensureActivityConfigurationLocked(int, boolean)} */ private final Configuration mTmpConfig1 = new Configuration(); @@ -498,6 +504,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo pw.print(" forceNewConfig="); pw.println(forceNewConfig); pw.print(prefix); pw.print("mActivityType="); pw.println(activityTypeToString(mActivityType)); + pw.print(prefix); pw.print("mStartInitiatedTimeMs="); + TimeUtils.formatDuration(mStartInitiatedTimeMs, now, pw); if (requestedVrComponent != null) { pw.print(prefix); pw.print("requestedVrComponent="); diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 56594d3fdf48..8f1c20330e53 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -244,6 +244,7 @@ class ActivityStarter { ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container, TaskRecord inTask) { + final long activityStartTime = SystemClock.uptimeMillis(); int err = ActivityManager.START_SUCCESS; ProcessRecord callerApp = null; @@ -478,6 +479,7 @@ class ActivityStarter { callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(), resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null, mSupervisor, container, options, sourceRecord); + r.mStartInitiatedTimeMs = activityStartTime; if (outActivity != null) { outActivity[0] = r; } @@ -1029,6 +1031,7 @@ class ActivityStarter { // so make sure the task now has the identity of the new intent. top.getTask().setIntent(mStartActivity); } + top.mStartInitiatedTimeMs = mStartActivity.mStartInitiatedTimeMs; ActivityStack.logStartActivity(AM_NEW_INTENT, mStartActivity, top.getTask()); top.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); @@ -1052,6 +1055,7 @@ class ActivityStarter { setTaskFromIntentActivity(reusedActivity); if (!mAddingToTask && mReuseTask == null) { + reusedActivity.mStartInitiatedTimeMs = mStartActivity.mStartInitiatedTimeMs; // We didn't do anything... but it was needed (a.k.a., client don't use that // intent!) And for paranoia, make sure we have correctly resumed the top activity. resumeTargetStackIfNeeded(); @@ -1084,6 +1088,7 @@ class ActivityStarter { || mLaunchSingleTop || mLaunchSingleTask); if (dontStart) { ActivityStack.logStartActivity(AM_NEW_INTENT, top, top.getTask()); + top.mStartInitiatedTimeMs = mStartActivity.mStartInitiatedTimeMs; // For paranoia, make sure we have correctly resumed the top activity. topStack.mLastPausedActivity = null; if (mDoResume) { @@ -1664,6 +1669,7 @@ class ActivityStarter { // desires. if (((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0 || mLaunchSingleTop) && intentActivity.realActivity.equals(mStartActivity.realActivity)) { + intentActivity.mStartInitiatedTimeMs = mStartActivity.mStartInitiatedTimeMs; ActivityStack.logStartActivity(AM_NEW_INTENT, mStartActivity, intentActivity.getTask()); if (intentActivity.frontOfTask) { diff --git a/services/core/java/com/android/server/am/AppErrorDialog.java b/services/core/java/com/android/server/am/AppErrorDialog.java index 646f6ce0653a..02ec07561f4f 100644 --- a/services/core/java/com/android/server/am/AppErrorDialog.java +++ b/services/core/java/com/android/server/am/AppErrorDialog.java @@ -106,7 +106,7 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final FrameLayout frame = (FrameLayout) findViewById(android.R.id.custom); + final FrameLayout frame = findViewById(android.R.id.custom); final Context context = getContext(); LayoutInflater.from(context).inflate( com.android.internal.R.layout.app_error_dialog, frame, true); @@ -114,19 +114,19 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen boolean hasRestart = !mRepeating && mIsRestartable; final boolean hasReceiver = mProc.errorReportReceiver != null; - final TextView restart = (TextView) findViewById(com.android.internal.R.id.aerr_restart); + final TextView restart = findViewById(com.android.internal.R.id.aerr_restart); restart.setOnClickListener(this); restart.setVisibility(hasRestart ? View.VISIBLE : View.GONE); - final TextView report = (TextView) findViewById(com.android.internal.R.id.aerr_report); + final TextView report = findViewById(com.android.internal.R.id.aerr_report); report.setOnClickListener(this); report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE); - final TextView close = (TextView) findViewById(com.android.internal.R.id.aerr_close); + final TextView close = findViewById(com.android.internal.R.id.aerr_close); close.setVisibility(!hasRestart ? View.VISIBLE : View.GONE); close.setOnClickListener(this); boolean showMute = !IS_USER_BUILD && Settings.Global.getInt(context.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; - final TextView mute = (TextView) findViewById(com.android.internal.R.id.aerr_mute); + final TextView mute = findViewById(com.android.internal.R.id.aerr_mute); mute.setOnClickListener(this); mute.setVisibility(showMute ? View.VISIBLE : View.GONE); diff --git a/services/core/java/com/android/server/am/AppNotRespondingDialog.java b/services/core/java/com/android/server/am/AppNotRespondingDialog.java index 9e297255c2f9..a3a67784fadc 100644 --- a/services/core/java/com/android/server/am/AppNotRespondingDialog.java +++ b/services/core/java/com/android/server/am/AppNotRespondingDialog.java @@ -104,18 +104,18 @@ final class AppNotRespondingDialog extends BaseErrorDialog implements View.OnCli @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final FrameLayout frame = (FrameLayout) findViewById(android.R.id.custom); + final FrameLayout frame = findViewById(android.R.id.custom); final Context context = getContext(); LayoutInflater.from(context).inflate( com.android.internal.R.layout.app_anr_dialog, frame, true); - final TextView report = (TextView) findViewById(com.android.internal.R.id.aerr_report); + final TextView report = findViewById(com.android.internal.R.id.aerr_report); report.setOnClickListener(this); final boolean hasReceiver = mProc.errorReportReceiver != null; report.setVisibility(hasReceiver ? View.VISIBLE : View.GONE); - final TextView close = (TextView) findViewById(com.android.internal.R.id.aerr_close); + final TextView close = findViewById(com.android.internal.R.id.aerr_close); close.setOnClickListener(this); - final TextView wait = (TextView) findViewById(com.android.internal.R.id.aerr_wait); + final TextView wait = findViewById(com.android.internal.R.id.aerr_wait); wait.setOnClickListener(this); findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE); diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index c7f20b9ff904..f8a4d4b21414 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -658,7 +658,8 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta // Must reparent first in window manager to avoid a situation where AM can delete the // we are coming from in WM before we reparent because it became empty. - mWindowContainerController.reparent(toStack.getWindowContainerController(), position); + mWindowContainerController.reparent(toStack.getWindowContainerController(), position, + moveStackMode == REPARENT_MOVE_STACK_TO_FRONT); // Move the task sourceStack.removeTask(this, reason, REMOVE_TASK_MODE_MOVING); diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index c4ad45576b08..d3c74e6d755a 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -70,6 +70,7 @@ import java.net.InetAddress; import java.net.MalformedURLException; import java.net.URL; import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.CountDownLatch; @@ -90,6 +91,8 @@ public class NetworkMonitor extends StateMachine { private static final String DEFAULT_HTTP_URL = "http://connectivitycheck.gstatic.com/generate_204"; private static final String DEFAULT_FALLBACK_URL = "http://www.google.com/gen_204"; + private static final String DEFAULT_OTHER_FALLBACK_URLS = + "http://play.googleapis.com/generate_204"; private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/52.0.2743.82 Safari/537.36"; @@ -263,7 +266,8 @@ public class NetworkMonitor extends StateMachine { private final String mCaptivePortalUserAgent; private final URL mCaptivePortalHttpsUrl; private final URL mCaptivePortalHttpUrl; - private final URL mCaptivePortalFallbackUrl; + private final URL[] mCaptivePortalFallbackUrls; + private int mNextFallbackUrlIndex = 0; public NetworkMonitor(Context context, Handler handler, NetworkAgentInfo networkAgentInfo, NetworkRequest defaultRequest) { @@ -302,7 +306,7 @@ public class NetworkMonitor extends StateMachine { mCaptivePortalUserAgent = getCaptivePortalUserAgent(context); mCaptivePortalHttpsUrl = makeURL(getCaptivePortalServerHttpsUrl(context)); mCaptivePortalHttpUrl = makeURL(getCaptivePortalServerHttpUrl(context)); - mCaptivePortalFallbackUrl = makeURL(getCaptivePortalFallbackUrl(context)); + mCaptivePortalFallbackUrls = makeCaptivePortalFallbackUrls(context); start(); } @@ -450,7 +454,7 @@ public class NetworkMonitor extends StateMachine { intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_URL, mLastPortalProbeResult.detectUrl); intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT, - getCaptivePortalUserAgent(mContext)); + mCaptivePortalUserAgent); intent.setFlags( Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivityAsUser(intent, UserHandle.CURRENT); @@ -666,9 +670,24 @@ public class NetworkMonitor extends StateMachine { return getSetting(context, Settings.Global.CAPTIVE_PORTAL_HTTP_URL, DEFAULT_HTTP_URL); } - private static String getCaptivePortalFallbackUrl(Context context) { - return getSetting(context, + private URL[] makeCaptivePortalFallbackUrls(Context context) { + String separator = ","; + String firstUrl = getSetting(context, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL, DEFAULT_FALLBACK_URL); + String joinedUrls = firstUrl + separator + getSetting(context, + Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS, DEFAULT_OTHER_FALLBACK_URLS); + List<URL> urls = new ArrayList<>(); + for (String s : joinedUrls.split(separator)) { + URL u = makeURL(s); + if (u == null) { + continue; + } + urls.add(u); + } + if (urls.isEmpty()) { + Log.e(TAG, String.format("could not create any url from %s", joinedUrls)); + } + return urls.toArray(new URL[urls.size()]); } private static String getCaptivePortalUserAgent(Context context) { @@ -680,6 +699,15 @@ public class NetworkMonitor extends StateMachine { return value != null ? value : defaultValue; } + private URL nextFallbackUrl() { + if (mCaptivePortalFallbackUrls.length == 0) { + return null; + } + int idx = Math.abs(mNextFallbackUrlIndex) % mCaptivePortalFallbackUrls.length; + mNextFallbackUrlIndex += new Random().nextInt(); // randomely change url without memory. + return mCaptivePortalFallbackUrls[idx]; + } + @VisibleForTesting protected CaptivePortalProbeResult isCaptivePortal() { if (!mIsCaptivePortalCheckEnabled) { @@ -690,7 +718,6 @@ public class NetworkMonitor extends StateMachine { URL pacUrl = null; URL httpsUrl = mCaptivePortalHttpsUrl; URL httpUrl = mCaptivePortalHttpUrl; - URL fallbackUrl = mCaptivePortalFallbackUrl; // On networks with a PAC instead of fetching a URL that should result in a 204 // response, we instead simply fetch the PAC script. This is done for a few reasons: @@ -727,7 +754,7 @@ public class NetworkMonitor extends StateMachine { if (pacUrl != null) { result = sendDnsAndHttpProbes(null, pacUrl, ValidationProbeEvent.PROBE_PAC); } else if (mUseHttps) { - result = sendParallelHttpProbes(proxyInfo, httpsUrl, httpUrl, fallbackUrl); + result = sendParallelHttpProbes(proxyInfo, httpsUrl, httpUrl); } else { result = sendDnsAndHttpProbes(proxyInfo, httpUrl, ValidationProbeEvent.PROBE_HTTP); } @@ -863,7 +890,7 @@ public class NetworkMonitor extends StateMachine { } private CaptivePortalProbeResult sendParallelHttpProbes( - ProxyInfo proxy, URL httpsUrl, URL httpUrl, URL fallbackUrl) { + ProxyInfo proxy, URL httpsUrl, URL httpUrl) { // Number of probes to wait for. If a probe completes with a conclusive answer // it shortcuts the latch immediately by forcing the count to 0. final CountDownLatch latch = new CountDownLatch(2); @@ -922,7 +949,8 @@ public class NetworkMonitor extends StateMachine { if (httpsResult.isPortal() || httpsResult.isSuccessful()) { return httpsResult; } - // If a fallback url is specified, use a fallback probe to try again portal detection. + // If a fallback url exists, use a fallback probe to try again portal detection. + URL fallbackUrl = nextFallbackUrl(); if (fallbackUrl != null) { CaptivePortalProbeResult result = sendHttpProbe(fallbackUrl, ValidationProbeEvent.PROBE_FALLBACK); diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java index 552f0d1f8b17..fe498135feba 100644 --- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java +++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java @@ -36,6 +36,7 @@ public abstract class AuthenticationClient extends ClientMonitor { public abstract boolean handleFailedAttempt(); public abstract void resetFailedAttempts(); + private boolean mAlreadyCancelled; public AuthenticationClient(Context context, long halDeviceId, IBinder token, IFingerprintServiceReceiver receiver, int targetUserId, int groupId, long opId, @@ -129,6 +130,10 @@ public abstract class AuthenticationClient extends ClientMonitor { @Override public int stop(boolean initiatedByClient) { + if (mAlreadyCancelled) { + Slog.w(TAG, "stopAuthentication: already cancelled!"); + return 0; + } IBiometricsFingerprint daemon = getFingerprintDaemon(); if (daemon == null) { Slog.w(TAG, "stopAuthentication: no fingerprint HAL!"); @@ -145,6 +150,7 @@ public abstract class AuthenticationClient extends ClientMonitor { Slog.e(TAG, "stopAuthentication failed", e); return ERROR_ESRCH; } + mAlreadyCancelled = true; return 0; // success } diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index a0d0d777637f..d01de3c9157d 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -1271,8 +1271,7 @@ public final class JobSchedulerService extends com.android.server.SystemService if (job.hasIdleConstraint()) { idleCount++; } - if (job.hasConnectivityConstraint() || job.hasUnmeteredConstraint() - || job.hasNotRoamingConstraint()) { + if (job.hasConnectivityConstraint()) { connectivityCount++; } if (job.hasChargingConstraint()) { diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java index fcc082790892..2e6cd3febd2d 100644 --- a/services/core/java/com/android/server/job/JobStore.java +++ b/services/core/java/com/android/server/job/JobStore.java @@ -368,13 +368,16 @@ public class JobStore { */ private void writeConstraintsToXml(XmlSerializer out, JobStatus jobStatus) throws IOException { out.startTag(null, XML_TAG_PARAMS_CONSTRAINTS); - if (jobStatus.hasConnectivityConstraint()) { + if (jobStatus.needsAnyConnectivity()) { out.attribute(null, "connectivity", Boolean.toString(true)); } - if (jobStatus.hasUnmeteredConstraint()) { + if (jobStatus.needsMeteredConnectivity()) { + out.attribute(null, "metered", Boolean.toString(true)); + } + if (jobStatus.needsUnmeteredConnectivity()) { out.attribute(null, "unmetered", Boolean.toString(true)); } - if (jobStatus.hasNotRoamingConstraint()) { + if (jobStatus.needsNonRoamingConnectivity()) { out.attribute(null, "not-roaming", Boolean.toString(true)); } if (jobStatus.hasIdleConstraint()) { @@ -713,6 +716,10 @@ public class JobStore { if (val != null) { jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); } + val = parser.getAttributeValue(null, "metered"); + if (val != null) { + jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_METERED); + } val = parser.getAttributeValue(null, "unmetered"); if (val != null) { jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java index b458d8b72ade..5ebcc93cda09 100644 --- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java +++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java @@ -84,8 +84,7 @@ public class ConnectivityController extends StateController implements @Override public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) { - if (jobStatus.hasConnectivityConstraint() || jobStatus.hasUnmeteredConstraint() - || jobStatus.hasNotRoamingConstraint()) { + if (jobStatus.hasConnectivityConstraint()) { updateConstraintsSatisfied(jobStatus, null); mTrackedJobs.add(jobStatus); } @@ -94,8 +93,7 @@ public class ConnectivityController extends StateController implements @Override public void maybeStopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob, boolean forUpdate) { - if (jobStatus.hasConnectivityConstraint() || jobStatus.hasUnmeteredConstraint() - || jobStatus.hasNotRoamingConstraint()) { + if (jobStatus.hasConnectivityConstraint()) { mTrackedJobs.remove(jobStatus); } } @@ -114,11 +112,13 @@ public class ConnectivityController extends StateController implements && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); final boolean connected = info != null && info.isConnected(); final boolean connectionUsable = connected && validated; + final boolean metered = connected && info.isMetered(); final boolean unmetered = connected && !info.isMetered(); final boolean notRoaming = connected && !info.isRoaming(); boolean changed = false; changed |= jobStatus.setConnectivityConstraintSatisfied(connectionUsable); + changed |= jobStatus.setMeteredConstraintSatisfied(metered); changed |= jobStatus.setUnmeteredConstraintSatisfied(unmetered); changed |= jobStatus.setNotRoamingConstraintSatisfied(notRoaming); @@ -134,6 +134,7 @@ public class ConnectivityController extends StateController implements + " for " + jobStatus + ": usable=" + connectionUsable + " connected=" + connected + " validated=" + validated + + " metered=" + metered + " unmetered=" + unmetered + " notRoaming=" + notRoaming); } @@ -244,9 +245,10 @@ public class ConnectivityController extends StateController implements js.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, js.getSourceUid()); - pw.print(": C="); pw.print(js.hasConnectivityConstraint()); - pw.print(": UM="); pw.print(js.hasUnmeteredConstraint()); - pw.print(": NR="); pw.println(js.hasNotRoamingConstraint()); + pw.print(": C="); pw.print(js.needsAnyConnectivity()); + pw.print(": M="); pw.print(js.needsMeteredConnectivity()); + pw.print(": UM="); pw.print(js.needsUnmeteredConnectivity()); + pw.print(": NR="); pw.println(js.needsNonRoamingConnectivity()); } } } diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java index 4cdce5f52f8f..e8cc078b7eb1 100644 --- a/services/core/java/com/android/server/job/controllers/JobStatus.java +++ b/services/core/java/com/android/server/job/controllers/JobStatus.java @@ -68,6 +68,11 @@ public final class JobStatus { static final int CONSTRAINT_CONTENT_TRIGGER = 1<<26; static final int CONSTRAINT_DEVICE_NOT_DOZING = 1<<25; static final int CONSTRAINT_NOT_ROAMING = 1<<24; + static final int CONSTRAINT_METERED = 1<<23; + + static final int CONNECTIVITY_MASK = + CONSTRAINT_UNMETERED | CONSTRAINT_CONNECTIVITY | + CONSTRAINT_NOT_ROAMING | CONSTRAINT_METERED; // Soft override: ignore constraints like time that don't affect API availability public static final int OVERRIDE_SOFT = 1; @@ -191,15 +196,28 @@ public final class JobStatus { this.numFailures = numFailures; int requiredConstraints = job.getConstraintFlags(); - if (job.getNetworkType() == JobInfo.NETWORK_TYPE_ANY) { - requiredConstraints |= CONSTRAINT_CONNECTIVITY; - } - if (job.getNetworkType() == JobInfo.NETWORK_TYPE_UNMETERED) { - requiredConstraints |= CONSTRAINT_UNMETERED; - } - if (job.getNetworkType() == JobInfo.NETWORK_TYPE_NOT_ROAMING) { - requiredConstraints |= CONSTRAINT_NOT_ROAMING; + + switch (job.getNetworkType()) { + case JobInfo.NETWORK_TYPE_NONE: + // No constraint. + break; + case JobInfo.NETWORK_TYPE_ANY: + requiredConstraints |= CONSTRAINT_CONNECTIVITY; + break; + case JobInfo.NETWORK_TYPE_UNMETERED: + requiredConstraints |= CONSTRAINT_UNMETERED; + break; + case JobInfo.NETWORK_TYPE_NOT_ROAMING: + requiredConstraints |= CONSTRAINT_NOT_ROAMING; + break; + case JobInfo.NETWORK_TYPE_METERED: + requiredConstraints |= CONSTRAINT_METERED; + break; + default: + Slog.w(TAG, "Unrecognized networking constraint " + job.getNetworkType()); + break; } + if (earliestRunTimeElapsedMillis != NO_EARLIEST_RUNTIME) { requiredConstraints |= CONSTRAINT_TIMING_DELAY; } @@ -467,15 +485,24 @@ public final class JobStatus { return job.getFlags(); } + /** Does this job have any sort of networking constraint? */ public boolean hasConnectivityConstraint() { + return (requiredConstraints&CONNECTIVITY_MASK) != 0; + } + + public boolean needsAnyConnectivity() { return (requiredConstraints&CONSTRAINT_CONNECTIVITY) != 0; } - public boolean hasUnmeteredConstraint() { + public boolean needsUnmeteredConnectivity() { return (requiredConstraints&CONSTRAINT_UNMETERED) != 0; } - public boolean hasNotRoamingConstraint() { + public boolean needsMeteredConnectivity() { + return (requiredConstraints&CONSTRAINT_METERED) != 0; + } + + public boolean needsNonRoamingConnectivity() { return (requiredConstraints&CONSTRAINT_NOT_ROAMING) != 0; } @@ -571,6 +598,10 @@ public final class JobStatus { return setConstraintSatisfied(CONSTRAINT_UNMETERED, state); } + boolean setMeteredConstraintSatisfied(boolean state) { + return setConstraintSatisfied(CONSTRAINT_METERED, state); + } + boolean setNotRoamingConstraintSatisfied(boolean state) { return setConstraintSatisfied(CONSTRAINT_NOT_ROAMING, state); } diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java index 2fab2887c28e..c28fb67d6c2d 100644 --- a/services/core/java/com/android/server/notification/ConditionProviders.java +++ b/services/core/java/com/android/server/notification/ConditionProviders.java @@ -251,7 +251,7 @@ public class ConditionProviders extends ManagedServices { public IConditionProvider findConditionProvider(ComponentName component) { if (component == null) return null; - for (ManagedServiceInfo service : mServices) { + for (ManagedServiceInfo service : getServices()) { if (component.equals(service.component)) { return provider(service); } diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index 000cf2e908c8..90e9b927a4c7 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -90,7 +90,7 @@ abstract public class ManagedServices { // contains connections to all connected services, including app services // and system services - protected final ArrayList<ManagedServiceInfo> mServices = new ArrayList<ManagedServiceInfo>(); + private final ArrayList<ManagedServiceInfo> mServices = new ArrayList<ManagedServiceInfo>(); // things that will be put into mServices as soon as they're ready private final ArrayList<String> mServicesBinding = new ArrayList<String>(); // lists the component names of all enabled (and therefore potentially connected) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index f9dff3ef9434..f334ba41bdf1 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -4783,7 +4783,7 @@ public class NotificationManagerService extends SystemService { // There should be only one, but it's a list, so while we enforce // singularity elsewhere, we keep it general here, to avoid surprises. - for (final ManagedServiceInfo info : NotificationAssistants.this.mServices) { + for (final ManagedServiceInfo info : NotificationAssistants.this.getServices()) { boolean sbnVisible = isVisibleToListener(sbn, info); if (!sbnVisible) { continue; @@ -4819,7 +4819,7 @@ public class NotificationManagerService extends SystemService { public void notifyAssistantSnoozedLocked(final StatusBarNotification sbn, final String snoozeCriterionId) { TrimCache trimCache = new TrimCache(sbn); - for (final ManagedServiceInfo info : mServices) { + for (final ManagedServiceInfo info : getServices()) { final StatusBarNotification sbnToPost = trimCache.ForListener(info); mHandler.post(new Runnable() { @Override @@ -4840,7 +4840,7 @@ public class NotificationManagerService extends SystemService { } public boolean isEnabled() { - return !mServices.isEmpty(); + return !getServices().isEmpty(); } } @@ -4920,7 +4920,7 @@ public class NotificationManagerService extends SystemService { // Lazily initialized snapshots of the notification. TrimCache trimCache = new TrimCache(sbn); - for (final ManagedServiceInfo info : mServices) { + for (final ManagedServiceInfo info : getServices()) { boolean sbnVisible = isVisibleToListener(sbn, info); boolean oldSbnVisible = oldSbn != null ? isVisibleToListener(oldSbn, info) : false; // This notification hasn't been and still isn't visible -> ignore. @@ -4959,7 +4959,7 @@ public class NotificationManagerService extends SystemService { // NOTE: this copy is lightweight: it doesn't include heavyweight parts of the // notification final StatusBarNotification sbnLight = sbn.cloneLight(); - for (final ManagedServiceInfo info : mServices) { + for (final ManagedServiceInfo info : getServices()) { if (!isVisibleToListener(sbn, info)) { continue; } @@ -4977,7 +4977,7 @@ public class NotificationManagerService extends SystemService { * asynchronously notify all listeners about a reordering of notifications */ public void notifyRankingUpdateLocked() { - for (final ManagedServiceInfo serviceInfo : mServices) { + for (final ManagedServiceInfo serviceInfo : getServices()) { if (!serviceInfo.isEnabledForCurrentProfiles()) { continue; } @@ -4992,7 +4992,7 @@ public class NotificationManagerService extends SystemService { } public void notifyListenerHintsChangedLocked(final int hints) { - for (final ManagedServiceInfo serviceInfo : mServices) { + for (final ManagedServiceInfo serviceInfo : getServices()) { if (!serviceInfo.isEnabledForCurrentProfiles()) { continue; } @@ -5006,7 +5006,7 @@ public class NotificationManagerService extends SystemService { } public void notifyInterruptionFilterChanged(final int interruptionFilter) { - for (final ManagedServiceInfo serviceInfo : mServices) { + for (final ManagedServiceInfo serviceInfo : getServices()) { if (!serviceInfo.isEnabledForCurrentProfiles()) { continue; } @@ -5145,7 +5145,7 @@ public class NotificationManagerService extends SystemService { } // TODO: clean up locking object later synchronized (mNotificationLock) { - for (final ManagedServiceInfo serviceInfo : mServices) { + for (final ManagedServiceInfo serviceInfo : getServices()) { if (packageName.equals(serviceInfo.component.getPackageName())) { return true; } diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index 44dc61de0ea9..221b2bb0886a 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -232,7 +232,9 @@ public class RankingHelper implements RankingConfig { private Record getRecord(String pkg, int uid) { final String key = recordKey(pkg, uid); - return mRecords.get(key); + synchronized (mRecords) { + return mRecords.get(key); + } } private Record getOrCreateRecord(String pkg, int uid) { @@ -243,29 +245,32 @@ public class RankingHelper implements RankingConfig { private Record getOrCreateRecord(String pkg, int uid, int importance, int priority, int visibility, boolean showBadge) { final String key = recordKey(pkg, uid); - Record r = (uid == Record.UNKNOWN_UID) ? mRestoredWithoutUids.get(pkg) : mRecords.get(key); - if (r == null) { - r = new Record(); - r.pkg = pkg; - r.uid = uid; - r.importance = importance; - r.priority = priority; - r.visibility = visibility; - r.showBadge = showBadge; + synchronized (mRecords) { + Record r = (uid == Record.UNKNOWN_UID) ? mRestoredWithoutUids.get(pkg) : mRecords.get( + key); + if (r == null) { + r = new Record(); + r.pkg = pkg; + r.uid = uid; + r.importance = importance; + r.priority = priority; + r.visibility = visibility; + r.showBadge = showBadge; - try { - createDefaultChannelIfNeeded(r); - } catch (NameNotFoundException e) { - Slog.e(TAG, "createDefaultChannelIfNeeded - Exception: " + e); - } + try { + createDefaultChannelIfNeeded(r); + } catch (NameNotFoundException e) { + Slog.e(TAG, "createDefaultChannelIfNeeded - Exception: " + e); + } - if (r.uid == Record.UNKNOWN_UID) { - mRestoredWithoutUids.put(pkg, r); - } else { - mRecords.put(key, r); + if (r.uid == Record.UNKNOWN_UID) { + mRestoredWithoutUids.put(pkg, r); + } else { + mRecords.put(key, r); + } } + return r; } - return r; } private boolean shouldHaveDefaultChannel(Record r) throws NameNotFoundException { @@ -346,46 +351,48 @@ public class RankingHelper implements RankingConfig { out.startTag(null, TAG_RANKING); out.attribute(null, ATT_VERSION, Integer.toString(XML_VERSION)); - final int N = mRecords.size(); - for (int i = 0; i < N; i++) { - final Record r = mRecords.valueAt(i); - //TODO: http://b/22388012 - if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) { - continue; - } - final boolean hasNonDefaultSettings = r.importance != DEFAULT_IMPORTANCE - || r.priority != DEFAULT_PRIORITY || r.visibility != DEFAULT_VISIBILITY - || r.showBadge != DEFAULT_SHOW_BADGE || r.channels.size() > 0 - || r.groups.size() > 0; - if (hasNonDefaultSettings) { - out.startTag(null, TAG_PACKAGE); - out.attribute(null, ATT_NAME, r.pkg); - if (r.importance != DEFAULT_IMPORTANCE) { - out.attribute(null, ATT_IMPORTANCE, Integer.toString(r.importance)); - } - if (r.priority != DEFAULT_PRIORITY) { - out.attribute(null, ATT_PRIORITY, Integer.toString(r.priority)); - } - if (r.visibility != DEFAULT_VISIBILITY) { - out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility)); + synchronized (mRecords) { + final int N = mRecords.size(); + for (int i = 0; i < N; i++) { + final Record r = mRecords.valueAt(i); + //TODO: http://b/22388012 + if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) { + continue; } - out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge)); + final boolean hasNonDefaultSettings = r.importance != DEFAULT_IMPORTANCE + || r.priority != DEFAULT_PRIORITY || r.visibility != DEFAULT_VISIBILITY + || r.showBadge != DEFAULT_SHOW_BADGE || r.channels.size() > 0 + || r.groups.size() > 0; + if (hasNonDefaultSettings) { + out.startTag(null, TAG_PACKAGE); + out.attribute(null, ATT_NAME, r.pkg); + if (r.importance != DEFAULT_IMPORTANCE) { + out.attribute(null, ATT_IMPORTANCE, Integer.toString(r.importance)); + } + if (r.priority != DEFAULT_PRIORITY) { + out.attribute(null, ATT_PRIORITY, Integer.toString(r.priority)); + } + if (r.visibility != DEFAULT_VISIBILITY) { + out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility)); + } + out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge)); - if (!forBackup) { - out.attribute(null, ATT_UID, Integer.toString(r.uid)); - } + if (!forBackup) { + out.attribute(null, ATT_UID, Integer.toString(r.uid)); + } - for (NotificationChannelGroup group : r.groups.values()) { - group.writeXml(out); - } + for (NotificationChannelGroup group : r.groups.values()) { + group.writeXml(out); + } - for (NotificationChannel channel : r.channels.values()) { - if (!forBackup || (forBackup && !channel.isDeleted())) { - channel.writeXml(out); + for (NotificationChannel channel : r.channels.values()) { + if (!forBackup || (forBackup && !channel.isDeleted())) { + channel.writeXml(out); + } } - } - out.endTag(null, TAG_PACKAGE); + out.endTag(null, TAG_PACKAGE); + } } } out.endTag(null, TAG_RANKING); @@ -814,7 +821,9 @@ public class RankingHelper implements RankingConfig { pw.println("per-package config:"); } pw.println("Records:"); - dumpRecords(pw, prefix, filter, mRecords); + synchronized (mRecords) { + dumpRecords(pw, prefix, filter, mRecords); + } pw.println("Restored without uid:"); dumpRecords(pw, prefix, filter, mRestoredWithoutUids); } @@ -870,36 +879,38 @@ public class RankingHelper implements RankingConfig { } catch (JSONException e) { // pass } - final int N = mRecords.size(); - for (int i = 0; i < N; i++) { - final Record r = mRecords.valueAt(i); - if (filter == null || filter.matches(r.pkg)) { - JSONObject record = new JSONObject(); - try { - record.put("userId", UserHandle.getUserId(r.uid)); - record.put("packageName", r.pkg); - if (r.importance != DEFAULT_IMPORTANCE) { - record.put("importance", Ranking.importanceToString(r.importance)); - } - if (r.priority != DEFAULT_PRIORITY) { - record.put("priority", Notification.priorityToString(r.priority)); - } - if (r.visibility != DEFAULT_VISIBILITY) { - record.put("visibility", Notification.visibilityToString(r.visibility)); - } - if (r.showBadge != DEFAULT_SHOW_BADGE) { - record.put("showBadge", Boolean.valueOf(r.showBadge)); - } - for (NotificationChannel channel : r.channels.values()) { - record.put("channel", channel.toJson()); - } - for (NotificationChannelGroup group : r.groups.values()) { - record.put("group", group.toJson()); + synchronized (mRecords) { + final int N = mRecords.size(); + for (int i = 0; i < N; i++) { + final Record r = mRecords.valueAt(i); + if (filter == null || filter.matches(r.pkg)) { + JSONObject record = new JSONObject(); + try { + record.put("userId", UserHandle.getUserId(r.uid)); + record.put("packageName", r.pkg); + if (r.importance != DEFAULT_IMPORTANCE) { + record.put("importance", Ranking.importanceToString(r.importance)); + } + if (r.priority != DEFAULT_PRIORITY) { + record.put("priority", Notification.priorityToString(r.priority)); + } + if (r.visibility != DEFAULT_VISIBILITY) { + record.put("visibility", Notification.visibilityToString(r.visibility)); + } + if (r.showBadge != DEFAULT_SHOW_BADGE) { + record.put("showBadge", Boolean.valueOf(r.showBadge)); + } + for (NotificationChannel channel : r.channels.values()) { + record.put("channel", channel.toJson()); + } + for (NotificationChannelGroup group : r.groups.values()) { + record.put("group", group.toJson()); + } + } catch (JSONException e) { + // pass } - } catch (JSONException e) { - // pass + records.put(record); } - records.put(record); } } try { @@ -940,15 +951,18 @@ public class RankingHelper implements RankingConfig { } public Map<Integer, String> getPackageBans() { - final int N = mRecords.size(); - ArrayMap<Integer, String> packageBans = new ArrayMap<>(N); - for (int i = 0; i < N; i++) { - final Record r = mRecords.valueAt(i); - if (r.importance == NotificationManager.IMPORTANCE_NONE) { - packageBans.put(r.uid, r.pkg); + synchronized (mRecords) { + final int N = mRecords.size(); + ArrayMap<Integer, String> packageBans = new ArrayMap<>(N); + for (int i = 0; i < N; i++) { + final Record r = mRecords.valueAt(i); + if (r.importance == NotificationManager.IMPORTANCE_NONE) { + packageBans.put(r.uid, r.pkg); + } } + + return packageBans; } - return packageBans; } /** @@ -981,15 +995,17 @@ public class RankingHelper implements RankingConfig { private Map<String, Integer> getPackageChannels() { ArrayMap<String, Integer> packageChannels = new ArrayMap<>(); - for (int i = 0; i < mRecords.size(); i++) { - final Record r = mRecords.valueAt(i); - int channelCount = 0; - for (int j = 0; j < r.channels.size();j++) { - if (!r.channels.valueAt(j).isDeleted()) { - channelCount++; + synchronized (mRecords) { + for (int i = 0; i < mRecords.size(); i++) { + final Record r = mRecords.valueAt(i); + int channelCount = 0; + for (int j = 0; j < r.channels.size(); j++) { + if (!r.channels.valueAt(j).isDeleted()) { + channelCount++; + } } + packageChannels.put(r.pkg, channelCount); } - packageChannels.put(r.pkg, channelCount); } return packageChannels; } @@ -1006,7 +1022,9 @@ public class RankingHelper implements RankingConfig { for (int i = 0; i < size; i++) { final String pkg = pkgList[i]; final int uid = uidList[i]; - mRecords.remove(recordKey(pkg, uid)); + synchronized (mRecords) { + mRecords.remove(recordKey(pkg, uid)); + } mRestoredWithoutUids.remove(pkg); updated = true; } @@ -1018,7 +1036,9 @@ public class RankingHelper implements RankingConfig { try { r.uid = mPm.getPackageUidAsUser(r.pkg, changeUserId); mRestoredWithoutUids.remove(pkg); - mRecords.put(recordKey(r.pkg, r.uid), r); + synchronized (mRecords) { + mRecords.put(recordKey(r.pkg, r.uid), r); + } updated = true; } catch (NameNotFoundException e) { // noop diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index e6df49a82ea3..4f29bfa2829e 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -145,6 +145,7 @@ import android.content.res.TypedArray; import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.hardware.display.DisplayManager; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPlaybackClient; @@ -221,6 +222,7 @@ import android.view.accessibility.AccessibilityManager; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.AnimationUtils; +import android.widget.ImageView; import com.android.internal.R; import com.android.internal.logging.MetricsLogger; @@ -2809,6 +2811,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { + overrideConfig + " to starting window resId=" + resId); context = overrideContext; } + typedArray.recycle(); } final PhoneWindow win = new PhoneWindow(context); @@ -2868,6 +2871,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } params.setTitle("Splash Screen " + packageName); + addSplashscreenContent(win, context); + wm = (WindowManager) context.getSystemService(WINDOW_SERVICE); view = win.getDecorView(); @@ -2898,6 +2903,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { return null; } + private void addSplashscreenContent(PhoneWindow win, Context ctx) { + final TypedArray a = ctx.obtainStyledAttributes(R.styleable.Window); + final int resId = a.getResourceId(R.styleable.Window_windowSplashscreenContent, 0); + a.recycle(); + if (resId == 0) { + return; + } + final Drawable drawable = ctx.getDrawable(resId); + if (drawable == null) { + return; + } + + // We wrap this into a view so the system insets get applied to the drawable. + final View v = new View(ctx); + v.setBackground(drawable); + win.setContentView(v); + } + /** Obtain proper context for showing splash screen on the provided display. */ private Context getDisplayContext(Context context, int displayId) { if (displayId == Display.DEFAULT_DISPLAY) { diff --git a/services/core/java/com/android/server/storage/DiskStatsLoggingService.java b/services/core/java/com/android/server/storage/DiskStatsLoggingService.java index 1783dccd0b06..4035adedafe1 100644 --- a/services/core/java/com/android/server/storage/DiskStatsLoggingService.java +++ b/services/core/java/com/android/server/storage/DiskStatsLoggingService.java @@ -73,6 +73,7 @@ public class DiskStatsLoggingService extends JobService { final int userId = UserHandle.myUserId(); UserEnvironment environment = new UserEnvironment(userId); LogRunnable task = new LogRunnable(); + task.setRootDirectory(environment.getExternalStorageDirectory()); task.setDownloadsDirectory( environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)); task.setSystemSize(FileCollector.getSystemSize(this)); @@ -126,10 +127,14 @@ public class DiskStatsLoggingService extends JobService { private JobParameters mParams; private AppCollector mCollector; private File mOutputFile; + private File mRootDirectory; private File mDownloadsDirectory; - private Context mContext; private long mSystemSize; + public void setRootDirectory(File file) { + mRootDirectory = file; + } + public void setDownloadsDirectory(File file) { mDownloadsDirectory = file; } @@ -146,25 +151,14 @@ public class DiskStatsLoggingService extends JobService { mSystemSize = size; } - public void setContext(Context context) { - mContext = context; - } - public void setJobService(JobService jobService, JobParameters params) { mJobService = jobService; mParams = params; } public void run() { - FileCollector.MeasurementResult mainCategories; - try { - mainCategories = FileCollector.getMeasurementResult(mContext); - } catch (IllegalStateException e) { - // This can occur if installd has an issue. - Log.e(TAG, "Error while measuring storage", e); - finishJob(true); - return; - } + FileCollector.MeasurementResult mainCategories = + FileCollector.getMeasurementResult(mRootDirectory); FileCollector.MeasurementResult downloads = FileCollector.getMeasurementResult(mDownloadsDirectory); @@ -174,10 +168,12 @@ public class DiskStatsLoggingService extends JobService { needsReschedule = false; logToFile(mainCategories, downloads, stats, mSystemSize); } else { - Log.w(TAG, "Timed out while fetching package stats."); + Log.w("TAG", "Timed out while fetching package stats."); } - finishJob(needsReschedule); + if (mJobService != null) { + mJobService.jobFinished(mParams, needsReschedule); + } } private void logToFile(MeasurementResult mainCategories, MeasurementResult downloads, @@ -191,11 +187,5 @@ public class DiskStatsLoggingService extends JobService { Log.e(TAG, "Exception while writing opportunistic disk file cache.", e); } } - - private void finishJob(boolean needsReschedule) { - if (mJobService != null) { - mJobService.jobFinished(mParams, needsReschedule); - } - } } }
\ No newline at end of file diff --git a/services/core/java/com/android/server/storage/FileCollector.java b/services/core/java/com/android/server/storage/FileCollector.java index 04f25a484c79..90f9f1391679 100644 --- a/services/core/java/com/android/server/storage/FileCollector.java +++ b/services/core/java/com/android/server/storage/FileCollector.java @@ -17,11 +17,8 @@ package com.android.server.storage; import android.annotation.IntDef; -import android.app.usage.ExternalStorageStats; -import android.app.usage.StorageStatsManager; import android.content.Context; import android.content.pm.PackageManager; -import android.os.UserHandle; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.util.ArrayMap; @@ -157,29 +154,8 @@ public class FileCollector { } /** - * Returns the file categorization result for the primary internal storage UUID. - * - * @param context - */ - public static MeasurementResult getMeasurementResult(Context context) { - MeasurementResult result = new MeasurementResult(); - StorageStatsManager ssm = - (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE); - ExternalStorageStats stats = - ssm.queryExternalStatsForUser( - StorageManager.UUID_PRIVATE_INTERNAL, UserHandle.of(context.getUserId())); - result.imagesSize = stats.getImageBytes(); - result.videosSize = stats.getVideoBytes(); - result.audioSize = stats.getAudioBytes(); - result.miscSize = - stats.getTotalBytes() - result.imagesSize - result.videosSize - result.audioSize; - return result; - } - - /** * Returns the size of a system for a given context. This is done by finding the difference * between the shared data and the total primary storage size. - * * @param context Context to use to get storage information. */ public static long getSystemSize(Context context) { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 5c46ca9aa443..4262d124ed0a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -184,7 +184,7 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU super.removeImmediately(); } - void reparent(TaskStack stack, int position) { + void reparent(TaskStack stack, int position, boolean moveParents) { if (stack == mStack) { throw new IllegalArgumentException( "task=" + this + " already child of stack=" + mStack); @@ -195,7 +195,7 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU final DisplayContent prevDisplayContent = getDisplayContent(); getParent().removeChild(this); - stack.addTask(this, position, showForAllUsers(), false /* moveParents */); + stack.addTask(this, position, showForAllUsers(), moveParents); // Relayout display(s). final DisplayContent displayContent = stack.getDisplayContent(); diff --git a/services/core/java/com/android/server/wm/TaskWindowContainerController.java b/services/core/java/com/android/server/wm/TaskWindowContainerController.java index efc2e117b02d..9f0248517e88 100644 --- a/services/core/java/com/android/server/wm/TaskWindowContainerController.java +++ b/services/core/java/com/android/server/wm/TaskWindowContainerController.java @@ -121,7 +121,7 @@ public class TaskWindowContainerController } } - public void reparent(StackWindowController stackController, int position) { + public void reparent(StackWindowController stackController, int position, boolean moveParents) { synchronized (mWindowMap) { if (DEBUG_STACK) Slog.i(TAG_WM, "reparent: moving taskId=" + mTaskId + " to stack=" + stackController + " at " + position); @@ -135,7 +135,7 @@ public class TaskWindowContainerController throw new IllegalArgumentException("reparent: could not find stack=" + stackController); } - mContainer.reparent(stack, position); + mContainer.reparent(stack, position, moveParents); mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); } } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 67f1a0a5c658..42a92327bd4e 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -981,6 +981,11 @@ public final class SystemServer { traceBeginAndSlog("StartPersistentDataBlock"); mSystemServiceManager.startService(PersistentDataBlockService.class); traceEnd(); + + // Implementation depends on persistent data block + traceBeginAndSlog("StartOemLockService"); + mSystemServiceManager.startService(OemLockService.class); + traceEnd(); } traceBeginAndSlog("StartDeviceIdleController"); diff --git a/services/print/java/com/android/server/print/CompanionDeviceManagerService.java b/services/print/java/com/android/server/print/CompanionDeviceManagerService.java index d0dfc6cc4fe8..122a954b4d30 100644 --- a/services/print/java/com/android/server/print/CompanionDeviceManagerService.java +++ b/services/print/java/com/android/server/print/CompanionDeviceManagerService.java @@ -17,12 +17,15 @@ package com.android.server.print; +import static com.android.internal.util.CollectionUtils.size; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkNotNull; +import static com.android.internal.util.Preconditions.checkState; import android.Manifest; import android.annotation.CheckResult; import android.annotation.Nullable; +import android.app.PendingIntent; import android.companion.AssociationRequest; import android.companion.CompanionDeviceManager; import android.companion.ICompanionDeviceDiscoveryService; @@ -46,13 +49,18 @@ import android.os.Parcel; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.provider.Settings; +import android.provider.SettingsStringUtil.ComponentNameSet; +import android.text.BidiFormatter; import android.util.AtomicFile; import android.util.ExceptionUtils; +import android.util.Log; import android.util.Slog; import android.util.Xml; import com.android.internal.app.IAppOpsService; import com.android.internal.content.PackageMonitor; +import com.android.internal.notification.NotificationAccessConfirmationActivityContract; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.server.FgThread; @@ -79,6 +87,7 @@ import java.util.function.Function; //TODO schedule stopScan on activity destroy(except if configuration change) //TODO on associate called again after configuration change -> replace old callback with new //TODO avoid leaking calling activity in IFindDeviceCallback (see PrintManager#print for example) +//TODO check user-feature present in manifest on API calls /** @hide */ public class CompanionDeviceManagerService extends SystemService implements Binder.DeathRecipient { @@ -140,10 +149,10 @@ public class CompanionDeviceManagerService extends SystemService implements Bind @Override public void binderDied() { - Handler.getMain().post(this::handleBinderDied); + Handler.getMain().post(this::cleanup); } - private void handleBinderDied() { + private void cleanup() { mServiceConnection = unbind(mServiceConnection); mFindDeviceCallback = unlinkToDeath(mFindDeviceCallback, this, 0); } @@ -207,7 +216,6 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } } - @Override public List<String> getAssociations(String callingPackage, int userId) throws RemoteException { @@ -217,12 +225,13 @@ public class CompanionDeviceManagerService extends SystemService implements Bind a -> a.deviceAddress); } + //TODO also revoke notification access @Override public void disassociate(String deviceMacAddress, String callingPackage) throws RemoteException { checkNotNull(deviceMacAddress); checkCallerIsSystemOr(callingPackage); - updateAssociations(associations -> ArrayUtils.remove(associations, + updateAssociations(associations -> CollectionUtils.remove(associations, new Association(getCallingUserId(), deviceMacAddress, callingPackage))); } @@ -237,11 +246,49 @@ public class CompanionDeviceManagerService extends SystemService implements Bind checkArgument(getCallingUserId() == userId, "Must be called by either same user or system"); - mAppOpsManager.checkPackage(Binder.getCallingUid(), pkg); } + + @Override + public PendingIntent requestNotificationAccess(ComponentName component) + throws RemoteException { + String callingPackage = component.getPackageName(); + checkCanCallNotificationApi(callingPackage); + int userId = getCallingUserId(); + String packageTitle = BidiFormatter.getInstance().unicodeWrap( + getPackageInfo(callingPackage, userId) + .applicationInfo + .loadSafeLabel(getContext().getPackageManager()) + .toString()); + long identity = Binder.clearCallingIdentity(); + try { + return PendingIntent.getActivity(getContext(), + 0 /* request code */, + NotificationAccessConfirmationActivityContract.launcherIntent( + userId, component, packageTitle), + PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT + | PendingIntent.FLAG_CANCEL_CURRENT); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + public boolean hasNotificationAccess(ComponentName component) throws RemoteException { + checkCanCallNotificationApi(component.getPackageName()); + String setting = Settings.Secure.getString(getContext().getContentResolver(), + Settings.Secure.ENABLED_NOTIFICATION_LISTENERS); + return new ComponentNameSet(setting).contains(component); + } + + private void checkCanCallNotificationApi(String callingPackage) throws RemoteException { + checkCallerIsSystemOr(callingPackage); + checkState(!ArrayUtils.isEmpty(readAllAssociations(getCallingUserId(), callingPackage)), + "App must have an association before calling this API"); + } } + private int getCallingUserId() { return UserHandle.getUserId(Binder.getCallingUid()); } @@ -263,7 +310,7 @@ public class CompanionDeviceManagerService extends SystemService implements Bind mFindDeviceCallback.asBinder().linkToDeath( CompanionDeviceManagerService.this, 0); } catch (RemoteException e) { - handleBinderDied(); + cleanup(); return; } try { @@ -291,10 +338,26 @@ public class CompanionDeviceManagerService extends SystemService implements Bind return new ICompanionDeviceDiscoveryServiceCallback.Stub() { @Override + public boolean onTransact(int code, Parcel data, Parcel reply, int flags) + throws RemoteException { + try { + return super.onTransact(code, data, reply, flags); + } catch (Throwable e) { + Slog.e(LOG_TAG, "Error during IPC", e); + throw ExceptionUtils.propagate(e, RemoteException.class); + } + } + + @Override public void onDeviceSelected(String packageName, int userId, String deviceAddress) { - //TODO unbind updateSpecialAccessPermissionForAssociatedPackage(packageName, userId); recordAssociation(packageName, deviceAddress); + cleanup(); + } + + @Override + public void onDeviceSelectionCancel() { + cleanup(); } }; } @@ -345,22 +408,29 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } private void recordAssociation(String priviledgedPackage, String deviceAddress) { - updateAssociations((associations) -> ArrayUtils.add(associations, - new Association(getCallingUserId(), deviceAddress, priviledgedPackage))); + if (DEBUG) { + Log.i(LOG_TAG, "recordAssociation(priviledgedPackage = " + priviledgedPackage + + ", deviceAddress = " + deviceAddress + ")"); + } + int userId = getCallingUserId(); + updateAssociations(associations -> CollectionUtils.add(associations, + new Association(userId, deviceAddress, priviledgedPackage))); } - private void updateAssociations(Function<ArrayList<Association>, List<Association>> update) { + private void updateAssociations(Function<List<Association>, List<Association>> update) { updateAssociations(update, getCallingUserId()); } - private void updateAssociations(Function<ArrayList<Association>, List<Association>> update, + private void updateAssociations(Function<List<Association>, List<Association>> update, int userId) { final AtomicFile file = getStorageFileForUser(userId); synchronized (file) { - final ArrayList<Association> old = readAllAssociations(userId); - final List<Association> associations = update.apply(old); - if (Objects.equals(old, associations)) return; + List<Association> associations = readAllAssociations(userId); + final List<Association> old = CollectionUtils.copyOf(associations); + associations = update.apply(associations); + if (size(old) == size(associations)) return; + List<Association> finalAssociations = associations; file.write((out) -> { XmlSerializer xml = Xml.newSerializer(); try { @@ -369,8 +439,8 @@ public class CompanionDeviceManagerService extends SystemService implements Bind xml.startDocument(null, true); xml.startTag(null, XML_TAG_ASSOCIATIONS); - for (int i = 0; i < CollectionUtils.size(associations); i++) { - Association association = associations.get(i); + for (int i = 0; i < size(finalAssociations); i++) { + Association association = finalAssociations.get(i); xml.startTag(null, XML_TAG_ASSOCIATION) .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage) .attribute(null, XML_ATTR_DEVICE, association.deviceAddress) @@ -386,15 +456,6 @@ public class CompanionDeviceManagerService extends SystemService implements Bind }); } - - - //TODO Show dialog before recording notification access -// final SettingStringHelper setting = -// new SettingStringHelper( -// getContext().getContentResolver(), -// Settings.Secure.ENABLED_NOTIFICATION_LISTENERS, -// getUserId()); -// setting.write(ColonDelimitedSet.OfStrings.add(setting.read(), priviledgedPackage)); } private AtomicFile getStorageFileForUser(int uid) { diff --git a/services/retaildemo/java/com/android/server/retaildemo/UserInactivityCountdownDialog.java b/services/retaildemo/java/com/android/server/retaildemo/UserInactivityCountdownDialog.java index d14f4eb33dc5..013eab8679a8 100644 --- a/services/retaildemo/java/com/android/server/retaildemo/UserInactivityCountdownDialog.java +++ b/services/retaildemo/java/com/android/server/retaildemo/UserInactivityCountdownDialog.java @@ -67,7 +67,7 @@ public class UserInactivityCountdownDialog extends AlertDialog { @Override public void show() { super.show(); - final TextView messageView = (TextView) findViewById(R.id.message); + final TextView messageView = findViewById(R.id.message); messageView.post(new Runnable() { @Override public void run() { diff --git a/services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java b/services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java index 81ce6069c92e..378908655cb0 100644 --- a/services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java @@ -20,18 +20,15 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.isNull; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.job.JobService; -import android.app.usage.ExternalStorageStats; -import android.app.usage.StorageStatsManager; +import android.app.job.JobParameters; import android.content.pm.PackageStats; -import android.os.UserHandle; import android.test.AndroidTestCase; -import android.util.Log; import com.android.server.storage.DiskStatsLoggingService.LogRunnable; @@ -55,10 +52,8 @@ import java.util.ArrayList; public class DiskStatsLoggingServiceTest extends AndroidTestCase { @Rule public TemporaryFolder mTemporaryFolder; @Rule public TemporaryFolder mDownloads; + @Rule public TemporaryFolder mRootDirectory; @Mock private AppCollector mCollector; - @Mock private JobService mJobService; - @Mock private StorageStatsManager mSsm; - private ExternalStorageStats mStorageStats; private File mInputFile; @@ -71,10 +66,8 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { mInputFile = mTemporaryFolder.newFile(); mDownloads = new TemporaryFolder(); mDownloads.create(); - mStorageStats = new ExternalStorageStats(); - when(mSsm.queryExternalStatsForUser(isNull(String.class), any(UserHandle.class))) - .thenReturn(mStorageStats); - when(mJobService.getSystemService(anyString())).thenReturn(mSsm); + mRootDirectory = new TemporaryFolder(); + mRootDirectory.create(); } @Test @@ -82,9 +75,9 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); + task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setSystemSize(0L); - task.setContext(mJobService); task.run(); JSONObject json = getJsonOutput(); @@ -106,10 +99,10 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { public void testPopulatedLogTask() throws Exception { // Write data to directories. writeDataToFile(mDownloads.newFile(), "lol"); - mStorageStats.audioBytes = 6L; - mStorageStats.imageBytes = 4L; - mStorageStats.videoBytes = 5L; - mStorageStats.totalBytes = 22L; + writeDataToFile(mRootDirectory.newFile("test.jpg"), "1234"); + writeDataToFile(mRootDirectory.newFile("test.mp4"), "12345"); + writeDataToFile(mRootDirectory.newFile("test.mp3"), "123456"); + writeDataToFile(mRootDirectory.newFile("test.whatever"), "1234567"); // Write apps. ArrayList<PackageStats> apps = new ArrayList<>(); @@ -117,16 +110,15 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { testApp.dataSize = 5L; testApp.cacheSize = 55L; testApp.codeSize = 10L; - testApp.userHandle = UserHandle.USER_SYSTEM; apps.add(testApp); - when(mCollector.getPackageStats(anyLong())).thenReturn(apps); + when(mCollector.getPackageStats(anyInt())).thenReturn(apps); LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); + task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setSystemSize(10L); - task.setContext(mJobService); task.run(); JSONObject json = getJsonOutput(); @@ -151,9 +143,9 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); + task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setSystemSize(10L); - task.setContext(mJobService); task.run(); // No exception should be thrown. diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java index 1819c56735eb..98d20a2634ac 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java @@ -89,7 +89,7 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase { boolean gotException = false; try { - taskController.reparent(stackController1, 0); + taskController.reparent(stackController1, 0, false/* moveParents */); } catch (IllegalArgumentException e) { gotException = true; } @@ -100,14 +100,14 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase { stackController3.setContainer(null); gotException = false; try { - taskController.reparent(stackController3, 0); + taskController.reparent(stackController3, 0, false/* moveParents */); } catch (IllegalArgumentException e) { gotException = true; } assertTrue("Should not be able to reparent to a stack that doesn't have a container", gotException); - taskController.reparent(stackController2, 0); + taskController.reparent(stackController2, 0, false/* moveParents */); assertEquals(stackController2.mContainer, taskController.mContainer.getParent()); assertEquals(0, ((WindowTestUtils.TestTask) taskController.mContainer).positionInParent()); assertEquals(1, ((WindowTestUtils.TestTask) taskController2.mContainer).positionInParent()); @@ -135,7 +135,7 @@ public class TaskWindowContainerControllerTests extends WindowTestsBase { (WindowTestUtils.TestTask) taskController2.mContainer; // Reparent and check state - taskController.reparent(stack2Controller, 0); + taskController.reparent(stack2Controller, 0, false /* moveParents */); assertEquals(stack2, task1.getParent()); assertEquals(0, task1.positionInParent()); assertEquals(1, task2.positionInParent()); diff --git a/tests/AccessoryDisplay/sink/src/com/android/accessorydisplay/sink/SinkActivity.java b/tests/AccessoryDisplay/sink/src/com/android/accessorydisplay/sink/SinkActivity.java index 6fe2cfbcd8f4..fc1d47bcd20f 100644 --- a/tests/AccessoryDisplay/sink/src/com/android/accessorydisplay/sink/SinkActivity.java +++ b/tests/AccessoryDisplay/sink/src/com/android/accessorydisplay/sink/SinkActivity.java @@ -95,13 +95,13 @@ public class SinkActivity extends Activity { setContentView(R.layout.sink_activity); - mLogTextView = (TextView) findViewById(R.id.logTextView); + mLogTextView = findViewById(R.id.logTextView); mLogTextView.setMovementMethod(ScrollingMovementMethod.getInstance()); mLogger = new TextLogger(); - mFpsTextView = (TextView) findViewById(R.id.fpsTextView); + mFpsTextView = findViewById(R.id.fpsTextView); - mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView); + mSurfaceView = findViewById(R.id.surfaceView); mSurfaceView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { diff --git a/tests/AccessoryDisplay/source/src/com/android/accessorydisplay/source/SourceActivity.java b/tests/AccessoryDisplay/source/src/com/android/accessorydisplay/source/SourceActivity.java index c59c95856efa..a2161028f9a6 100644 --- a/tests/AccessoryDisplay/source/src/com/android/accessorydisplay/source/SourceActivity.java +++ b/tests/AccessoryDisplay/source/src/com/android/accessorydisplay/source/SourceActivity.java @@ -63,7 +63,7 @@ public class SourceActivity extends Activity { setContentView(R.layout.source_activity); - mLogTextView = (TextView) findViewById(R.id.logTextView); + mLogTextView = findViewById(R.id.logTextView); mLogTextView.setMovementMethod(ScrollingMovementMethod.getInstance()); mLogger = new TextLogger(); mPresenter = new Presenter(); diff --git a/tests/ActivityTests/AndroidManifest.xml b/tests/ActivityTests/AndroidManifest.xml index 64cdcf78fdcc..b381cbfbd0a9 100644 --- a/tests/ActivityTests/AndroidManifest.xml +++ b/tests/ActivityTests/AndroidManifest.xml @@ -87,5 +87,13 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> + <activity android:name="CustomSplashscreenActivity" + android:label="CustomSplashscreen" + android:theme="@style/CustomSplashscreen"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> </application> </manifest> diff --git a/tests/ActivityTests/res/drawable/splashscreen.xml b/tests/ActivityTests/res/drawable/splashscreen.xml new file mode 100644 index 000000000000..01fb6462fd95 --- /dev/null +++ b/tests/ActivityTests/res/drawable/splashscreen.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2017 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 + --> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <bitmap + android:gravity="center" + android:src="@drawable/icon"/> + </item> +</layer-list>
\ No newline at end of file diff --git a/tests/ActivityTests/res/values/themes.xml b/tests/ActivityTests/res/values/themes.xml index b8dd83039ed8..c11d2e48834a 100644 --- a/tests/ActivityTests/res/values/themes.xml +++ b/tests/ActivityTests/res/values/themes.xml @@ -26,4 +26,7 @@ <item name="android:colorBackground">@color/blue</item> <item name="android:windowBackground">@color/blue</item> </style> + <style name="CustomSplashscreen" parent="@android:style/Theme.Material.Light.NoActionBar"> + <item name="android:windowSplashscreenContent">@drawable/splashscreen</item> + </style> </resources> diff --git a/tests/ActivityTests/src/com/google/android/test/activity/CustomSplashscreenActivity.java b/tests/ActivityTests/src/com/google/android/test/activity/CustomSplashscreenActivity.java new file mode 100644 index 000000000000..0683df6d649f --- /dev/null +++ b/tests/ActivityTests/src/com/google/android/test/activity/CustomSplashscreenActivity.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2017 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 com.google.android.test.activity; + +import android.annotation.Nullable; +import android.app.Activity; +import android.graphics.Color; +import android.os.Bundle; +import android.os.SystemClock; + +/** + * Activity for which we set a custom splash screen. + */ +public class CustomSplashscreenActivity extends Activity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + SystemClock.sleep(2000); + } +} diff --git a/tests/AmSlam/Android.mk b/tests/AmSlam/Android.mk index 8dafac73403d..934bae03a560 100644 --- a/tests/AmSlam/Android.mk +++ b/tests/AmSlam/Android.mk @@ -21,7 +21,7 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := AmSlam -LOCAL_SDK_VERSION := 21 +LOCAL_SDK_VERSION := current LOCAL_MIN_SDK_VERSION := 21 LOCAL_JAVA_LANGUAGE_VERSION := 1.8 diff --git a/tests/AmSlam/src/test/amslam/MainActivity.java b/tests/AmSlam/src/test/amslam/MainActivity.java index cce955e999f8..17fca091ac09 100644 --- a/tests/AmSlam/src/test/amslam/MainActivity.java +++ b/tests/AmSlam/src/test/amslam/MainActivity.java @@ -60,7 +60,7 @@ public class MainActivity extends Activity implements PongReceiver.PingPongRespo super.onCreate(savedInstanceState); sAppContext = getApplicationContext(); setContentView(R.layout.activity_main); - mOutput = (TextView) findViewById(R.id.output); + mOutput = findViewById(R.id.output); PongReceiver.addListener(this); findViewById(R.id.run).setOnClickListener(view -> { diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java index b88a885efa43..f85e82deb0d6 100644 --- a/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java +++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java @@ -75,7 +75,7 @@ public class BiDiTestActivity extends Activity { setContentView(R.layout.main); - mList = (ListView) findViewById(R.id.testlist); + mList = findViewById(R.id.testlist); mList.setChoiceMode(ListView.CHOICE_MODE_SINGLE); mList.setFocusableInTouchMode(true); diff --git a/tests/CanvasCompare/src/com/android/test/hwuicompare/AutomaticActivity.java b/tests/CanvasCompare/src/com/android/test/hwuicompare/AutomaticActivity.java index 1ed47230c6fc..8ccd4e2181ed 100644 --- a/tests/CanvasCompare/src/com/android/test/hwuicompare/AutomaticActivity.java +++ b/tests/CanvasCompare/src/com/android/test/hwuicompare/AutomaticActivity.java @@ -111,8 +111,8 @@ public class AutomaticActivity extends CompareActivity { super.onCreate(savedInstanceState); setContentView(R.layout.automatic_layout); - mSoftwareImageView = (ImageView) findViewById(R.id.software_image_view); - mHardwareImageView = (ImageView) findViewById(R.id.hardware_image_view); + mSoftwareImageView = findViewById(R.id.software_image_view); + mHardwareImageView = findViewById(R.id.hardware_image_view); onCreateCommon(mRunnable); beginTest(); diff --git a/tests/CanvasCompare/src/com/android/test/hwuicompare/CompareActivity.java b/tests/CanvasCompare/src/com/android/test/hwuicompare/CompareActivity.java index 8d8d9de1a249..0dec1de79a46 100644 --- a/tests/CanvasCompare/src/com/android/test/hwuicompare/CompareActivity.java +++ b/tests/CanvasCompare/src/com/android/test/hwuicompare/CompareActivity.java @@ -57,7 +57,7 @@ abstract public class CompareActivity extends Activity { getWindow().setBackgroundDrawable(new ColorDrawable(0xffefefef)); ResourceModifiers.init(getResources()); - mHardwareView = (MainView) findViewById(R.id.hardware_view); + mHardwareView = findViewById(R.id.hardware_view); mHardwareView.setLayerType(View.LAYER_TYPE_HARDWARE, null); mHardwareView.setBackgroundColor(Color.WHITE); mHardwareView.addDrawCallback(mDrawCallback); diff --git a/tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java b/tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java index 78e360bdb831..723c46089d51 100644 --- a/tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java +++ b/tests/FrameworkPerf/src/com/android/frameworkperf/FrameworkPerfActivity.java @@ -162,19 +162,19 @@ public class FrameworkPerfActivity extends Activity // in res/layout/hello_activity.xml setContentView(R.layout.main); - mFgSpinner = (Spinner) findViewById(R.id.fgspinner); + mFgSpinner = findViewById(R.id.fgspinner); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mAvailOpLabels); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mFgSpinner.setAdapter(adapter); mFgSpinner.setOnItemSelectedListener(this); - mBgSpinner = (Spinner) findViewById(R.id.bgspinner); + mBgSpinner = findViewById(R.id.bgspinner); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mAvailOpLabels); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mBgSpinner.setAdapter(adapter); mBgSpinner.setOnItemSelectedListener(this); - mLimitSpinner = (Spinner) findViewById(R.id.limitspinner); + mLimitSpinner = findViewById(R.id.limitspinner); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mLimitLabels); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); diff --git a/tests/HugeBackup/src/com/android/hugebackup/HugeBackupActivity.java b/tests/HugeBackup/src/com/android/hugebackup/HugeBackupActivity.java index 84e31aa8417e..83c27fb750e5 100644 --- a/tests/HugeBackup/src/com/android/hugebackup/HugeBackupActivity.java +++ b/tests/HugeBackup/src/com/android/hugebackup/HugeBackupActivity.java @@ -71,9 +71,9 @@ public class HugeBackupActivity extends Activity { setContentView(R.layout.backup_restore); /** Once the UI has been inflated, cache the controls for later */ - mFillingGroup = (RadioGroup) findViewById(R.id.filling_group); - mAddMayoCheckbox = (CheckBox) findViewById(R.id.mayo); - mAddTomatoCheckbox = (CheckBox) findViewById(R.id.tomato); + mFillingGroup = findViewById(R.id.filling_group); + mAddMayoCheckbox = findViewById(R.id.mayo); + mAddTomatoCheckbox = findViewById(R.id.tomato); /** Set up our file bookkeeping */ mDataFile = new File(getFilesDir(), HugeBackupActivity.DATA_FILE_NAME); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java b/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java index eb4e3fd00eee..492d158ec5ef 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java @@ -101,7 +101,7 @@ public class DatePicker extends FrameLayout { Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.date_picker, this, true); - mDayPicker = (NumberPicker) findViewById(R.id.day); + mDayPicker = findViewById(R.id.day); mDayPicker.setFormatter(NumberPicker.getTwoDigitFormatter()); mDayPicker.setOnLongPressUpdateInterval(100); mDayPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { @@ -110,7 +110,7 @@ public class DatePicker extends FrameLayout { notifyDateChanged(); } }); - mMonthPicker = (NumberPicker) findViewById(R.id.month); + mMonthPicker = findViewById(R.id.month); mMonthPicker.setFormatter(NumberPicker.getTwoDigitFormatter()); DateFormatSymbols dfs = new DateFormatSymbols(); String[] months = dfs.getShortMonths(); @@ -146,7 +146,7 @@ public class DatePicker extends FrameLayout { updateDaySpinner(); } }); - mYearPicker = (NumberPicker) findViewById(R.id.year); + mYearPicker = findViewById(R.id.year); mYearPicker.setOnLongPressUpdateInterval(100); mYearPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { public void onValueChange(NumberPicker picker, int oldVal, int newVal) { @@ -158,7 +158,7 @@ public class DatePicker extends FrameLayout { } }); - mYearToggle = (CheckBox) findViewById(R.id.yearToggle); + mYearToggle = findViewById(R.id.yearToggle); mYearToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { @@ -229,7 +229,7 @@ public class DatePicker extends FrameLayout { /* Remove the 3 pickers from their parent and then add them back in the * required order. */ - LinearLayout parent = (LinearLayout) findViewById(R.id.parent); + LinearLayout parent = findViewById(R.id.parent); parent.removeAllViews(); boolean quoted = false; diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ListActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ListActivity.java index 0defe924e6b3..134c2e045449 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ListActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ListActivity.java @@ -82,7 +82,7 @@ public class ListActivity extends Activity { ListAdapter adapter = new SimpleListAdapter(this); - final ListView list = (ListView) findViewById(R.id.list); + final ListView list = findViewById(R.id.list); list.setAdapter(adapter); registerForContextMenu(list); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/StackActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/StackActivity.java index 5655adf878fe..262b0e93671b 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/StackActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/StackActivity.java @@ -35,7 +35,7 @@ public class StackActivity extends Activity { setContentView(R.layout.stack); - StackView stack = (StackView) findViewById(R.id.stack_view); + StackView stack = findViewById(R.id.stack_view); stack.setAdapter(new ArrayAdapter<Drawable>(this, android.R.layout.simple_list_item_1, android.R.id.text1, new Drawable[] { getResources().getDrawable(R.drawable.sunset1), diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/TransformsAndAnimationsActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/TransformsAndAnimationsActivity.java index 684d17944549..b5a5e025e757 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/TransformsAndAnimationsActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/TransformsAndAnimationsActivity.java @@ -55,23 +55,23 @@ public class TransformsAndAnimationsActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.transforms_and_animations); - button1 = (Button) findViewById(R.id.button1); - button2 = (Button) findViewById(R.id.button2); - button3 = (Button) findViewById(R.id.button3); - button1a = (Button) findViewById(R.id.button1a); - button2a = (Button) findViewById(R.id.button2a); - button3a = (Button) findViewById(R.id.button3a); - button1b = (Button) findViewById(R.id.button1b); - button2b = (Button) findViewById(R.id.button2b); - button3b = (Button) findViewById(R.id.button3b); - button4 = (Button) findViewById(R.id.button4); - button5 = (Button) findViewById(R.id.button5); - button6 = (Button) findViewById(R.id.button6); - button7 = (Button) findViewById(R.id.button7); - button8 = (Button) findViewById(R.id.button8); - layersNoneCB = (CheckBox) findViewById(R.id.layersNoneCB); - layersHardwareCB = (CheckBox) findViewById(R.id.layersHwCB); - layersSoftwareCB = (CheckBox) findViewById(R.id.layersSwCB); + button1 = findViewById(R.id.button1); + button2 = findViewById(R.id.button2); + button3 = findViewById(R.id.button3); + button1a = findViewById(R.id.button1a); + button2a = findViewById(R.id.button2a); + button3a = findViewById(R.id.button3a); + button1b = findViewById(R.id.button1b); + button2b = findViewById(R.id.button2b); + button3b = findViewById(R.id.button3b); + button4 = findViewById(R.id.button4); + button5 = findViewById(R.id.button5); + button6 = findViewById(R.id.button6); + button7 = findViewById(R.id.button7); + button8 = findViewById(R.id.button8); + layersNoneCB = findViewById(R.id.layersNoneCB); + layersHardwareCB = findViewById(R.id.layersHwCB); + layersSoftwareCB = findViewById(R.id.layersSwCB); layersNoneCB.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() { @Override diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/TransparentListActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/TransparentListActivity.java index ffb86893be73..deb8585a95f5 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/TransparentListActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/TransparentListActivity.java @@ -84,7 +84,7 @@ public class TransparentListActivity extends Activity { ListAdapter adapter = new SimpleListAdapter(this); - ListView list = (ListView) findViewById(R.id.list); + ListView list = findViewById(R.id.list); list.setAdapter(adapter); list.setCacheColorHint(0); list.setVerticalFadingEdgeEnabled(true); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayerInvalidationActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayerInvalidationActivity.java index 6d47d6c467e7..a261fb729a65 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayerInvalidationActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayerInvalidationActivity.java @@ -49,13 +49,13 @@ public class ViewLayerInvalidationActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.view_layer_invalidation); - container = (LinearLayout) findViewById(R.id.container); - final LinearLayout container1 = (LinearLayout) findViewById(R.id.container1); - final LinearLayout container2 = (LinearLayout) findViewById(R.id.container2); - final LinearLayout container3 = (LinearLayout) findViewById(R.id.container3); - nestedStatusTV = (TextView) findViewById(R.id.nestedStatus); - invalidateStatusTV = (TextView) findViewById(R.id.invalidateStatus); - final TextView tva = (TextView) findViewById(R.id.textviewa); + container = findViewById(R.id.container); + final LinearLayout container1 = findViewById(R.id.container1); + final LinearLayout container2 = findViewById(R.id.container2); + final LinearLayout container3 = findViewById(R.id.container3); + nestedStatusTV = findViewById(R.id.nestedStatus); + invalidateStatusTV = findViewById(R.id.invalidateStatus); + final TextView tva = findViewById(R.id.textviewa); topLayouts.add(container1); topLayouts.add(container2); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity.java index 7168478c083c..07dc0a1b5df0 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity.java @@ -94,7 +94,7 @@ public class ViewLayersActivity extends Activity { } private void setupList(int listId) { - final ListView list = (ListView) findViewById(listId); + final ListView list = findViewById(listId); list.setAdapter(new SimpleListAdapter(this)); } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity3.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity3.java index e65dd6331408..96cf43e48778 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity3.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity3.java @@ -39,7 +39,7 @@ public class ViewLayersActivity3 extends Activity { } private void setupList(int listId) { - final ListView list = (ListView) findViewById(listId); + final ListView list = findViewById(listId); list.setAdapter(new SimpleListAdapter(this)); list.setLayerType(View.LAYER_TYPE_HARDWARE, null); ((View) list.getParent()).setLayerType(View.LAYER_TYPE_HARDWARE, null); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity4.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity4.java index 17f78af50edb..1f3f874744db 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity4.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity4.java @@ -47,7 +47,7 @@ public class ViewLayersActivity4 extends Activity { } private void setupList(int listId) { - final ListView list = (ListView) findViewById(listId); + final ListView list = findViewById(listId); list.setAdapter(new SimpleListAdapter(this)); list.setLayerType(View.LAYER_TYPE_HARDWARE, null); } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity5.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity5.java index 2dd7b6a99ce1..715da201458b 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity5.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity5.java @@ -113,7 +113,7 @@ public class ViewLayersActivity5 extends Activity { } private void setupList(int listId) { - final ListView list = (ListView) findViewById(listId); + final ListView list = findViewById(listId); list.setAdapter(new SimpleListAdapter(this)); } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewPropertyAlphaActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewPropertyAlphaActivity.java index 738801d8b285..9ae38119cac6 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewPropertyAlphaActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewPropertyAlphaActivity.java @@ -60,12 +60,12 @@ public class ViewPropertyAlphaActivity extends Activity { startAnim(R.id.imageview); startAnim(myViewAlphaDefault); startAnim(myViewAlphaHandled); - EditText selectedText = (EditText) findViewById(R.id.selectedtext); + EditText selectedText = findViewById(R.id.selectedtext); selectedText.setSelection(3, 8); } }, 2000); - Button invalidator = (Button) findViewById(R.id.invalidateButton); + Button invalidator = findViewById(R.id.invalidateButton); invalidator.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -74,7 +74,7 @@ public class ViewPropertyAlphaActivity extends Activity { } }); - TextView textView = (TextView) findViewById(R.id.spantext); + TextView textView = findViewById(R.id.spantext); if (textView != null) { SpannableStringBuilder text = new SpannableStringBuilder("Now this is a short text message with spans"); @@ -93,7 +93,7 @@ public class ViewPropertyAlphaActivity extends Activity { textView.setText(text); } - LinearLayout container = (LinearLayout) findViewById(R.id.container); + LinearLayout container = findViewById(R.id.container); myViewAlphaDefault = new MyView(this, false); myViewAlphaDefault.setLayoutParams(new LinearLayout.LayoutParams(75, 75)); container.addView(myViewAlphaDefault); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ZOrderingActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ZOrderingActivity.java index 45e77edb03da..08979bce8f73 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ZOrderingActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ZOrderingActivity.java @@ -12,7 +12,7 @@ public class ZOrderingActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.z_ordering); - ViewGroup grandParent = (ViewGroup) findViewById(R.id.parent); + ViewGroup grandParent = findViewById(R.id.parent); if (grandParent == null) throw new IllegalStateException(); View.OnClickListener l = new View.OnClickListener() { @Override diff --git a/tests/ImfTest/src/com/android/imftest/samples/AutoCompleteTextViewActivityLandscape.java b/tests/ImfTest/src/com/android/imftest/samples/AutoCompleteTextViewActivityLandscape.java index 292bbd22d0fc..6115fd5a0fd0 100644 --- a/tests/ImfTest/src/com/android/imftest/samples/AutoCompleteTextViewActivityLandscape.java +++ b/tests/ImfTest/src/com/android/imftest/samples/AutoCompleteTextViewActivityLandscape.java @@ -50,7 +50,7 @@ public class AutoCompleteTextViewActivityLandscape extends Activity ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); - AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit); + AutoCompleteTextView textView = findViewById(R.id.edit); textView.setAdapter(adapter); } diff --git a/tests/ImfTest/src/com/android/imftest/samples/AutoCompleteTextViewActivityPortrait.java b/tests/ImfTest/src/com/android/imftest/samples/AutoCompleteTextViewActivityPortrait.java index 570cb6bf8a06..253c50fe5810 100644 --- a/tests/ImfTest/src/com/android/imftest/samples/AutoCompleteTextViewActivityPortrait.java +++ b/tests/ImfTest/src/com/android/imftest/samples/AutoCompleteTextViewActivityPortrait.java @@ -45,7 +45,7 @@ public class AutoCompleteTextViewActivityPortrait extends Activity ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); - AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit); + AutoCompleteTextView textView = findViewById(R.id.edit); textView.setAdapter(adapter); } diff --git a/tests/JobSchedulerTestApp/src/com/android/demo/jobSchedulerApp/MainActivity.java b/tests/JobSchedulerTestApp/src/com/android/demo/jobSchedulerApp/MainActivity.java index 5aa0d4f35a21..51cdbb585659 100644 --- a/tests/JobSchedulerTestApp/src/com/android/demo/jobSchedulerApp/MainActivity.java +++ b/tests/JobSchedulerTestApp/src/com/android/demo/jobSchedulerApp/MainActivity.java @@ -56,16 +56,16 @@ public class MainActivity extends Activity { stopJobColor = getColor(R.color.stop_received); // Set up UI. - mShowStartView = (TextView) findViewById(R.id.onstart_textview); - mShowStopView = (TextView) findViewById(R.id.onstop_textview); - mParamsTextView = (TextView) findViewById(R.id.task_params); - mDelayEditText = (EditText) findViewById(R.id.delay_time); - mDeadlineEditText = (EditText) findViewById(R.id.deadline_time); - mWiFiConnectivityRadioButton = (RadioButton) findViewById(R.id.checkbox_unmetered); - mAnyConnectivityRadioButton = (RadioButton) findViewById(R.id.checkbox_any); - mRequiresChargingCheckBox = (CheckBox) findViewById(R.id.checkbox_charging); - mRequiresIdleCheckbox = (CheckBox) findViewById(R.id.checkbox_idle); - mIsPersistedCheckbox = (CheckBox) findViewById(R.id.checkbox_persisted); + mShowStartView = findViewById(R.id.onstart_textview); + mShowStopView = findViewById(R.id.onstop_textview); + mParamsTextView = findViewById(R.id.task_params); + mDelayEditText = findViewById(R.id.delay_time); + mDeadlineEditText = findViewById(R.id.deadline_time); + mWiFiConnectivityRadioButton = findViewById(R.id.checkbox_unmetered); + mAnyConnectivityRadioButton = findViewById(R.id.checkbox_any); + mRequiresChargingCheckBox = findViewById(R.id.checkbox_charging); + mRequiresIdleCheckbox = findViewById(R.id.checkbox_idle); + mIsPersistedCheckbox = findViewById(R.id.checkbox_persisted); mServiceComponent = new ComponentName(this, TestJobService.class); // Start service and provide it a way to communicate with us. diff --git a/tests/LargeAssetTest/src/com/android/largeassettest/LargeAssetTest.java b/tests/LargeAssetTest/src/com/android/largeassettest/LargeAssetTest.java index e3a9cf40b066..612c53e3e93c 100644 --- a/tests/LargeAssetTest/src/com/android/largeassettest/LargeAssetTest.java +++ b/tests/LargeAssetTest/src/com/android/largeassettest/LargeAssetTest.java @@ -43,8 +43,8 @@ public class LargeAssetTest extends Activity { super.onCreate(icicle); setContentView(R.layout.lat); - mResultText = (TextView) findViewById(R.id.result); - mValidateButton = (Button) findViewById(R.id.validate); + mResultText = findViewById(R.id.result); + mValidateButton = findViewById(R.id.validate); mValidateButton.setOnClickListener(mClickListener); } diff --git a/tests/LowStorageTest/src/com/android/lowstoragetest/LowStorageTest.java b/tests/LowStorageTest/src/com/android/lowstoragetest/LowStorageTest.java index 9f297aa13e90..c0091ad7b03f 100644 --- a/tests/LowStorageTest/src/com/android/lowstoragetest/LowStorageTest.java +++ b/tests/LowStorageTest/src/com/android/lowstoragetest/LowStorageTest.java @@ -52,9 +52,9 @@ public class LowStorageTest extends Activity { StatFs stat = new StatFs(path.getPath()); int totalBlocks = stat.getBlockCount(); mBlockSize = (int) (stat.getBlockSize()); - TextView startSizeTextView = (TextView) findViewById(R.id.totalsize); + TextView startSizeTextView = findViewById(R.id.totalsize); startSizeTextView.setText(Long.toString((totalBlocks * mBlockSize) / BYTE_SIZE)); - Button button = (Button) findViewById(R.id.button_run); + Button button = findViewById(R.id.button_run); button.setOnClickListener(mStartListener); } @@ -121,9 +121,9 @@ public class LowStorageTest extends Activity { File path = Environment.getDataDirectory(); StatFs stat = new StatFs(path.getPath()); long availableBlocks = stat.getAvailableBlocks(); - TextView freeSizeTextView = (TextView) findViewById(R.id.freesize); + TextView freeSizeTextView = findViewById(R.id.freesize); freeSizeTextView.setText(Long.toString((availableBlocks * mBlockSize) / BYTE_SIZE)); - TextView statusTextView = (TextView) findViewById(R.id.status); + TextView statusTextView = findViewById(R.id.status); statusTextView.setText("Finished. You can start the test now."); } catch (Exception e) { Log.v(TAG, e.toString()); diff --git a/tests/OneMedia/src/com/android/onemedia/OnePlayerActivity.java b/tests/OneMedia/src/com/android/onemedia/OnePlayerActivity.java index 2ff3e2026cc0..85cc8fb046f2 100644 --- a/tests/OneMedia/src/com/android/onemedia/OnePlayerActivity.java +++ b/tests/OneMedia/src/com/android/onemedia/OnePlayerActivity.java @@ -68,16 +68,16 @@ public class OnePlayerActivity extends Activity { mPlayer = new PlayerController(this, OnePlayerService.getServiceIntent(this)); - mStartButton = (Button) findViewById(R.id.start_button); - mPlayButton = (Button) findViewById(R.id.play_button); - mRouteButton = (Button) findViewById(R.id.route_button); - mStatusView = (TextView) findViewById(R.id.status); - mContentText = (EditText) findViewById(R.id.content); - mNextContentText = (EditText) findViewById(R.id.next_content); - mHasVideo = (CheckBox) findViewById(R.id.has_video); - mArtView = (ImageView) findViewById(R.id.art); - - final Button artPicker = (Button) findViewById(R.id.art_picker); + mStartButton = findViewById(R.id.start_button); + mPlayButton = findViewById(R.id.play_button); + mRouteButton = findViewById(R.id.route_button); + mStatusView = findViewById(R.id.status); + mContentText = findViewById(R.id.content); + mNextContentText = findViewById(R.id.next_content); + mHasVideo = findViewById(R.id.has_video); + mArtView = findViewById(R.id.art); + + final Button artPicker = findViewById(R.id.art_picker); artPicker.setOnClickListener(mButtonListener); mStartButton.setOnClickListener(mButtonListener); diff --git a/tests/RenderThreadTest/src/com/example/renderthread/MainActivity.java b/tests/RenderThreadTest/src/com/example/renderthread/MainActivity.java index ee4c8343d9e9..241206d8919b 100644 --- a/tests/RenderThreadTest/src/com/example/renderthread/MainActivity.java +++ b/tests/RenderThreadTest/src/com/example/renderthread/MainActivity.java @@ -43,7 +43,7 @@ public class MainActivity extends Activity implements OnItemClickListener { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - ListView lv = (ListView) findViewById(android.R.id.list); + ListView lv = findViewById(android.R.id.list); lv.setDrawSelectorOnTop(true); lv.setAdapter(new SimpleAdapter(this, SAMPLES, R.layout.item_layout, new String[] { KEY_NAME }, @@ -55,7 +55,7 @@ public class MainActivity extends Activity implements OnItemClickListener { @Override protected void onResume() { super.onResume(); - ListView lv = (ListView) findViewById(android.R.id.list); + ListView lv = findViewById(android.R.id.list); for (int i = 0; i < lv.getChildCount(); i++) { lv.getChildAt(i).animate().translationY(0).setDuration(DURATION); } diff --git a/tests/RenderThreadTest/src/com/example/renderthread/SubActivity.java b/tests/RenderThreadTest/src/com/example/renderthread/SubActivity.java index 892cbae50560..22fc6911f7df 100644 --- a/tests/RenderThreadTest/src/com/example/renderthread/SubActivity.java +++ b/tests/RenderThreadTest/src/com/example/renderthread/SubActivity.java @@ -39,7 +39,7 @@ public class SubActivity extends Activity { @Override protected void onResume() { super.onResume(); - ViewGroup container = (ViewGroup) findViewById(R.id.my_container); + ViewGroup container = findViewById(R.id.my_container); int dx = getWindowManager().getDefaultDisplay().getWidth(); for (int i = 0; i < container.getChildCount(); i++) { View child = container.getChildAt(i); diff --git a/tests/SoundTriggerTestApp/src/com/android/test/soundtrigger/SoundTriggerTestActivity.java b/tests/SoundTriggerTestApp/src/com/android/test/soundtrigger/SoundTriggerTestActivity.java index 4841bc59c794..c3c4cf556986 100644 --- a/tests/SoundTriggerTestApp/src/com/android/test/soundtrigger/SoundTriggerTestActivity.java +++ b/tests/SoundTriggerTestApp/src/com/android/test/soundtrigger/SoundTriggerTestActivity.java @@ -81,14 +81,14 @@ public class SoundTriggerTestActivity extends Activity implements SoundTriggerTe super.onCreate(savedInstanceState); setContentView(R.layout.main); - mDebugView = (TextView) findViewById(R.id.console); - mScrollView = (ScrollView) findViewById(R.id.scroller_id); - mRadioGroup = (RadioGroup) findViewById(R.id.model_group_id); - mPlayTriggerButton = (Button) findViewById(R.id.play_trigger_id); + mDebugView = findViewById(R.id.console); + mScrollView = findViewById(R.id.scroller_id); + mRadioGroup = findViewById(R.id.model_group_id); + mPlayTriggerButton = findViewById(R.id.play_trigger_id); mDebugView.setText(mDebugView.getText(), TextView.BufferType.EDITABLE); mDebugView.setMovementMethod(new ScrollingMovementMethod()); - mCaptureAudioCheckBox = (CheckBox) findViewById(R.id.caputre_check_box); - mPlayCapturedAudioButton = (Button) findViewById(R.id.play_captured_id); + mCaptureAudioCheckBox = findViewById(R.id.caputre_check_box); + mPlayCapturedAudioButton = findViewById(R.id.play_captured_id); mHandler = new Handler(); mButtonModelUuidMap = new HashMap(); mModelButtons = new HashMap(); diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java index 7c139742f54d..7632a6e3dfd6 100644 --- a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java +++ b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java @@ -180,7 +180,7 @@ public class TouchLatencyActivity extends ActionBarActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_touch_latency); - mTouchView = (TouchLatencyView) findViewById(R.id.canvasView); + mTouchView = findViewById(R.id.canvasView); } diff --git a/tests/TransitionTests/src/com/android/transitiontests/ClippingText.java b/tests/TransitionTests/src/com/android/transitiontests/ClippingText.java index 54c44e22d1b6..9985357d4577 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ClippingText.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ClippingText.java @@ -42,7 +42,7 @@ public class ClippingText extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.clipping_text_1); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.clipping_text_1, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/ContactsExpansion.java b/tests/TransitionTests/src/com/android/transitiontests/ContactsExpansion.java index f687da37eedf..86ecf8e5f9f2 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ContactsExpansion.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ContactsExpansion.java @@ -49,7 +49,7 @@ public class ContactsExpansion extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contacts_list); - ViewGroup contactsContainer = (ViewGroup) findViewById(R.id.contactsContainer); + ViewGroup contactsContainer = findViewById(R.id.contactsContainer); int contactsIndex = 0; addContact(contactsContainer, contactsIndex, R.drawable.self_portrait_square_100); diff --git a/tests/TransitionTests/src/com/android/transitiontests/CrossFadeDemo.java b/tests/TransitionTests/src/com/android/transitiontests/CrossFadeDemo.java index 5bb0e77c08c9..0d41d647fe22 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/CrossFadeDemo.java +++ b/tests/TransitionTests/src/com/android/transitiontests/CrossFadeDemo.java @@ -38,7 +38,7 @@ public class CrossFadeDemo extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.crossfade); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.crossfade, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeImage.java b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeImage.java index 1f278b9a6485..1fb732e19eb9 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeImage.java +++ b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeImage.java @@ -41,10 +41,10 @@ public class CrossfadeImage extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.crossfade_image); - ViewGroup container = (ViewGroup) findViewById(R.id.container); + ViewGroup container = findViewById(R.id.container); mSceneRoot = container; - mImageView = (ImageView) findViewById(R.id.contact_picture); + mImageView = findViewById(R.id.contact_picture); mImageView.setScaleType(ImageView.ScaleType.FIT_CENTER); Crossfade mCrossfade = new Crossfade(); diff --git a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java index 469ee8b28a9f..15d15351957e 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java +++ b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java @@ -49,12 +49,12 @@ public class CrossfadeMultiple extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.crossfade_multiple); - ViewGroup container = (ViewGroup) findViewById(R.id.container); + ViewGroup container = findViewById(R.id.container); mSceneRoot = container; - mButton = (Button) findViewById(R.id.button); - mImageView = (ImageView) findViewById(R.id.imageview); - mTextView = (TextView) findViewById(R.id.textview); + mButton = findViewById(R.id.button); + mImageView = findViewById(R.id.imageview); + mTextView = findViewById(R.id.textview); mCrossfade = new Crossfade(); mCrossfade.addTarget(R.id.button).addTarget(R.id.textview).addTarget(R.id.imageview); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo0.java b/tests/TransitionTests/src/com/android/transitiontests/Demo0.java index d52ab1dc55ba..e1729045a42e 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo0.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo0.java @@ -35,7 +35,7 @@ public class Demo0 extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mCurrentScene = SEARCH_SCREEN; diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo1.java b/tests/TransitionTests/src/com/android/transitiontests/Demo1.java index 5b5eb156bba0..e92dd039c428 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo1.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo1.java @@ -40,7 +40,7 @@ public class Demo1 extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); // mResultsScreen = new MyScene(mSceneRoot, R.layout.results_screen); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo2.java b/tests/TransitionTests/src/com/android/transitiontests/Demo2.java index 0f3257bbadad..c26723bc89e2 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo2.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo2.java @@ -38,7 +38,7 @@ public class Demo2 extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); } diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo3.java b/tests/TransitionTests/src/com/android/transitiontests/Demo3.java index 0ffa1f534834..094ab97ddacb 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo3.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo3.java @@ -38,7 +38,7 @@ public class Demo3 extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo4.java b/tests/TransitionTests/src/com/android/transitiontests/Demo4.java index 3aadbb0ae670..af67f26b3707 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo4.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo4.java @@ -38,7 +38,7 @@ public class Demo4 extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo5.java b/tests/TransitionTests/src/com/android/transitiontests/Demo5.java index c36abda081b3..f01a29d60293 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo5.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo5.java @@ -33,7 +33,7 @@ public class Demo5 extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/FadingHierarchy.java b/tests/TransitionTests/src/com/android/transitiontests/FadingHierarchy.java index d497abe8d3d9..40bf975eb5a8 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/FadingHierarchy.java +++ b/tests/TransitionTests/src/com/android/transitiontests/FadingHierarchy.java @@ -34,11 +34,11 @@ public class FadingHierarchy extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.fading_hierarchy); - mContainer = (ViewGroup) findViewById(R.id.container); - mRemovingContainer = (ViewGroup) findViewById(R.id.removingContainer); + mContainer = findViewById(R.id.container); + mRemovingContainer = findViewById(R.id.removingContainer); mInnerContainerParent = (ViewGroup) mRemovingContainer.getParent(); - mRemovingButton = (Button) findViewById(R.id.removingButton); + mRemovingButton = findViewById(R.id.removingButton); } public void sendMessage(View view) { diff --git a/tests/TransitionTests/src/com/android/transitiontests/FadingTest.java b/tests/TransitionTests/src/com/android/transitiontests/FadingTest.java index 29fb868794f4..83073666d6a0 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/FadingTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/FadingTest.java @@ -43,13 +43,13 @@ public class FadingTest extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.fading_test); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mRemovingButton = (Button) findViewById(R.id.removingButton); - mInvisibleButton = (Button) findViewById(R.id.invisibleButton); - mGoneButton = (Button) findViewById(R.id.goneButton); + mRemovingButton = findViewById(R.id.removingButton); + mInvisibleButton = findViewById(R.id.invisibleButton); + mGoneButton = findViewById(R.id.goneButton); mGoneButton.setOnClickListener(new View.OnClickListener() { @Override diff --git a/tests/TransitionTests/src/com/android/transitiontests/InstanceTargets.java b/tests/TransitionTests/src/com/android/transitiontests/InstanceTargets.java index a06ba8fb61d1..025e4e313738 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/InstanceTargets.java +++ b/tests/TransitionTests/src/com/android/transitiontests/InstanceTargets.java @@ -37,7 +37,7 @@ public class InstanceTargets extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.instance_targets); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container; } diff --git a/tests/TransitionTests/src/com/android/transitiontests/InterruptionTest.java b/tests/TransitionTests/src/com/android/transitiontests/InterruptionTest.java index c26e93f95ed3..6186150d772a 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/InterruptionTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/InterruptionTest.java @@ -40,17 +40,17 @@ public class InterruptionTest extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.interruption); - ViewGroup sceneRoot = (ViewGroup) findViewById(R.id.sceneRoot); + ViewGroup sceneRoot = findViewById(R.id.sceneRoot); mScene1 = Scene.getSceneForLayout(sceneRoot, R.layout.interruption_inner_1, this); mScene2 = Scene.getSceneForLayout(sceneRoot, R.layout.interruption_inner_2, this); mScene3 = Scene.getSceneForLayout(sceneRoot, R.layout.interruption_inner_3, this); mScene4 = Scene.getSceneForLayout(sceneRoot, R.layout.interruption_inner_4, this); - mScene1RB = (RadioButton) findViewById(R.id.scene1RB); - mScene2RB = (RadioButton) findViewById(R.id.scene2RB); - mScene3RB = (RadioButton) findViewById(R.id.scene3RB); - mScene4RB = (RadioButton) findViewById(R.id.scene4RB); + mScene1RB = findViewById(R.id.scene1RB); + mScene2RB = findViewById(R.id.scene2RB); + mScene3RB = findViewById(R.id.scene3RB); + mScene4RB = findViewById(R.id.scene4RB); ChangeBounds changeBounds1 = new ChangeBounds(); changeBounds1.addTarget(R.id.button); diff --git a/tests/TransitionTests/src/com/android/transitiontests/ListViewAddRemove.java b/tests/TransitionTests/src/com/android/transitiontests/ListViewAddRemove.java index 251bf24e8a39..45b8286f6d0b 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ListViewAddRemove.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ListViewAddRemove.java @@ -47,9 +47,9 @@ public class ListViewAddRemove extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.list_view_add_remove); - final LinearLayout container = (LinearLayout) findViewById(R.id.container); + final LinearLayout container = findViewById(R.id.container); - final ListView listview = (ListView) findViewById(R.id.listview); + final ListView listview = findViewById(R.id.listview); for (int i = 0; i < 200; ++i) { numList.add(Integer.toString(i)); } diff --git a/tests/TransitionTests/src/com/android/transitiontests/LoginActivity.java b/tests/TransitionTests/src/com/android/transitiontests/LoginActivity.java index 92bbb85edb52..96b018b9f8e0 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/LoginActivity.java +++ b/tests/TransitionTests/src/com/android/transitiontests/LoginActivity.java @@ -40,7 +40,7 @@ public class LoginActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mLoginScene = Scene.getSceneForLayout(mSceneRoot, R.layout.activity_login, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/OverlayTest.java b/tests/TransitionTests/src/com/android/transitiontests/OverlayTest.java index ef8cd3709413..384762b206be 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/OverlayTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/OverlayTest.java @@ -32,12 +32,12 @@ public class OverlayTest extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.overlay_test); - mContainer = (ViewGroup) findViewById(R.id.container); + mContainer = findViewById(R.id.container); mRoot = (ViewGroup) mContainer.getParent(); } public void onClick(View view) { - final Button fadingButton = (Button) findViewById(R.id.fadingButton); + final Button fadingButton = findViewById(R.id.fadingButton); if (fadingButton != null) { mContainer.removeView(fadingButton); mRoot.getOverlay().add(fadingButton); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Reparenting.java b/tests/TransitionTests/src/com/android/transitiontests/Reparenting.java index 1ee862177e23..772ddc793334 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Reparenting.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Reparenting.java @@ -34,9 +34,9 @@ public class Reparenting extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.reparenting); - ViewGroup container = (ViewGroup) findViewById(R.id.container); - mContainer1 = (ViewGroup) findViewById(R.id.container1); - mContainer2 = (ViewGroup) findViewById(R.id.container2); + ViewGroup container = findViewById(R.id.container); + mContainer1 = findViewById(R.id.container1); + mContainer2 = findViewById(R.id.container2); System.out.println("container 1 and 2 " + mContainer1 + ", " + mContainer2); setupButtons(0, mContainer1); diff --git a/tests/TransitionTests/src/com/android/transitiontests/ResourceLoadingTest.java b/tests/TransitionTests/src/com/android/transitiontests/ResourceLoadingTest.java index 1aee258343c4..96d3ae1fb354 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ResourceLoadingTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ResourceLoadingTest.java @@ -39,7 +39,7 @@ public class ResourceLoadingTest extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mCurrentScene = SEARCH_SCREEN; diff --git a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTargets.java b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTargets.java index 7504058d315b..7ee4b3e7aa25 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTargets.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTargets.java @@ -39,7 +39,7 @@ public class ScenesTestAutoTargets extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition.java b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition.java index 23b28ec0fb2b..9333ea1c093b 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition.java @@ -37,7 +37,7 @@ public class ScenesTestAutoTransition extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestv21.java b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestv21.java index ecf5ef349c25..a01f6382b154 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestv21.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestv21.java @@ -39,7 +39,7 @@ public class ScenesTestv21 extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.search_screen); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/SequenceTest.java b/tests/TransitionTests/src/com/android/transitiontests/SequenceTest.java index c550e92f62d6..5f4560cceb06 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/SequenceTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/SequenceTest.java @@ -41,12 +41,12 @@ public class SequenceTest extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.fading_test); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mRemovingButton = (Button) findViewById(R.id.removingButton); - mInvisibleButton = (Button) findViewById(R.id.invisibleButton); - mGoneButton = (Button) findViewById(R.id.goneButton); + mRemovingButton = findViewById(R.id.removingButton); + mInvisibleButton = findViewById(R.id.invisibleButton); + mGoneButton = findViewById(R.id.goneButton); mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test, this); mScene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test_scene_2, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/SequenceTestSimple.java b/tests/TransitionTests/src/com/android/transitiontests/SequenceTestSimple.java index 92b169ec9e1f..f478cb8630f5 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/SequenceTestSimple.java +++ b/tests/TransitionTests/src/com/android/transitiontests/SequenceTestSimple.java @@ -42,10 +42,10 @@ public class SequenceTestSimple extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.fading_test_simple); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mRemovingButton = (Button) findViewById(R.id.removingButton); + mRemovingButton = findViewById(R.id.removingButton); mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test_simple, this); mScene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test_simple2, this); diff --git a/tests/TransitionTests/src/com/android/transitiontests/SurfaceAndTextureViews.java b/tests/TransitionTests/src/com/android/transitiontests/SurfaceAndTextureViews.java index 9b246adb08cb..8819c40bb27a 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/SurfaceAndTextureViews.java +++ b/tests/TransitionTests/src/com/android/transitiontests/SurfaceAndTextureViews.java @@ -48,8 +48,8 @@ public class SurfaceAndTextureViews extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.surface_texture_views); - final ViewGroup container = (ViewGroup) findViewById(R.id.container); - Button toggleButton = (Button) findViewById(R.id.toggleButton); + final ViewGroup container = findViewById(R.id.container); + Button toggleButton = findViewById(R.id.toggleButton); mView = new SimpleView(this); mView.setId(0); diff --git a/tests/TransitionTests/src/com/android/transitiontests/UniqueIds.java b/tests/TransitionTests/src/com/android/transitiontests/UniqueIds.java index c8249561ef2b..b2b24bc22600 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/UniqueIds.java +++ b/tests/TransitionTests/src/com/android/transitiontests/UniqueIds.java @@ -40,7 +40,7 @@ public class UniqueIds extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.unique_id_test); - LinearLayout container = (LinearLayout) findViewById(R.id.container); + LinearLayout container = findViewById(R.id.container); LayoutInflater inflater = getLayoutInflater(); Button button = (Button) inflater.inflate(R.layout.button_template, null); container.addView(button); diff --git a/tests/UiBench/src/com/android/test/uibench/ActivityTransition.java b/tests/UiBench/src/com/android/test/uibench/ActivityTransition.java index 0a069c269697..c212c4cbf61a 100644 --- a/tests/UiBench/src/com/android/test/uibench/ActivityTransition.java +++ b/tests/UiBench/src/com/android/test/uibench/ActivityTransition.java @@ -94,7 +94,7 @@ public class ActivityTransition extends AppCompatActivity { setupHero(); // Ensure that all images are visible regardless of orientation. - GridLayout gridLayout = (GridLayout) findViewById(R.id.transition_grid_layout); + GridLayout gridLayout = findViewById(R.id.transition_grid_layout); boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; gridLayout.setRowCount(isPortrait ? 4 : 2); @@ -105,7 +105,7 @@ public class ActivityTransition extends AppCompatActivity { String name = getIntent().getStringExtra(KEY_ID); mHero = null; if (name != null) { - mHero = (ImageView) findViewById(getIdForKey(name)); + mHero = findViewById(getIdForKey(name)); setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, diff --git a/tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java b/tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java index a654c6107134..a4d57e173bfa 100644 --- a/tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java +++ b/tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java @@ -39,7 +39,7 @@ public class ActivityTransitionDetails extends AppCompatActivity { super.onCreate(savedInstanceState); getWindow().setBackgroundDrawable(new ColorDrawable(Color.DKGRAY)); setContentView(R.layout.activity_transition_details); - ImageView titleImage = (ImageView) findViewById(R.id.titleImage); + ImageView titleImage = findViewById(R.id.titleImage); titleImage.setImageDrawable(getHeroDrawable()); } diff --git a/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java b/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java index e2bf8976a315..235e0e61b353 100644 --- a/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java +++ b/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java @@ -80,7 +80,7 @@ public class BitmapUploadActivity extends AppCompatActivity { setContentView(R.layout.activity_bitmap_upload); // animate color to force bitmap uploads - UploadView uploadView = (UploadView) findViewById(R.id.upload_view); + UploadView uploadView = findViewById(R.id.upload_view); ObjectAnimator colorValueAnimator = ObjectAnimator.ofInt(uploadView, "colorValue", 0, 255); colorValueAnimator.setRepeatMode(ValueAnimator.REVERSE); colorValueAnimator.setRepeatCount(ValueAnimator.INFINITE); diff --git a/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java b/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java index 7454124b5ed0..fee7480fa65e 100644 --- a/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java +++ b/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java @@ -35,16 +35,16 @@ public class ClippedListActivity extends AppCompatActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation_drawer); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + DrawerLayout drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); - NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); + NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); FragmentManager fm = getSupportFragmentManager(); @@ -59,7 +59,7 @@ public class ClippedListActivity extends AppCompatActivity @Override public boolean onNavigationItemSelected(MenuItem item) { - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + DrawerLayout drawer = findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } diff --git a/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java b/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java index 1d68767b2db2..a54110454f7a 100644 --- a/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java +++ b/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java @@ -31,22 +31,22 @@ public class NavigationDrawerActivity extends AppCompatActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation_drawer); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + DrawerLayout drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); - NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); + NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); } @Override public boolean onNavigationItemSelected(MenuItem item) { - DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + DrawerLayout drawer = findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } diff --git a/tests/UiBench/src/com/android/test/uibench/RenderingJitter.java b/tests/UiBench/src/com/android/test/uibench/RenderingJitter.java index e2a9bcb0d2af..e1df7d3e28ac 100644 --- a/tests/UiBench/src/com/android/test/uibench/RenderingJitter.java +++ b/tests/UiBench/src/com/android/test/uibench/RenderingJitter.java @@ -85,12 +85,12 @@ public class RenderingJitter extends Activity { View content = findViewById(android.R.id.content); content.setBackground(new AnimatedBackgroundDrawable()); content.setKeepScreenOn(true); - mJitterReport = (TextView) findViewById(R.id.jitter_mma); - mMostlyTotalFrameTimeReport = (TextView) findViewById(R.id.totalish_mma); - mUiFrameTimeReport = (TextView) findViewById(R.id.ui_frametime_mma); - mRenderThreadTimeReport = (TextView) findViewById(R.id.rt_frametime_mma); - mTotalFrameTimeReport = (TextView) findViewById(R.id.total_mma); - mGraph = (PointGraphView) findViewById(R.id.graph); + mJitterReport = findViewById(R.id.jitter_mma); + mMostlyTotalFrameTimeReport = findViewById(R.id.totalish_mma); + mUiFrameTimeReport = findViewById(R.id.ui_frametime_mma); + mRenderThreadTimeReport = findViewById(R.id.rt_frametime_mma); + mTotalFrameTimeReport = findViewById(R.id.total_mma); + mGraph = findViewById(R.id.graph); mJitterReport.setText("abcdefghijklmnopqrstuvwxyz"); mMostlyTotalFrameTimeReport.setText("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); mUiFrameTimeReport.setText("0123456789"); diff --git a/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/src/com/android/hardware/usb/externalmanagementtest/UsbHostManagementActivity.java b/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/src/com/android/hardware/usb/externalmanagementtest/UsbHostManagementActivity.java index 2d9226ff4246..af8b846385b0 100644 --- a/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/src/com/android/hardware/usb/externalmanagementtest/UsbHostManagementActivity.java +++ b/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/src/com/android/hardware/usb/externalmanagementtest/UsbHostManagementActivity.java @@ -68,12 +68,12 @@ public class UsbHostManagementActivity extends Activity Log.i(TAG, "onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.host_management); - mDeviceInfoText = (TextView) findViewById(R.id.device_info_text); - mStartAoapButton = (Button) findViewById(R.id.start_aoap_button); - mStartAoapActivityButton = (Button) findViewById(R.id.start_aoap_activity_button); - mAoapAppLog = (TextView) findViewById(R.id.aoap_apps_text); - mResetUsbButton = (Button) findViewById(R.id.reset_button); - mFinishButton = (Button) findViewById(R.id.finish_button); + mDeviceInfoText = findViewById(R.id.device_info_text); + mStartAoapButton = findViewById(R.id.start_aoap_button); + mStartAoapActivityButton = findViewById(R.id.start_aoap_activity_button); + mAoapAppLog = findViewById(R.id.aoap_apps_text); + mResetUsbButton = findViewById(R.id.reset_button); + mFinishButton = findViewById(R.id.finish_button); Intent intent = getIntent(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) { diff --git a/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableAttr.java b/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableAttr.java index 8de2f6b42840..47ca482b7771 100644 --- a/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableAttr.java +++ b/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableAttr.java @@ -25,7 +25,7 @@ public class AnimatedVectorDrawableAttr extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animated_vector_drawable_attr); - ImageView avdIv = (ImageView) findViewById(R.id.avd); + ImageView avdIv = findViewById(R.id.avd); AnimatedVectorDrawable avd = (AnimatedVectorDrawable) avdIv.getDrawable(); avd.start(); } diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/StartVoiceInteractionActivity.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/StartVoiceInteractionActivity.java index 41058c9ba8a4..733f602f6c14 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/StartVoiceInteractionActivity.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/StartVoiceInteractionActivity.java @@ -55,9 +55,9 @@ public class StartVoiceInteractionActivity extends Activity implements View.OnCl mPickButton.setOnClickListener(this); mCancelButton = (Button)findViewById(R.id.cancel); mCancelButton.setOnClickListener(this); - mStartButton = (Button) findViewById(R.id.start); + mStartButton = findViewById(R.id.start); mStartButton.setOnClickListener(this); - mStopButton = (Button) findViewById(R.id.stop); + mStopButton = findViewById(R.id.stop); mStopButton.setOnClickListener(this); mLog.append("Local Voice Interaction Supported = " + isLocalVoiceInteractionSupported()); diff --git a/tests/WallpaperTest/src/com/example/wallpapertest/MainActivity.java b/tests/WallpaperTest/src/com/example/wallpapertest/MainActivity.java index 7880f6721193..63e11a75f73a 100644 --- a/tests/WallpaperTest/src/com/example/wallpapertest/MainActivity.java +++ b/tests/WallpaperTest/src/com/example/wallpapertest/MainActivity.java @@ -58,28 +58,28 @@ public class MainActivity extends Activity { mWallpaperManager = (WallpaperManager)getSystemService(Context.WALLPAPER_SERVICE); mWindowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE); - mDimenWidthView = (TextView) findViewById(R.id.dimen_width); + mDimenWidthView = findViewById(R.id.dimen_width); mDimenWidthView.addTextChangedListener(mTextWatcher); - mDimenHeightView = (TextView) findViewById(R.id.dimen_height); + mDimenHeightView = findViewById(R.id.dimen_height); mDimenHeightView.addTextChangedListener(mTextWatcher); - mWallOffXView = (TextView) findViewById(R.id.walloff_x); + mWallOffXView = findViewById(R.id.walloff_x); mWallOffXView.addTextChangedListener(mTextWatcher); - mWallOffYView = (TextView) findViewById(R.id.walloff_y); + mWallOffYView = findViewById(R.id.walloff_y); mWallOffYView.addTextChangedListener(mTextWatcher); - mPaddingLeftView = (TextView) findViewById(R.id.padding_left); + mPaddingLeftView = findViewById(R.id.padding_left); mPaddingLeftView.addTextChangedListener(mTextWatcher); - mPaddingRightView = (TextView) findViewById(R.id.padding_right); + mPaddingRightView = findViewById(R.id.padding_right); mPaddingRightView.addTextChangedListener(mTextWatcher); - mPaddingTopView = (TextView) findViewById(R.id.padding_top); + mPaddingTopView = findViewById(R.id.padding_top); mPaddingTopView.addTextChangedListener(mTextWatcher); - mPaddingBottomView = (TextView) findViewById(R.id.padding_bottom); + mPaddingBottomView = findViewById(R.id.padding_bottom); mPaddingBottomView.addTextChangedListener(mTextWatcher); - mDispOffXView = (TextView) findViewById(R.id.dispoff_x); + mDispOffXView = findViewById(R.id.dispoff_x); mDispOffXView.addTextChangedListener(mTextWatcher); - mDispOffYView = (TextView) findViewById(R.id.dispoff_y); + mDispOffYView = findViewById(R.id.dispoff_y); mDispOffYView.addTextChangedListener(mTextWatcher); updateDimens(); diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index c562cb95ee31..7c7a3f83a826 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -42,6 +42,7 @@ import android.net.INetworkStatsService; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; +import android.net.MatchAllNetworkSpecifier; import android.net.Network; import android.net.NetworkAgent; import android.net.NetworkCapabilities; @@ -51,7 +52,9 @@ import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkMisc; import android.net.NetworkRequest; +import android.net.NetworkSpecifier; import android.net.RouteInfo; +import android.net.StringNetworkSpecifier; import android.net.metrics.IpConnectivityLog; import android.net.util.MultinetworkPolicyTracker; import android.os.ConditionVariable; @@ -64,12 +67,15 @@ import android.os.Message; import android.os.MessageQueue; import android.os.Messenger; import android.os.MessageQueue.IdleHandler; +import android.os.Parcel; +import android.os.Parcelable; import android.os.Process; import android.os.SystemClock; import android.provider.Settings; import android.test.AndroidTestCase; import android.test.mock.MockContentResolver; import android.test.suitebuilder.annotation.SmallTest; +import android.text.TextUtils; import android.util.Log; import android.util.LogPrinter; @@ -319,6 +325,11 @@ public class ConnectivityServiceTest extends AndroidTestCase { mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); } + public void setNetworkSpecifier(NetworkSpecifier networkSpecifier) { + mNetworkCapabilities.setNetworkSpecifier(networkSpecifier); + mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); + } + public void connectWithoutInternet() { mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null); mNetworkAgent.sendNetworkInfo(mNetworkInfo); @@ -1819,34 +1830,130 @@ public class ConnectivityServiceTest extends AndroidTestCase { captivePortalCallback.assertNoCallback(); } + private NetworkRequest.Builder newWifiRequestBuilder() { + return new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI); + } + @SmallTest - public void testInvalidNetworkSpecifier() { - boolean execptionCalled = true; + public void testNetworkSpecifier() { + NetworkRequest rEmpty1 = newWifiRequestBuilder().build(); + NetworkRequest rEmpty2 = newWifiRequestBuilder().setNetworkSpecifier((String) null).build(); + NetworkRequest rEmpty3 = newWifiRequestBuilder().setNetworkSpecifier("").build(); + NetworkRequest rEmpty4 = newWifiRequestBuilder().setNetworkSpecifier( + (NetworkSpecifier) null).build(); + NetworkRequest rFoo = newWifiRequestBuilder().setNetworkSpecifier("foo").build(); + NetworkRequest rBar = newWifiRequestBuilder().setNetworkSpecifier( + new StringNetworkSpecifier("bar")).build(); + + TestNetworkCallback cEmpty1 = new TestNetworkCallback(); + TestNetworkCallback cEmpty2 = new TestNetworkCallback(); + TestNetworkCallback cEmpty3 = new TestNetworkCallback(); + TestNetworkCallback cEmpty4 = new TestNetworkCallback(); + TestNetworkCallback cFoo = new TestNetworkCallback(); + TestNetworkCallback cBar = new TestNetworkCallback(); + TestNetworkCallback[] emptyCallbacks = new TestNetworkCallback[] { + cEmpty1, cEmpty2, cEmpty3 }; + + mCm.registerNetworkCallback(rEmpty1, cEmpty1); + mCm.registerNetworkCallback(rEmpty2, cEmpty2); + mCm.registerNetworkCallback(rEmpty3, cEmpty3); + mCm.registerNetworkCallback(rEmpty4, cEmpty4); + mCm.registerNetworkCallback(rFoo, cFoo); + mCm.registerNetworkCallback(rBar, cBar); + + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false); + cEmpty1.expectAvailableCallbacks(mWiFiNetworkAgent); + cEmpty2.expectAvailableCallbacks(mWiFiNetworkAgent); + cEmpty3.expectAvailableCallbacks(mWiFiNetworkAgent); + cEmpty4.expectAvailableCallbacks(mWiFiNetworkAgent); + assertNoCallbacks(cFoo, cBar); + + mWiFiNetworkAgent.setNetworkSpecifier(new StringNetworkSpecifier("foo")); + cFoo.expectAvailableCallbacks(mWiFiNetworkAgent); + for (TestNetworkCallback c: emptyCallbacks) { + c.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent); + } + cFoo.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent); + cFoo.assertNoCallback(); + + mWiFiNetworkAgent.setNetworkSpecifier(new StringNetworkSpecifier("bar")); + cFoo.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + cBar.expectAvailableCallbacks(mWiFiNetworkAgent); + for (TestNetworkCallback c: emptyCallbacks) { + c.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent); + } + cBar.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent); + cBar.assertNoCallback(); + + mWiFiNetworkAgent.setNetworkSpecifier(null); + cBar.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + for (TestNetworkCallback c: emptyCallbacks) { + c.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent); + } + + assertNoCallbacks(cEmpty1, cEmpty2, cEmpty3, cFoo, cBar); + } + @SmallTest + public void testInvalidNetworkSpecifier() { try { NetworkRequest.Builder builder = new NetworkRequest.Builder(); - builder.setNetworkSpecifier(MATCH_ALL_REQUESTS_NETWORK_SPECIFIER); - execptionCalled = false; - } catch (IllegalArgumentException e) { - // do nothing - should get here + builder.setNetworkSpecifier(new MatchAllNetworkSpecifier()); + fail("NetworkRequest builder with MatchAllNetworkSpecifier"); + } catch (IllegalArgumentException expected) { + // expected } - assertTrue("NetworkRequest builder with MATCH_ALL_REQUESTS_NETWORK_SPECIFIER", - execptionCalled); - try { NetworkCapabilities networkCapabilities = new NetworkCapabilities(); networkCapabilities.addTransportType(TRANSPORT_WIFI) - .setNetworkSpecifier(NetworkCapabilities.MATCH_ALL_REQUESTS_NETWORK_SPECIFIER); + .setNetworkSpecifier(new MatchAllNetworkSpecifier()); mService.requestNetwork(networkCapabilities, null, 0, null, ConnectivityManager.TYPE_WIFI); - execptionCalled = false; - } catch (IllegalArgumentException e) { - // do nothing - should get here + fail("ConnectivityService requestNetwork with MatchAllNetworkSpecifier"); + } catch (IllegalArgumentException expected) { + // expected + } + + class NonParcelableSpecifier extends NetworkSpecifier { + public boolean satisfiedBy(NetworkSpecifier other) { return false; } + }; + class ParcelableSpecifier extends NonParcelableSpecifier implements Parcelable { + @Override public int describeContents() { return 0; } + @Override public void writeToParcel(Parcel p, int flags) {} + } + NetworkRequest.Builder builder; + + builder = new NetworkRequest.Builder().addTransportType(TRANSPORT_ETHERNET); + try { + builder.setNetworkSpecifier(new NonParcelableSpecifier()); + Parcel parcelW = Parcel.obtain(); + builder.build().writeToParcel(parcelW, 0); + fail("Parceling a non-parcelable specifier did not throw an exception"); + } catch (Exception e) { + // expected } - assertTrue("ConnectivityService requestNetwork with MATCH_ALL_REQUESTS_NETWORK_SPECIFIER", - execptionCalled); + builder = new NetworkRequest.Builder().addTransportType(TRANSPORT_ETHERNET); + builder.setNetworkSpecifier(new ParcelableSpecifier()); + NetworkRequest nr = builder.build(); + assertNotNull(nr); + + try { + Parcel parcelW = Parcel.obtain(); + nr.writeToParcel(parcelW, 0); + byte[] bytes = parcelW.marshall(); + parcelW.recycle(); + + Parcel parcelR = Parcel.obtain(); + parcelR.unmarshall(bytes, 0, bytes.length); + parcelR.setDataPosition(0); + NetworkRequest rereadNr = NetworkRequest.CREATOR.createFromParcel(parcelR); + fail("Unparceling a non-framework NetworkSpecifier did not throw an exception"); + } catch (Exception e) { + // expected + } } @SmallTest |