Merge "Fix status bar autohide with DirectReply" into nyc-dev
diff --git a/api/current.txt b/api/current.txt
index 3bd607b..ebda35c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -299,13 +299,13 @@
field public static final int backgroundTint = 16843883; // 0x101046b
field public static final int backgroundTintMode = 16843884; // 0x101046c
field public static final int backupAgent = 16843391; // 0x101027f
- field public static final int backupInForeground = 16844058; // 0x101051a
+ field public static final int backupInForeground = 16844059; // 0x101051b
field public static final int banner = 16843762; // 0x10103f2
field public static final int baseline = 16843548; // 0x101031c
field public static final int baselineAlignBottom = 16843042; // 0x1010122
field public static final int baselineAligned = 16843046; // 0x1010126
field public static final int baselineAlignedChildIndex = 16843047; // 0x1010127
- field public static final int bitmap = 16844054; // 0x1010516
+ field public static final int bitmap = 16844055; // 0x1010517
field public static final int borderlessButtonStyle = 16843563; // 0x101032b
field public static final int bottom = 16843184; // 0x10101b0
field public static final int bottomBright = 16842957; // 0x10100cd
@@ -324,7 +324,7 @@
field public static final int buttonBarNeutralButtonStyle = 16843914; // 0x101048a
field public static final int buttonBarPositiveButtonStyle = 16843913; // 0x1010489
field public static final int buttonBarStyle = 16843566; // 0x101032e
- field public static final int buttonGravity = 16844030; // 0x10104fe
+ field public static final int buttonGravity = 16844031; // 0x10104ff
field public static final int buttonStyle = 16842824; // 0x1010048
field public static final int buttonStyleInset = 16842826; // 0x101004a
field public static final int buttonStyleSmall = 16842825; // 0x1010049
@@ -335,9 +335,9 @@
field public static final int calendarTextColor = 16843931; // 0x101049b
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
- field public static final int canControlMagnification = 16844039; // 0x1010507
- field public static final int canPerformGestures = 16844045; // 0x101050d
- field public static final int canRecord = 16844060; // 0x101051c
+ field public static final int canControlMagnification = 16844040; // 0x1010508
+ field public static final int canPerformGestures = 16844046; // 0x101050e
+ field public static final int canRecord = 16844061; // 0x101051d
field public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
field public static final int canRequestFilterKeyEvents = 16843737; // 0x10103d9
field public static final int canRequestTouchExplorationMode = 16843735; // 0x10103d7
@@ -377,7 +377,7 @@
field public static final int codes = 16843330; // 0x1010242
field public static final int collapseColumns = 16843083; // 0x101014b
field public static final int collapseContentDescription = 16843984; // 0x10104d0
- field public static final int collapseIcon = 16844031; // 0x10104ff
+ field public static final int collapseIcon = 16844032; // 0x1010500
field public static final int color = 16843173; // 0x10101a5
field public static final int colorAccent = 16843829; // 0x1010435
field public static final int colorActivatedHighlight = 16843664; // 0x1010390
@@ -414,18 +414,18 @@
field public static final int contentAuthority = 16843408; // 0x1010290
field public static final int contentDescription = 16843379; // 0x1010273
field public static final int contentInsetEnd = 16843860; // 0x1010454
- field public static final int contentInsetEndWithActions = 16844067; // 0x1010523
+ field public static final int contentInsetEndWithActions = 16844070; // 0x1010526
field public static final int contentInsetLeft = 16843861; // 0x1010455
field public static final int contentInsetRight = 16843862; // 0x1010456
field public static final int contentInsetStart = 16843859; // 0x1010453
- field public static final int contentInsetStartWithNavigation = 16844066; // 0x1010522
+ field public static final int contentInsetStartWithNavigation = 16844069; // 0x1010525
field public static final int contextClickable = 16844007; // 0x10104e7
- field public static final int contextPopupMenuStyle = 16844033; // 0x1010501
+ field public static final int contextPopupMenuStyle = 16844034; // 0x1010502
field public static final int controlX1 = 16843772; // 0x10103fc
field public static final int controlX2 = 16843774; // 0x10103fe
field public static final int controlY1 = 16843773; // 0x10103fd
field public static final int controlY2 = 16843775; // 0x10103ff
- field public static final int countDown = 16844059; // 0x101051b
+ field public static final int countDown = 16844060; // 0x101051c
field public static final int country = 16843962; // 0x10104ba
field public static final int cropToPadding = 16843043; // 0x1010123
field public static final int cursorVisible = 16843090; // 0x1010152
@@ -443,7 +443,7 @@
field public static final deprecated int dayOfWeekTextAppearance = 16843925; // 0x1010495
field public static final int debuggable = 16842767; // 0x101000f
field public static final int defaultHeight = 16844021; // 0x10104f5
- field public static final int defaultToDeviceProtectedStorage = 16844036; // 0x1010504
+ field public static final int defaultToDeviceProtectedStorage = 16844037; // 0x1010505
field public static final int defaultValue = 16843245; // 0x10101ed
field public static final int defaultWidth = 16844020; // 0x10104f4
field public static final int delay = 16843212; // 0x10101cc
@@ -463,7 +463,7 @@
field public static final int dialogTheme = 16843528; // 0x1010308
field public static final int dialogTitle = 16843250; // 0x10101f2
field public static final int digits = 16843110; // 0x1010166
- field public static final int directBootAware = 16844037; // 0x1010505
+ field public static final int directBootAware = 16844038; // 0x1010506
field public static final int direction = 16843217; // 0x10101d1
field public static final deprecated int directionDescriptions = 16843681; // 0x10103a1
field public static final int directionPriority = 16843218; // 0x10101d2
@@ -511,12 +511,12 @@
field public static final int elevation = 16843840; // 0x1010440
field public static final int ellipsize = 16842923; // 0x10100ab
field public static final int ems = 16843096; // 0x1010158
- field public static final int enableVrMode = 16844069; // 0x1010525
+ field public static final int enableVrMode = 16844072; // 0x1010528
field public static final int enabled = 16842766; // 0x101000e
field public static final int end = 16843996; // 0x10104dc
field public static final int endColor = 16843166; // 0x101019e
- field public static final int endX = 16844050; // 0x1010512
- field public static final int endY = 16844051; // 0x1010513
+ field public static final int endX = 16844051; // 0x1010513
+ field public static final int endY = 16844052; // 0x1010514
field public static final deprecated int endYear = 16843133; // 0x101017d
field public static final int enterFadeDuration = 16843532; // 0x101030c
field public static final int entries = 16842930; // 0x10100b2
@@ -536,7 +536,7 @@
field public static final int expandableListViewStyle = 16842863; // 0x101006f
field public static final int expandableListViewWhiteStyle = 16843446; // 0x10102b6
field public static final int exported = 16842768; // 0x1010010
- field public static final int externalService = 16844046; // 0x101050e
+ field public static final int externalService = 16844047; // 0x101050f
field public static final int extraTension = 16843371; // 0x101026b
field public static final int extractNativeLibs = 16844010; // 0x10104ea
field public static final int factor = 16843219; // 0x10101d3
@@ -561,7 +561,7 @@
field public static final int fillBefore = 16843196; // 0x10101bc
field public static final int fillColor = 16843780; // 0x1010404
field public static final int fillEnabled = 16843343; // 0x101024f
- field public static final int fillType = 16844062; // 0x101051e
+ field public static final int fillType = 16844064; // 0x1010520
field public static final int fillViewport = 16843130; // 0x101017a
field public static final int filter = 16843035; // 0x101011b
field public static final int filterTouchesWhenObscured = 16843460; // 0x10102c4
@@ -577,7 +577,7 @@
field public static final int fontFamily = 16843692; // 0x10103ac
field public static final int fontFeatureSettings = 16843959; // 0x10104b7
field public static final int footerDividersEnabled = 16843311; // 0x101022f
- field public static final int forceHasOverlappingRendering = 16844065; // 0x1010521
+ field public static final int forceHasOverlappingRendering = 16844068; // 0x1010524
field public static final int foreground = 16843017; // 0x1010109
field public static final int foregroundGravity = 16843264; // 0x1010200
field public static final int foregroundTint = 16843885; // 0x101046d
@@ -654,8 +654,8 @@
field public static final int horizontalScrollViewStyle = 16843603; // 0x1010353
field public static final int horizontalSpacing = 16843028; // 0x1010114
field public static final int host = 16842792; // 0x1010028
- field public static final int hotSpotX = 16844055; // 0x1010517
- field public static final int hotSpotY = 16844056; // 0x1010518
+ field public static final int hotSpotX = 16844056; // 0x1010518
+ field public static final int hotSpotY = 16844057; // 0x1010519
field public static final int hyphenationFrequency = 16843998; // 0x10104de
field public static final int icon = 16842754; // 0x1010002
field public static final int iconPreview = 16843337; // 0x1010249
@@ -742,7 +742,7 @@
field public static final int label = 16842753; // 0x1010001
field public static final int labelFor = 16843718; // 0x10103c6
field public static final int labelTextSize = 16843317; // 0x1010235
- field public static final int languageTag = 16844040; // 0x1010508
+ field public static final int languageTag = 16844041; // 0x1010509
field public static final int largeHeap = 16843610; // 0x101035a
field public static final int largeScreens = 16843398; // 0x1010286
field public static final int largestWidthLimitDp = 16843622; // 0x1010366
@@ -800,7 +800,7 @@
field public static final int layout_y = 16843136; // 0x1010180
field public static final int left = 16843181; // 0x10101ad
field public static final int letterSpacing = 16843958; // 0x10104b6
- field public static final int level = 16844032; // 0x1010500
+ field public static final int level = 16844033; // 0x1010501
field public static final int lineSpacingExtra = 16843287; // 0x1010217
field public static final int lineSpacingMultiplier = 16843288; // 0x1010218
field public static final int lines = 16843092; // 0x1010154
@@ -833,7 +833,7 @@
field public static final int marqueeRepeatLimit = 16843293; // 0x101021d
field public static final int matchOrder = 16843855; // 0x101044f
field public static final int max = 16843062; // 0x1010136
- field public static final int maxButtonHeight = 16844029; // 0x10104fd
+ field public static final int maxButtonHeight = 16844030; // 0x10104fe
field public static final int maxDate = 16843584; // 0x1010340
field public static final int maxEms = 16843095; // 0x1010157
field public static final int maxHeight = 16843040; // 0x1010120
@@ -876,25 +876,26 @@
field public static final int navigationMode = 16843471; // 0x10102cf
field public static final int negativeButtonText = 16843254; // 0x10101f6
field public static final int nestedScrollingEnabled = 16843830; // 0x1010436
- field public static final int networkSecurityConfig = 16844071; // 0x1010527
+ field public static final int networkSecurityConfig = 16844074; // 0x101052a
field public static final int nextFocusDown = 16842980; // 0x10100e4
field public static final int nextFocusForward = 16843580; // 0x101033c
field public static final int nextFocusLeft = 16842977; // 0x10100e1
field public static final int nextFocusRight = 16842978; // 0x10100e2
field public static final int nextFocusUp = 16842979; // 0x10100e3
+ field public static final int nfcAntennaPositionDrawable = 16844063; // 0x101051f
field public static final int noHistory = 16843309; // 0x101022d
field public static final int normalScreens = 16843397; // 0x1010285
field public static final int notificationTimeout = 16843651; // 0x1010383
field public static final int numColumns = 16843032; // 0x1010118
field public static final int numStars = 16843076; // 0x1010144
- field public static final int numberPickerStyle = 16844068; // 0x1010524
+ field public static final int numberPickerStyle = 16844071; // 0x1010527
field public static final int numbersBackgroundColor = 16843938; // 0x10104a2
field public static final int numbersInnerTextColor = 16844001; // 0x10104e1
field public static final int numbersSelectorColor = 16843939; // 0x10104a3
field public static final int numbersTextColor = 16843937; // 0x10104a1
field public static final deprecated int numeric = 16843109; // 0x1010165
field public static final int numericShortcut = 16843236; // 0x10101e4
- field public static final int offset = 16844052; // 0x1010514
+ field public static final int offset = 16844053; // 0x1010515
field public static final int onClick = 16843375; // 0x101026f
field public static final int oneshot = 16843159; // 0x1010197
field public static final int opacity = 16843550; // 0x101031e
@@ -941,13 +942,13 @@
field public static final deprecated int phoneNumber = 16843111; // 0x1010167
field public static final int pivotX = 16843189; // 0x10101b5
field public static final int pivotY = 16843190; // 0x10101b6
- field public static final int pointerIcon = 16844041; // 0x1010509
+ field public static final int pointerIcon = 16844042; // 0x101050a
field public static final int popupAnimationStyle = 16843465; // 0x10102c9
field public static final int popupBackground = 16843126; // 0x1010176
field public static final int popupCharacters = 16843332; // 0x1010244
field public static final int popupElevation = 16843916; // 0x101048c
- field public static final int popupEnterTransition = 16844063; // 0x101051f
- field public static final int popupExitTransition = 16844064; // 0x1010520
+ field public static final int popupEnterTransition = 16844065; // 0x1010521
+ field public static final int popupExitTransition = 16844066; // 0x1010522
field public static final int popupKeyboard = 16843331; // 0x1010243
field public static final int popupLayout = 16843323; // 0x101023b
field public static final int popupMenuStyle = 16843520; // 0x1010300
@@ -956,7 +957,7 @@
field public static final int port = 16842793; // 0x1010029
field public static final int positiveButtonText = 16843253; // 0x10101f5
field public static final int preferenceCategoryStyle = 16842892; // 0x101008c
- field public static final int preferenceFragmentStyle = 16844038; // 0x1010506
+ field public static final int preferenceFragmentStyle = 16844039; // 0x1010507
field public static final int preferenceInformationStyle = 16842893; // 0x101008d
field public static final int preferenceLayoutChild = 16842900; // 0x1010094
field public static final int preferenceScreenStyle = 16842891; // 0x101008b
@@ -1024,7 +1025,7 @@
field public static final int resizeClip = 16843983; // 0x10104cf
field public static final int resizeMode = 16843619; // 0x1010363
field public static final int resizeable = 16843405; // 0x101028d
- field public static final int resizeableActivity = 16844022; // 0x10104f6
+ field public static final int resizeableActivity = 16844023; // 0x10104f7
field public static final int resource = 16842789; // 0x1010025
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
@@ -1144,8 +1145,8 @@
field public static final int startColor = 16843165; // 0x101019d
field public static final int startDelay = 16843746; // 0x10103e2
field public static final int startOffset = 16843198; // 0x10101be
- field public static final int startX = 16844048; // 0x1010510
- field public static final int startY = 16844049; // 0x1010511
+ field public static final int startX = 16844049; // 0x1010511
+ field public static final int startY = 16844050; // 0x1010512
field public static final deprecated int startYear = 16843132; // 0x101017c
field public static final int stateListAnimator = 16843848; // 0x1010448
field public static final int stateNotNeeded = 16842774; // 0x1010016
@@ -1202,8 +1203,8 @@
field public static final int summaryOn = 16843247; // 0x10101ef
field public static final int supportsAssist = 16844016; // 0x10104f0
field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1
- field public static final int supportsLocalInteraction = 16844047; // 0x101050f
- field public static final int supportsPictureInPicture = 16844023; // 0x10104f7
+ field public static final int supportsLocalInteraction = 16844048; // 0x1010510
+ field public static final int supportsPictureInPicture = 16844024; // 0x10104f8
field public static final int supportsRtl = 16843695; // 0x10103af
field public static final int supportsSwitchingToNextInputMethod = 16843755; // 0x10103eb
field public static final int supportsUploading = 16843419; // 0x101029b
@@ -1252,7 +1253,7 @@
field public static final int textAppearanceListItemSmall = 16843679; // 0x101039f
field public static final int textAppearanceMedium = 16842817; // 0x1010041
field public static final int textAppearanceMediumInverse = 16842820; // 0x1010044
- field public static final int textAppearancePopupMenuHeader = 16844034; // 0x1010502
+ field public static final int textAppearancePopupMenuHeader = 16844035; // 0x1010503
field public static final int textAppearanceSearchResultSubtitle = 16843424; // 0x10102a0
field public static final int textAppearanceSearchResultTitle = 16843425; // 0x10102a1
field public static final int textAppearanceSmall = 16842818; // 0x1010042
@@ -1310,9 +1311,9 @@
field public static final int thumbTint = 16843889; // 0x1010471
field public static final int thumbTintMode = 16843890; // 0x1010472
field public static final int thumbnail = 16843429; // 0x10102a5
- field public static final int tickMark = 16844042; // 0x101050a
- field public static final int tickMarkTint = 16844043; // 0x101050b
- field public static final int tickMarkTintMode = 16844044; // 0x101050c
+ field public static final int tickMark = 16844043; // 0x101050b
+ field public static final int tickMarkTint = 16844044; // 0x101050c
+ field public static final int tickMarkTintMode = 16844045; // 0x101050d
field public static final int tileMode = 16843265; // 0x1010201
field public static final int tileModeX = 16843895; // 0x1010477
field public static final int tileModeY = 16843896; // 0x1010478
@@ -1324,11 +1325,11 @@
field public static final int tintMode = 16843771; // 0x10103fb
field public static final int title = 16843233; // 0x10101e1
field public static final int titleCondensed = 16843234; // 0x10101e2
- field public static final int titleMargin = 16844024; // 0x10104f8
- field public static final int titleMarginBottom = 16844028; // 0x10104fc
- field public static final int titleMarginEnd = 16844026; // 0x10104fa
- field public static final int titleMarginStart = 16844025; // 0x10104f9
- field public static final int titleMarginTop = 16844027; // 0x10104fb
+ field public static final int titleMargin = 16844025; // 0x10104f9
+ field public static final int titleMarginBottom = 16844029; // 0x10104fd
+ field public static final int titleMarginEnd = 16844027; // 0x10104fb
+ field public static final int titleMarginStart = 16844026; // 0x10104fa
+ field public static final int titleMarginTop = 16844028; // 0x10104fc
field public static final int titleTextAppearance = 16843822; // 0x101042e
field public static final int titleTextColor = 16844003; // 0x10104e3
field public static final int titleTextStyle = 16843512; // 0x10102f8
@@ -1367,7 +1368,7 @@
field public static final int trimPathEnd = 16843785; // 0x1010409
field public static final int trimPathOffset = 16843786; // 0x101040a
field public static final int trimPathStart = 16843784; // 0x1010408
- field public static final int tunerCount = 16844061; // 0x101051d
+ field public static final int tunerCount = 16844062; // 0x101051e
field public static final int type = 16843169; // 0x10101a1
field public static final int typeface = 16842902; // 0x1010096
field public static final int uiOptions = 16843672; // 0x1010398
@@ -1375,7 +1376,7 @@
field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344
field public static final int unselectedAlpha = 16843278; // 0x101020e
field public static final int updatePeriodMillis = 16843344; // 0x1010250
- field public static final int use32bitAbi = 16844053; // 0x1010515
+ field public static final int use32bitAbi = 16844054; // 0x1010516
field public static final int useDefaultMargins = 16843641; // 0x1010379
field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310
field public static final int useLevel = 16843167; // 0x101019f
@@ -1387,7 +1388,7 @@
field public static final int valueType = 16843488; // 0x10102e0
field public static final int variablePadding = 16843157; // 0x1010195
field public static final int vendor = 16843751; // 0x10103e7
- field public static final int version = 16844057; // 0x1010519
+ field public static final int version = 16844058; // 0x101051a
field public static final int versionCode = 16843291; // 0x101021b
field public static final int versionName = 16843292; // 0x101021c
field public static final int verticalCorrection = 16843322; // 0x101023a
@@ -1431,7 +1432,7 @@
field public static final int windowAllowReturnTransitionOverlap = 16843835; // 0x101043b
field public static final int windowAnimationStyle = 16842926; // 0x10100ae
field public static final int windowBackground = 16842836; // 0x1010054
- field public static final int windowBackgroundFallback = 16844035; // 0x1010503
+ field public static final int windowBackgroundFallback = 16844036; // 0x1010504
field public static final int windowClipToOutline = 16843947; // 0x10104ab
field public static final int windowCloseOnTouchOutside = 16843611; // 0x101035b
field public static final int windowContentOverlay = 16842841; // 0x1010059
diff --git a/api/removed.txt b/api/removed.txt
index 8119834..0ff2476 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -1,3 +1,17 @@
+package android {
+
+ public static final class R.attr {
+ field public static final int minimalHeight = 16844067; // 0x1010523
+ field public static final int minimalWidth = 16844022; // 0x10104f6
+ }
+
+ public static final class R.styleable {
+ field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6
+ field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5
+ }
+
+}
+
package android.app {
public class Notification implements android.os.Parcelable {
@@ -454,6 +468,11 @@
package com.android.internal {
+ public static final class R.attr {
+ field public static final int minimalHeight = 16844067; // 0x1010523
+ field public static final int minimalWidth = 16844022; // 0x10104f6
+ }
+
public static final class R.styleable {
field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6
field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5
diff --git a/api/system-current.txt b/api/system-current.txt
index 3a2f29b..0b6ac73 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -405,13 +405,13 @@
field public static final int backgroundTint = 16843883; // 0x101046b
field public static final int backgroundTintMode = 16843884; // 0x101046c
field public static final int backupAgent = 16843391; // 0x101027f
- field public static final int backupInForeground = 16844058; // 0x101051a
+ field public static final int backupInForeground = 16844059; // 0x101051b
field public static final int banner = 16843762; // 0x10103f2
field public static final int baseline = 16843548; // 0x101031c
field public static final int baselineAlignBottom = 16843042; // 0x1010122
field public static final int baselineAligned = 16843046; // 0x1010126
field public static final int baselineAlignedChildIndex = 16843047; // 0x1010127
- field public static final int bitmap = 16844054; // 0x1010516
+ field public static final int bitmap = 16844055; // 0x1010517
field public static final int borderlessButtonStyle = 16843563; // 0x101032b
field public static final int bottom = 16843184; // 0x10101b0
field public static final int bottomBright = 16842957; // 0x10100cd
@@ -430,7 +430,7 @@
field public static final int buttonBarNeutralButtonStyle = 16843914; // 0x101048a
field public static final int buttonBarPositiveButtonStyle = 16843913; // 0x1010489
field public static final int buttonBarStyle = 16843566; // 0x101032e
- field public static final int buttonGravity = 16844030; // 0x10104fe
+ field public static final int buttonGravity = 16844031; // 0x10104ff
field public static final int buttonStyle = 16842824; // 0x1010048
field public static final int buttonStyleInset = 16842826; // 0x101004a
field public static final int buttonStyleSmall = 16842825; // 0x1010049
@@ -441,9 +441,9 @@
field public static final int calendarTextColor = 16843931; // 0x101049b
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
- field public static final int canControlMagnification = 16844039; // 0x1010507
- field public static final int canPerformGestures = 16844045; // 0x101050d
- field public static final int canRecord = 16844060; // 0x101051c
+ field public static final int canControlMagnification = 16844040; // 0x1010508
+ field public static final int canPerformGestures = 16844046; // 0x101050e
+ field public static final int canRecord = 16844061; // 0x101051d
field public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
field public static final int canRequestFilterKeyEvents = 16843737; // 0x10103d9
field public static final int canRequestTouchExplorationMode = 16843735; // 0x10103d7
@@ -483,7 +483,7 @@
field public static final int codes = 16843330; // 0x1010242
field public static final int collapseColumns = 16843083; // 0x101014b
field public static final int collapseContentDescription = 16843984; // 0x10104d0
- field public static final int collapseIcon = 16844031; // 0x10104ff
+ field public static final int collapseIcon = 16844032; // 0x1010500
field public static final int color = 16843173; // 0x10101a5
field public static final int colorAccent = 16843829; // 0x1010435
field public static final int colorActivatedHighlight = 16843664; // 0x1010390
@@ -520,18 +520,18 @@
field public static final int contentAuthority = 16843408; // 0x1010290
field public static final int contentDescription = 16843379; // 0x1010273
field public static final int contentInsetEnd = 16843860; // 0x1010454
- field public static final int contentInsetEndWithActions = 16844067; // 0x1010523
+ field public static final int contentInsetEndWithActions = 16844070; // 0x1010526
field public static final int contentInsetLeft = 16843861; // 0x1010455
field public static final int contentInsetRight = 16843862; // 0x1010456
field public static final int contentInsetStart = 16843859; // 0x1010453
- field public static final int contentInsetStartWithNavigation = 16844066; // 0x1010522
+ field public static final int contentInsetStartWithNavigation = 16844069; // 0x1010525
field public static final int contextClickable = 16844007; // 0x10104e7
- field public static final int contextPopupMenuStyle = 16844033; // 0x1010501
+ field public static final int contextPopupMenuStyle = 16844034; // 0x1010502
field public static final int controlX1 = 16843772; // 0x10103fc
field public static final int controlX2 = 16843774; // 0x10103fe
field public static final int controlY1 = 16843773; // 0x10103fd
field public static final int controlY2 = 16843775; // 0x10103ff
- field public static final int countDown = 16844059; // 0x101051b
+ field public static final int countDown = 16844060; // 0x101051c
field public static final int country = 16843962; // 0x10104ba
field public static final int cropToPadding = 16843043; // 0x1010123
field public static final int cursorVisible = 16843090; // 0x1010152
@@ -549,7 +549,7 @@
field public static final deprecated int dayOfWeekTextAppearance = 16843925; // 0x1010495
field public static final int debuggable = 16842767; // 0x101000f
field public static final int defaultHeight = 16844021; // 0x10104f5
- field public static final int defaultToDeviceProtectedStorage = 16844036; // 0x1010504
+ field public static final int defaultToDeviceProtectedStorage = 16844037; // 0x1010505
field public static final int defaultValue = 16843245; // 0x10101ed
field public static final int defaultWidth = 16844020; // 0x10104f4
field public static final int delay = 16843212; // 0x10101cc
@@ -569,7 +569,7 @@
field public static final int dialogTheme = 16843528; // 0x1010308
field public static final int dialogTitle = 16843250; // 0x10101f2
field public static final int digits = 16843110; // 0x1010166
- field public static final int directBootAware = 16844037; // 0x1010505
+ field public static final int directBootAware = 16844038; // 0x1010506
field public static final int direction = 16843217; // 0x10101d1
field public static final deprecated int directionDescriptions = 16843681; // 0x10103a1
field public static final int directionPriority = 16843218; // 0x10101d2
@@ -617,12 +617,12 @@
field public static final int elevation = 16843840; // 0x1010440
field public static final int ellipsize = 16842923; // 0x10100ab
field public static final int ems = 16843096; // 0x1010158
- field public static final int enableVrMode = 16844069; // 0x1010525
+ field public static final int enableVrMode = 16844072; // 0x1010528
field public static final int enabled = 16842766; // 0x101000e
field public static final int end = 16843996; // 0x10104dc
field public static final int endColor = 16843166; // 0x101019e
- field public static final int endX = 16844050; // 0x1010512
- field public static final int endY = 16844051; // 0x1010513
+ field public static final int endX = 16844051; // 0x1010513
+ field public static final int endY = 16844052; // 0x1010514
field public static final deprecated int endYear = 16843133; // 0x101017d
field public static final int enterFadeDuration = 16843532; // 0x101030c
field public static final int entries = 16842930; // 0x10100b2
@@ -642,7 +642,7 @@
field public static final int expandableListViewStyle = 16842863; // 0x101006f
field public static final int expandableListViewWhiteStyle = 16843446; // 0x10102b6
field public static final int exported = 16842768; // 0x1010010
- field public static final int externalService = 16844046; // 0x101050e
+ field public static final int externalService = 16844047; // 0x101050f
field public static final int extraTension = 16843371; // 0x101026b
field public static final int extractNativeLibs = 16844010; // 0x10104ea
field public static final int factor = 16843219; // 0x10101d3
@@ -667,7 +667,7 @@
field public static final int fillBefore = 16843196; // 0x10101bc
field public static final int fillColor = 16843780; // 0x1010404
field public static final int fillEnabled = 16843343; // 0x101024f
- field public static final int fillType = 16844062; // 0x101051e
+ field public static final int fillType = 16844064; // 0x1010520
field public static final int fillViewport = 16843130; // 0x101017a
field public static final int filter = 16843035; // 0x101011b
field public static final int filterTouchesWhenObscured = 16843460; // 0x10102c4
@@ -683,7 +683,7 @@
field public static final int fontFamily = 16843692; // 0x10103ac
field public static final int fontFeatureSettings = 16843959; // 0x10104b7
field public static final int footerDividersEnabled = 16843311; // 0x101022f
- field public static final int forceHasOverlappingRendering = 16844065; // 0x1010521
+ field public static final int forceHasOverlappingRendering = 16844068; // 0x1010524
field public static final int foreground = 16843017; // 0x1010109
field public static final int foregroundGravity = 16843264; // 0x1010200
field public static final int foregroundTint = 16843885; // 0x101046d
@@ -760,8 +760,8 @@
field public static final int horizontalScrollViewStyle = 16843603; // 0x1010353
field public static final int horizontalSpacing = 16843028; // 0x1010114
field public static final int host = 16842792; // 0x1010028
- field public static final int hotSpotX = 16844055; // 0x1010517
- field public static final int hotSpotY = 16844056; // 0x1010518
+ field public static final int hotSpotX = 16844056; // 0x1010518
+ field public static final int hotSpotY = 16844057; // 0x1010519
field public static final int hyphenationFrequency = 16843998; // 0x10104de
field public static final int icon = 16842754; // 0x1010002
field public static final int iconPreview = 16843337; // 0x1010249
@@ -848,7 +848,7 @@
field public static final int label = 16842753; // 0x1010001
field public static final int labelFor = 16843718; // 0x10103c6
field public static final int labelTextSize = 16843317; // 0x1010235
- field public static final int languageTag = 16844040; // 0x1010508
+ field public static final int languageTag = 16844041; // 0x1010509
field public static final int largeHeap = 16843610; // 0x101035a
field public static final int largeScreens = 16843398; // 0x1010286
field public static final int largestWidthLimitDp = 16843622; // 0x1010366
@@ -906,7 +906,7 @@
field public static final int layout_y = 16843136; // 0x1010180
field public static final int left = 16843181; // 0x10101ad
field public static final int letterSpacing = 16843958; // 0x10104b6
- field public static final int level = 16844032; // 0x1010500
+ field public static final int level = 16844033; // 0x1010501
field public static final int lineSpacingExtra = 16843287; // 0x1010217
field public static final int lineSpacingMultiplier = 16843288; // 0x1010218
field public static final int lines = 16843092; // 0x1010154
@@ -939,7 +939,7 @@
field public static final int marqueeRepeatLimit = 16843293; // 0x101021d
field public static final int matchOrder = 16843855; // 0x101044f
field public static final int max = 16843062; // 0x1010136
- field public static final int maxButtonHeight = 16844029; // 0x10104fd
+ field public static final int maxButtonHeight = 16844030; // 0x10104fe
field public static final int maxDate = 16843584; // 0x1010340
field public static final int maxEms = 16843095; // 0x1010157
field public static final int maxHeight = 16843040; // 0x1010120
@@ -982,25 +982,26 @@
field public static final int navigationMode = 16843471; // 0x10102cf
field public static final int negativeButtonText = 16843254; // 0x10101f6
field public static final int nestedScrollingEnabled = 16843830; // 0x1010436
- field public static final int networkSecurityConfig = 16844071; // 0x1010527
+ field public static final int networkSecurityConfig = 16844074; // 0x101052a
field public static final int nextFocusDown = 16842980; // 0x10100e4
field public static final int nextFocusForward = 16843580; // 0x101033c
field public static final int nextFocusLeft = 16842977; // 0x10100e1
field public static final int nextFocusRight = 16842978; // 0x10100e2
field public static final int nextFocusUp = 16842979; // 0x10100e3
+ field public static final int nfcAntennaPositionDrawable = 16844063; // 0x101051f
field public static final int noHistory = 16843309; // 0x101022d
field public static final int normalScreens = 16843397; // 0x1010285
field public static final int notificationTimeout = 16843651; // 0x1010383
field public static final int numColumns = 16843032; // 0x1010118
field public static final int numStars = 16843076; // 0x1010144
- field public static final int numberPickerStyle = 16844068; // 0x1010524
+ field public static final int numberPickerStyle = 16844071; // 0x1010527
field public static final int numbersBackgroundColor = 16843938; // 0x10104a2
field public static final int numbersInnerTextColor = 16844001; // 0x10104e1
field public static final int numbersSelectorColor = 16843939; // 0x10104a3
field public static final int numbersTextColor = 16843937; // 0x10104a1
field public static final deprecated int numeric = 16843109; // 0x1010165
field public static final int numericShortcut = 16843236; // 0x10101e4
- field public static final int offset = 16844052; // 0x1010514
+ field public static final int offset = 16844053; // 0x1010515
field public static final int onClick = 16843375; // 0x101026f
field public static final int oneshot = 16843159; // 0x1010197
field public static final int opacity = 16843550; // 0x101031e
@@ -1047,13 +1048,13 @@
field public static final deprecated int phoneNumber = 16843111; // 0x1010167
field public static final int pivotX = 16843189; // 0x10101b5
field public static final int pivotY = 16843190; // 0x10101b6
- field public static final int pointerIcon = 16844041; // 0x1010509
+ field public static final int pointerIcon = 16844042; // 0x101050a
field public static final int popupAnimationStyle = 16843465; // 0x10102c9
field public static final int popupBackground = 16843126; // 0x1010176
field public static final int popupCharacters = 16843332; // 0x1010244
field public static final int popupElevation = 16843916; // 0x101048c
- field public static final int popupEnterTransition = 16844063; // 0x101051f
- field public static final int popupExitTransition = 16844064; // 0x1010520
+ field public static final int popupEnterTransition = 16844065; // 0x1010521
+ field public static final int popupExitTransition = 16844066; // 0x1010522
field public static final int popupKeyboard = 16843331; // 0x1010243
field public static final int popupLayout = 16843323; // 0x101023b
field public static final int popupMenuStyle = 16843520; // 0x1010300
@@ -1062,7 +1063,7 @@
field public static final int port = 16842793; // 0x1010029
field public static final int positiveButtonText = 16843253; // 0x10101f5
field public static final int preferenceCategoryStyle = 16842892; // 0x101008c
- field public static final int preferenceFragmentStyle = 16844038; // 0x1010506
+ field public static final int preferenceFragmentStyle = 16844039; // 0x1010507
field public static final int preferenceInformationStyle = 16842893; // 0x101008d
field public static final int preferenceLayoutChild = 16842900; // 0x1010094
field public static final int preferenceScreenStyle = 16842891; // 0x101008b
@@ -1130,7 +1131,7 @@
field public static final int resizeClip = 16843983; // 0x10104cf
field public static final int resizeMode = 16843619; // 0x1010363
field public static final int resizeable = 16843405; // 0x101028d
- field public static final int resizeableActivity = 16844022; // 0x10104f6
+ field public static final int resizeableActivity = 16844023; // 0x10104f7
field public static final int resource = 16842789; // 0x1010025
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
@@ -1254,8 +1255,8 @@
field public static final int startColor = 16843165; // 0x101019d
field public static final int startDelay = 16843746; // 0x10103e2
field public static final int startOffset = 16843198; // 0x10101be
- field public static final int startX = 16844048; // 0x1010510
- field public static final int startY = 16844049; // 0x1010511
+ field public static final int startX = 16844049; // 0x1010511
+ field public static final int startY = 16844050; // 0x1010512
field public static final deprecated int startYear = 16843132; // 0x101017c
field public static final int stateListAnimator = 16843848; // 0x1010448
field public static final int stateNotNeeded = 16842774; // 0x1010016
@@ -1312,8 +1313,8 @@
field public static final int summaryOn = 16843247; // 0x10101ef
field public static final int supportsAssist = 16844016; // 0x10104f0
field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1
- field public static final int supportsLocalInteraction = 16844047; // 0x101050f
- field public static final int supportsPictureInPicture = 16844023; // 0x10104f7
+ field public static final int supportsLocalInteraction = 16844048; // 0x1010510
+ field public static final int supportsPictureInPicture = 16844024; // 0x10104f8
field public static final int supportsRtl = 16843695; // 0x10103af
field public static final int supportsSwitchingToNextInputMethod = 16843755; // 0x10103eb
field public static final int supportsUploading = 16843419; // 0x101029b
@@ -1362,7 +1363,7 @@
field public static final int textAppearanceListItemSmall = 16843679; // 0x101039f
field public static final int textAppearanceMedium = 16842817; // 0x1010041
field public static final int textAppearanceMediumInverse = 16842820; // 0x1010044
- field public static final int textAppearancePopupMenuHeader = 16844034; // 0x1010502
+ field public static final int textAppearancePopupMenuHeader = 16844035; // 0x1010503
field public static final int textAppearanceSearchResultSubtitle = 16843424; // 0x10102a0
field public static final int textAppearanceSearchResultTitle = 16843425; // 0x10102a1
field public static final int textAppearanceSmall = 16842818; // 0x1010042
@@ -1420,9 +1421,9 @@
field public static final int thumbTint = 16843889; // 0x1010471
field public static final int thumbTintMode = 16843890; // 0x1010472
field public static final int thumbnail = 16843429; // 0x10102a5
- field public static final int tickMark = 16844042; // 0x101050a
- field public static final int tickMarkTint = 16844043; // 0x101050b
- field public static final int tickMarkTintMode = 16844044; // 0x101050c
+ field public static final int tickMark = 16844043; // 0x101050b
+ field public static final int tickMarkTint = 16844044; // 0x101050c
+ field public static final int tickMarkTintMode = 16844045; // 0x101050d
field public static final int tileMode = 16843265; // 0x1010201
field public static final int tileModeX = 16843895; // 0x1010477
field public static final int tileModeY = 16843896; // 0x1010478
@@ -1434,11 +1435,11 @@
field public static final int tintMode = 16843771; // 0x10103fb
field public static final int title = 16843233; // 0x10101e1
field public static final int titleCondensed = 16843234; // 0x10101e2
- field public static final int titleMargin = 16844024; // 0x10104f8
- field public static final int titleMarginBottom = 16844028; // 0x10104fc
- field public static final int titleMarginEnd = 16844026; // 0x10104fa
- field public static final int titleMarginStart = 16844025; // 0x10104f9
- field public static final int titleMarginTop = 16844027; // 0x10104fb
+ field public static final int titleMargin = 16844025; // 0x10104f9
+ field public static final int titleMarginBottom = 16844029; // 0x10104fd
+ field public static final int titleMarginEnd = 16844027; // 0x10104fb
+ field public static final int titleMarginStart = 16844026; // 0x10104fa
+ field public static final int titleMarginTop = 16844028; // 0x10104fc
field public static final int titleTextAppearance = 16843822; // 0x101042e
field public static final int titleTextColor = 16844003; // 0x10104e3
field public static final int titleTextStyle = 16843512; // 0x10102f8
@@ -1477,7 +1478,7 @@
field public static final int trimPathEnd = 16843785; // 0x1010409
field public static final int trimPathOffset = 16843786; // 0x101040a
field public static final int trimPathStart = 16843784; // 0x1010408
- field public static final int tunerCount = 16844061; // 0x101051d
+ field public static final int tunerCount = 16844062; // 0x101051e
field public static final int type = 16843169; // 0x10101a1
field public static final int typeface = 16842902; // 0x1010096
field public static final int uiOptions = 16843672; // 0x1010398
@@ -1485,7 +1486,7 @@
field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344
field public static final int unselectedAlpha = 16843278; // 0x101020e
field public static final int updatePeriodMillis = 16843344; // 0x1010250
- field public static final int use32bitAbi = 16844053; // 0x1010515
+ field public static final int use32bitAbi = 16844054; // 0x1010516
field public static final int useDefaultMargins = 16843641; // 0x1010379
field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310
field public static final int useLevel = 16843167; // 0x101019f
@@ -1497,7 +1498,7 @@
field public static final int valueType = 16843488; // 0x10102e0
field public static final int variablePadding = 16843157; // 0x1010195
field public static final int vendor = 16843751; // 0x10103e7
- field public static final int version = 16844057; // 0x1010519
+ field public static final int version = 16844058; // 0x101051a
field public static final int versionCode = 16843291; // 0x101021b
field public static final int versionName = 16843292; // 0x101021c
field public static final int verticalCorrection = 16843322; // 0x101023a
@@ -1541,7 +1542,7 @@
field public static final int windowAllowReturnTransitionOverlap = 16843835; // 0x101043b
field public static final int windowAnimationStyle = 16842926; // 0x10100ae
field public static final int windowBackground = 16842836; // 0x1010054
- field public static final int windowBackgroundFallback = 16844035; // 0x1010503
+ field public static final int windowBackgroundFallback = 16844036; // 0x1010504
field public static final int windowClipToOutline = 16843947; // 0x10104ab
field public static final int windowCloseOnTouchOutside = 16843611; // 0x101035b
field public static final int windowContentOverlay = 16842841; // 0x1010059
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 7f18d6a..715312f 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -1,3 +1,17 @@
+package android {
+
+ public static final class R.attr {
+ field public static final int minimalHeight = 16844067; // 0x1010523
+ field public static final int minimalWidth = 16844022; // 0x10104f6
+ }
+
+ public static final class R.styleable {
+ field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6
+ field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5
+ }
+
+}
+
package android.app {
public class Notification implements android.os.Parcelable {
@@ -452,6 +466,11 @@
package com.android.internal {
+ public static final class R.attr {
+ field public static final int minimalHeight = 16844067; // 0x1010523
+ field public static final int minimalWidth = 16844022; // 0x10104f6
+ }
+
public static final class R.styleable {
field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6
field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5
diff --git a/api/test-current.txt b/api/test-current.txt
index 8425e90..d277fd7 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -299,13 +299,13 @@
field public static final int backgroundTint = 16843883; // 0x101046b
field public static final int backgroundTintMode = 16843884; // 0x101046c
field public static final int backupAgent = 16843391; // 0x101027f
- field public static final int backupInForeground = 16844058; // 0x101051a
+ field public static final int backupInForeground = 16844059; // 0x101051b
field public static final int banner = 16843762; // 0x10103f2
field public static final int baseline = 16843548; // 0x101031c
field public static final int baselineAlignBottom = 16843042; // 0x1010122
field public static final int baselineAligned = 16843046; // 0x1010126
field public static final int baselineAlignedChildIndex = 16843047; // 0x1010127
- field public static final int bitmap = 16844054; // 0x1010516
+ field public static final int bitmap = 16844055; // 0x1010517
field public static final int borderlessButtonStyle = 16843563; // 0x101032b
field public static final int bottom = 16843184; // 0x10101b0
field public static final int bottomBright = 16842957; // 0x10100cd
@@ -324,7 +324,7 @@
field public static final int buttonBarNeutralButtonStyle = 16843914; // 0x101048a
field public static final int buttonBarPositiveButtonStyle = 16843913; // 0x1010489
field public static final int buttonBarStyle = 16843566; // 0x101032e
- field public static final int buttonGravity = 16844030; // 0x10104fe
+ field public static final int buttonGravity = 16844031; // 0x10104ff
field public static final int buttonStyle = 16842824; // 0x1010048
field public static final int buttonStyleInset = 16842826; // 0x101004a
field public static final int buttonStyleSmall = 16842825; // 0x1010049
@@ -335,9 +335,9 @@
field public static final int calendarTextColor = 16843931; // 0x101049b
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
- field public static final int canControlMagnification = 16844039; // 0x1010507
- field public static final int canPerformGestures = 16844045; // 0x101050d
- field public static final int canRecord = 16844060; // 0x101051c
+ field public static final int canControlMagnification = 16844040; // 0x1010508
+ field public static final int canPerformGestures = 16844046; // 0x101050e
+ field public static final int canRecord = 16844061; // 0x101051d
field public static final int canRequestEnhancedWebAccessibility = 16843736; // 0x10103d8
field public static final int canRequestFilterKeyEvents = 16843737; // 0x10103d9
field public static final int canRequestTouchExplorationMode = 16843735; // 0x10103d7
@@ -377,7 +377,7 @@
field public static final int codes = 16843330; // 0x1010242
field public static final int collapseColumns = 16843083; // 0x101014b
field public static final int collapseContentDescription = 16843984; // 0x10104d0
- field public static final int collapseIcon = 16844031; // 0x10104ff
+ field public static final int collapseIcon = 16844032; // 0x1010500
field public static final int color = 16843173; // 0x10101a5
field public static final int colorAccent = 16843829; // 0x1010435
field public static final int colorActivatedHighlight = 16843664; // 0x1010390
@@ -414,18 +414,18 @@
field public static final int contentAuthority = 16843408; // 0x1010290
field public static final int contentDescription = 16843379; // 0x1010273
field public static final int contentInsetEnd = 16843860; // 0x1010454
- field public static final int contentInsetEndWithActions = 16844067; // 0x1010523
+ field public static final int contentInsetEndWithActions = 16844070; // 0x1010526
field public static final int contentInsetLeft = 16843861; // 0x1010455
field public static final int contentInsetRight = 16843862; // 0x1010456
field public static final int contentInsetStart = 16843859; // 0x1010453
- field public static final int contentInsetStartWithNavigation = 16844066; // 0x1010522
+ field public static final int contentInsetStartWithNavigation = 16844069; // 0x1010525
field public static final int contextClickable = 16844007; // 0x10104e7
- field public static final int contextPopupMenuStyle = 16844033; // 0x1010501
+ field public static final int contextPopupMenuStyle = 16844034; // 0x1010502
field public static final int controlX1 = 16843772; // 0x10103fc
field public static final int controlX2 = 16843774; // 0x10103fe
field public static final int controlY1 = 16843773; // 0x10103fd
field public static final int controlY2 = 16843775; // 0x10103ff
- field public static final int countDown = 16844059; // 0x101051b
+ field public static final int countDown = 16844060; // 0x101051c
field public static final int country = 16843962; // 0x10104ba
field public static final int cropToPadding = 16843043; // 0x1010123
field public static final int cursorVisible = 16843090; // 0x1010152
@@ -443,7 +443,7 @@
field public static final deprecated int dayOfWeekTextAppearance = 16843925; // 0x1010495
field public static final int debuggable = 16842767; // 0x101000f
field public static final int defaultHeight = 16844021; // 0x10104f5
- field public static final int defaultToDeviceProtectedStorage = 16844036; // 0x1010504
+ field public static final int defaultToDeviceProtectedStorage = 16844037; // 0x1010505
field public static final int defaultValue = 16843245; // 0x10101ed
field public static final int defaultWidth = 16844020; // 0x10104f4
field public static final int delay = 16843212; // 0x10101cc
@@ -463,7 +463,7 @@
field public static final int dialogTheme = 16843528; // 0x1010308
field public static final int dialogTitle = 16843250; // 0x10101f2
field public static final int digits = 16843110; // 0x1010166
- field public static final int directBootAware = 16844037; // 0x1010505
+ field public static final int directBootAware = 16844038; // 0x1010506
field public static final int direction = 16843217; // 0x10101d1
field public static final deprecated int directionDescriptions = 16843681; // 0x10103a1
field public static final int directionPriority = 16843218; // 0x10101d2
@@ -511,12 +511,12 @@
field public static final int elevation = 16843840; // 0x1010440
field public static final int ellipsize = 16842923; // 0x10100ab
field public static final int ems = 16843096; // 0x1010158
- field public static final int enableVrMode = 16844069; // 0x1010525
+ field public static final int enableVrMode = 16844072; // 0x1010528
field public static final int enabled = 16842766; // 0x101000e
field public static final int end = 16843996; // 0x10104dc
field public static final int endColor = 16843166; // 0x101019e
- field public static final int endX = 16844050; // 0x1010512
- field public static final int endY = 16844051; // 0x1010513
+ field public static final int endX = 16844051; // 0x1010513
+ field public static final int endY = 16844052; // 0x1010514
field public static final deprecated int endYear = 16843133; // 0x101017d
field public static final int enterFadeDuration = 16843532; // 0x101030c
field public static final int entries = 16842930; // 0x10100b2
@@ -536,7 +536,7 @@
field public static final int expandableListViewStyle = 16842863; // 0x101006f
field public static final int expandableListViewWhiteStyle = 16843446; // 0x10102b6
field public static final int exported = 16842768; // 0x1010010
- field public static final int externalService = 16844046; // 0x101050e
+ field public static final int externalService = 16844047; // 0x101050f
field public static final int extraTension = 16843371; // 0x101026b
field public static final int extractNativeLibs = 16844010; // 0x10104ea
field public static final int factor = 16843219; // 0x10101d3
@@ -561,7 +561,7 @@
field public static final int fillBefore = 16843196; // 0x10101bc
field public static final int fillColor = 16843780; // 0x1010404
field public static final int fillEnabled = 16843343; // 0x101024f
- field public static final int fillType = 16844062; // 0x101051e
+ field public static final int fillType = 16844064; // 0x1010520
field public static final int fillViewport = 16843130; // 0x101017a
field public static final int filter = 16843035; // 0x101011b
field public static final int filterTouchesWhenObscured = 16843460; // 0x10102c4
@@ -577,7 +577,7 @@
field public static final int fontFamily = 16843692; // 0x10103ac
field public static final int fontFeatureSettings = 16843959; // 0x10104b7
field public static final int footerDividersEnabled = 16843311; // 0x101022f
- field public static final int forceHasOverlappingRendering = 16844065; // 0x1010521
+ field public static final int forceHasOverlappingRendering = 16844068; // 0x1010524
field public static final int foreground = 16843017; // 0x1010109
field public static final int foregroundGravity = 16843264; // 0x1010200
field public static final int foregroundTint = 16843885; // 0x101046d
@@ -654,8 +654,8 @@
field public static final int horizontalScrollViewStyle = 16843603; // 0x1010353
field public static final int horizontalSpacing = 16843028; // 0x1010114
field public static final int host = 16842792; // 0x1010028
- field public static final int hotSpotX = 16844055; // 0x1010517
- field public static final int hotSpotY = 16844056; // 0x1010518
+ field public static final int hotSpotX = 16844056; // 0x1010518
+ field public static final int hotSpotY = 16844057; // 0x1010519
field public static final int hyphenationFrequency = 16843998; // 0x10104de
field public static final int icon = 16842754; // 0x1010002
field public static final int iconPreview = 16843337; // 0x1010249
@@ -742,7 +742,7 @@
field public static final int label = 16842753; // 0x1010001
field public static final int labelFor = 16843718; // 0x10103c6
field public static final int labelTextSize = 16843317; // 0x1010235
- field public static final int languageTag = 16844040; // 0x1010508
+ field public static final int languageTag = 16844041; // 0x1010509
field public static final int largeHeap = 16843610; // 0x101035a
field public static final int largeScreens = 16843398; // 0x1010286
field public static final int largestWidthLimitDp = 16843622; // 0x1010366
@@ -800,7 +800,7 @@
field public static final int layout_y = 16843136; // 0x1010180
field public static final int left = 16843181; // 0x10101ad
field public static final int letterSpacing = 16843958; // 0x10104b6
- field public static final int level = 16844032; // 0x1010500
+ field public static final int level = 16844033; // 0x1010501
field public static final int lineSpacingExtra = 16843287; // 0x1010217
field public static final int lineSpacingMultiplier = 16843288; // 0x1010218
field public static final int lines = 16843092; // 0x1010154
@@ -833,7 +833,7 @@
field public static final int marqueeRepeatLimit = 16843293; // 0x101021d
field public static final int matchOrder = 16843855; // 0x101044f
field public static final int max = 16843062; // 0x1010136
- field public static final int maxButtonHeight = 16844029; // 0x10104fd
+ field public static final int maxButtonHeight = 16844030; // 0x10104fe
field public static final int maxDate = 16843584; // 0x1010340
field public static final int maxEms = 16843095; // 0x1010157
field public static final int maxHeight = 16843040; // 0x1010120
@@ -876,25 +876,26 @@
field public static final int navigationMode = 16843471; // 0x10102cf
field public static final int negativeButtonText = 16843254; // 0x10101f6
field public static final int nestedScrollingEnabled = 16843830; // 0x1010436
- field public static final int networkSecurityConfig = 16844071; // 0x1010527
+ field public static final int networkSecurityConfig = 16844074; // 0x101052a
field public static final int nextFocusDown = 16842980; // 0x10100e4
field public static final int nextFocusForward = 16843580; // 0x101033c
field public static final int nextFocusLeft = 16842977; // 0x10100e1
field public static final int nextFocusRight = 16842978; // 0x10100e2
field public static final int nextFocusUp = 16842979; // 0x10100e3
+ field public static final int nfcAntennaPositionDrawable = 16844063; // 0x101051f
field public static final int noHistory = 16843309; // 0x101022d
field public static final int normalScreens = 16843397; // 0x1010285
field public static final int notificationTimeout = 16843651; // 0x1010383
field public static final int numColumns = 16843032; // 0x1010118
field public static final int numStars = 16843076; // 0x1010144
- field public static final int numberPickerStyle = 16844068; // 0x1010524
+ field public static final int numberPickerStyle = 16844071; // 0x1010527
field public static final int numbersBackgroundColor = 16843938; // 0x10104a2
field public static final int numbersInnerTextColor = 16844001; // 0x10104e1
field public static final int numbersSelectorColor = 16843939; // 0x10104a3
field public static final int numbersTextColor = 16843937; // 0x10104a1
field public static final deprecated int numeric = 16843109; // 0x1010165
field public static final int numericShortcut = 16843236; // 0x10101e4
- field public static final int offset = 16844052; // 0x1010514
+ field public static final int offset = 16844053; // 0x1010515
field public static final int onClick = 16843375; // 0x101026f
field public static final int oneshot = 16843159; // 0x1010197
field public static final int opacity = 16843550; // 0x101031e
@@ -941,13 +942,13 @@
field public static final deprecated int phoneNumber = 16843111; // 0x1010167
field public static final int pivotX = 16843189; // 0x10101b5
field public static final int pivotY = 16843190; // 0x10101b6
- field public static final int pointerIcon = 16844041; // 0x1010509
+ field public static final int pointerIcon = 16844042; // 0x101050a
field public static final int popupAnimationStyle = 16843465; // 0x10102c9
field public static final int popupBackground = 16843126; // 0x1010176
field public static final int popupCharacters = 16843332; // 0x1010244
field public static final int popupElevation = 16843916; // 0x101048c
- field public static final int popupEnterTransition = 16844063; // 0x101051f
- field public static final int popupExitTransition = 16844064; // 0x1010520
+ field public static final int popupEnterTransition = 16844065; // 0x1010521
+ field public static final int popupExitTransition = 16844066; // 0x1010522
field public static final int popupKeyboard = 16843331; // 0x1010243
field public static final int popupLayout = 16843323; // 0x101023b
field public static final int popupMenuStyle = 16843520; // 0x1010300
@@ -956,7 +957,7 @@
field public static final int port = 16842793; // 0x1010029
field public static final int positiveButtonText = 16843253; // 0x10101f5
field public static final int preferenceCategoryStyle = 16842892; // 0x101008c
- field public static final int preferenceFragmentStyle = 16844038; // 0x1010506
+ field public static final int preferenceFragmentStyle = 16844039; // 0x1010507
field public static final int preferenceInformationStyle = 16842893; // 0x101008d
field public static final int preferenceLayoutChild = 16842900; // 0x1010094
field public static final int preferenceScreenStyle = 16842891; // 0x101008b
@@ -1024,7 +1025,7 @@
field public static final int resizeClip = 16843983; // 0x10104cf
field public static final int resizeMode = 16843619; // 0x1010363
field public static final int resizeable = 16843405; // 0x101028d
- field public static final int resizeableActivity = 16844022; // 0x10104f6
+ field public static final int resizeableActivity = 16844023; // 0x10104f7
field public static final int resource = 16842789; // 0x1010025
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
@@ -1144,8 +1145,8 @@
field public static final int startColor = 16843165; // 0x101019d
field public static final int startDelay = 16843746; // 0x10103e2
field public static final int startOffset = 16843198; // 0x10101be
- field public static final int startX = 16844048; // 0x1010510
- field public static final int startY = 16844049; // 0x1010511
+ field public static final int startX = 16844049; // 0x1010511
+ field public static final int startY = 16844050; // 0x1010512
field public static final deprecated int startYear = 16843132; // 0x101017c
field public static final int stateListAnimator = 16843848; // 0x1010448
field public static final int stateNotNeeded = 16842774; // 0x1010016
@@ -1202,8 +1203,8 @@
field public static final int summaryOn = 16843247; // 0x10101ef
field public static final int supportsAssist = 16844016; // 0x10104f0
field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1
- field public static final int supportsLocalInteraction = 16844047; // 0x101050f
- field public static final int supportsPictureInPicture = 16844023; // 0x10104f7
+ field public static final int supportsLocalInteraction = 16844048; // 0x1010510
+ field public static final int supportsPictureInPicture = 16844024; // 0x10104f8
field public static final int supportsRtl = 16843695; // 0x10103af
field public static final int supportsSwitchingToNextInputMethod = 16843755; // 0x10103eb
field public static final int supportsUploading = 16843419; // 0x101029b
@@ -1252,7 +1253,7 @@
field public static final int textAppearanceListItemSmall = 16843679; // 0x101039f
field public static final int textAppearanceMedium = 16842817; // 0x1010041
field public static final int textAppearanceMediumInverse = 16842820; // 0x1010044
- field public static final int textAppearancePopupMenuHeader = 16844034; // 0x1010502
+ field public static final int textAppearancePopupMenuHeader = 16844035; // 0x1010503
field public static final int textAppearanceSearchResultSubtitle = 16843424; // 0x10102a0
field public static final int textAppearanceSearchResultTitle = 16843425; // 0x10102a1
field public static final int textAppearanceSmall = 16842818; // 0x1010042
@@ -1310,9 +1311,9 @@
field public static final int thumbTint = 16843889; // 0x1010471
field public static final int thumbTintMode = 16843890; // 0x1010472
field public static final int thumbnail = 16843429; // 0x10102a5
- field public static final int tickMark = 16844042; // 0x101050a
- field public static final int tickMarkTint = 16844043; // 0x101050b
- field public static final int tickMarkTintMode = 16844044; // 0x101050c
+ field public static final int tickMark = 16844043; // 0x101050b
+ field public static final int tickMarkTint = 16844044; // 0x101050c
+ field public static final int tickMarkTintMode = 16844045; // 0x101050d
field public static final int tileMode = 16843265; // 0x1010201
field public static final int tileModeX = 16843895; // 0x1010477
field public static final int tileModeY = 16843896; // 0x1010478
@@ -1324,11 +1325,11 @@
field public static final int tintMode = 16843771; // 0x10103fb
field public static final int title = 16843233; // 0x10101e1
field public static final int titleCondensed = 16843234; // 0x10101e2
- field public static final int titleMargin = 16844024; // 0x10104f8
- field public static final int titleMarginBottom = 16844028; // 0x10104fc
- field public static final int titleMarginEnd = 16844026; // 0x10104fa
- field public static final int titleMarginStart = 16844025; // 0x10104f9
- field public static final int titleMarginTop = 16844027; // 0x10104fb
+ field public static final int titleMargin = 16844025; // 0x10104f9
+ field public static final int titleMarginBottom = 16844029; // 0x10104fd
+ field public static final int titleMarginEnd = 16844027; // 0x10104fb
+ field public static final int titleMarginStart = 16844026; // 0x10104fa
+ field public static final int titleMarginTop = 16844028; // 0x10104fc
field public static final int titleTextAppearance = 16843822; // 0x101042e
field public static final int titleTextColor = 16844003; // 0x10104e3
field public static final int titleTextStyle = 16843512; // 0x10102f8
@@ -1367,7 +1368,7 @@
field public static final int trimPathEnd = 16843785; // 0x1010409
field public static final int trimPathOffset = 16843786; // 0x101040a
field public static final int trimPathStart = 16843784; // 0x1010408
- field public static final int tunerCount = 16844061; // 0x101051d
+ field public static final int tunerCount = 16844062; // 0x101051e
field public static final int type = 16843169; // 0x10101a1
field public static final int typeface = 16842902; // 0x1010096
field public static final int uiOptions = 16843672; // 0x1010398
@@ -1375,7 +1376,7 @@
field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344
field public static final int unselectedAlpha = 16843278; // 0x101020e
field public static final int updatePeriodMillis = 16843344; // 0x1010250
- field public static final int use32bitAbi = 16844053; // 0x1010515
+ field public static final int use32bitAbi = 16844054; // 0x1010516
field public static final int useDefaultMargins = 16843641; // 0x1010379
field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310
field public static final int useLevel = 16843167; // 0x101019f
@@ -1387,7 +1388,7 @@
field public static final int valueType = 16843488; // 0x10102e0
field public static final int variablePadding = 16843157; // 0x1010195
field public static final int vendor = 16843751; // 0x10103e7
- field public static final int version = 16844057; // 0x1010519
+ field public static final int version = 16844058; // 0x101051a
field public static final int versionCode = 16843291; // 0x101021b
field public static final int versionName = 16843292; // 0x101021c
field public static final int verticalCorrection = 16843322; // 0x101023a
@@ -1431,7 +1432,7 @@
field public static final int windowAllowReturnTransitionOverlap = 16843835; // 0x101043b
field public static final int windowAnimationStyle = 16842926; // 0x10100ae
field public static final int windowBackground = 16842836; // 0x1010054
- field public static final int windowBackgroundFallback = 16844035; // 0x1010503
+ field public static final int windowBackgroundFallback = 16844036; // 0x1010504
field public static final int windowClipToOutline = 16843947; // 0x10104ab
field public static final int windowCloseOnTouchOutside = 16843611; // 0x101035b
field public static final int windowContentOverlay = 16842841; // 0x1010059
diff --git a/api/test-removed.txt b/api/test-removed.txt
index 8119834..0ff2476 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -1,3 +1,17 @@
+package android {
+
+ public static final class R.attr {
+ field public static final int minimalHeight = 16844067; // 0x1010523
+ field public static final int minimalWidth = 16844022; // 0x10104f6
+ }
+
+ public static final class R.styleable {
+ field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6
+ field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5
+ }
+
+}
+
package android.app {
public class Notification implements android.os.Parcelable {
@@ -454,6 +468,11 @@
package com.android.internal {
+ public static final class R.attr {
+ field public static final int minimalHeight = 16844067; // 0x1010523
+ field public static final int minimalWidth = 16844022; // 0x10104f6
+ }
+
public static final class R.styleable {
field public static final int AndroidManifestLayout_minimalHeight = 6; // 0x6
field public static final int AndroidManifestLayout_minimalWidth = 5; // 0x5
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 4b8d9ee..3a70a4c 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.content.ComponentName;
+import android.content.IIntentSender;
import android.os.IBinder;
import android.service.voice.IVoiceInteractionSession;
@@ -144,4 +145,10 @@
* Kill foreground apps from the specified user.
*/
public abstract void killForegroundAppsForUser(int userHandle);
+
+ /**
+ * Sets how long a {@link PendingIntent} can be temporarily whitelist to by bypass restrictions
+ * such as Power Save mode.
+ */
+ public abstract void setPendingIntentWhitelistDuration(IIntentSender target, long duration);
}
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index cd9a05b..f12c284 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -6966,8 +6966,8 @@
reply.recycle();
}
- public void notifyLockedProfile(@UserIdInt int userId) throws RemoteException
- {
+ @Override
+ public void notifyLockedProfile(@UserIdInt int userId) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
@@ -6978,6 +6978,7 @@
reply.recycle();
}
+ @Override
public void startConfirmDeviceCredentialIntent(Intent intent) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
@@ -6989,6 +6990,7 @@
reply.recycle();
}
+ @Override
public int sendIntentSender(IIntentSender target, int code, Intent intent, String resolvedType,
IIntentReceiver finishedReceiver, String requiredPermission, Bundle options)
throws RemoteException {
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 0cc44e7..e108dd6 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -4323,18 +4323,23 @@
// experience
bigTextText = mBuilder.processLegacyText(text);
}
- contentView.setTextViewText(R.id.big_text, bigTextText);
- contentView.setViewVisibility(R.id.big_text,
- TextUtils.isEmpty(bigTextText) ? View.GONE : View.VISIBLE);
- contentView.setInt(R.id.big_text, "setMaxLines", calculateMaxLines());
- contentView.setBoolean(R.id.big_text, "setHasImage", mBuilder.mN.mLargeIcon != null);
+ applyBigTextContentView(mBuilder, contentView, bigTextText);
return contentView;
}
- private int calculateMaxLines() {
+ static void applyBigTextContentView(Builder builder,
+ RemoteViews contentView, CharSequence bigTextText) {
+ contentView.setTextViewText(R.id.big_text, bigTextText);
+ contentView.setViewVisibility(R.id.big_text,
+ TextUtils.isEmpty(bigTextText) ? View.GONE : View.VISIBLE);
+ contentView.setInt(R.id.big_text, "setMaxLines", calculateMaxLines(builder));
+ contentView.setBoolean(R.id.big_text, "setHasImage", builder.mN.mLargeIcon != null);
+ }
+
+ private static int calculateMaxLines(Builder builder) {
int lineCount = MAX_LINES;
- boolean hasActions = mBuilder.mActions.size() > 0;
+ boolean hasActions = builder.mActions.size() > 0;
if (hasActions) {
lineCount -= LINES_CONSUMED_BY_ACTIONS;
}
@@ -4532,6 +4537,16 @@
: mConversationTitle;
boolean hasTitle = !TextUtils.isEmpty(title);
+ if (!hasTitle && mMessages.size() == 1) {
+ CharSequence sender = mMessages.get(0).mSender;
+ CharSequence text = mMessages.get(0).mText;
+ RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(
+ mBuilder.getBigTextLayoutResource(),
+ false /* progress */, sender, null /* text */);
+ BigTextStyle.applyBigTextContentView(mBuilder, contentView, text);
+ return contentView;
+ }
+
RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(
mBuilder.getMessagingLayoutResource(),
false /* hasProgress */,
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index b758868..108350a 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -285,6 +285,12 @@
public static final int BIND_ADJUST_WITH_ACTIVITY = 0x0080;
/**
+ * @hide Flag for {@link #bindService}: allows application hosting service to manage whitelists
+ * such as temporary allowing a {@code PendingIntent} to bypass Power Save mode.
+ */
+ public static final int BIND_ALLOW_WHITELIST_MANAGEMENT = 0x01000000;
+
+ /**
* @hide Flag for {@link #bindService}: Like {@link #BIND_FOREGROUND_SERVICE},
* but only applies while the device is awake.
*/
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 0bc514e..f867fb0 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -60,8 +60,8 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
-
import android.util.MemoryIntArray;
+
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.internal.widget.ILockSettings;
@@ -7950,6 +7950,7 @@
* idle_factor (float)
* min_time_to_alarm (long)
* max_temp_app_whitelist_duration (long)
+ * notification_whitelist_duration (long)
* </pre>
*
* <p>
diff --git a/core/java/android/view/inputmethod/InputMethodManagerInternal.java b/core/java/android/view/inputmethod/InputMethodManagerInternal.java
index ce9908c..77df4e3 100644
--- a/core/java/android/view/inputmethod/InputMethodManagerInternal.java
+++ b/core/java/android/view/inputmethod/InputMethodManagerInternal.java
@@ -32,4 +32,9 @@
* Called by the window manager to let the input method manager rotate the input method.
*/
void switchInputMethod(boolean forwardDirection);
+
+ /**
+ * Hides the current input method, if visible.
+ */
+ void hideCurrentInputMethod();
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 3711b94..5cbd284 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -6857,11 +6857,11 @@
.setLineSpacing(mSpacingAdd, mSpacingMult)
.setIncludePad(mIncludePad)
.setBreakStrategy(mBreakStrategy)
- .setHyphenationFrequency(mHyphenationFrequency)
- .setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE);
+ .setHyphenationFrequency(mHyphenationFrequency);
if (shouldEllipsize) {
builder.setEllipsize(mEllipsize)
- .setEllipsizedWidth(ellipsisWidth);
+ .setEllipsizedWidth(ellipsisWidth)
+ .setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE);
}
mHintLayout = builder.build();
}
@@ -6948,12 +6948,11 @@
.setLineSpacing(mSpacingAdd, mSpacingMult)
.setIncludePad(mIncludePad)
.setBreakStrategy(mBreakStrategy)
- .setHyphenationFrequency(mHyphenationFrequency)
- .setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE);
+ .setHyphenationFrequency(mHyphenationFrequency);
if (shouldEllipsize) {
builder.setEllipsize(effectiveEllipsize)
- .setEllipsizedWidth(ellipsisWidth);
-
+ .setEllipsizedWidth(ellipsisWidth)
+ .setMaxLines(mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE);
}
// TODO: explore always setting maxLines
result = builder.build();
@@ -6983,19 +6982,14 @@
return false;
}
- private static int desired(Layout layout, int maxLines) {
+ private static int desired(Layout layout) {
int n = layout.getLineCount();
CharSequence text = layout.getText();
float max = 0;
- // if maxLines is set, and the text length is greater that the length of the text in the
- // layout, it means that there is a cut-off and we cannot use it.
- if (maxLines != -1 && text.length() > layout.getLineEnd(n - 1)) {
- return -1;
- }
-
// if any line was wrapped, we can't use it.
// but it's ok for the last line not to have a newline
+
for (int i = 0; i < n - 1; i++) {
if (text.charAt(layout.getLineEnd(i) - 1) != '\n')
return -1;
@@ -7068,7 +7062,7 @@
width = widthSize;
} else {
if (mLayout != null && mEllipsize == null) {
- des = desired(mLayout, getMaxLines());
+ des = desired(mLayout);
}
if (des < 0) {
@@ -7100,7 +7094,7 @@
int hintWidth;
if (mHintLayout != null && mEllipsize == null) {
- hintDes = desired(mHintLayout, getMaxLines());
+ hintDes = desired(mHintLayout);
}
if (hintDes < 0) {
diff --git a/core/jni/android_graphics_drawable_VectorDrawable.cpp b/core/jni/android_graphics_drawable_VectorDrawable.cpp
index 9e69f79..045f127 100644
--- a/core/jni/android_graphics_drawable_VectorDrawable.cpp
+++ b/core/jni/android_graphics_drawable_VectorDrawable.cpp
@@ -36,6 +36,13 @@
return reinterpret_cast<jlong>(tree);
}
+static jlong createTreeFromCopy(JNIEnv*, jobject, jlong treePtr, jlong groupPtr) {
+ VectorDrawable::Group* rootGroup = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
+ VectorDrawable::Tree* treeToCopy = reinterpret_cast<VectorDrawable::Tree*>(treePtr);
+ VectorDrawable::Tree* tree = new VectorDrawable::Tree(treeToCopy, rootGroup);
+ return reinterpret_cast<jlong>(tree);
+}
+
static jlong createEmptyFullPath(JNIEnv*, jobject) {
VectorDrawable::FullPath* newPath = new VectorDrawable::FullPath();
return reinterpret_cast<jlong>(newPath);
@@ -344,6 +351,7 @@
static const JNINativeMethod gMethods[] = {
{"nCreateTree", "!(J)J", (void*)createTree},
+ {"nCreateTreeFromCopy", "!(JJ)J", (void*)createTreeFromCopy},
{"nSetRendererViewportSize", "!(JFF)V", (void*)setTreeViewportSize},
{"nSetRootAlpha", "!(JF)Z", (void*)setRootAlpha},
{"nGetRootAlpha", "!(J)F", (void*)getRootAlpha},
diff --git a/core/res/res/layout/app_error_dialog.xml b/core/res/res/layout/app_error_dialog.xml
index 7147ea2..9a5bbd4 100644
--- a/core/res/res/layout/app_error_dialog.xml
+++ b/core/res/res/layout/app_error_dialog.xml
@@ -35,11 +35,11 @@
/>
<Button
- android:id="@+id/aerr_reset"
+ android:id="@+id/aerr_close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/aerr_reset"
- android:drawableStart="@drawable/ic_refresh"
+ android:text="@string/aerr_close"
+ android:drawableStart="@drawable/ic_close"
style="@style/aerr_list_item"
/>
@@ -53,15 +53,6 @@
/>
<Button
- android:id="@+id/aerr_close"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/aerr_close"
- android:drawableStart="@drawable/ic_close"
- style="@style/aerr_list_item"
- />
-
- <Button
android:id="@+id/aerr_mute"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/notification_template_header.xml b/core/res/res/layout/notification_template_header.xml
index d16dcc6..38ea92a 100644
--- a/core/res/res/layout/notification_template_header.xml
+++ b/core/res/res/layout/notification_template_header.xml
@@ -96,6 +96,7 @@
android:layout_height="wrap_content"
android:paddingTop="1dp"
android:visibility="gone"
+ android:contentDescription="@string/expand_button_content_description"
/>
<ImageView android:id="@+id/profile_badge"
android:layout_width="@dimen/notification_badge_size"
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index b61d6cf..d12e34c 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -593,6 +593,9 @@
the appearance matches the branding of the app requesting the fingerprint scan.-->
<attr name="fingerprintAuthDrawable" format="reference" />
+ <!-- Asset that should be used to show users the position of the NFC antenna on the device. -->
+ <attr name="nfcAntennaPositionDrawable" format="reference" />
+
<!-- ============ -->
<!-- Panel styles -->
<!-- ============ -->
@@ -4591,6 +4594,10 @@
screens with limited space for text. -->
<enum name="full" value="2" />
</attr>
+ <!-- Placeholder for a deleted attribute. This should be removed before M release. -->
+ <attr name="__removeBeforeMRelease_leftIndents" format="reference" />
+ <!-- Placeholder for a deleted attribute. This should be removed before M release. -->
+ <attr name="__removeBeforeMRelease_rightIndents" format="reference" />
</declare-styleable>
<declare-styleable name="TextViewAppearance">
<!-- Base text color, typeface, size, and style. -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 6797799..fee2469 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2595,13 +2595,13 @@
<public type="attr" name="accessibilityTraversalAfter" id="0x010104d2" />
<public type="attr" name="dialogPreferredPadding" id="0x010104d3" />
<public type="attr" name="searchHintIcon" id="0x010104d4" />
- <public type="attr" name="revisionCode" id="0x010104d5" />
- <public type="attr" name="drawableTint" id="0x010104d6" />
- <public type="attr" name="drawableTintMode" id="0x010104d7" />
- <public type="attr" name="fraction" id="0x010104d8" />
+ <public type="attr" name="revisionCode" />
+ <public type="attr" name="drawableTint" />
+ <public type="attr" name="drawableTintMode" />
+ <public type="attr" name="fraction" />
- <public type="style" name="Theme.DeviceDefault.Dialog.Alert" id="0x010302d1" />
- <public type="style" name="Theme.DeviceDefault.Light.Dialog.Alert" id="0x010302d2" />
+ <public type="style" name="Theme.DeviceDefault.Dialog.Alert" />
+ <public type="style" name="Theme.DeviceDefault.Light.Dialog.Alert" />
<!-- ===============================================================
Resources added in version M of the platform
@@ -2653,79 +2653,85 @@
<public type="id" name="accessibilityActionScrollRight" id="0x0102003b" />
<public type="id" name="accessibilityActionContextClick" id="0x0102003c" />
- <public type="string" name="fingerprint_icon_content_description" id="0x01040018" />
+ <public type="string" name="fingerprint_icon_content_description" />
<!-- ===============================================================
Resources added in version N of the platform
=============================================================== -->
<eat-comment />
- <public type="attr" name="listMenuViewStyle" id="0x010104f2" />
- <public type="attr" name="subMenuArrow" id="0x010104f3" />
- <public type="attr" name="defaultWidth" id="0x010104f4" />
- <public type="attr" name="defaultHeight" id="0x010104f5" />
- <public type="attr" name="resizeableActivity" id="0x010104f6" />
- <public type="attr" name="supportsPictureInPicture" id="0x010104f7" />
- <public type="attr" name="titleMargin" id="0x010104f8" />
- <public type="attr" name="titleMarginStart" id="0x010104f9" />
- <public type="attr" name="titleMarginEnd" id="0x010104fa" />
- <public type="attr" name="titleMarginTop" id="0x010104fb" />
- <public type="attr" name="titleMarginBottom" id="0x010104fc" />
- <public type="attr" name="maxButtonHeight" id="0x010104fd" />
- <public type="attr" name="buttonGravity" id="0x010104fe" />
- <public type="attr" name="collapseIcon" id="0x010104ff" />
- <public type="attr" name="level" id="0x01010500" />
- <public type="attr" name="contextPopupMenuStyle" id="0x01010501" />
- <public type="attr" name="textAppearancePopupMenuHeader" id="0x01010502" />
- <public type="attr" name="windowBackgroundFallback" id="0x01010503" />
- <public type="attr" name="defaultToDeviceProtectedStorage" id="0x01010504" />
- <public type="attr" name="directBootAware" id="0x01010505" />
- <public type="attr" name="preferenceFragmentStyle" id="0x01010506" />
- <public type="attr" name="canControlMagnification" id="0x01010507" />
- <public type="attr" name="languageTag" id="0x01010508" />
- <public type="attr" name="pointerIcon" id="0x01010509" />
- <public type="attr" name="tickMark" id="0x0101050a" />
- <public type="attr" name="tickMarkTint" id="0x0101050b" />
- <public type="attr" name="tickMarkTintMode" id="0x0101050c" />
- <public type="attr" name="canPerformGestures" id="0x0101050d" />
- <public type="attr" name="externalService" id="0x0101050e" />
- <public type="attr" name="supportsLocalInteraction" id="0x0101050f" />
- <public type="attr" name="startX" id="0x01010510" />
- <public type="attr" name="startY" id="0x01010511" />
- <public type="attr" name="endX" id="0x01010512" />
- <public type="attr" name="endY" id="0x01010513" />
- <public type="attr" name="offset" id="0x01010514" />
- <public type="attr" name="use32bitAbi" id="0x01010515" />
- <public type="attr" name="bitmap" id="0x01010516" />
- <public type="attr" name="hotSpotX" id="0x01010517" />
- <public type="attr" name="hotSpotY" id="0x01010518" />
- <public type="attr" name="version" id="0x01010519" />
- <public type="attr" name="backupInForeground" id="0x0101051a" />
- <public type="attr" name="countDown" id="0x0101051b" />
- <public type="attr" name="canRecord" id="0x0101051c" />
- <public type="attr" name="tunerCount" id="0x0101051d" />
- <public type="attr" name="fillType" id="0x0101051e" />
- <public type="attr" name="popupEnterTransition" id="0x0101051f" />
- <public type="attr" name="popupExitTransition" id="0x01010520" />
- <public type="attr" name="forceHasOverlappingRendering" id="0x01010521" />
- <public type="attr" name="contentInsetStartWithNavigation" id="0x01010522" />
- <public type="attr" name="contentInsetEndWithActions" id="0x01010523" />
- <public type="attr" name="numberPickerStyle" id="0x01010524" />
- <public type="attr" name="enableVrMode" id="0x01010525" />
- <public type="attr" name="hash" id="0x01010526" />
- <public type="attr" name="networkSecurityConfig" id="0x01010527" />
+ <public type="attr" name="listMenuViewStyle" />
+ <public type="attr" name="subMenuArrow" />
+ <public type="attr" name="defaultWidth" />
+ <public type="attr" name="defaultHeight" />
+ <!-- @removed -->
+ <public type="attr" name="minimalWidth" />
+ <public type="attr" name="resizeableActivity" />
+ <public type="attr" name="supportsPictureInPicture" />
+ <public type="attr" name="titleMargin" />
+ <public type="attr" name="titleMarginStart" />
+ <public type="attr" name="titleMarginEnd" />
+ <public type="attr" name="titleMarginTop" />
+ <public type="attr" name="titleMarginBottom" />
+ <public type="attr" name="maxButtonHeight" />
+ <public type="attr" name="buttonGravity" />
+ <public type="attr" name="collapseIcon" />
+ <public type="attr" name="level" />
+ <public type="attr" name="contextPopupMenuStyle" />
+ <public type="attr" name="textAppearancePopupMenuHeader" />
+ <public type="attr" name="windowBackgroundFallback" />
+ <public type="attr" name="defaultToDeviceProtectedStorage" />
+ <public type="attr" name="directBootAware" />
+ <public type="attr" name="preferenceFragmentStyle" />
+ <public type="attr" name="canControlMagnification" />
+ <public type="attr" name="languageTag" />
+ <public type="attr" name="pointerIcon" />
+ <public type="attr" name="tickMark" />
+ <public type="attr" name="tickMarkTint" />
+ <public type="attr" name="tickMarkTintMode" />
+ <public type="attr" name="canPerformGestures" />
+ <public type="attr" name="externalService" />
+ <public type="attr" name="supportsLocalInteraction" />
+ <public type="attr" name="startX" />
+ <public type="attr" name="startY" />
+ <public type="attr" name="endX" />
+ <public type="attr" name="endY" />
+ <public type="attr" name="offset" />
+ <public type="attr" name="use32bitAbi" />
+ <public type="attr" name="bitmap" />
+ <public type="attr" name="hotSpotX" />
+ <public type="attr" name="hotSpotY" />
+ <public type="attr" name="version" />
+ <public type="attr" name="backupInForeground" />
+ <public type="attr" name="countDown" />
+ <public type="attr" name="canRecord" />
+ <public type="attr" name="tunerCount" />
+ <public type="attr" name="nfcAntennaPositionDrawable" />
+ <public type="attr" name="fillType" />
+ <public type="attr" name="popupEnterTransition" />
+ <public type="attr" name="popupExitTransition" />
+ <!-- @removed -->
+ <public type="attr" name="minimalHeight" />
+ <public type="attr" name="forceHasOverlappingRendering" />
+ <public type="attr" name="contentInsetStartWithNavigation" />
+ <public type="attr" name="contentInsetEndWithActions" />
+ <public type="attr" name="numberPickerStyle" />
+ <public type="attr" name="enableVrMode" />
+ <public type="attr" name="hash" />
+ <public type="attr" name="networkSecurityConfig" />
- <public type="style" name="Theme.Material.Light.DialogWhenLarge.DarkActionBar" id="0x010302d8" />
- <public type="style" name="Widget.Material.SeekBar.Discrete" id="0x010302d9" />
- <public type="style" name="Widget.Material.CompoundButton.Switch" id="0x010302da" />
- <public type="style" name="Widget.Material.Light.CompoundButton.Switch" id="0x010302db" />
- <public type="style" name="Widget.Material.NumberPicker" id="0x010302dc" />
- <public type="style" name="Widget.Material.Light.NumberPicker" id="0x010302dd" />
- <public type="style" name="TextAppearance.Material.Widget.Button.Colored" id="0x010302de" />
- <public type="style" name="TextAppearance.Material.Widget.Button.Borderless.Colored" id="0x010302df" />
+ <public type="style" name="Theme.Material.Light.DialogWhenLarge.DarkActionBar" />
+ <public type="style" name="Widget.Material.SeekBar.Discrete" />
+ <public type="style" name="Widget.Material.CompoundButton.Switch" />
+ <public type="style" name="Widget.Material.Light.CompoundButton.Switch" />
+ <public type="style" name="Widget.Material.NumberPicker" />
+ <public type="style" name="Widget.Material.Light.NumberPicker" />
+ <public type="style" name="TextAppearance.Material.Widget.Button.Colored" />
+ <public type="style" name="TextAppearance.Material.Widget.Button.Borderless.Colored" />
- <public type="id" name="accessibilityActionSetProgress" id="0x0102003d" />
- <public type="id" name="icon_frame" id="0x0102003e" />
- <public type="id" name="list_container" id="0x0102003f" />
- <public type="id" name="switch_widget" id="0x01020040" />
+ <public type="id" name="accessibilityActionSetProgress" />
+ <public type="id" name="icon_frame" />
+ <public type="id" name="list_container" />
+ <public type="id" name="switch_widget" />
+
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index e30fd1a..3a28822 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2725,9 +2725,7 @@
<!-- Text of the alert that is displayed when a process has crashed repeatedly. -->
<string name="aerr_process_repeated"><xliff:g id="process">%1$s</xliff:g> keeps stopping</string>
<!-- Button that restarts a crashed application -->
- <string name="aerr_restart">Restart app</string>
- <!-- Button that clears cache and restarts a crashed application -->
- <string name="aerr_reset">Reset and restart app</string>
+ <string name="aerr_restart">Open app again</string>
<!-- Button that sends feedback about a crashed application -->
<string name="aerr_report">Send feedback</string>
<!-- Button that closes a crashed application -->
@@ -4261,6 +4259,12 @@
<!-- Content description of the work profile icon in the notification. -->
<string name="notification_work_profile_content_description">Work profile</string>
+ <!-- Content description of the expand button icon in the notification.-->
+ <string name="expand_button_content_description">Expand button</string>
+
+ <!-- Accessibility action description on the expand button. -->
+ <string name="expand_action_accessibility">Click to expand</string>
+
<!-- User visible name for USB MIDI Peripheral port -->
<string name="usb_midi_peripheral_name">Android USB Peripheral Port</string>
<!-- Manufacturer name for USB MIDI Peripheral port -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 737daed..9ab42a9 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2445,7 +2445,6 @@
<java-symbol type="id" name="work_widget_badge_icon" />
<java-symbol type="id" name="aerr_report" />
- <java-symbol type="id" name="aerr_reset" />
<java-symbol type="id" name="aerr_restart" />
<java-symbol type="id" name="aerr_close" />
<java-symbol type="id" name="aerr_mute" />
diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml
index 9e9343e..4825d8c 100644
--- a/docs/html/_redirects.yaml
+++ b/docs/html/_redirects.yaml
@@ -99,10 +99,6 @@
to: /training/testing/ui-testing/index.html
- from: /guide/market/
to: /google/play/
-- from: /guide/google/gcm/client-javadoc/...
- to: /reference/com/google/android/gms/gcm/package-summary.html
-- from: /guide/google/gcm/server-javadoc/...
- to: /reference/com/google/android/gms/gcm/package-summary.html
- from: /guide/google/play/services.html
to: https://developers.google.com/android/guides/overview
- from: /guide/google/
@@ -771,10 +767,6 @@
to: https://developers.google.com/android/guides/api-client
- from: /google/auth/http-auth.html
to: https://developers.google.com/android/guides/http-auth
-- from: /reference/gms-packages.html
- to: https://developers.google.com/android/reference/packages
-- from: /reference/com/google/android/gms/
- to: https://developers.google.com/android/reference/com/google/android/gms/
- from: /preview/features/runtime-permissions.html
to: /training/permissions/index.html
- from: /preview/features/app-linking.html
@@ -865,11 +857,18 @@
- from: /tools/testing-support-library/...
to: /topic/libraries/testing-support-library/...
-# GCM redirects
+# GMS and GCM reference redirects
+- from: /reference/gms-packages.html
+ to: https://developers.google.com/android/reference/packages
+- from: /guide/google/gcm/client-javadoc/...
+ to: https://developers.google.com/android/reference/com/google/android/gms/gcm/package-summary
+- from: /guide/google/gcm/server-javadoc/...
+ to: https://developers.google.com/android/reference/com/google/android/gms/gcm/package-summary
+- from: /reference/com/google/android/gcm/...
+ to: https://developers.google.com/android/reference/com/google/android/gms/gcm/package-summary
- from: /reference/com/google/...
to: https://developers.google.com/android/reference/com/google/...
-
# Files moved during the /studio restructure
- from: /sdk/index.html
to: /studio/index.html
diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd
index f4a03db..fff2608 100644
--- a/docs/html/about/dashboards/index.jd
+++ b/docs/html/about/dashboards/index.jd
@@ -63,19 +63,10 @@
<br/>Any versions with less than 0.1% distribution are not shown.</em>
</p>
-<p class="note"><strong>Note:</strong> This data is gathered from the new Google Play
-Store app, which supports Android 2.2 and above, so devices running older versions are not included.
-However, in August, 2013, versions older than Android 2.2 accounted for about 1% of devices that
-<em>checked in</em> to Google servers (not those that actually visited Google Play Store).
-</p>
-
-
-
<h2 id="Screens">Screen Sizes and Densities</h2>
-
<p>This section provides data about the relative number of devices that have a particular
screen configuration, defined by a combination of screen size and density. To simplify the way that
you design your user interfaces for different screen configurations, Android divides the range of
diff --git a/docs/html/ndk/guides/audio/opensl-prog-notes.jd b/docs/html/ndk/guides/audio/opensl-prog-notes.jd
index 3263145..e70aa08 100644
--- a/docs/html/ndk/guides/audio/opensl-prog-notes.jd
+++ b/docs/html/ndk/guides/audio/opensl-prog-notes.jd
@@ -61,8 +61,8 @@
create array and can be added
later after the object is created. The Android implementation provides
a convenience feature to
-avoid this complexity; see the
- <a href="#dynamic-interfaces">Dynamic interfaces at object creation</a> section above.
+avoid this complexity, which is described in
+ <a href="{@docRoot}ndk/guides/audio/opensl-for-android.html#dynamic-interfaces">Dynamic interfaces at object creation</a>.
</p>
<p>
diff --git a/docs/html/samples/index.jd b/docs/html/samples/index.jd
index 76ea573..5885086 100644
--- a/docs/html/samples/index.jd
+++ b/docs/html/samples/index.jd
@@ -35,9 +35,8 @@
from GitHub as a new project.
</p>
-<p>For more information about importing samples, see
-<a href="{@docRoot}tools/studio/index.html#git-samples">Easy access to Android code samples on
-GitHub</a>.</p>
+<p>To view the Android code samples that you can import, see the
+<a class="external-link" href="https://github.com/googlesamples/">Google Samples page</a> on GitHub.</p>
<h2>Download Samples</h2>
diff --git a/docs/html/training/sync-adapters/running-sync-adapter.jd b/docs/html/training/sync-adapters/running-sync-adapter.jd
index 033450f..a640aa6 100644
--- a/docs/html/training/sync-adapters/running-sync-adapter.jd
+++ b/docs/html/training/sync-adapters/running-sync-adapter.jd
@@ -240,6 +240,7 @@
* Ask the framework to run your sync adapter.
* To maintain backward compatibility, assume that
* changeUri is null.
+ */
ContentResolver.requestSync(ACCOUNT, AUTHORITY, null);
}
...
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index dd33e98..f5592fa 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -804,7 +804,7 @@
mTintMode = copy.mTintMode;
mAutoMirrored = copy.mAutoMirrored;
mRootGroup = new VGroup(copy.mRootGroup, mVGTargetsMap);
- createNativeTree(mRootGroup);
+ createNativeTreeFromCopy(copy, mRootGroup);
mBaseWidth = copy.mBaseWidth;
mBaseHeight = copy.mBaseHeight;
@@ -826,6 +826,16 @@
VMRuntime.getRuntime().registerNativeAllocation(NATIVE_ALLOCATION_SIZE);
}
+ // Create a new native tree with the given root group, and copy the properties from the
+ // given VectorDrawableState's native tree.
+ private void createNativeTreeFromCopy(VectorDrawableState copy, VGroup rootGroup) {
+ mNativeTree = new VirtualRefBasePtr(nCreateTreeFromCopy(
+ copy.mNativeTree.get(), rootGroup.mNativePtr));
+ // Register tree size
+ VMRuntime.getRuntime().registerNativeAllocation(NATIVE_ALLOCATION_SIZE);
+ }
+
+
void onTreeConstructionFinished() {
mRootGroup.setTree(mNativeTree);
mAllocationOfAllNodes = mRootGroup.getNativeSize();
@@ -1777,6 +1787,7 @@
}
private static native long nCreateTree(long rootGroupPtr);
+ private static native long nCreateTreeFromCopy(long treeToCopy, long rootGroupPtr);
private static native void nSetRendererViewportSize(long rendererPtr, float viewportWidth,
float viewportHeight);
private static native boolean nSetRootAlpha(long rendererPtr, float alpha);
diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp
index f0348e4..2b79941 100644
--- a/libs/hwui/VectorDrawable.cpp
+++ b/libs/hwui/VectorDrawable.cpp
@@ -530,7 +530,7 @@
if (prop->getRootAlpha() == 1.0f && prop->getColorFilter() == nullptr) {
return nullptr;
} else {
- outPaint->setColorFilter(mStagingProperties.getColorFilter());
+ outPaint->setColorFilter(prop->getColorFilter());
outPaint->setFilterQuality(kLow_SkFilterQuality);
outPaint->setAlpha(prop->getRootAlpha() * 255);
return outPaint;
diff --git a/libs/hwui/VectorDrawable.h b/libs/hwui/VectorDrawable.h
index b33f26c..a5d1d4b 100644
--- a/libs/hwui/VectorDrawable.h
+++ b/libs/hwui/VectorDrawable.h
@@ -542,6 +542,12 @@
Tree(Group* rootNode) : mRootNode(rootNode) {
mRootNode->setPropertyChangedListener(&mPropertyChangedListener);
}
+
+ // Copy properties from the tree and use the give node as the root node
+ Tree(const Tree* copy, Group* rootNode) : Tree(rootNode) {
+ mStagingProperties.syncAnimatableProperties(*copy->stagingProperties());
+ mStagingProperties.syncNonAnimatableProperties(*copy->stagingProperties());
+ }
// Draws the VD onto a bitmap cache, then the bitmap cache will be rendered onto the input
// canvas. Returns the number of pixels needed for the bitmap cache.
int draw(Canvas* outCanvas, SkColorFilter* colorFilter,
@@ -666,7 +672,7 @@
};
void onPropertyChanged(TreeProperties* prop);
TreeProperties* mutateStagingProperties() { return &mStagingProperties; }
- const TreeProperties* stagingProperties() { return &mStagingProperties; }
+ const TreeProperties* stagingProperties() const { return &mStagingProperties; }
PushStagingFunctor* getFunctor() { return &mFunctor;}
// This should only be called from animations on RT
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/Camera2SurfaceViewTestCase.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/Camera2SurfaceViewTestCase.java
index 423c3b0..a8b782e8 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/Camera2SurfaceViewTestCase.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/Camera2SurfaceViewTestCase.java
@@ -37,6 +37,7 @@
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.ImageReader;
import android.graphics.SurfaceTexture;
import android.os.Bundle;
@@ -127,6 +128,7 @@
protected List<Size> mOrderedRAW10Sizes; // In descending order.
protected List<Size> mOrderedYUV420888Sizes; // In descending order.
protected HashMap<Size, Long> mMinPreviewFrameDurationMap;
+ protected boolean mSupportRAW10;
protected WindowManager mWindowManager;
@@ -603,16 +605,21 @@
mCamera = CameraTestUtils.openCamera(
mCameraManager, cameraId, mCameraListener, mHandler);
mCollector.setCameraId(cameraId);
- mStaticInfo = new StaticMetadata(mCameraManager.getCameraCharacteristics(cameraId),
- CheckLevel.ASSERT, /*collector*/null);
+ CameraCharacteristics properties = mCameraManager.getCameraCharacteristics(cameraId);
+ mStaticInfo = new StaticMetadata(properties, CheckLevel.ASSERT, /*collector*/null);
+ StreamConfigurationMap configMap =
+ properties.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+ mSupportRAW10 = configMap.isOutputSupportedFor(ImageFormat.RAW10);
if (mStaticInfo.isColorOutputSupported()) {
mOrderedPreviewSizes = getSupportedPreviewSizes(cameraId, mCameraManager,
getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
mOrderedVideoSizes = getSupportedVideoSizes(
cameraId, mCameraManager, PREVIEW_SIZE_BOUND);
mOrderedStillSizes = getSupportedStillSizes(cameraId, mCameraManager, null);
- mOrderedRAW10Sizes = getSortedSizesForFormat(
- cameraId, mCameraManager, ImageFormat.RAW10, null);
+ if (mSupportRAW10) {
+ mOrderedRAW10Sizes = getSortedSizesForFormat(
+ cameraId, mCameraManager, ImageFormat.RAW10, null);
+ }
mOrderedYUV420888Sizes = getSortedSizesForFormat(
cameraId, mCameraManager, ImageFormat.YUV_420_888, null);
// Use ImageFormat.YUV_420_888 for now. TODO: need figure out what's format for preview
@@ -636,6 +643,7 @@
mOrderedPreviewSizes = null;
mOrderedVideoSizes = null;
mOrderedStillSizes = null;
+ mSupportRAW10 = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
index e89c136..a0bae20 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
@@ -39,6 +39,7 @@
public class Divider extends SystemUI {
private DividerWindowManager mWindowManager;
private DividerView mView;
+ private final DividerState mDividerState = new DividerState();
private DockDividerVisibilityListener mDockDividerVisibilityListener;
private boolean mVisible = false;
private boolean mMinimized = false;
@@ -76,7 +77,7 @@
final int width = landscape ? size : MATCH_PARENT;
final int height = landscape ? MATCH_PARENT : size;
mWindowManager.add(mView, width, height);
- mView.setWindowManager(mWindowManager);
+ mView.injectDependencies(mWindowManager, mDividerState);
}
private void removeDivider() {
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerState.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerState.java
new file mode 100644
index 0000000..353a974
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerState.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.stackdivider;
+
+/**
+ * Class to hold state of divider that needs to persist across configuration changes.
+ */
+public class DividerState {
+ public boolean animateAfterRecentsDrawn;
+ public boolean growAfterRecentsDrawn;
+}
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index f728aa4..d09587b 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -30,12 +30,12 @@
import android.graphics.Region.Op;
import android.hardware.display.DisplayManager;
import android.os.Bundle;
+import android.os.Handler;
import android.util.AttributeSet;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
-import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.PointerIcon;
import android.view.VelocityTracker;
@@ -141,8 +141,6 @@
private DividerSnapAlgorithm mSnapAlgorithm;
private final Rect mStableInsets = new Rect();
- private boolean mAnimateAfterRecentsDrawn;
- private boolean mGrowAfterRecentsDrawn;
private boolean mGrowRecents;
private ValueAnimator mCurrentAnimator;
private boolean mEntranceAnimationRunning;
@@ -151,6 +149,8 @@
private GestureDetector mGestureDetector;
private boolean mDockedStackMinimized;
private boolean mAdjustedForIme;
+ private DividerState mState;
+ private final Handler mHandler = new Handler();
private final AccessibilityDelegate mHandleDelegate = new AccessibilityDelegate() {
@Override
@@ -335,8 +335,9 @@
}
}
- public void setWindowManager(DividerWindowManager windowManager) {
+ public void injectDependencies(DividerWindowManager windowManager, DividerState dividerState) {
mWindowManager = windowManager;
+ mState = dividerState;
}
public WindowManagerProxy getWindowManagerProxy() {
@@ -558,7 +559,7 @@
if (endDelay == 0 || mCancelled) {
endAction.run();
} else {
- postDelayed(endAction, endDelay);
+ mHandler.postDelayed(endAction, endDelay);
}
}
});
@@ -1048,15 +1049,15 @@
public final void onBusEvent(RecentsActivityStartingEvent recentsActivityStartingEvent) {
if (mGrowRecents && getWindowManagerProxy().getDockSide() == WindowManager.DOCKED_TOP
&& getCurrentPosition() == getSnapAlgorithm().getLastSplitTarget().position) {
- mGrowAfterRecentsDrawn = true;
+ mState.growAfterRecentsDrawn = true;
startDragging(false /* animate */, false /* touching */);
}
}
public final void onBusEvent(DockedTopTaskEvent event) {
if (event.dragMode == NavigationBarGestureHelper.DRAG_MODE_NONE) {
- mGrowAfterRecentsDrawn = false;
- mAnimateAfterRecentsDrawn = true;
+ mState.growAfterRecentsDrawn = false;
+ mState.animateAfterRecentsDrawn = true;
startDragging(false /* animate */, false /* touching */);
}
updateDockSide();
@@ -1068,11 +1069,11 @@
}
public final void onBusEvent(RecentsDrawnEvent drawnEvent) {
- if (mAnimateAfterRecentsDrawn) {
- mAnimateAfterRecentsDrawn = false;
+ if (mState.animateAfterRecentsDrawn) {
+ mState.animateAfterRecentsDrawn = false;
updateDockSide();
- post(() -> {
+ mHandler.post(() -> {
// Delay switching resizing mode because this might cause jank in recents animation
// that's longer than this animation.
stopDragging(getCurrentPosition(), mSnapAlgorithm.getMiddleTarget(),
@@ -1080,8 +1081,8 @@
200 /* endDelay */);
});
}
- if (mGrowAfterRecentsDrawn) {
- mGrowAfterRecentsDrawn = false;
+ if (mState.growAfterRecentsDrawn) {
+ mState.growAfterRecentsDrawn = false;
updateDockSide();
EventBus.getDefault().send(new RecentsGrowingEvent());
stopDragging(getCurrentPosition(), mSnapAlgorithm.getMiddleTarget(), 336,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 63933d4..91889d3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -1887,10 +1887,13 @@
public boolean onDismiss() {
if (mHeadsUpManager != null && mHeadsUpManager.isHeadsUp(notificationKey)) {
// Release the HUN notification to the shade.
+
+ if (isPanelFullyCollapsed()) {
+ HeadsUpManager.setIsClickedNotification(row, true);
+ }
//
// In most cases, when FLAG_AUTO_CANCEL is set, the notification will
// become canceled shortly by NoMan, but we can't assume that.
- HeadsUpManager.setIsClickedNotification(row, true);
mHeadsUpManager.releaseImmediately(notificationKey);
}
StatusBarNotification parentToCancel = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 88c1503..6e9e830 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -1486,6 +1486,13 @@
updateBackground();
}
+ public int getPositionOfChild(ExpandableNotificationRow childRow) {
+ if (mIsSummaryWithChildren) {
+ return mChildrenContainer.getPositionInLinearLayout(childRow);
+ }
+ return 0;
+ }
+
public void setExpansionLogger(ExpansionLogger logger, String key) {
mLogger = logger;
mLoggingKey = key;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index f3c666f..d6c02e4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -360,7 +360,9 @@
private void setVisible(final boolean isVisible) {
if (isVisible) {
-
+ // This call can happen multiple times, but removing only removes a single one.
+ // We therefore need to remove the old one.
+ getViewTreeObserver().removeOnPreDrawListener(mEnableAnimationPredrawListener);
// We only animate if we are drawn at least once, otherwise the view might animate when
// it's shown the first time
getViewTreeObserver().addOnPreDrawListener(mEnableAnimationPredrawListener);
@@ -401,12 +403,17 @@
return mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_action_list_height);
}
+ int hint;
if (mHeadsUpChild != null) {
- return mHeadsUpChild.getHeight();
+ hint = mHeadsUpChild.getHeight();
} else {
- return mContractedChild.getHeight() + mContext.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.notification_action_list_height);
+ hint = mContractedChild.getHeight() + mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_action_list_height);
}
+ if (mExpandedChild != null) {
+ hint = Math.min(hint, mExpandedChild.getHeight());
+ }
+ return hint;
}
private void updateContentTransformation() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeaderTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeaderTransformState.java
index b66e9f3..8463e06 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeaderTransformState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeaderTransformState.java
@@ -109,9 +109,6 @@
@Override
public void recycle() {
super.recycle();
- if (mWorkProfileState != null) {
- mWorkProfileState.recycle();
- }
sInstancePool.release(this);
}
@@ -120,6 +117,10 @@
super.reset();
mExpandButton = null;
mWorkProfileState = null;
+ if (mWorkProfileState != null) {
+ mWorkProfileState.recycle();
+ mWorkProfileState = null;
+ }
}
public void setVisible(boolean visible) {
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 2f522f0..40ff051 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -47,6 +47,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto;
import com.android.systemui.R;
+import com.android.systemui.statusbar.ExpandableView;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.stack.ScrollContainer;
@@ -284,11 +285,17 @@
private void findScrollContainer() {
if (mScrollContainer == null) {
+ mScrollContainerChild = null;
ViewParent p = this;
while (p != null) {
+ if (mScrollContainerChild == null && p instanceof ExpandableView) {
+ mScrollContainerChild = (View) p;
+ }
if (p.getParent() instanceof ScrollContainer) {
mScrollContainer = (ScrollContainer) p.getParent();
- mScrollContainerChild = (View) p;
+ if (mScrollContainerChild == null) {
+ mScrollContainerChild = (View) p;
+ }
break;
}
p = p.getParent();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
index cb0b848..a0f1bc2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
@@ -677,6 +677,10 @@
mHeaderUtil = new NotificationHeaderUtil(mNotificationParent);
}
+ public ExpandableNotificationRow getNotificationParent() {
+ return mNotificationParent;
+ }
+
public NotificationHeaderView getHeaderView() {
return mNotificationHeader;
}
@@ -854,4 +858,23 @@
child.setRemoved();
}
}
+
+ public int getPositionInLinearLayout(View childInGroup) {
+ int position = mNotificationHeaderMargin + mNotificatonTopPadding;
+
+ for (int i = 0; i < mChildren.size(); i++) {
+ ExpandableNotificationRow child = mChildren.get(i);
+ boolean notGone = child.getVisibility() != View.GONE;
+ if (notGone) {
+ position += mDividerHeight;
+ }
+ if (child == childInGroup) {
+ return position;
+ }
+ if (notGone) {
+ position += child.getIntrinsicHeight();
+ }
+ }
+ return 0;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index cab2534..b58538d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -610,9 +610,13 @@
ExpandableView expandableView = (ExpandableView) mForcedScroll;
int positionInLinearLayout = getPositionInLinearLayout(expandableView);
int targetScroll = targetScrollForView(expandableView, positionInLinearLayout);
+ int outOfViewScroll = positionInLinearLayout + expandableView.getIntrinsicHeight();
targetScroll = Math.max(0, Math.min(targetScroll, getScrollRange()));
- if (mOwnScrollY < targetScroll || positionInLinearLayout < mOwnScrollY) {
+
+ // Only apply the scroll if we're scrolling the view upwards, or the view is so far up
+ // that it is not visible anymore.
+ if (mOwnScrollY < targetScroll || outOfViewScroll < mOwnScrollY) {
mOwnScrollY = targetScroll;
}
}
@@ -1034,9 +1038,13 @@
@Override
public boolean scrollTo(View v) {
ExpandableView expandableView = (ExpandableView) v;
- int targetScroll = targetScrollForView(expandableView, getPositionInLinearLayout(v));
+ int positionInLinearLayout = getPositionInLinearLayout(v);
+ int targetScroll = targetScrollForView(expandableView, positionInLinearLayout);
+ int outOfViewScroll = positionInLinearLayout + expandableView.getIntrinsicHeight();
- if (mOwnScrollY < targetScroll) {
+ // Only apply the scroll if we're scrolling the view upwards, or the view is so far up
+ // that it is not visible anymore.
+ if (mOwnScrollY < targetScroll || outOfViewScroll < mOwnScrollY) {
mScroller.startScroll(mScrollX, mOwnScrollY, 0, targetScroll - mOwnScrollY);
mDontReportNextOverScroll = true;
postInvalidateOnAnimation();
@@ -1064,6 +1072,10 @@
// animating away. To work around that we'll wait until things have settled.
removeCallbacks(mReclamp);
postDelayed(mReclamp, 50);
+ } else if (mForcedScroll != null) {
+ // The scroll was requested before we got the actual inset - in case we need
+ // to scroll up some more do so now.
+ scrollTo(mForcedScroll);
}
return insets;
}
@@ -2363,7 +2375,15 @@
return view.getHeight();
}
- private int getPositionInLinearLayout(View requestedChild) {
+ private int getPositionInLinearLayout(View requestedView) {
+ ExpandableNotificationRow childInGroup = null;
+ ExpandableNotificationRow requestedRow = null;
+ if (isChildInGroup(requestedView)) {
+ // We're asking for a child in a group. Calculate the position of the parent first,
+ // then within the parent.
+ childInGroup = (ExpandableNotificationRow) requestedView;
+ requestedView = requestedRow = childInGroup.getNotificationParent();
+ }
int position = 0;
float previousIncreasedAmount = 0.0f;
for (int i = 0; i < getChildCount(); i++) {
@@ -2379,7 +2399,10 @@
}
previousIncreasedAmount = increasedPaddingAmount;
}
- if (child == requestedChild) {
+ if (child == requestedView) {
+ if (requestedRow != null) {
+ position += requestedRow.getPositionOfChild(childInGroup);
+ }
return position;
}
if (notGone) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
index d6c5506..8f0cd8e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
@@ -26,9 +26,8 @@
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.ExpandableView;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
+import java.util.WeakHashMap;
/**
* A state of a {@link com.android.systemui.statusbar.stack.NotificationStackScrollLayout} which
@@ -39,12 +38,12 @@
private static final String CHILD_NOT_FOUND_TAG = "StackScrollStateNoSuchChild";
private final ViewGroup mHostView;
- private Map<ExpandableView, StackViewState> mStateMap;
+ private WeakHashMap<ExpandableView, StackViewState> mStateMap;
private final int mClearAllTopPadding;
public StackScrollState(ViewGroup hostView) {
mHostView = hostView;
- mStateMap = new HashMap<ExpandableView, StackViewState>();
+ mStateMap = new WeakHashMap<>();
mClearAllTopPadding = hostView.getContext().getResources().getDimensionPixelSize(
R.dimen.clear_all_padding_top);
}
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index 69960c7..bb966f7 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -542,6 +542,8 @@
"mms_temp_app_whitelist_duration";
private static final String KEY_SMS_TEMP_APP_WHITELIST_DURATION =
"sms_temp_app_whitelist_duration";
+ private static final String KEY_NOTIFICATION_WHITELIST_DURATION =
+ "notification_whitelist_duration";
/**
* This is the time, after becoming inactive, that we go in to the first
@@ -752,6 +754,14 @@
*/
public long SMS_TEMP_APP_WHITELIST_DURATION;
+ /**
+ * Amount of time we would like to whitelist an app that is handling a
+ * {@link android.app.PendingIntent} triggered by a {@link android.app.Notification}.
+ * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+ * @see #KEY_NOTIFICATION_WHITELIST_DURATION
+ */
+ public long NOTIFICATION_WHITELIST_DURATION;
+
private final ContentResolver mResolver;
private final boolean mHasWatch;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -842,6 +852,8 @@
KEY_MMS_TEMP_APP_WHITELIST_DURATION, 60 * 1000L);
SMS_TEMP_APP_WHITELIST_DURATION = mParser.getLong(
KEY_SMS_TEMP_APP_WHITELIST_DURATION, 20 * 1000L);
+ NOTIFICATION_WHITELIST_DURATION = mParser.getLong(
+ KEY_NOTIFICATION_WHITELIST_DURATION, 30 * 1000L);
}
}
@@ -945,6 +957,10 @@
pw.print(" "); pw.print(KEY_SMS_TEMP_APP_WHITELIST_DURATION); pw.print("=");
TimeUtils.formatDuration(SMS_TEMP_APP_WHITELIST_DURATION, pw);
pw.println();
+
+ pw.print(" "); pw.print(KEY_NOTIFICATION_WHITELIST_DURATION); pw.print("=");
+ TimeUtils.formatDuration(NOTIFICATION_WHITELIST_DURATION, pw);
+ pw.println();
}
}
@@ -1252,6 +1268,10 @@
addPowerSaveTempWhitelistAppDirectInternal(0, appId, duration, sync, reason);
}
+ public long getNotificationWhitelistDuration() {
+ return mConstants.NOTIFICATION_WHITELIST_DURATION;
+ }
+
public void setNetworkPolicyTempWhitelistCallback(Runnable callback) {
setNetworkPolicyTempWhitelistCallbackInternal(callback);
}
@@ -1632,7 +1652,7 @@
}
entry.first.value = timeNow + duration;
if (DEBUG) {
- Slog.d(TAG, "Adding AppId " + appId + " to temp whitelist");
+ Slog.d(TAG, "Adding AppId " + appId + " to temp whitelist. New entry: " + newEntry);
}
if (newEntry) {
// No pending timeout for the app id, post a delayed message
@@ -1665,12 +1685,18 @@
}
private void postTempActiveTimeoutMessage(int uid, long delay) {
+ if (DEBUG) {
+ Slog.d(TAG, "postTempActiveTimeoutMessage: uid=" + uid + ", delay=" + delay);
+ }
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_TEMP_APP_WHITELIST_TIMEOUT, uid, 0),
delay);
}
void checkTempAppWhitelistTimeout(int uid) {
final long timeNow = SystemClock.elapsedRealtime();
+ if (DEBUG) {
+ Slog.d(TAG, "checkTempAppWhitelistTimeout: uid=" + uid + ", timeNow=" + timeNow);
+ }
synchronized (this) {
Pair<MutableLong, String> entry = mTempWhitelistAppIdEndTimes.get(uid);
if (entry == null) {
@@ -1694,6 +1720,9 @@
}
} else {
// Need more time
+ if (DEBUG) {
+ Slog.d(TAG, "Time to remove UID " + uid + ": " + entry.first.value);
+ }
postTempActiveTimeoutMessage(uid, entry.first.value - timeNow);
}
}
@@ -2514,6 +2543,8 @@
pw.println(" Print currently whitelisted apps.");
pw.println(" whitelist [package ...]");
pw.println(" Add (prefix with +) or remove (prefix with -) packages.");
+ pw.println(" tempwhitelist");
+ pw.println(" Print packages that are temporarily whitelisted.");
pw.println(" tempwhitelist [-u] [package ..]");
pw.println(" Temporarily place packages in whitelist for 10 seconds.");
}
@@ -2817,8 +2848,7 @@
pw.println("Failed: " + re);
}
} else {
- pw.println("At least one package name must be specified");
- return -1;
+ dumpTempWhitelistSchedule(pw, false);
}
} else {
return shell.handleDefaultCommands(cmd);
@@ -2943,20 +2973,8 @@
pw.println();
}
}
- size = mTempWhitelistAppIdEndTimes.size();
- if (size > 0) {
- pw.println(" Temp whitelist schedule:");
- final long timeNow = SystemClock.elapsedRealtime();
- for (int i = 0; i < size; i++) {
- pw.print(" UID=");
- pw.print(mTempWhitelistAppIdEndTimes.keyAt(i));
- pw.print(": ");
- Pair<MutableLong, String> entry = mTempWhitelistAppIdEndTimes.valueAt(i);
- TimeUtils.formatDuration(entry.first.value, timeNow, pw);
- pw.print(" - ");
- pw.println(entry.second);
- }
- }
+ dumpTempWhitelistSchedule(pw, true);
+
size = mTempWhitelistAppIdArray != null ? mTempWhitelistAppIdArray.length : 0;
if (size > 0) {
pw.println(" Temp whitelist app ids:");
@@ -2968,7 +2986,7 @@
}
pw.print(" mLightEnabled="); pw.print(mLightEnabled);
- pw.print(" mDeepEnabled="); pw.println(mDeepEnabled);
+ pw.print(" mDeepEnabled="); pw.println(mDeepEnabled);
pw.print(" mForceIdle="); pw.println(mForceIdle);
pw.print(" mMotionSensor="); pw.println(mMotionSensor);
pw.print(" mCurDisplay="); pw.println(mCurDisplay);
@@ -3040,4 +3058,26 @@
}
}
}
-}
+
+ void dumpTempWhitelistSchedule(PrintWriter pw, boolean printTitle) {
+ final int size = mTempWhitelistAppIdEndTimes.size();
+ if (size > 0) {
+ String prefix = "";
+ if (printTitle) {
+ pw.println(" Temp whitelist schedule:");
+ prefix = " ";
+ }
+ final long timeNow = SystemClock.elapsedRealtime();
+ for (int i = 0; i < size; i++) {
+ pw.print(prefix);
+ pw.print("UID=");
+ pw.print(mTempWhitelistAppIdEndTimes.keyAt(i));
+ pw.print(": ");
+ Pair<MutableLong, String> entry = mTempWhitelistAppIdEndTimes.valueAt(i);
+ TimeUtils.formatDuration(entry.first.value, timeNow, pw);
+ pw.print(" - ");
+ pw.println(entry.second);
+ }
+ }
+ }
+ }
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 727bf5c..5d8fe7c 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -159,6 +159,7 @@
static final int MSG_BIND_INPUT = 1010;
static final int MSG_SHOW_SOFT_INPUT = 1020;
static final int MSG_HIDE_SOFT_INPUT = 1030;
+ static final int MSG_HIDE_CURRENT_INPUT_METHOD = 1035;
static final int MSG_ATTACH_TOKEN = 1040;
static final int MSG_CREATE_SESSION = 1050;
@@ -2846,6 +2847,11 @@
}
args.recycle();
return true;
+ case MSG_HIDE_CURRENT_INPUT_METHOD:
+ synchronized (mMethodMap) {
+ hideCurrentInputLocked(0, null);
+ }
+ return true;
case MSG_ATTACH_TOKEN:
args = (SomeArgs)msg.obj;
try {
@@ -3880,6 +3886,12 @@
mHandler.sendMessage(mHandler.obtainMessage(MSG_SWITCH_IME,
forwardDirection ? 1 : 0, 0));
}
+
+ @Override
+ public void hideCurrentInputMethod() {
+ mHandler.removeMessages(MSG_HIDE_CURRENT_INPUT_METHOD);
+ mHandler.sendEmptyMessage(MSG_HIDE_CURRENT_INPUT_METHOD);
+ }
}
private static String imeWindowStatusToString(final int imeWindowVis) {
diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java
index 2a78f90..3745e0b 100644
--- a/services/core/java/com/android/server/NetworkScoreService.java
+++ b/services/core/java/com/android/server/NetworkScoreService.java
@@ -17,12 +17,10 @@
package com.android.server;
import android.Manifest.permission;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.net.INetworkScoreCache;
@@ -33,7 +31,6 @@
import android.net.ScoredNetwork;
import android.os.Binder;
import android.os.IBinder;
-import android.os.PatternMatcher;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
@@ -42,6 +39,7 @@
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.content.PackageMonitor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -62,39 +60,75 @@
private final Context mContext;
private final Map<Integer, INetworkScoreCache> mScoreCaches;
- /** Lock used to update mReceiver when scorer package changes occur. */
- private final Object mReceiverLock = new Object[0];
+ /** Lock used to update mPackageMonitor when scorer package changes occur. */
+ private final Object mPackageMonitorLock = new Object[0];
- /** Clears scores when the active scorer package is no longer valid. */
- @GuardedBy("mReceiverLock")
- private ScorerChangedReceiver mReceiver;
+ @GuardedBy("mPackageMonitorLock")
+ private NetworkScorerPackageMonitor mPackageMonitor;
private ScoringServiceConnection mServiceConnection;
- private class ScorerChangedReceiver extends BroadcastReceiver {
+ /**
+ * Clears scores when the active scorer package is no longer valid and
+ * manages the service connection.
+ */
+ private class NetworkScorerPackageMonitor extends PackageMonitor {
final String mRegisteredPackage;
- ScorerChangedReceiver(String packageName) {
- mRegisteredPackage = packageName;
+ private NetworkScorerPackageMonitor(String mRegisteredPackage) {
+ this.mRegisteredPackage = mRegisteredPackage;
}
@Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (Intent.ACTION_PACKAGE_CHANGED.equals(action)
- || Intent.ACTION_PACKAGE_REPLACED.equals(action)
- || Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(action)) {
- NetworkScorerAppData activeScorer =
+ public void onPackageAdded(String packageName, int uid) {
+ evaluateBinding(packageName, true /* forceUnbind */);
+ }
+
+ @Override
+ public void onPackageRemoved(String packageName, int uid) {
+ evaluateBinding(packageName, true /* forceUnbind */);
+ }
+
+ @Override
+ public void onPackageModified(String packageName) {
+ evaluateBinding(packageName, false /* forceUnbind */);
+ }
+
+ @Override
+ public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
+ if (doit) { // "doit" means the force stop happened instead of just being queried for.
+ for (String packageName : packages) {
+ evaluateBinding(packageName, true /* forceUnbind */);
+ }
+ }
+ return super.onHandleForceStop(intent, packages, uid, doit);
+ }
+
+ @Override
+ public void onPackageUpdateFinished(String packageName, int uid) {
+ evaluateBinding(packageName, true /* forceUnbind */);
+ }
+
+ private void evaluateBinding(String scorerPackageName, boolean forceUnbind) {
+ if (mRegisteredPackage.equals(scorerPackageName)) {
+ if (DBG) {
+ Log.d(TAG, "Evaluating binding for: " + scorerPackageName
+ + ", forceUnbind=" + forceUnbind);
+ }
+ final NetworkScorerAppData activeScorer =
NetworkScorerAppManager.getActiveScorer(mContext);
if (activeScorer == null) {
- // Package change has invalidated a scorer.
+ // Package change has invalidated a scorer, this will also unbind any service
+ // connection.
Log.i(TAG, "Package " + mRegisteredPackage +
" is no longer valid, disabling scoring.");
setScorerInternal(null);
} else if (activeScorer.mScoringServiceClassName == null) {
// The scoring service is not available, make sure it's unbound.
unbindFromScoringServiceIfNeeded();
- } else {
- // The scoring service may have changed or been added.
+ } else { // The scoring service changed in some way.
+ if (forceUnbind) {
+ unbindFromScoringServiceIfNeeded();
+ }
bindToScoringServiceIfNeeded(activeScorer);
}
}
@@ -121,7 +155,7 @@
Settings.Global.putInt(cr, Settings.Global.NETWORK_SCORING_PROVISIONED, 1);
}
- registerPackageReceiverIfNeeded();
+ registerPackageMonitorIfNeeded();
}
/** Called when the system is ready for us to start third-party code. */
@@ -130,33 +164,29 @@
bindToScoringServiceIfNeeded();
}
- private void registerPackageReceiverIfNeeded() {
- if (DBG) Log.d(TAG, "registerPackageReceiverIfNeeded");
+ private void registerPackageMonitorIfNeeded() {
+ if (DBG) Log.d(TAG, "registerPackageMonitorIfNeeded");
NetworkScorerAppData scorer = NetworkScorerAppManager.getActiveScorer(mContext);
- synchronized (mReceiverLock) {
- // Unregister the receiver if the current scorer has changed since last registration.
- if (mReceiver != null) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "Unregistering receiver for " + mReceiver.mRegisteredPackage);
+ synchronized (mPackageMonitorLock) {
+ // Unregister the current monitor if needed.
+ if (mPackageMonitor != null) {
+ if (DBG) {
+ Log.d(TAG, "Unregistering package monitor for "
+ + mPackageMonitor.mRegisteredPackage);
}
- mContext.unregisterReceiver(mReceiver);
- mReceiver = null;
+ mPackageMonitor.unregister();
+ mPackageMonitor = null;
}
- // Register receiver if a scorer is active.
+ // Create and register the monitor if a scorer is active.
if (scorer != null) {
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
- filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
- filter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
- filter.addDataScheme("package");
- filter.addDataSchemeSpecificPart(scorer.mPackageName,
- PatternMatcher.PATTERN_LITERAL);
- mReceiver = new ScorerChangedReceiver(scorer.mPackageName);
+ mPackageMonitor = new NetworkScorerPackageMonitor(scorer.mPackageName);
// TODO: Need to update when we support per-user scorers. http://b/23422763
- mContext.registerReceiverAsUser(mReceiver, UserHandle.SYSTEM, filter, null, null);
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "Registered receiver for " + scorer.mPackageName);
+ mPackageMonitor.register(mContext, null /* thread */, UserHandle.SYSTEM,
+ false /* externalStorage */);
+ if (DBG) {
+ Log.d(TAG, "Registered package monitor for "
+ + mPackageMonitor.mRegisteredPackage);
}
}
}
@@ -299,7 +329,7 @@
// will be made to bind to the new scorer.
bindToScoringServiceIfNeeded();
if (result) { // new scorer successfully set
- registerPackageReceiverIfNeeded();
+ registerPackageMonitorIfNeeded();
Intent intent = new Intent(NetworkScoreManager.ACTION_SCORER_CHANGED);
if (prevScorer != null) { // Directly notify the old scorer.
@@ -391,20 +421,24 @@
private static class ScoringServiceConnection implements ServiceConnection {
private final ComponentName mComponentName;
private boolean mBound = false;
+ private boolean mConnected = false;
ScoringServiceConnection(ComponentName componentName) {
mComponentName = componentName;
}
void connect(Context context) {
- disconnect(context);
- Intent service = new Intent();
- service.setComponent(mComponentName);
- mBound = context.bindServiceAsUser(service, this,
- Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
- UserHandle.SYSTEM);
if (!mBound) {
- Log.w(TAG, "Bind call failed for " + service);
+ Intent service = new Intent();
+ service.setComponent(mComponentName);
+ mBound = context.bindServiceAsUser(service, this,
+ Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
+ UserHandle.SYSTEM);
+ if (!mBound) {
+ Log.w(TAG, "Bind call failed for " + service);
+ } else {
+ if (DBG) Log.d(TAG, "ScoringServiceConnection bound.");
+ }
}
}
@@ -413,6 +447,7 @@
if (mBound) {
mBound = false;
context.unbindService(this);
+ if (DBG) Log.d(TAG, "ScoringServiceConnection unbound.");
}
} catch (RuntimeException e) {
Log.e(TAG, "Unbind failed.", e);
@@ -422,15 +457,20 @@
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
if (DBG) Log.d(TAG, "ScoringServiceConnection: " + name.flattenToString());
+ mConnected = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
- if (DBG) Log.d(TAG, "ScoringServiceConnection, disconnected: " + name.flattenToString());
+ if (DBG) {
+ Log.d(TAG, "ScoringServiceConnection, disconnected: " + name.flattenToString());
+ }
+ mConnected = false;
}
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
- writer.println("ScoringServiceConnection: " + mComponentName + ", bound: " + mBound);
+ writer.println("ScoringServiceConnection: " + mComponentName + ", bound: " + mBound
+ + ", connected: " + mConnected);
}
}
}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index c24123a..6a8c8b0 100755
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -831,8 +831,9 @@
int clientLabel = 0;
PendingIntent clientIntent = null;
+ final boolean isCallerSystem = callerApp.info.uid == Process.SYSTEM_UID;
- if (callerApp.info.uid == Process.SYSTEM_UID) {
+ if (isCallerSystem) {
// Hacky kind of thing -- allow system stuff to tell us
// what they are, so we can report this elsewhere for
// others to know why certain services are running.
@@ -854,6 +855,12 @@
"BIND_TREAT_LIKE_ACTIVITY");
}
+ if ((flags & Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0 && !isCallerSystem) {
+ throw new SecurityException(
+ "Non-system caller " + caller + " (pid=" + Binder.getCallingPid()
+ + ") set BIND_ALLOW_WHITELIST_MANAGEMENT when binding service " + service);
+ }
+
final boolean callerFg = callerApp.setSchedGroup != ProcessList.SCHED_GROUP_BACKGROUND;
final boolean isBindExternal = (flags & Context.BIND_EXTERNAL_SERVICE) != 0;
@@ -1124,6 +1131,11 @@
}
if (r.binding.service.app != null) {
+ if (r.binding.service.app.whitelistManager) {
+ // Must reset flag here because on computeOomAdjLocked() the service
+ // connection will be gone...
+ r.binding.service.app.whitelistManager = false;
+ }
// This could have made the service less important.
if ((r.flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) {
r.binding.service.app.treatLikeActivity = true;
diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
index f2bf4f9..43bb5ee 100644
--- a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
+++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
@@ -90,6 +90,7 @@
static final boolean DEBUG_VISIBLE_BEHIND = DEBUG_ALL_ACTIVITIES || false;
static final boolean DEBUG_USAGE_STATS = DEBUG_ALL || false;
static final boolean DEBUG_PERMISSIONS_REVIEW = DEBUG_ALL || false;
+ static final boolean DEBUG_WHITELISTS = DEBUG_ALL || false;
static final String POSTFIX_ADD_REMOVE = (APPEND_CATEGORY_NAME) ? "_AddRemove" : "";
static final String POSTFIX_APP = (APPEND_CATEGORY_NAME) ? "_App" : "";
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 7c82829..ec54116 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -321,6 +321,7 @@
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBILITY;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBLE_BEHIND;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_WHITELISTS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BACKUP;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CLEANUP;
@@ -7135,6 +7136,41 @@
}
}
+ /**
+ * Whitelists {@code targetUid} to temporarily bypass Power Save mode.
+ *
+ * <p>{@code callerUid} must be allowed to request such whitelist by calling
+ * {@link #addTempPowerSaveWhitelistGrantorUid(int)}.
+ */
+ void tempWhitelistAppForPowerSave(int callerPid, int callerUid, int targetUid, long duration) {
+ if (DEBUG_WHITELISTS) {
+ Slog.d(TAG, "tempWhitelistAppForPowerSave(" + callerPid + ", " + callerUid + ", "
+ + targetUid + ", " + duration + ")");
+ }
+ synchronized (mPidsSelfLocked) {
+ final ProcessRecord pr = mPidsSelfLocked.get(callerPid);
+ if (pr == null) {
+ Slog.w(TAG, "tempWhitelistAppForPowerSave() no ProcessRecord for pid " + callerPid);
+ return;
+ }
+ if (!pr.whitelistManager) {
+ if (DEBUG_WHITELISTS) {
+ Slog.d(TAG, "tempWhitelistAppForPowerSave() for target " + targetUid + ": pid "
+ + callerPid + " is not allowed");
+ }
+ return;
+ }
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mLocalDeviceIdleController.addPowerSaveTempWhitelistAppDirect(targetUid, duration,
+ true, "pe from uid:" + callerUid);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
@Override
public void cancelIntentSender(IIntentSender sender) {
if (!(sender instanceof PendingIntentRecord)) {
@@ -19023,6 +19059,9 @@
}
}
}
+
+ app.whitelistManager = false;
+
for (int conni = s.connections.size()-1;
conni >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
@@ -19041,6 +19080,10 @@
// Binding to ourself is not interesting.
continue;
}
+ if ((cr.flags & Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0) {
+ app.whitelistManager = true;
+ }
+
if ((cr.flags&Context.BIND_WAIVE_PRIORITY) == 0) {
ProcessRecord client = cr.binding.client;
int clientAdj = computeOomAdjLocked(client, cachedAdj,
@@ -21312,6 +21355,15 @@
}
}
}
+
+ @Override
+ public void setPendingIntentWhitelistDuration(IIntentSender target, long duration) {
+ if (!(target instanceof PendingIntentRecord)) {
+ Slog.w(TAG, "markAsSentFromNotification(): not a PendingIntentRecord: " + target);
+ return;
+ }
+ ((PendingIntentRecord) target).setWhitelistDuration(duration);
+ }
}
private final class SleepTokenImpl extends SleepToken {
diff --git a/services/core/java/com/android/server/am/AppErrorDialog.java b/services/core/java/com/android/server/am/AppErrorDialog.java
index ddfab4d..e37feb2 100644
--- a/services/core/java/com/android/server/am/AppErrorDialog.java
+++ b/services/core/java/com/android/server/am/AppErrorDialog.java
@@ -18,13 +18,17 @@
import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.IPackageDataObserver;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.provider.Settings;
import android.text.BidiFormatter;
import android.util.Slog;
import android.view.LayoutInflater;
@@ -43,6 +47,7 @@
private final AppErrorResult mResult;
private final ProcessRecord mProc;
private final boolean mRepeating;
+ private final boolean mForeground;
private CharSequence mName;
@@ -54,9 +59,9 @@
static final int FORCE_QUIT = 1;
static final int FORCE_QUIT_AND_REPORT = 2;
static final int RESTART = 3;
- static final int RESET = 4;
static final int MUTE = 5;
static final int TIMEOUT = 6;
+ static final int CANCEL = 7;
// 5-minute timeout, then we automatically dismiss the crash dialog
static final long DISMISS_TIMEOUT = 1000 * 60 * 5;
@@ -69,6 +74,7 @@
mProc = data.proc;
mResult = data.result;
mRepeating = data.repeating;
+ mForeground = data.task != null;
BidiFormatter bidi = BidiFormatter.getInstance();
if ((mProc.pkgList.size() == 1) &&
@@ -86,7 +92,8 @@
bidi.unicodeWrap(mName.toString())));
}
- setCancelable(false);
+ setCancelable(true);
+ setCancelMessage(mHandler.obtainMessage(CANCEL));
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.setTitle("Application Error: " + mProc.info.processName);
@@ -111,25 +118,41 @@
LayoutInflater.from(context).inflate(
com.android.internal.R.layout.app_error_dialog, frame, true);
+ boolean hasRestart = !mRepeating && mForeground;
+ final boolean hasReceiver = mProc.errorReportReceiver != null;
+
final TextView restart = (TextView) findViewById(com.android.internal.R.id.aerr_restart);
restart.setOnClickListener(this);
- restart.setVisibility(!mRepeating ? View.VISIBLE : View.GONE);
- final TextView reset = (TextView) findViewById(com.android.internal.R.id.aerr_reset);
- reset.setOnClickListener(this);
- reset.setVisibility(mRepeating ? View.VISIBLE : View.GONE);
+ restart.setVisibility(hasRestart ? View.VISIBLE : View.GONE);
final TextView report = (TextView) 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);
+ 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);
mute.setOnClickListener(this);
- mute.setVisibility(!IS_USER_BUILD ? View.VISIBLE : View.GONE);
+ mute.setVisibility(showMute ? View.VISIBLE : View.GONE);
findViewById(com.android.internal.R.id.customPanel).setVisibility(View.VISIBLE);
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ getContext().registerReceiver(mReceiver,
+ new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ getContext().unregisterReceiver(mReceiver);
+ }
+
private final Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
final int result = msg.what;
@@ -163,9 +186,6 @@
case com.android.internal.R.id.aerr_restart:
mHandler.obtainMessage(RESTART).sendToTarget();
break;
- case com.android.internal.R.id.aerr_reset:
- mHandler.obtainMessage(RESET).sendToTarget();
- break;
case com.android.internal.R.id.aerr_report:
mHandler.obtainMessage(FORCE_QUIT_AND_REPORT).sendToTarget();
break;
@@ -180,6 +200,15 @@
}
}
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
+ cancel();
+ }
+ }
+ };
+
static class Data {
AppErrorResult result;
TaskRecord task;
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 3ed9969..49106f4 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -370,38 +370,9 @@
Intent appErrorIntent = null;
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_CRASH, res);
- if (res == AppErrorDialog.TIMEOUT) {
+ if (res == AppErrorDialog.TIMEOUT || res == AppErrorDialog.CANCEL) {
res = AppErrorDialog.FORCE_QUIT;
}
- if (res == AppErrorDialog.RESET) {
- String[] packageList = r.getPackageList();
- if (packageList != null) {
- PackageManager pm = mContext.getPackageManager();
- final Semaphore s = new Semaphore(0);
- for (int i = 0; i < packageList.length; i++) {
- if (i < packageList.length - 1) {
- pm.deleteApplicationCacheFiles(packageList[i], null);
- } else {
- pm.deleteApplicationCacheFiles(packageList[i],
- new IPackageDataObserver.Stub() {
- @Override
- public void onRemoveCompleted(String packageName,
- boolean succeeded) {
- s.release();
- }
- });
-
- // Wait until cache has been cleared before we restart.
- try {
- s.acquire();
- } catch (InterruptedException e) {
- }
- }
- }
- }
- // If there was nothing to reset, just restart;
- res = AppErrorDialog.RESTART;
- }
synchronized (mService) {
if (res == AppErrorDialog.MUTE) {
stopReportingCrashesLocked(r);
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index 1f8d26b..c1ff4dd 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -47,6 +47,7 @@
final WeakReference<PendingIntentRecord> ref;
boolean sent = false;
boolean canceled = false;
+ private long whitelistDuration = 0;
String stringName;
String lastTagPrefix;
@@ -66,9 +67,9 @@
final int flags;
final int hashCode;
final int userId;
-
+
private static final int ODD_PRIME_NUMBER = 37;
-
+
Key(int _t, String _p, ActivityRecord _a, String _w,
int _r, Intent[] _i, String[] _it, int _f, Bundle _o, int _userId) {
type = _t;
@@ -106,7 +107,7 @@
//Slog.i(ActivityManagerService.TAG, this + " hashCode=0x"
// + Integer.toHexString(hashCode));
}
-
+
public boolean equals(Object otherObj) {
if (otherObj == null) {
return false;
@@ -198,6 +199,11 @@
ref = new WeakReference<PendingIntentRecord>(this);
}
+ void setWhitelistDuration(long duration) {
+ this.whitelistDuration = duration;
+ this.stringName = null;
+ }
+
public void send(int code, Intent intent, String resolvedType, IIntentReceiver finishedReceiver,
String requiredPermission, Bundle options) {
sendInner(code, intent, resolvedType, finishedReceiver,
@@ -216,6 +222,14 @@
if (intent != null) intent.setDefusable(true);
if (options != null) options.setDefusable(true);
+ if (whitelistDuration > 0 && !canceled) {
+ // Must call before acquiring the lock. It's possible the method return before sending
+ // the intent due to some validations inside the lock, in which case the UID shouldn't
+ // be whitelisted, but since the whitelist is temporary, that would be ok.
+ owner.tempWhitelistAppForPowerSave(Binder.getCallingPid(), Binder.getCallingUid(), uid,
+ whitelistDuration);
+ }
+
synchronized (owner) {
final ActivityContainer activityContainer = (ActivityContainer)container;
if (activityContainer != null && activityContainer.mParentActivity != null &&
@@ -361,7 +375,7 @@
}
}
}
-
+
void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("uid="); pw.print(uid);
pw.print(" packageName="); pw.print(key.packageName);
@@ -383,6 +397,7 @@
pw.print(prefix); pw.print("sent="); pw.print(sent);
pw.print(" canceled="); pw.println(canceled);
}
+ pw.print(prefix); pw.println("whitelistDuration="); pw.println(whitelistDuration);
}
public String toString() {
@@ -396,6 +411,9 @@
sb.append(key.packageName);
sb.append(' ');
sb.append(key.typeName());
+ if (whitelistDuration > 0) {
+ sb.append( " (whitelistDuration: ").append(whitelistDuration).append("ms)");
+ }
sb.append('}');
return stringName = sb.toString();
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index da18f32..691fd2a 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -194,6 +194,8 @@
// Process is currently hosting a backup agent for backup or restore
public boolean inFullBackup;
+ // App is allowed to manage whitelists such as temporary Power Save mode whitelist.
+ boolean whitelistManager;
void dump(PrintWriter pw, String prefix) {
final long now = SystemClock.uptimeMillis();
@@ -376,6 +378,9 @@
}
pw.println();
}
+ if (whitelistManager) {
+ pw.print(prefix); pw.print("whitelistManager="); pw.println(whitelistManager);
+ }
if (activities.size() > 0) {
pw.print(prefix); pw.println("Activities:");
for (int i=0; i<activities.size(); i++) {
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 491ee18..1b8eccb 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -16,6 +16,9 @@
package com.android.server.job;
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -41,6 +44,7 @@
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Handler;
@@ -217,7 +221,41 @@
if (DEBUG) {
Slog.d(TAG, "Receieved: " + intent.getAction());
}
- if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
+ if (Intent.ACTION_PACKAGE_CHANGED.equals(intent.getAction())) {
+ // Purge the app's jobs if the whole package was just disabled. When this is
+ // the case the component name will be a bare package name.
+ final String pkgName = getPackageName(intent);
+ final int pkgUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
+ if (pkgName != null && pkgUid != -1) {
+ final String[] changedComponents = intent.getStringArrayExtra(
+ Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
+ if (changedComponents != null) {
+ for (String component : changedComponents) {
+ if (component.equals(pkgName)) {
+ if (DEBUG) {
+ Slog.d(TAG, "Package state change: " + pkgName);
+ }
+ try {
+ final int userId = UserHandle.getUserId(pkgUid);
+ IPackageManager pm = AppGlobals.getPackageManager();
+ final int state = pm.getApplicationEnabledSetting(pkgName, userId);
+ if (state == COMPONENT_ENABLED_STATE_DISABLED
+ || state == COMPONENT_ENABLED_STATE_DISABLED_USER) {
+ if (DEBUG) {
+ Slog.d(TAG, "Removing jobs for package " + pkgName
+ + " in user " + userId);
+ }
+ cancelJobsForUid(pkgUid, true);
+ }
+ } catch (RemoteException e) { /* cannot happen */ }
+ break;
+ }
+ }
+ }
+ } else {
+ Slog.w(TAG, "PACKAGE_CHANGED for " + pkgName + " / uid " + pkgUid);
+ }
+ } else if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
// If this is an outright uninstall rather than the first half of an
// app update sequence, cancel the jobs associated with the app.
if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
@@ -237,6 +275,12 @@
}
};
+ private String getPackageName(Intent intent) {
+ Uri uri = intent.getData();
+ String pkg = uri != null ? uri.getSchemeSpecificPart() : null;
+ return pkg;
+ }
+
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
updateUidState(uid, procState);
@@ -520,7 +564,9 @@
public void onBootPhase(int phase) {
if (PHASE_SYSTEM_SERVICES_READY == phase) {
// Register br for package removals and user removals.
- final IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
getContext().registerReceiverAsUser(
mBroadcastReceiver, UserHandle.ALL, filter, null, null);
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 53c5a6d..dc85dd7 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -16,6 +16,10 @@
package com.android.server.notification;
+import static android.content.Context.BIND_ALLOW_WHITELIST_MANAGEMENT;
+import static android.content.Context.BIND_AUTO_CREATE;
+import static android.content.Context.BIND_FOREGROUND_SERVICE;
+
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.PendingIntent;
@@ -43,7 +47,6 @@
import android.os.UserManager;
import android.provider.Settings;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
@@ -56,7 +59,6 @@
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
-import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
@@ -681,7 +683,7 @@
};
if (!mContext.bindServiceAsUser(intent,
serviceConnection,
- Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
+ BIND_AUTO_CREATE | BIND_FOREGROUND_SERVICE | BIND_ALLOW_WHITELIST_MANAGEMENT,
new UserHandle(userid))) {
mServicesBinding.remove(servicesBindingTag);
Slog.w(TAG, "Unable to bind " + getCaption() + " service: " + intent);
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index cf4669d..b5a8bf3 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -40,11 +40,13 @@
import static android.service.notification.NotificationListenerService.TRIM_LIGHT;
import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_DEFAULT;
import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_NONE;
+
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import android.Manifest;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
import android.app.ActivityManagerNative;
import android.app.AppGlobals;
import android.app.AppOpsManager;
@@ -56,6 +58,7 @@
import android.app.NotificationManager;
import android.app.NotificationManager.Policy;
import android.app.PendingIntent;
+import android.app.RemoteInput;
import android.app.StatusBarManager;
import android.app.backup.BackupManager;
import android.app.usage.UsageEvents;
@@ -64,6 +67,7 @@
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
@@ -90,6 +94,7 @@
import android.os.IInterface;
import android.os.Looper;
import android.os.Message;
+import android.os.Parcelable;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -127,6 +132,7 @@
import com.android.internal.statusbar.NotificationVisibility;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.Preconditions;
+import com.android.server.DeviceIdleController;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.SystemService;
@@ -2542,6 +2548,8 @@
+ " id=" + id + " notification=" + notification);
}
+ markAsSentFromNotification(notification);
+
// Sanitize inputs
notification.priority = clamp(notification.priority, Notification.PRIORITY_MIN,
Notification.PRIORITY_MAX);
@@ -2556,6 +2564,63 @@
idOut[0] = id;
}
+ private static void markAsSentFromNotification(Notification notification) {
+ final ActivityManagerInternal am = LocalServices.getService(ActivityManagerInternal.class);
+ final long duration = LocalServices.getService(DeviceIdleController.LocalService.class)
+ .getNotificationWhitelistDuration();
+
+ int size = 0;
+ if (notification.contentIntent != null) {
+ am.setPendingIntentWhitelistDuration(notification.contentIntent.getTarget(), duration);
+ }
+ if (notification.deleteIntent != null) {
+ am.setPendingIntentWhitelistDuration(notification.deleteIntent.getTarget(), duration);
+ }
+ if (notification.fullScreenIntent != null) {
+ am.setPendingIntentWhitelistDuration(notification.fullScreenIntent.getTarget(),
+ duration);
+ }
+ if (notification.actions != null) {
+ for (Notification.Action action: notification.actions) {
+ am.setPendingIntentWhitelistDuration(action.actionIntent.getTarget(), duration);
+ setPendingIntentWhitelistDuration(am, duration, action.getExtras());
+ final RemoteInput[] remoteInputs = action.getRemoteInputs();
+ if (remoteInputs != null) {
+ for (RemoteInput remoteInput : remoteInputs) {
+ setPendingIntentWhitelistDuration(am, duration, remoteInput.getExtras());
+ }
+ }
+ }
+ }
+ }
+
+ private static void setPendingIntentWhitelistDuration(ActivityManagerInternal am, long duration,
+ Bundle extras) {
+ for (String key : extras.keySet()) {
+ setPendingIntentWhitelistDuration(am, duration, extras.getParcelable(key));
+ final Parcelable[] parcelableArray = extras.getParcelableArray(key);
+ if (parcelableArray != null) {
+ for (Parcelable parcelable: parcelableArray) {
+ setPendingIntentWhitelistDuration(am, duration, parcelable);
+ }
+ }
+ final ArrayList<Parcelable> parcelableList = extras.getParcelableArrayList(key);
+ if (parcelableList != null) {
+ for (Parcelable parcelable: parcelableList) {
+ setPendingIntentWhitelistDuration(am, duration, parcelable);
+ }
+ }
+ }
+ }
+
+ private static void setPendingIntentWhitelistDuration(ActivityManagerInternal am, long duration,
+ Parcelable parcelable) {
+ if (parcelable instanceof PendingIntent) {
+ am.setPendingIntentWhitelistDuration(((PendingIntent) parcelable).getTarget(),
+ duration);
+ }
+ }
+
private class EnqueueNotificationRunnable implements Runnable {
private final NotificationRecord r;
private final int userId;
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 0cafb93..66bb24d 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -4360,6 +4360,11 @@
pf.bottom = df.bottom = of.bottom = mUnrestrictedScreenTop + mUnrestrictedScreenHeight;
// ...with content insets above the nav bar
cf.bottom = vf.bottom = mStableBottom;
+ if (mStatusBar != null && mFocusedWindow == mStatusBar && canReceiveInput(mStatusBar)) {
+ // The status bar forces the navigation bar while it's visible. Make sure the IME
+ // avoids the navigation bar in that case.
+ pf.right = df.right = of.right = cf.right = vf.right = mStableRight;
+ }
// IM dock windows always go to the bottom of the screen.
attrs.gravity = Gravity.BOTTOM;
mDockLayer = win.getSurfaceLayer();
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 1b31d07c..e73649d 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -45,9 +45,11 @@
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
+import android.view.inputmethod.InputMethodManagerInternal;
import com.android.internal.policy.DividerSnapAlgorithm;
import com.android.internal.policy.DockedDividerUtils;
+import com.android.server.LocalServices;
import com.android.server.wm.DimLayer.DimLayerUser;
import com.android.server.wm.WindowManagerService.H;
@@ -131,6 +133,7 @@
private float mLastAnimationProgress;
private float mLastDividerProgress;
private final DividerSnapAlgorithm[] mSnapAlgorithmForRotation = new DividerSnapAlgorithm[4];
+ private boolean mImeHideRequested;
DockedStackDividerController(WindowManagerService service, DisplayContent displayContent) {
mService = service;
@@ -375,11 +378,39 @@
}
}
mDockedStackListeners.finishBroadcast();
- if (!exists) {
+ if (exists) {
+ InputMethodManagerInternal inputMethodManagerInternal =
+ LocalServices.getService(InputMethodManagerInternal.class);
+ if (inputMethodManagerInternal != null) {
+
+ // Hide the current IME to avoid problems with animations from IME adjustment when
+ // attaching the docked stack.
+ inputMethodManagerInternal.hideCurrentInputMethod();
+ mImeHideRequested = true;
+ }
+ } else {
setMinimizedDockedStack(false);
}
}
+ /**
+ * Resets the state that IME hide has been requested. See {@link #isImeHideRequested}.
+ */
+ void resetImeHideRequested() {
+ mImeHideRequested = false;
+ }
+
+ /**
+ * The docked stack divider controller makes sure the IME gets hidden when attaching the docked
+ * stack, to avoid animation problems. This flag indicates whether the request to hide the IME
+ * has been sent in an asynchronous manner, and the IME should be treated as hidden already.
+ *
+ * @return whether IME hide request has been sent
+ */
+ boolean isImeHideRequested() {
+ return mImeHideRequested;
+ }
+
void notifyDockedStackMinimizedChanged(boolean minimizedDock, long animDuration) {
mService.mH.removeMessages(NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED);
mService.mH.obtainMessage(NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED,
@@ -606,7 +637,12 @@
private void setMinimizedDockedStack(boolean minimized) {
final TaskStack stack = mDisplayContent.getDockedStackVisibleForUserLocked();
notifyDockedStackMinimizedChanged(minimized, 0);
- setMinimizeAmount(stack, minimized ? 1f : 0f);
+ if (stack == null) {
+ return;
+ }
+ if (stack.setAdjustedForMinimizedDock(minimized ? 1f : 0f)) {
+ mService.mWindowPlacerLocked.performSurfacePlacement();
+ }
}
private boolean isAnimationMaximizing() {
@@ -690,8 +726,11 @@
float t = Math.min(1f, (float) (now - mAnimationStartTime) / mAnimationDuration);
t = (isAnimationMaximizing() ? TOUCH_RESPONSE_INTERPOLATOR : mMinimizedDockInterpolator)
.getInterpolation(t);
- setMinimizeAmount(stack, getMinimizeAmount(stack, t));
-
+ if (stack != null) {
+ if (stack.setAdjustedForMinimizedDock(getMinimizeAmount(stack, t))) {
+ mService.mWindowPlacerLocked.performSurfacePlacement();
+ }
+ }
if (t >= 1.0f) {
mAnimatingForMinimizedDockedStack = false;
return false;
@@ -700,42 +739,6 @@
}
}
- void setMinimizeAmount(TaskStack dockedStack, float minimizeAmount) {
- final ArrayList<TaskStack> stacks = mDisplayContent.getStacks();
-
- // If the docked stack is not visible, clear the complementary stack on all stacks.
- if (dockedStack == null) {
- for (int i = stacks.size() - 1; i >= 0; --i) {
- final TaskStack stack = stacks.get(i);
- stack.resetAdjustedForComplementDock();
- }
- return;
- }
-
- // Otherwise if the docked stack minimize amount has changed, update the adjusted bounds
- // on the other stack that's currently visible, so that the stack's getDimBounds()
- // occupies what's left by the docked stack. This is needed so that stuff like wallpaper
- // gets cropped properly to the area left by the dock.
- if (dockedStack.setAdjustedForMinimizedDock(minimizeAmount)) {
- final boolean adjusted =
- dockedStack.isVisibleForUserLocked() && minimizeAmount != 0.0f;
- dockedStack.getDimBounds(mTmpRect2);
- int dockSide = dockedStack.getDockSide();
- for (int i = stacks.size() - 1; i >= 0; --i) {
- final TaskStack stack = stacks.get(i);
- if (stack == dockedStack) {
- continue;
- }
- if (stack.isVisibleLocked() && adjusted) {
- stack.setAdjustedForComplementDock(mTmpRect2, dockSide);
- } else {
- stack.resetAdjustedForComplementDock();
- }
- }
- mService.mWindowPlacerLocked.performSurfacePlacement();
- }
- }
-
private float getInterpolatedAnimationValue(float t) {
return t * mAnimationTarget + (1 - t) * mAnimationStart;
}
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 114d9be..8be5b19 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -123,7 +123,6 @@
private float mAdjustImeAmount;
private float mAdjustDividerAmount;
private final int mDockedStackMinimizeThickness;
- private boolean mAdjustedForForComplementDock;
// If this is true, we are in the bounds animating mode.
// The task will be down or upscaled to perfectly fit the
@@ -243,9 +242,7 @@
insetBounds = mFullyAdjustedImeBounds;
}
}
- if (!mAdjustedForForComplementDock) {
- alignTasksToAdjustedBounds(adjusted ? mAdjustedBounds : mBounds, insetBounds);
- }
+ alignTasksToAdjustedBounds(adjusted ? mAdjustedBounds : mBounds, insetBounds);
mDisplayContent.layoutNeeded = true;
}
@@ -864,7 +861,6 @@
mImeWin = imeWin;
mImeGoingAway = false;
if (!mAdjustedForIme || forceUpdate) {
- mAdjustedForForComplementDock = false;
mAdjustedForIme = true;
mAdjustImeAmount = 0f;
mAdjustDividerAmount = 0f;
@@ -927,12 +923,10 @@
* @return Whether the amount has changed and a layout is needed.
*/
boolean setAdjustedForMinimizedDock(float minimizeAmount) {
- mAdjustedForForComplementDock = false;
-
if (minimizeAmount != mMinimizeAmount) {
mMinimizeAmount = minimizeAmount;
updateAdjustedBounds();
- return true;
+ return isVisibleForUserLocked();
} else {
return false;
}
@@ -942,33 +936,6 @@
return mMinimizeAmount != 0f;
}
- void setAdjustedForComplementDock(Rect dockBounds, int dockSide) {
- if (mMinimizeAmount != 0f || mAdjustedForIme) {
- return;
- }
- mTmpAdjustedBounds.set(mBounds);
- if (dockSide == DOCKED_TOP) {
- mTmpAdjustedBounds.top = dockBounds.bottom;
- } else if (dockSide == DOCKED_LEFT) {
- mTmpAdjustedBounds.left = dockBounds.right;
- } else if (dockSide == DOCKED_RIGHT) {
- mTmpAdjustedBounds.right = dockBounds.left;
- } else {
- Slog.w(TAG_WM, "setAdjustedForComplementDock: invalid dock side " + dockSide);
- return;
- }
- mAdjustedForForComplementDock = true;
- setAdjustedBounds(mTmpAdjustedBounds);
- }
-
- void resetAdjustedForComplementDock() {
- if (mAdjustedForForComplementDock) {
- mAdjustedForForComplementDock = false;
- mTmpAdjustedBounds.setEmpty();
- setAdjustedBounds(mTmpAdjustedBounds);
- }
- }
-
/**
* Puts all visible tasks that are adjusted for IME into resizing mode and adds the windows
* to the list of to be drawn windows the service is waiting for.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 695ed36..3f4c1d5 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3569,6 +3569,8 @@
final ArrayList<Task> tasks = displayContent.getTasks();
final boolean inMultiWindow = isStackVisibleLocked(DOCKED_STACK_ID)
|| isStackVisibleLocked(FREEFORM_WORKSPACE_STACK_ID);
+ final boolean dockMinimized =
+ getDefaultDisplayContentLocked().mDividerControllerLocked.isMinimizedDock();
for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
AppTokenList tokens = tasks.get(taskNdx).mAppTokens;
final int firstToken = tokens.size() - 1;
@@ -3603,8 +3605,10 @@
continue;
}
- // No app except the home app may specify the screen orientation in multi-window.
- if (inMultiWindow && !atoken.mTask.isHomeTask()) {
+ // No app except the home app may specify the screen orientation in multi-window,
+ // and only if the docked stack is minimized to avoid weirdness when home task
+ // temporarily gets moved to the front.
+ if (inMultiWindow && (!atoken.mTask.isHomeTask() || !dockMinimized)) {
continue;
}
@@ -7596,7 +7600,8 @@
void adjustForImeIfNeeded(final DisplayContent displayContent) {
final WindowState imeWin = mInputMethodWindow;
- final boolean imeVisible = imeWin != null && imeWin.isVisibleLw() && imeWin.isDisplayedLw();
+ final boolean imeVisible = imeWin != null && imeWin.isVisibleLw() && imeWin.isDisplayedLw()
+ && !displayContent.mDividerControllerLocked.isImeHideRequested();
final boolean dockVisible = isStackVisibleLocked(DOCKED_STACK_ID);
final TaskStack imeTargetStack = getImeFocusStackLocked();
final int imeDockSide = (dockVisible && imeTargetStack != null) ?
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 9dae0f2..37d6faf5 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -23,7 +23,6 @@
import static android.view.WindowManager.LayoutParams.FLAG_SCALED;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
-import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import static com.android.server.wm.AppWindowAnimator.sDummyAnimation;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
@@ -1328,33 +1327,6 @@
return;
}
- // We crop wallpaper windows to the stack bounds of their current target to avoid them
- // showing behind transparent windows in other stacks in split-screen mode.
- if (w.getBaseType() == TYPE_WALLPAPER) {
- final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
- if (wallpaperTarget != null) {
- final Task task = wallpaperTarget.getTask();
- final WindowStateAnimator winAnimator = wallpaperTarget.mWinAnimator;
- // We can only crop the wallpaper using final crop with stack bounds if the target
- // is not animating, or if it's animating with clip mode STACK_CLIP_AFTER_ANIM.
- // If it's animating with mode STACK_CLIP_NONE, we shouldn't crop either the task
- // itself or the wallpaper. If it's animating with STACK_CLIP_BEFORE_ANIM, the crop
- // is before the transform on the task itself.
- final boolean useFinalCropOnWallpaper = !winAnimator.isAnimationSet()
- || winAnimator.resolveStackClip() == STACK_CLIP_AFTER_ANIM;
- if (task != null && !task.isFullscreen()
- && task.cropWindowsToStackBounds()
- && useFinalCropOnWallpaper){
- final TaskStack stack = task.mStack;
- if (stack != null && !stack.isFullscreen()) {
- stack.getDimBounds(mTmpStackBounds);
- finalClipRect.set(mTmpStackBounds);
- }
- }
- }
- return;
- }
-
final Task task = w.getTask();
if (task == null || !task.cropWindowsToStackBounds()) {
return;
@@ -1487,7 +1459,7 @@
// We need to ensure for each surface, that we disable transformation matrix
// scaling in the same transaction which we resize the surface in.
// As we are in SCALING_MODE_SCALE_TO_WINDOW, SurfaceFlinger will
- // then take over the scaling until the new buffer arrives, and things
+ // then take over the scaling until the new buffer arrives, and things
// will be seamless.
mForceScaleUntilResize = true;
} else {
@@ -1773,6 +1745,10 @@
mWin.mAppToken.onFirstWindowDrawn(mWin, this);
}
+ if (mWin.mAttrs.type == TYPE_INPUT_METHOD) {
+ mWin.mDisplayContent.mDividerControllerLocked.resetImeHideRequested();
+ }
+
return true;
}
return false;