Merge "If media player has died already, do not dec the old surface texture reference. Otherwise segfault will occur. For bug 5327664."
diff --git a/CleanSpec.mk b/CleanSpec.mk
index c1799a1..d0aa368c 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -109,6 +109,7 @@
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/media/audio/)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/nfc/)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/wifi/java)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/wifi/java)
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
diff --git a/api/14.txt b/api/14.txt
index 3d96c11..ce78f9e 100644
--- a/api/14.txt
+++ b/api/14.txt
@@ -15,12 +15,15 @@
field public static final java.lang.String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
field public static final java.lang.String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
field public static final java.lang.String ACCOUNT_MANAGER = "android.permission.ACCOUNT_MANAGER";
+ field public static final java.lang.String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
field public static final java.lang.String AUTHENTICATE_ACCOUNTS = "android.permission.AUTHENTICATE_ACCOUNTS";
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
field public static final java.lang.String BIND_DEVICE_ADMIN = "android.permission.BIND_DEVICE_ADMIN";
field public static final java.lang.String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD";
field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS";
+ field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE";
+ field public static final java.lang.String BIND_VPN_SERVICE = "android.permission.BIND_VPN_SERVICE";
field public static final java.lang.String BIND_WALLPAPER = "android.permission.BIND_WALLPAPER";
field public static final java.lang.String BLUETOOTH = "android.permission.BLUETOOTH";
field public static final java.lang.String BLUETOOTH_ADMIN = "android.permission.BLUETOOTH_ADMIN";
@@ -78,6 +81,7 @@
field public static final java.lang.String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE";
field public static final java.lang.String READ_LOGS = "android.permission.READ_LOGS";
field public static final java.lang.String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
+ field public static final java.lang.String READ_PROFILE = "android.permission.READ_PROFILE";
field public static final java.lang.String READ_SMS = "android.permission.READ_SMS";
field public static final java.lang.String READ_SYNC_SETTINGS = "android.permission.READ_SYNC_SETTINGS";
field public static final java.lang.String READ_SYNC_STATS = "android.permission.READ_SYNC_STATS";
@@ -96,6 +100,7 @@
field public static final java.lang.String SET_ANIMATION_SCALE = "android.permission.SET_ANIMATION_SCALE";
field public static final java.lang.String SET_DEBUG_APP = "android.permission.SET_DEBUG_APP";
field public static final java.lang.String SET_ORIENTATION = "android.permission.SET_ORIENTATION";
+ field public static final java.lang.String SET_POINTER_SPEED = "android.permission.SET_POINTER_SPEED";
field public static final deprecated java.lang.String SET_PREFERRED_APPLICATIONS = "android.permission.SET_PREFERRED_APPLICATIONS";
field public static final java.lang.String SET_PROCESS_LIMIT = "android.permission.SET_PROCESS_LIMIT";
field public static final java.lang.String SET_TIME = "android.permission.SET_TIME";
@@ -118,6 +123,7 @@
field public static final java.lang.String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
field public static final java.lang.String WRITE_GSERVICES = "android.permission.WRITE_GSERVICES";
field public static final java.lang.String WRITE_HISTORY_BOOKMARKS = "com.android.browser.permission.WRITE_HISTORY_BOOKMARKS";
+ field public static final java.lang.String WRITE_PROFILE = "android.permission.WRITE_PROFILE";
field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
field public static final java.lang.String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
field public static final java.lang.String WRITE_SMS = "android.permission.WRITE_SMS";
@@ -178,14 +184,21 @@
public static final class R.attr {
ctor public R.attr();
field public static final int absListViewStyle = 16842858; // 0x101006a
+ field public static final int accessibilityEventTypes = 16843648; // 0x1010380
+ field public static final int accessibilityFeedbackType = 16843650; // 0x1010382
+ field public static final int accessibilityFlags = 16843652; // 0x1010384
field public static final int accountPreferences = 16843423; // 0x101029f
field public static final int accountType = 16843407; // 0x101028f
field public static final int action = 16842797; // 0x101002d
+ field public static final int actionBarDivider = 16843675; // 0x101039b
+ field public static final int actionBarItemBackground = 16843676; // 0x101039c
field public static final int actionBarSize = 16843499; // 0x10102eb
+ field public static final int actionBarSplitStyle = 16843656; // 0x1010388
field public static final int actionBarStyle = 16843470; // 0x10102ce
field public static final int actionBarTabBarStyle = 16843508; // 0x10102f4
field public static final int actionBarTabStyle = 16843507; // 0x10102f3
field public static final int actionBarTabTextStyle = 16843509; // 0x10102f5
+ field public static final int actionBarWidgetTheme = 16843671; // 0x1010397
field public static final int actionButtonStyle = 16843480; // 0x10102d8
field public static final int actionDropDownStyle = 16843479; // 0x10102d7
field public static final int actionLayout = 16843515; // 0x10102fb
@@ -197,7 +210,11 @@
field public static final int actionModeCopyDrawable = 16843538; // 0x1010312
field public static final int actionModeCutDrawable = 16843537; // 0x1010311
field public static final int actionModePasteDrawable = 16843539; // 0x1010313
+ field public static final int actionModeSelectAllDrawable = 16843646; // 0x101037e
+ field public static final int actionModeSplitBackground = 16843677; // 0x101039d
+ field public static final int actionModeStyle = 16843668; // 0x1010394
field public static final int actionOverflowButtonStyle = 16843510; // 0x10102f6
+ field public static final int actionProviderClass = 16843657; // 0x1010389
field public static final int actionViewClass = 16843516; // 0x10102fc
field public static final int activatedBackgroundIndicator = 16843517; // 0x10102fd
field public static final int activityCloseEnterAnimation = 16842938; // 0x10100ba
@@ -209,6 +226,7 @@
field public static final int alertDialogIcon = 16843605; // 0x1010355
field public static final int alertDialogStyle = 16842845; // 0x101005d
field public static final int alertDialogTheme = 16843529; // 0x1010309
+ field public static final int alignmentMode = 16843642; // 0x101037a
field public static final int allContactsName = 16843468; // 0x10102cc
field public static final int allowBackup = 16843392; // 0x1010280
field public static final int allowClearUserData = 16842757; // 0x1010005
@@ -242,6 +260,8 @@
field public static final int background = 16842964; // 0x10100d4
field public static final int backgroundDimAmount = 16842802; // 0x1010032
field public static final int backgroundDimEnabled = 16843295; // 0x101021f
+ field public static final int backgroundSplit = 16843659; // 0x101038b
+ field public static final int backgroundStacked = 16843658; // 0x101038a
field public static final int backupAgent = 16843391; // 0x101027f
field public static final int baseline = 16843548; // 0x101031c
field public static final int baselineAlignBottom = 16843042; // 0x1010122
@@ -268,6 +288,7 @@
field public static final int cacheColorHint = 16843009; // 0x1010101
field public static final int calendarViewShown = 16843596; // 0x101034c
field public static final int calendarViewStyle = 16843613; // 0x101035d
+ field public static final int canRetrieveWindowContent = 16843653; // 0x1010385
field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230
field public static final deprecated int capitalize = 16843113; // 0x1010169
field public static final int centerBright = 16842956; // 0x10100cc
@@ -296,12 +317,20 @@
field public static final int codes = 16843330; // 0x1010242
field public static final int collapseColumns = 16843083; // 0x101014b
field public static final int color = 16843173; // 0x10101a5
+ field public static final int colorActivatedHighlight = 16843664; // 0x1010390
field public static final int colorBackground = 16842801; // 0x1010031
field public static final int colorBackgroundCacheHint = 16843435; // 0x10102ab
+ field public static final int colorFocusedHighlight = 16843663; // 0x101038f
field public static final int colorForeground = 16842800; // 0x1010030
field public static final int colorForegroundInverse = 16843270; // 0x1010206
+ field public static final int colorLongPressedHighlight = 16843662; // 0x101038e
+ field public static final int colorMultiSelectHighlight = 16843665; // 0x1010391
+ field public static final int colorPressedHighlight = 16843661; // 0x101038d
+ field public static final int columnCount = 16843639; // 0x1010377
field public static final int columnDelay = 16843215; // 0x10101cf
+ field public static final int columnOrderPreserved = 16843640; // 0x1010378
field public static final int columnWidth = 16843031; // 0x1010117
+ field public static final int compatibleWidthLimitDp = 16843621; // 0x1010365
field public static final int completionHint = 16843122; // 0x1010172
field public static final int completionHintView = 16843123; // 0x1010173
field public static final int completionThreshold = 16843124; // 0x1010174
@@ -340,6 +369,7 @@
field public static final int dialogTitle = 16843250; // 0x10101f2
field public static final int digits = 16843110; // 0x1010166
field public static final int direction = 16843217; // 0x10101d1
+ field public static final int directionDescriptions = 16843681; // 0x10103a1
field public static final int directionPriority = 16843218; // 0x10101d2
field public static final int disableDependentsState = 16843249; // 0x10101f1
field public static final int disabledAlpha = 16842803; // 0x1010033
@@ -353,9 +383,11 @@
field public static final int drawSelectorOnTop = 16843004; // 0x10100fc
field public static final int drawable = 16843161; // 0x1010199
field public static final int drawableBottom = 16843118; // 0x101016e
+ field public static final int drawableEnd = 16843667; // 0x1010393
field public static final int drawableLeft = 16843119; // 0x101016f
field public static final int drawablePadding = 16843121; // 0x1010171
field public static final int drawableRight = 16843120; // 0x1010170
+ field public static final int drawableStart = 16843666; // 0x1010392
field public static final int drawableTop = 16843117; // 0x101016d
field public static final int drawingCacheQuality = 16842984; // 0x10100e8
field public static final int dropDownAnchor = 16843363; // 0x1010263
@@ -402,7 +434,7 @@
field public static final int fadeEnabled = 16843390; // 0x101027e
field public static final int fadeOffset = 16843383; // 0x1010277
field public static final int fadeScrollbars = 16843434; // 0x10102aa
- field public static final int fadingEdge = 16842975; // 0x10100df
+ field public static final deprecated int fadingEdge = 16842975; // 0x10100df
field public static final int fadingEdgeLength = 16842976; // 0x10100e0
field public static final int fastScrollAlwaysVisible = 16843573; // 0x1010335
field public static final int fastScrollEnabled = 16843302; // 0x1010226
@@ -521,6 +553,7 @@
field public static final int installLocation = 16843447; // 0x10102b7
field public static final int interpolator = 16843073; // 0x1010141
field public static final int isAlwaysSyncable = 16843571; // 0x1010333
+ field public static final int isAuxiliary = 16843647; // 0x101037f
field public static final int isDefault = 16843297; // 0x1010221
field public static final int isIndicator = 16843079; // 0x1010147
field public static final int isModifier = 16843334; // 0x1010246
@@ -552,6 +585,7 @@
field public static final int labelTextSize = 16843317; // 0x1010235
field public static final int largeHeap = 16843610; // 0x101035a
field public static final int largeScreens = 16843398; // 0x1010286
+ field public static final int largestWidthLimitDp = 16843622; // 0x1010366
field public static final int launchMode = 16842781; // 0x101001d
field public static final int layerType = 16843604; // 0x1010354
field public static final int layout = 16842994; // 0x10100f2
@@ -572,6 +606,7 @@
field public static final int layout_centerInParent = 16843151; // 0x101018f
field public static final int layout_centerVertical = 16843153; // 0x1010191
field public static final int layout_column = 16843084; // 0x101014c
+ field public static final int layout_columnSpan = 16843645; // 0x101037d
field public static final int layout_gravity = 16842931; // 0x10100b3
field public static final int layout_height = 16842997; // 0x10100f5
field public static final int layout_margin = 16842998; // 0x10100f6
@@ -579,6 +614,8 @@
field public static final int layout_marginLeft = 16842999; // 0x10100f7
field public static final int layout_marginRight = 16843001; // 0x10100f9
field public static final int layout_marginTop = 16843000; // 0x10100f8
+ field public static final int layout_row = 16843643; // 0x101037b
+ field public static final int layout_rowSpan = 16843644; // 0x101037c
field public static final int layout_scale = 16843155; // 0x1010193
field public static final int layout_span = 16843085; // 0x101014d
field public static final int layout_toLeftOf = 16843138; // 0x1010182
@@ -599,6 +636,10 @@
field public static final int listDividerAlertDialog = 16843525; // 0x1010305
field public static final int listPopupWindowStyle = 16843519; // 0x10102ff
field public static final int listPreferredItemHeight = 16842829; // 0x101004d
+ field public static final int listPreferredItemHeightLarge = 16843654; // 0x1010386
+ field public static final int listPreferredItemHeightSmall = 16843655; // 0x1010387
+ field public static final int listPreferredItemPaddingLeft = 16843683; // 0x10103a3
+ field public static final int listPreferredItemPaddingRight = 16843684; // 0x10103a4
field public static final int listSelector = 16843003; // 0x10100fb
field public static final int listSeparatorTextViewStyle = 16843272; // 0x1010208
field public static final int listViewStyle = 16842868; // 0x1010074
@@ -629,6 +670,8 @@
field public static final int minHeight = 16843072; // 0x1010140
field public static final int minLevel = 16843185; // 0x10101b1
field public static final int minLines = 16843094; // 0x1010156
+ field public static final int minResizeHeight = 16843670; // 0x1010396
+ field public static final int minResizeWidth = 16843669; // 0x1010395
field public static final int minSdkVersion = 16843276; // 0x101020c
field public static final int minWidth = 16843071; // 0x101013f
field public static final int mode = 16843134; // 0x101017e
@@ -644,6 +687,7 @@
field public static final int nextFocusUp = 16842979; // 0x10100e3
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 deprecated int numeric = 16843109; // 0x1010165
@@ -660,6 +704,8 @@
field public static final int overScrollFooter = 16843459; // 0x10102c3
field public static final int overScrollHeader = 16843458; // 0x10102c2
field public static final int overScrollMode = 16843457; // 0x10102c1
+ field public static final int overridesImplicitlyEnabledSubtype = 16843682; // 0x10103a2
+ field public static final int packageNames = 16843649; // 0x1010381
field public static final int padding = 16842965; // 0x10100d5
field public static final int paddingBottom = 16842969; // 0x10100d9
field public static final int paddingLeft = 16842966; // 0x10100d6
@@ -737,6 +783,8 @@
field public static final int reqNavigation = 16843306; // 0x101022a
field public static final int reqTouchScreen = 16843303; // 0x1010227
field public static final int required = 16843406; // 0x101028e
+ field public static final int requiresFadingEdge = 16843685; // 0x10103a5
+ field public static final int requiresSmallestWidthDp = 16843620; // 0x1010364
field public static final int resizeMode = 16843619; // 0x1010363
field public static final int resizeable = 16843405; // 0x101028d
field public static final int resource = 16842789; // 0x1010025
@@ -748,9 +796,11 @@
field public static final int rotation = 16843558; // 0x1010326
field public static final int rotationX = 16843559; // 0x1010327
field public static final int rotationY = 16843560; // 0x1010328
+ field public static final int rowCount = 16843637; // 0x1010375
field public static final int rowDelay = 16843216; // 0x10101d0
field public static final int rowEdgeFlags = 16843329; // 0x1010241
field public static final int rowHeight = 16843058; // 0x1010132
+ field public static final int rowOrderPreserved = 16843638; // 0x1010376
field public static final int saveEnabled = 16842983; // 0x10100e7
field public static final int scaleGravity = 16843262; // 0x10101fe
field public static final int scaleHeight = 16843261; // 0x10101fd
@@ -837,11 +887,14 @@
field public static final int state_active = 16842914; // 0x10100a2
field public static final int state_checkable = 16842911; // 0x101009f
field public static final int state_checked = 16842912; // 0x10100a0
+ field public static final int state_drag_can_accept = 16843624; // 0x1010368
+ field public static final int state_drag_hovered = 16843625; // 0x1010369
field public static final int state_empty = 16842921; // 0x10100a9
field public static final int state_enabled = 16842910; // 0x101009e
field public static final int state_expanded = 16842920; // 0x10100a8
field public static final int state_first = 16842916; // 0x10100a4
field public static final int state_focused = 16842908; // 0x101009c
+ field public static final int state_hovered = 16843623; // 0x1010367
field public static final int state_last = 16842918; // 0x10100a6
field public static final int state_long_pressable = 16843324; // 0x101023c
field public static final int state_middle = 16842917; // 0x10100a5
@@ -852,11 +905,14 @@
field public static final int state_window_focused = 16842909; // 0x101009d
field public static final int staticWallpaperPreview = 16843569; // 0x1010331
field public static final int stepSize = 16843078; // 0x1010146
+ field public static final int stopWithTask = 16843626; // 0x101036a
field public static final int streamType = 16843273; // 0x1010209
field public static final int stretchColumns = 16843081; // 0x1010149
field public static final int stretchMode = 16843030; // 0x1010116
field public static final int subtitle = 16843473; // 0x10102d1
field public static final int subtitleTextStyle = 16843513; // 0x10102f9
+ field public static final int subtypeExtraValue = 16843674; // 0x101039a
+ field public static final int subtypeLocale = 16843673; // 0x1010399
field public static final int suggestActionMsg = 16843228; // 0x10101dc
field public static final int suggestActionMsgColumn = 16843229; // 0x10101dd
field public static final int summary = 16843241; // 0x10101e9
@@ -864,6 +920,12 @@
field public static final int summaryOff = 16843248; // 0x10101f0
field public static final int summaryOn = 16843247; // 0x10101ef
field public static final int supportsUploading = 16843419; // 0x101029b
+ field public static final int switchMinWidth = 16843632; // 0x1010370
+ field public static final int switchPadding = 16843633; // 0x1010371
+ field public static final int switchPreferenceStyle = 16843629; // 0x101036d
+ field public static final int switchTextAppearance = 16843630; // 0x101036e
+ field public static final int switchTextOff = 16843628; // 0x101036c
+ field public static final int switchTextOn = 16843627; // 0x101036b
field public static final int syncable = 16842777; // 0x1010019
field public static final int tabStripEnabled = 16843453; // 0x10102bd
field public static final int tabStripLeft = 16843451; // 0x10102bb
@@ -872,6 +934,7 @@
field public static final int tag = 16842961; // 0x10100d1
field public static final int targetActivity = 16843266; // 0x1010202
field public static final int targetClass = 16842799; // 0x101002f
+ field public static final int targetDescriptions = 16843680; // 0x10103a0
field public static final int targetPackage = 16842785; // 0x1010021
field public static final int targetSdkVersion = 16843376; // 0x1010270
field public static final int taskAffinity = 16842770; // 0x1010012
@@ -886,12 +949,15 @@
field public static final int tension = 16843370; // 0x101026a
field public static final int testOnly = 16843378; // 0x1010272
field public static final int text = 16843087; // 0x101014f
+ field public static final int textAllCaps = 16843660; // 0x101038c
field public static final int textAppearance = 16842804; // 0x1010034
field public static final int textAppearanceButton = 16843271; // 0x1010207
field public static final int textAppearanceInverse = 16842805; // 0x1010035
field public static final int textAppearanceLarge = 16842816; // 0x1010040
field public static final int textAppearanceLargeInverse = 16842819; // 0x1010043
field public static final int textAppearanceLargePopupMenu = 16843521; // 0x1010301
+ field public static final int textAppearanceListItem = 16843678; // 0x101039e
+ 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 textAppearanceSearchResultSubtitle = 16843424; // 0x10102a0
@@ -926,6 +992,7 @@
field public static final int textEditPasteWindowLayout = 16843540; // 0x1010314
field public static final int textEditSideNoPasteWindowLayout = 16843615; // 0x101035f
field public static final int textEditSidePasteWindowLayout = 16843614; // 0x101035e
+ field public static final int textEditSuggestionItemLayout = 16843636; // 0x1010374
field public static final int textFilterEnabled = 16843007; // 0x10100ff
field public static final int textIsSelectable = 16843542; // 0x1010316
field public static final int textOff = 16843045; // 0x1010125
@@ -937,12 +1004,14 @@
field public static final int textSelectHandleWindowStyle = 16843464; // 0x10102c8
field public static final int textSize = 16842901; // 0x1010095
field public static final int textStyle = 16842903; // 0x1010097
+ field public static final int textSuggestionsWindowStyle = 16843635; // 0x1010373
field public static final int textViewStyle = 16842884; // 0x1010084
field public static final int theme = 16842752; // 0x1010000
field public static final int thickness = 16843360; // 0x1010260
field public static final int thicknessRatio = 16843164; // 0x101019c
field public static final int thumb = 16843074; // 0x1010142
field public static final int thumbOffset = 16843075; // 0x1010143
+ field public static final int thumbTextPadding = 16843634; // 0x1010372
field public static final int thumbnail = 16843429; // 0x10102a5
field public static final int tileMode = 16843265; // 0x1010201
field public static final int tint = 16843041; // 0x1010121
@@ -961,6 +1030,7 @@
field public static final int topLeftRadius = 16843177; // 0x10101a9
field public static final int topOffset = 16843352; // 0x1010258
field public static final int topRightRadius = 16843178; // 0x10101aa
+ field public static final int track = 16843631; // 0x101036f
field public static final int transcriptMode = 16843008; // 0x1010100
field public static final int transformPivotX = 16843552; // 0x1010320
field public static final int transformPivotY = 16843553; // 0x1010321
@@ -968,10 +1038,12 @@
field public static final int translationY = 16843555; // 0x1010323
field public static final int type = 16843169; // 0x10101a1
field public static final int typeface = 16842902; // 0x1010096
+ field public static final int uiOptions = 16843672; // 0x1010398
field public static final int uncertainGestureColor = 16843382; // 0x1010276
field public static final 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 useDefaultMargins = 16843641; // 0x1010379
field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310
field public static final int useLevel = 16843167; // 0x101019f
field public static final int userVisible = 16843409; // 0x1010291
@@ -1055,6 +1127,16 @@
field public static final int background_light = 17170447; // 0x106000f
field public static final int black = 17170444; // 0x106000c
field public static final int darker_gray = 17170432; // 0x1060000
+ field public static final int holo_blue_bright = 17170459; // 0x106001b
+ field public static final int holo_blue_dark = 17170451; // 0x1060013
+ field public static final int holo_blue_light = 17170450; // 0x1060012
+ field public static final int holo_green_dark = 17170453; // 0x1060015
+ field public static final int holo_green_light = 17170452; // 0x1060014
+ field public static final int holo_orange_dark = 17170457; // 0x1060019
+ field public static final int holo_orange_light = 17170456; // 0x1060018
+ field public static final int holo_purple = 17170458; // 0x106001a
+ field public static final int holo_red_dark = 17170455; // 0x1060017
+ field public static final int holo_red_light = 17170454; // 0x1060016
field public static final int primary_text_dark = 17170433; // 0x1060001
field public static final int primary_text_dark_nodisable = 17170434; // 0x1060002
field public static final int primary_text_light = 17170435; // 0x1060003
@@ -1319,6 +1401,7 @@
field public static final int config_longAnimTime = 17694722; // 0x10e0002
field public static final int config_mediumAnimTime = 17694721; // 0x10e0001
field public static final int config_shortAnimTime = 17694720; // 0x10e0000
+ field public static final int status_bar_notification_info_maxnum = 17694723; // 0x10e0003
}
public static final class R.interpolator {
@@ -1405,6 +1488,7 @@
field public static final int search_go = 17039372; // 0x104000c
field public static final int selectAll = 17039373; // 0x104000d
field public static final int selectTextMode = 17039382; // 0x1040016
+ field public static final int status_bar_notification_info_overflow = 17039383; // 0x1040017
field public static final int unknownName = 17039374; // 0x104000e
field public static final int untitled = 17039375; // 0x104000f
field public static final int yes = 17039379; // 0x1040013
@@ -1418,6 +1502,12 @@
field public static final int Animation_InputMethod = 16973910; // 0x1030056
field public static final int Animation_Toast = 16973828; // 0x1030004
field public static final int Animation_Translucent = 16973827; // 0x1030003
+ field public static final int DeviceDefault_ButtonBar = 16974287; // 0x10301cf
+ field public static final int DeviceDefault_ButtonBar_AlertDialog = 16974288; // 0x10301d0
+ field public static final int DeviceDefault_Light_ButtonBar = 16974290; // 0x10301d2
+ field public static final int DeviceDefault_Light_ButtonBar_AlertDialog = 16974291; // 0x10301d3
+ field public static final int DeviceDefault_Light_SegmentedButton = 16974292; // 0x10301d4
+ field public static final int DeviceDefault_SegmentedButton = 16974289; // 0x10301d1
field public static final int Holo_ButtonBar = 16974053; // 0x10300e5
field public static final int Holo_ButtonBar_AlertDialog = 16974055; // 0x10300e7
field public static final int Holo_Light_ButtonBar = 16974054; // 0x10300e6
@@ -1432,7 +1522,75 @@
field public static final int MediaButton_Previous = 16973880; // 0x1030038
field public static final int MediaButton_Rew = 16973884; // 0x103003c
field public static final int TextAppearance = 16973886; // 0x103003e
+ field public static final int TextAppearance_DeviceDefault = 16974253; // 0x10301ad
+ field public static final int TextAppearance_DeviceDefault_DialogWindowTitle = 16974264; // 0x10301b8
+ field public static final int TextAppearance_DeviceDefault_Inverse = 16974254; // 0x10301ae
+ field public static final int TextAppearance_DeviceDefault_Large = 16974255; // 0x10301af
+ field public static final int TextAppearance_DeviceDefault_Large_Inverse = 16974256; // 0x10301b0
+ field public static final int TextAppearance_DeviceDefault_Medium = 16974257; // 0x10301b1
+ field public static final int TextAppearance_DeviceDefault_Medium_Inverse = 16974258; // 0x10301b2
+ field public static final int TextAppearance_DeviceDefault_SearchResult_Subtitle = 16974262; // 0x10301b6
+ field public static final int TextAppearance_DeviceDefault_SearchResult_Title = 16974261; // 0x10301b5
+ field public static final int TextAppearance_DeviceDefault_Small = 16974259; // 0x10301b3
+ field public static final int TextAppearance_DeviceDefault_Small_Inverse = 16974260; // 0x10301b4
+ field public static final int TextAppearance_DeviceDefault_Widget = 16974265; // 0x10301b9
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Menu = 16974286; // 0x10301ce
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle = 16974279; // 0x10301c7
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle_Inverse = 16974283; // 0x10301cb
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Title = 16974278; // 0x10301c6
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Title_Inverse = 16974282; // 0x10301ca
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle = 16974281; // 0x10301c9
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle_Inverse = 16974285; // 0x10301cd
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Title = 16974280; // 0x10301c8
+ field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Title_Inverse = 16974284; // 0x10301cc
+ field public static final int TextAppearance_DeviceDefault_Widget_Button = 16974266; // 0x10301ba
+ field public static final int TextAppearance_DeviceDefault_Widget_DropDownHint = 16974271; // 0x10301bf
+ field public static final int TextAppearance_DeviceDefault_Widget_DropDownItem = 16974272; // 0x10301c0
+ field public static final int TextAppearance_DeviceDefault_Widget_EditText = 16974274; // 0x10301c2
+ field public static final int TextAppearance_DeviceDefault_Widget_IconMenu_Item = 16974267; // 0x10301bb
+ field public static final int TextAppearance_DeviceDefault_Widget_PopupMenu = 16974275; // 0x10301c3
+ field public static final int TextAppearance_DeviceDefault_Widget_PopupMenu_Large = 16974276; // 0x10301c4
+ field public static final int TextAppearance_DeviceDefault_Widget_PopupMenu_Small = 16974277; // 0x10301c5
+ field public static final int TextAppearance_DeviceDefault_Widget_TabWidget = 16974268; // 0x10301bc
+ field public static final int TextAppearance_DeviceDefault_Widget_TextView = 16974269; // 0x10301bd
+ field public static final int TextAppearance_DeviceDefault_Widget_TextView_PopupMenu = 16974270; // 0x10301be
+ field public static final int TextAppearance_DeviceDefault_Widget_TextView_SpinnerItem = 16974273; // 0x10301c1
+ field public static final int TextAppearance_DeviceDefault_WindowTitle = 16974263; // 0x10301b7
field public static final int TextAppearance_DialogWindowTitle = 16973889; // 0x1030041
+ field public static final int TextAppearance_Holo = 16974075; // 0x10300fb
+ field public static final int TextAppearance_Holo_DialogWindowTitle = 16974103; // 0x1030117
+ field public static final int TextAppearance_Holo_Inverse = 16974076; // 0x10300fc
+ field public static final int TextAppearance_Holo_Large = 16974077; // 0x10300fd
+ field public static final int TextAppearance_Holo_Large_Inverse = 16974078; // 0x10300fe
+ field public static final int TextAppearance_Holo_Medium = 16974079; // 0x10300ff
+ field public static final int TextAppearance_Holo_Medium_Inverse = 16974080; // 0x1030100
+ field public static final int TextAppearance_Holo_SearchResult_Subtitle = 16974084; // 0x1030104
+ field public static final int TextAppearance_Holo_SearchResult_Title = 16974083; // 0x1030103
+ field public static final int TextAppearance_Holo_Small = 16974081; // 0x1030101
+ field public static final int TextAppearance_Holo_Small_Inverse = 16974082; // 0x1030102
+ field public static final int TextAppearance_Holo_Widget = 16974085; // 0x1030105
+ field public static final int TextAppearance_Holo_Widget_ActionBar_Menu = 16974112; // 0x1030120
+ field public static final int TextAppearance_Holo_Widget_ActionBar_Subtitle = 16974099; // 0x1030113
+ field public static final int TextAppearance_Holo_Widget_ActionBar_Subtitle_Inverse = 16974109; // 0x103011d
+ field public static final int TextAppearance_Holo_Widget_ActionBar_Title = 16974098; // 0x1030112
+ field public static final int TextAppearance_Holo_Widget_ActionBar_Title_Inverse = 16974108; // 0x103011c
+ field public static final int TextAppearance_Holo_Widget_ActionMode_Subtitle = 16974101; // 0x1030115
+ field public static final int TextAppearance_Holo_Widget_ActionMode_Subtitle_Inverse = 16974111; // 0x103011f
+ field public static final int TextAppearance_Holo_Widget_ActionMode_Title = 16974100; // 0x1030114
+ field public static final int TextAppearance_Holo_Widget_ActionMode_Title_Inverse = 16974110; // 0x103011e
+ field public static final int TextAppearance_Holo_Widget_Button = 16974086; // 0x1030106
+ field public static final int TextAppearance_Holo_Widget_DropDownHint = 16974091; // 0x103010b
+ field public static final int TextAppearance_Holo_Widget_DropDownItem = 16974092; // 0x103010c
+ field public static final int TextAppearance_Holo_Widget_EditText = 16974094; // 0x103010e
+ field public static final int TextAppearance_Holo_Widget_IconMenu_Item = 16974087; // 0x1030107
+ field public static final int TextAppearance_Holo_Widget_PopupMenu = 16974095; // 0x103010f
+ field public static final int TextAppearance_Holo_Widget_PopupMenu_Large = 16974096; // 0x1030110
+ field public static final int TextAppearance_Holo_Widget_PopupMenu_Small = 16974097; // 0x1030111
+ field public static final int TextAppearance_Holo_Widget_TabWidget = 16974088; // 0x1030108
+ field public static final int TextAppearance_Holo_Widget_TextView = 16974089; // 0x1030109
+ field public static final int TextAppearance_Holo_Widget_TextView_PopupMenu = 16974090; // 0x103010a
+ field public static final int TextAppearance_Holo_Widget_TextView_SpinnerItem = 16974093; // 0x103010d
+ field public static final int TextAppearance_Holo_WindowTitle = 16974102; // 0x1030116
field public static final int TextAppearance_Inverse = 16973887; // 0x103003f
field public static final int TextAppearance_Large = 16973890; // 0x1030042
field public static final int TextAppearance_Large_Inverse = 16973891; // 0x1030043
@@ -1444,6 +1602,7 @@
field public static final int TextAppearance_StatusBar_EventContent_Title = 16973928; // 0x1030068
field public static final int TextAppearance_StatusBar_Icon = 16973926; // 0x1030066
field public static final int TextAppearance_StatusBar_Title = 16973925; // 0x1030065
+ field public static final int TextAppearance_SuggestionHighlight = 16974104; // 0x1030118
field public static final int TextAppearance_Theme = 16973888; // 0x1030040
field public static final int TextAppearance_Theme_Dialog = 16973896; // 0x1030048
field public static final int TextAppearance_Widget = 16973897; // 0x1030049
@@ -1463,6 +1622,30 @@
field public static final int Theme_Black = 16973832; // 0x1030008
field public static final int Theme_Black_NoTitleBar = 16973833; // 0x1030009
field public static final int Theme_Black_NoTitleBar_Fullscreen = 16973834; // 0x103000a
+ field public static final int Theme_DeviceDefault = 16974120; // 0x1030128
+ field public static final int Theme_DeviceDefault_Dialog = 16974126; // 0x103012e
+ field public static final int Theme_DeviceDefault_DialogWhenLarge = 16974134; // 0x1030136
+ field public static final int Theme_DeviceDefault_DialogWhenLarge_NoActionBar = 16974135; // 0x1030137
+ field public static final int Theme_DeviceDefault_Dialog_MinWidth = 16974127; // 0x103012f
+ field public static final int Theme_DeviceDefault_Dialog_NoActionBar = 16974128; // 0x1030130
+ field public static final int Theme_DeviceDefault_Dialog_NoActionBar_MinWidth = 16974129; // 0x1030131
+ field public static final int Theme_DeviceDefault_InputMethod = 16974142; // 0x103013e
+ field public static final int Theme_DeviceDefault_Light = 16974123; // 0x103012b
+ field public static final int Theme_DeviceDefault_Light_DarkActionBar = 16974143; // 0x103013f
+ field public static final int Theme_DeviceDefault_Light_Dialog = 16974130; // 0x1030132
+ field public static final int Theme_DeviceDefault_Light_DialogWhenLarge = 16974136; // 0x1030138
+ field public static final int Theme_DeviceDefault_Light_DialogWhenLarge_NoActionBar = 16974137; // 0x1030139
+ field public static final int Theme_DeviceDefault_Light_Dialog_MinWidth = 16974131; // 0x1030133
+ field public static final int Theme_DeviceDefault_Light_Dialog_NoActionBar = 16974132; // 0x1030134
+ field public static final int Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth = 16974133; // 0x1030135
+ field public static final int Theme_DeviceDefault_Light_NoActionBar = 16974124; // 0x103012c
+ field public static final int Theme_DeviceDefault_Light_NoActionBar_Fullscreen = 16974125; // 0x103012d
+ field public static final int Theme_DeviceDefault_Light_Panel = 16974139; // 0x103013b
+ field public static final int Theme_DeviceDefault_NoActionBar = 16974121; // 0x1030129
+ field public static final int Theme_DeviceDefault_NoActionBar_Fullscreen = 16974122; // 0x103012a
+ field public static final int Theme_DeviceDefault_Panel = 16974138; // 0x103013a
+ field public static final int Theme_DeviceDefault_Wallpaper = 16974140; // 0x103013c
+ field public static final int Theme_DeviceDefault_Wallpaper_NoTitleBar = 16974141; // 0x103013d
field public static final int Theme_Dialog = 16973835; // 0x103000b
field public static final int Theme_Holo = 16973931; // 0x103006b
field public static final int Theme_Holo_Dialog = 16973935; // 0x103006f
@@ -1473,12 +1656,15 @@
field public static final int Theme_Holo_Dialog_NoActionBar_MinWidth = 16973938; // 0x1030072
field public static final int Theme_Holo_InputMethod = 16973951; // 0x103007f
field public static final int Theme_Holo_Light = 16973934; // 0x103006e
+ field public static final int Theme_Holo_Light_DarkActionBar = 16974105; // 0x1030119
field public static final int Theme_Holo_Light_Dialog = 16973939; // 0x1030073
field public static final int Theme_Holo_Light_DialogWhenLarge = 16973945; // 0x1030079
field public static final int Theme_Holo_Light_DialogWhenLarge_NoActionBar = 16973946; // 0x103007a
field public static final int Theme_Holo_Light_Dialog_MinWidth = 16973940; // 0x1030074
field public static final int Theme_Holo_Light_Dialog_NoActionBar = 16973941; // 0x1030075
field public static final int Theme_Holo_Light_Dialog_NoActionBar_MinWidth = 16973942; // 0x1030076
+ field public static final int Theme_Holo_Light_NoActionBar = 16974064; // 0x10300f0
+ field public static final int Theme_Holo_Light_NoActionBar_Fullscreen = 16974065; // 0x10300f1
field public static final int Theme_Holo_Light_Panel = 16973948; // 0x103007c
field public static final int Theme_Holo_NoActionBar = 16973932; // 0x103006c
field public static final int Theme_Holo_NoActionBar_Fullscreen = 16973933; // 0x103006d
@@ -1507,6 +1693,9 @@
field public static final int Widget = 16973842; // 0x1030012
field public static final int Widget_AbsListView = 16973843; // 0x1030013
field public static final int Widget_ActionBar = 16973954; // 0x1030082
+ field public static final int Widget_ActionBar_TabBar = 16974068; // 0x10300f4
+ field public static final int Widget_ActionBar_TabText = 16974067; // 0x10300f3
+ field public static final int Widget_ActionBar_TabView = 16974066; // 0x10300f2
field public static final int Widget_ActionButton = 16973956; // 0x1030084
field public static final int Widget_ActionButton_CloseMode = 16973960; // 0x1030088
field public static final int Widget_ActionButton_Overflow = 16973959; // 0x1030087
@@ -1521,6 +1710,115 @@
field public static final int Widget_CompoundButton_RadioButton = 16973850; // 0x103001a
field public static final int Widget_CompoundButton_Star = 16973851; // 0x103001b
field public static final int Widget_DatePicker = 16974062; // 0x10300ee
+ field public static final int Widget_DeviceDefault = 16974144; // 0x1030140
+ field public static final int Widget_DeviceDefault_ActionBar = 16974187; // 0x103016b
+ field public static final int Widget_DeviceDefault_ActionBar_Solid = 16974195; // 0x1030173
+ field public static final int Widget_DeviceDefault_ActionBar_TabBar = 16974194; // 0x1030172
+ field public static final int Widget_DeviceDefault_ActionBar_TabText = 16974193; // 0x1030171
+ field public static final int Widget_DeviceDefault_ActionBar_TabView = 16974192; // 0x1030170
+ field public static final int Widget_DeviceDefault_ActionButton = 16974182; // 0x1030166
+ field public static final int Widget_DeviceDefault_ActionButton_CloseMode = 16974186; // 0x103016a
+ field public static final int Widget_DeviceDefault_ActionButton_Overflow = 16974183; // 0x1030167
+ field public static final int Widget_DeviceDefault_ActionButton_TextButton = 16974184; // 0x1030168
+ field public static final int Widget_DeviceDefault_ActionMode = 16974185; // 0x1030169
+ field public static final int Widget_DeviceDefault_AutoCompleteTextView = 16974151; // 0x1030147
+ field public static final int Widget_DeviceDefault_Button = 16974145; // 0x1030141
+ field public static final int Widget_DeviceDefault_Button_Borderless = 16974188; // 0x103016c
+ field public static final int Widget_DeviceDefault_Button_Borderless_Small = 16974149; // 0x1030145
+ field public static final int Widget_DeviceDefault_Button_Inset = 16974147; // 0x1030143
+ field public static final int Widget_DeviceDefault_Button_Small = 16974146; // 0x1030142
+ field public static final int Widget_DeviceDefault_Button_Toggle = 16974148; // 0x1030144
+ field public static final int Widget_DeviceDefault_CalendarView = 16974190; // 0x103016e
+ field public static final int Widget_DeviceDefault_CompoundButton_CheckBox = 16974152; // 0x1030148
+ field public static final int Widget_DeviceDefault_CompoundButton_RadioButton = 16974169; // 0x1030159
+ field public static final int Widget_DeviceDefault_CompoundButton_Star = 16974173; // 0x103015d
+ field public static final int Widget_DeviceDefault_DatePicker = 16974191; // 0x103016f
+ field public static final int Widget_DeviceDefault_DropDownItem = 16974177; // 0x1030161
+ field public static final int Widget_DeviceDefault_DropDownItem_Spinner = 16974178; // 0x1030162
+ field public static final int Widget_DeviceDefault_EditText = 16974154; // 0x103014a
+ field public static final int Widget_DeviceDefault_ExpandableListView = 16974155; // 0x103014b
+ field public static final int Widget_DeviceDefault_GridView = 16974156; // 0x103014c
+ field public static final int Widget_DeviceDefault_HorizontalScrollView = 16974171; // 0x103015b
+ field public static final int Widget_DeviceDefault_ImageButton = 16974157; // 0x103014d
+ field public static final int Widget_DeviceDefault_Light = 16974196; // 0x1030174
+ field public static final int Widget_DeviceDefault_Light_ActionBar = 16974243; // 0x10301a3
+ field public static final int Widget_DeviceDefault_Light_ActionBar_Solid = 16974247; // 0x10301a7
+ field public static final int Widget_DeviceDefault_Light_ActionBar_Solid_Inverse = 16974248; // 0x10301a8
+ field public static final int Widget_DeviceDefault_Light_ActionBar_TabBar = 16974246; // 0x10301a6
+ field public static final int Widget_DeviceDefault_Light_ActionBar_TabBar_Inverse = 16974249; // 0x10301a9
+ field public static final int Widget_DeviceDefault_Light_ActionBar_TabText = 16974245; // 0x10301a5
+ field public static final int Widget_DeviceDefault_Light_ActionBar_TabText_Inverse = 16974251; // 0x10301ab
+ field public static final int Widget_DeviceDefault_Light_ActionBar_TabView = 16974244; // 0x10301a4
+ field public static final int Widget_DeviceDefault_Light_ActionBar_TabView_Inverse = 16974250; // 0x10301aa
+ field public static final int Widget_DeviceDefault_Light_ActionButton = 16974239; // 0x103019f
+ field public static final int Widget_DeviceDefault_Light_ActionButton_CloseMode = 16974242; // 0x10301a2
+ field public static final int Widget_DeviceDefault_Light_ActionButton_Overflow = 16974240; // 0x10301a0
+ field public static final int Widget_DeviceDefault_Light_ActionMode = 16974241; // 0x10301a1
+ field public static final int Widget_DeviceDefault_Light_ActionMode_Inverse = 16974252; // 0x10301ac
+ field public static final int Widget_DeviceDefault_Light_AutoCompleteTextView = 16974203; // 0x103017b
+ field public static final int Widget_DeviceDefault_Light_Button = 16974197; // 0x1030175
+ field public static final int Widget_DeviceDefault_Light_Button_Borderless_Small = 16974201; // 0x1030179
+ field public static final int Widget_DeviceDefault_Light_Button_Inset = 16974199; // 0x1030177
+ field public static final int Widget_DeviceDefault_Light_Button_Small = 16974198; // 0x1030176
+ field public static final int Widget_DeviceDefault_Light_Button_Toggle = 16974200; // 0x1030178
+ field public static final int Widget_DeviceDefault_Light_CalendarView = 16974238; // 0x103019e
+ field public static final int Widget_DeviceDefault_Light_CompoundButton_CheckBox = 16974204; // 0x103017c
+ field public static final int Widget_DeviceDefault_Light_CompoundButton_RadioButton = 16974224; // 0x1030190
+ field public static final int Widget_DeviceDefault_Light_CompoundButton_Star = 16974228; // 0x1030194
+ field public static final int Widget_DeviceDefault_Light_DropDownItem = 16974232; // 0x1030198
+ field public static final int Widget_DeviceDefault_Light_DropDownItem_Spinner = 16974233; // 0x1030199
+ field public static final int Widget_DeviceDefault_Light_EditText = 16974206; // 0x103017e
+ field public static final int Widget_DeviceDefault_Light_ExpandableListView = 16974207; // 0x103017f
+ field public static final int Widget_DeviceDefault_Light_GridView = 16974208; // 0x1030180
+ field public static final int Widget_DeviceDefault_Light_HorizontalScrollView = 16974226; // 0x1030192
+ field public static final int Widget_DeviceDefault_Light_ImageButton = 16974209; // 0x1030181
+ field public static final int Widget_DeviceDefault_Light_ListPopupWindow = 16974235; // 0x103019b
+ field public static final int Widget_DeviceDefault_Light_ListView = 16974210; // 0x1030182
+ field public static final int Widget_DeviceDefault_Light_ListView_DropDown = 16974205; // 0x103017d
+ field public static final int Widget_DeviceDefault_Light_PopupMenu = 16974236; // 0x103019c
+ field public static final int Widget_DeviceDefault_Light_PopupWindow = 16974211; // 0x1030183
+ field public static final int Widget_DeviceDefault_Light_ProgressBar = 16974212; // 0x1030184
+ field public static final int Widget_DeviceDefault_Light_ProgressBar_Horizontal = 16974213; // 0x1030185
+ field public static final int Widget_DeviceDefault_Light_ProgressBar_Inverse = 16974217; // 0x1030189
+ field public static final int Widget_DeviceDefault_Light_ProgressBar_Large = 16974216; // 0x1030188
+ field public static final int Widget_DeviceDefault_Light_ProgressBar_Large_Inverse = 16974219; // 0x103018b
+ field public static final int Widget_DeviceDefault_Light_ProgressBar_Small = 16974214; // 0x1030186
+ field public static final int Widget_DeviceDefault_Light_ProgressBar_Small_Inverse = 16974218; // 0x103018a
+ field public static final int Widget_DeviceDefault_Light_ProgressBar_Small_Title = 16974215; // 0x1030187
+ field public static final int Widget_DeviceDefault_Light_RatingBar = 16974221; // 0x103018d
+ field public static final int Widget_DeviceDefault_Light_RatingBar_Indicator = 16974222; // 0x103018e
+ field public static final int Widget_DeviceDefault_Light_RatingBar_Small = 16974223; // 0x103018f
+ field public static final int Widget_DeviceDefault_Light_ScrollView = 16974225; // 0x1030191
+ field public static final int Widget_DeviceDefault_Light_SeekBar = 16974220; // 0x103018c
+ field public static final int Widget_DeviceDefault_Light_Spinner = 16974227; // 0x1030193
+ field public static final int Widget_DeviceDefault_Light_Tab = 16974237; // 0x103019d
+ field public static final int Widget_DeviceDefault_Light_TabWidget = 16974229; // 0x1030195
+ field public static final int Widget_DeviceDefault_Light_TextView = 16974202; // 0x103017a
+ field public static final int Widget_DeviceDefault_Light_TextView_SpinnerItem = 16974234; // 0x103019a
+ field public static final int Widget_DeviceDefault_Light_WebTextView = 16974230; // 0x1030196
+ field public static final int Widget_DeviceDefault_Light_WebView = 16974231; // 0x1030197
+ field public static final int Widget_DeviceDefault_ListPopupWindow = 16974180; // 0x1030164
+ field public static final int Widget_DeviceDefault_ListView = 16974158; // 0x103014e
+ field public static final int Widget_DeviceDefault_ListView_DropDown = 16974153; // 0x1030149
+ field public static final int Widget_DeviceDefault_PopupMenu = 16974181; // 0x1030165
+ field public static final int Widget_DeviceDefault_PopupWindow = 16974159; // 0x103014f
+ field public static final int Widget_DeviceDefault_ProgressBar = 16974160; // 0x1030150
+ field public static final int Widget_DeviceDefault_ProgressBar_Horizontal = 16974161; // 0x1030151
+ field public static final int Widget_DeviceDefault_ProgressBar_Large = 16974164; // 0x1030154
+ field public static final int Widget_DeviceDefault_ProgressBar_Small = 16974162; // 0x1030152
+ field public static final int Widget_DeviceDefault_ProgressBar_Small_Title = 16974163; // 0x1030153
+ field public static final int Widget_DeviceDefault_RatingBar = 16974166; // 0x1030156
+ field public static final int Widget_DeviceDefault_RatingBar_Indicator = 16974167; // 0x1030157
+ field public static final int Widget_DeviceDefault_RatingBar_Small = 16974168; // 0x1030158
+ field public static final int Widget_DeviceDefault_ScrollView = 16974170; // 0x103015a
+ field public static final int Widget_DeviceDefault_SeekBar = 16974165; // 0x1030155
+ field public static final int Widget_DeviceDefault_Spinner = 16974172; // 0x103015c
+ field public static final int Widget_DeviceDefault_Tab = 16974189; // 0x103016d
+ field public static final int Widget_DeviceDefault_TabWidget = 16974174; // 0x103015e
+ field public static final int Widget_DeviceDefault_TextView = 16974150; // 0x1030146
+ field public static final int Widget_DeviceDefault_TextView_SpinnerItem = 16974179; // 0x1030163
+ field public static final int Widget_DeviceDefault_WebTextView = 16974175; // 0x103015f
+ field public static final int Widget_DeviceDefault_WebView = 16974176; // 0x1030160
field public static final int Widget_DropDownItem = 16973867; // 0x103002b
field public static final int Widget_DropDownItem_Spinner = 16973868; // 0x103002c
field public static final int Widget_EditText = 16973859; // 0x1030023
@@ -1530,6 +1828,10 @@
field public static final int Widget_GridView = 16973874; // 0x1030032
field public static final int Widget_Holo = 16973962; // 0x103008a
field public static final int Widget_Holo_ActionBar = 16974004; // 0x10300b4
+ field public static final int Widget_Holo_ActionBar_Solid = 16974113; // 0x1030121
+ field public static final int Widget_Holo_ActionBar_TabBar = 16974071; // 0x10300f7
+ field public static final int Widget_Holo_ActionBar_TabText = 16974070; // 0x10300f6
+ field public static final int Widget_Holo_ActionBar_TabView = 16974069; // 0x10300f5
field public static final int Widget_Holo_ActionButton = 16973999; // 0x10300af
field public static final int Widget_Holo_ActionButton_CloseMode = 16974003; // 0x10300b3
field public static final int Widget_Holo_ActionButton_Overflow = 16974000; // 0x10300b0
@@ -1538,6 +1840,7 @@
field public static final int Widget_Holo_AutoCompleteTextView = 16973968; // 0x1030090
field public static final int Widget_Holo_Button = 16973963; // 0x103008b
field public static final int Widget_Holo_Button_Borderless = 16974050; // 0x10300e2
+ field public static final int Widget_Holo_Button_Borderless_Small = 16974106; // 0x103011a
field public static final int Widget_Holo_Button_Inset = 16973965; // 0x103008d
field public static final int Widget_Holo_Button_Small = 16973964; // 0x103008c
field public static final int Widget_Holo_Button_Toggle = 16973966; // 0x103008e
@@ -1555,12 +1858,22 @@
field public static final int Widget_Holo_ImageButton = 16973974; // 0x1030096
field public static final int Widget_Holo_Light = 16974005; // 0x10300b5
field public static final int Widget_Holo_Light_ActionBar = 16974049; // 0x10300e1
+ field public static final int Widget_Holo_Light_ActionBar_Solid = 16974114; // 0x1030122
+ field public static final int Widget_Holo_Light_ActionBar_Solid_Inverse = 16974115; // 0x1030123
+ field public static final int Widget_Holo_Light_ActionBar_TabBar = 16974074; // 0x10300fa
+ field public static final int Widget_Holo_Light_ActionBar_TabBar_Inverse = 16974116; // 0x1030124
+ field public static final int Widget_Holo_Light_ActionBar_TabText = 16974073; // 0x10300f9
+ field public static final int Widget_Holo_Light_ActionBar_TabText_Inverse = 16974118; // 0x1030126
+ field public static final int Widget_Holo_Light_ActionBar_TabView = 16974072; // 0x10300f8
+ field public static final int Widget_Holo_Light_ActionBar_TabView_Inverse = 16974117; // 0x1030125
field public static final int Widget_Holo_Light_ActionButton = 16974045; // 0x10300dd
field public static final int Widget_Holo_Light_ActionButton_CloseMode = 16974048; // 0x10300e0
field public static final int Widget_Holo_Light_ActionButton_Overflow = 16974046; // 0x10300de
field public static final int Widget_Holo_Light_ActionMode = 16974047; // 0x10300df
+ field public static final int Widget_Holo_Light_ActionMode_Inverse = 16974119; // 0x1030127
field public static final int Widget_Holo_Light_AutoCompleteTextView = 16974011; // 0x10300bb
field public static final int Widget_Holo_Light_Button = 16974006; // 0x10300b6
+ field public static final int Widget_Holo_Light_Button_Borderless_Small = 16974107; // 0x103011b
field public static final int Widget_Holo_Light_Button_Inset = 16974008; // 0x10300b8
field public static final int Widget_Holo_Light_Button_Small = 16974007; // 0x10300b7
field public static final int Widget_Holo_Light_Button_Toggle = 16974009; // 0x10300b9
@@ -1667,14 +1980,23 @@
method protected void onServiceConnected();
method public final void setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo);
field public static final java.lang.String SERVICE_INTERFACE = "android.accessibilityservice.AccessibilityService";
+ field public static final java.lang.String SERVICE_META_DATA = "android.accessibilityservice";
}
public class AccessibilityServiceInfo implements android.os.Parcelable {
ctor public AccessibilityServiceInfo();
method public int describeContents();
+ method public static java.lang.String feedbackTypeToString(int);
+ method public static java.lang.String flagToString(int);
+ method public boolean getCanRetrieveWindowContent();
+ method public java.lang.String getDescription();
+ method public java.lang.String getId();
+ method public android.content.pm.ResolveInfo getResolveInfo();
+ method public java.lang.String getSettingsActivityName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int DEFAULT = 1; // 0x1
+ field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
field public static final int FEEDBACK_AUDIBLE = 4; // 0x4
field public static final int FEEDBACK_GENERIC = 16; // 0x10
field public static final int FEEDBACK_HAPTIC = 2; // 0x2
@@ -1742,7 +2064,8 @@
method public android.accounts.Account[] getAccountsByType(java.lang.String);
method public android.accounts.AccountManagerFuture<android.accounts.Account[]> getAccountsByTypeAndFeatures(java.lang.String, java.lang.String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method public deprecated android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthTokenByFeatures(java.lang.String, java.lang.String, java.lang.String[], android.app.Activity, android.os.Bundle, android.os.Bundle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AuthenticatorDescription[] getAuthenticatorTypes();
method public java.lang.String getPassword(android.accounts.Account);
@@ -1771,6 +2094,7 @@
field public static final java.lang.String KEY_ACCOUNT_MANAGER_RESPONSE = "accountManagerResponse";
field public static final java.lang.String KEY_ACCOUNT_NAME = "authAccount";
field public static final java.lang.String KEY_ACCOUNT_TYPE = "accountType";
+ field public static final java.lang.String KEY_ANDROID_PACKAGE_NAME = "androidPackageName";
field public static final java.lang.String KEY_AUTHENTICATOR_TYPES = "authenticator_types";
field public static final java.lang.String KEY_AUTHTOKEN = "authtoken";
field public static final java.lang.String KEY_AUTH_FAILED_MESSAGE = "authFailedMessage";
@@ -1860,6 +2184,7 @@
method public java.util.ArrayList<android.animation.Animator.AnimatorListener> getListeners();
method public abstract long getStartDelay();
method public abstract boolean isRunning();
+ method public boolean isStarted();
method public void removeAllListeners();
method public void removeListener(android.animation.Animator.AnimatorListener);
method public abstract android.animation.Animator setDuration(long);
@@ -1963,6 +2288,7 @@
method public boolean isRunning();
method public void removeChild(android.view.ViewGroup, android.view.View);
method public void removeTransitionListener(android.animation.LayoutTransition.TransitionListener);
+ method public void setAnimateParentHierarchy(boolean);
method public void setAnimator(int, android.animation.Animator);
method public void setDuration(long);
method public void setDuration(int, long);
@@ -1986,9 +2312,13 @@
method public java.lang.String getPropertyName();
method public java.lang.Object getTarget();
method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...);
+ method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...);
+ method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
+ method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
+ method public void setProperty(android.util.Property);
method public void setPropertyName(java.lang.String);
}
@@ -1996,14 +2326,19 @@
method public android.animation.PropertyValuesHolder clone();
method public java.lang.String getPropertyName();
method public static android.animation.PropertyValuesHolder ofFloat(java.lang.String, float...);
+ method public static android.animation.PropertyValuesHolder ofFloat(android.util.Property<?, java.lang.Float>, float...);
method public static android.animation.PropertyValuesHolder ofInt(java.lang.String, int...);
+ method public static android.animation.PropertyValuesHolder ofInt(android.util.Property<?, java.lang.Integer>, int...);
method public static android.animation.PropertyValuesHolder ofKeyframe(java.lang.String, android.animation.Keyframe...);
+ method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...);
method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
+ method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
method public void setEvaluator(android.animation.TypeEvaluator);
method public void setFloatValues(float...);
method public void setIntValues(int...);
method public void setKeyframes(android.animation.Keyframe...);
method public void setObjectValues(java.lang.Object...);
+ method public void setProperty(android.util.Property);
method public void setPropertyName(java.lang.String);
}
@@ -2079,6 +2414,7 @@
method public abstract java.lang.CharSequence getSubtitle();
method public abstract android.app.ActionBar.Tab getTabAt(int);
method public abstract int getTabCount();
+ method public android.content.Context getThemedContext();
method public abstract java.lang.CharSequence getTitle();
method public abstract void hide();
method public abstract boolean isShowing();
@@ -2099,9 +2435,16 @@
method public abstract void setDisplayShowHomeEnabled(boolean);
method public abstract void setDisplayShowTitleEnabled(boolean);
method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable);
method public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.app.ActionBar.OnNavigationListener);
+ method public abstract void setLogo(int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable);
method public abstract void setNavigationMode(int);
method public abstract void setSelectedNavigationItem(int);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
method public abstract void setSubtitle(java.lang.CharSequence);
method public abstract void setSubtitle(int);
method public abstract void setTitle(java.lang.CharSequence);
@@ -2137,12 +2480,15 @@
public static abstract class ActionBar.Tab {
ctor public ActionBar.Tab();
+ method public abstract java.lang.CharSequence getContentDescription();
method public abstract android.view.View getCustomView();
method public abstract android.graphics.drawable.Drawable getIcon();
method public abstract int getPosition();
method public abstract java.lang.Object getTag();
method public abstract java.lang.CharSequence getText();
method public abstract void select();
+ method public abstract android.app.ActionBar.Tab setContentDescription(int);
+ method public abstract android.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
method public abstract android.app.ActionBar.Tab setCustomView(android.view.View);
method public abstract android.app.ActionBar.Tab setCustomView(int);
method public abstract android.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
@@ -2160,13 +2506,13 @@
method public abstract void onTabUnselected(android.app.ActionBar.Tab, android.app.FragmentTransaction);
}
- public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
+ public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
ctor public Activity();
method public void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
method public void closeContextMenu();
method public void closeOptionsMenu();
method public android.app.PendingIntent createPendingResult(int, android.content.Intent, int);
- method public final void dismissDialog(int);
+ method public final deprecated void dismissDialog(int);
method public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
method public boolean dispatchKeyEvent(android.view.KeyEvent);
method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
@@ -2188,7 +2534,7 @@
method public android.view.View getCurrentFocus();
method public android.app.FragmentManager getFragmentManager();
method public android.content.Intent getIntent();
- method public java.lang.Object getLastNonConfigurationInstance();
+ method public deprecated java.lang.Object getLastNonConfigurationInstance();
method public android.view.LayoutInflater getLayoutInflater();
method public android.app.LoaderManager getLoaderManager();
method public java.lang.String getLocalClassName();
@@ -2225,7 +2571,7 @@
method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
method public java.lang.CharSequence onCreateDescription();
method protected deprecated android.app.Dialog onCreateDialog(int);
- method protected android.app.Dialog onCreateDialog(int, android.os.Bundle);
+ method protected deprecated android.app.Dialog onCreateDialog(int, android.os.Bundle);
method public boolean onCreateOptionsMenu(android.view.Menu);
method public boolean onCreatePanelMenu(int, android.view.Menu);
method public android.view.View onCreatePanelView(int);
@@ -2251,13 +2597,13 @@
method protected void onPostCreate(android.os.Bundle);
method protected void onPostResume();
method protected deprecated void onPrepareDialog(int, android.app.Dialog);
- method protected void onPrepareDialog(int, android.app.Dialog, android.os.Bundle);
+ method protected deprecated void onPrepareDialog(int, android.app.Dialog, android.os.Bundle);
method public boolean onPrepareOptionsMenu(android.view.Menu);
method public boolean onPreparePanel(int, android.view.View, android.view.Menu);
method protected void onRestart();
method protected void onRestoreInstanceState(android.os.Bundle);
method protected void onResume();
- method public java.lang.Object onRetainNonConfigurationInstance();
+ method public deprecated java.lang.Object onRetainNonConfigurationInstance();
method protected void onSaveInstanceState(android.os.Bundle);
method public boolean onSearchRequested();
method protected void onStart();
@@ -2265,6 +2611,7 @@
method protected void onTitleChanged(java.lang.CharSequence, int);
method public boolean onTouchEvent(android.view.MotionEvent);
method public boolean onTrackballEvent(android.view.MotionEvent);
+ method public void onTrimMemory(int);
method public void onUserInteraction();
method protected void onUserLeaveHint();
method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams);
@@ -2275,7 +2622,7 @@
method public void overridePendingTransition(int, int);
method public void recreate();
method public void registerForContextMenu(android.view.View);
- method public final void removeDialog(int);
+ method public final deprecated void removeDialog(int);
method public final boolean requestWindowFeature(int);
method public final void runOnUiThread(java.lang.Runnable);
method public void setContentView(int);
@@ -2301,8 +2648,8 @@
method public void setTitleColor(int);
method public void setVisible(boolean);
method public final void setVolumeControlStream(int);
- method public final void showDialog(int);
- method public final boolean showDialog(int, android.os.Bundle);
+ method public final deprecated void showDialog(int);
+ method public final deprecated boolean showDialog(int, android.os.Bundle);
method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback);
method public void startActivityForResult(android.content.Intent, int);
method public void startActivityFromChild(android.app.Activity, android.content.Intent, int);
@@ -2328,7 +2675,7 @@
field public static final int RESULT_OK = -1; // 0xffffffff
}
- public class ActivityGroup extends android.app.Activity {
+ public deprecated class ActivityGroup extends android.app.Activity {
ctor public ActivityGroup();
ctor public ActivityGroup(boolean);
method public android.app.Activity getCurrentActivity();
@@ -2512,6 +2859,8 @@
method public void setMessage(java.lang.CharSequence);
method public void setView(android.view.View);
method public void setView(android.view.View, int, int, int, int);
+ field public static final int THEME_DEVICE_DEFAULT_DARK = 4; // 0x4
+ field public static final int THEME_DEVICE_DEFAULT_LIGHT = 5; // 0x5
field public static final int THEME_HOLO_DARK = 2; // 0x2
field public static final int THEME_HOLO_LIGHT = 3; // 0x3
field public static final int THEME_TRADITIONAL = 1; // 0x1
@@ -2560,12 +2909,95 @@
ctor public AliasActivity();
}
- public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks {
+ public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Application();
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
method public void onLowMemory();
method public void onTerminate();
+ method public void onTrimMemory(int);
+ method public void registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks);
+ method public void unregisterActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks);
+ }
+
+ public static abstract interface Application.ActivityLifecycleCallbacks {
+ method public abstract void onActivityCreated(android.app.Activity, android.os.Bundle);
+ method public abstract void onActivityDestroyed(android.app.Activity);
+ method public abstract void onActivityPaused(android.app.Activity);
+ method public abstract void onActivityResumed(android.app.Activity);
+ method public abstract void onActivitySaveInstanceState(android.app.Activity, android.os.Bundle);
+ method public abstract void onActivityStarted(android.app.Activity);
+ method public abstract void onActivityStopped(android.app.Activity);
+ }
+
+ public class ApplicationErrorReport implements android.os.Parcelable {
+ ctor public ApplicationErrorReport();
+ method public int describeContents();
+ method public void dump(android.util.Printer, java.lang.String);
+ method public static android.content.ComponentName getErrorReportReceiver(android.content.Context, java.lang.String, int);
+ method public void readFromParcel(android.os.Parcel);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int TYPE_ANR = 2; // 0x2
+ field public static final int TYPE_BATTERY = 3; // 0x3
+ field public static final int TYPE_CRASH = 1; // 0x1
+ field public static final int TYPE_NONE = 0; // 0x0
+ field public static final int TYPE_RUNNING_SERVICE = 5; // 0x5
+ field public android.app.ApplicationErrorReport.AnrInfo anrInfo;
+ field public android.app.ApplicationErrorReport.BatteryInfo batteryInfo;
+ field public android.app.ApplicationErrorReport.CrashInfo crashInfo;
+ field public java.lang.String installerPackageName;
+ field public java.lang.String packageName;
+ field public java.lang.String processName;
+ field public android.app.ApplicationErrorReport.RunningServiceInfo runningServiceInfo;
+ field public boolean systemApp;
+ field public long time;
+ field public int type;
+ }
+
+ public static class ApplicationErrorReport.AnrInfo {
+ ctor public ApplicationErrorReport.AnrInfo();
+ ctor public ApplicationErrorReport.AnrInfo(android.os.Parcel);
+ method public void dump(android.util.Printer, java.lang.String);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public java.lang.String activity;
+ field public java.lang.String cause;
+ field public java.lang.String info;
+ }
+
+ public static class ApplicationErrorReport.BatteryInfo {
+ ctor public ApplicationErrorReport.BatteryInfo();
+ ctor public ApplicationErrorReport.BatteryInfo(android.os.Parcel);
+ method public void dump(android.util.Printer, java.lang.String);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public java.lang.String checkinDetails;
+ field public long durationMicros;
+ field public java.lang.String usageDetails;
+ field public int usagePercent;
+ }
+
+ public static class ApplicationErrorReport.CrashInfo {
+ ctor public ApplicationErrorReport.CrashInfo();
+ ctor public ApplicationErrorReport.CrashInfo(java.lang.Throwable);
+ ctor public ApplicationErrorReport.CrashInfo(android.os.Parcel);
+ method public void dump(android.util.Printer, java.lang.String);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public java.lang.String exceptionClassName;
+ field public java.lang.String exceptionMessage;
+ field public java.lang.String stackTrace;
+ field public java.lang.String throwClassName;
+ field public java.lang.String throwFileName;
+ field public int throwLineNumber;
+ field public java.lang.String throwMethodName;
+ }
+
+ public static class ApplicationErrorReport.RunningServiceInfo {
+ ctor public ApplicationErrorReport.RunningServiceInfo();
+ ctor public ApplicationErrorReport.RunningServiceInfo(android.os.Parcel);
+ method public void dump(android.util.Printer, java.lang.String);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public long durationMillis;
+ field public java.lang.String serviceDetails;
}
public class DatePickerDialog extends android.app.AlertDialog implements android.widget.DatePicker.OnDateChangedListener android.content.DialogInterface.OnClickListener {
@@ -2784,7 +3216,7 @@
method public void setSelectedGroup(int);
}
- public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
+ public class Fragment implements android.content.ComponentCallbacks2 android.view.View.OnCreateContextMenuListener {
ctor public Fragment();
method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
method public final boolean equals(java.lang.Object);
@@ -2806,6 +3238,7 @@
method public static android.app.Fragment instantiate(android.content.Context, java.lang.String);
method public static android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
method public final boolean isAdded();
+ method public final boolean isDetached();
method public final boolean isHidden();
method public final boolean isInLayout();
method public final boolean isRemoving();
@@ -2837,9 +3270,13 @@
method public void onSaveInstanceState(android.os.Bundle);
method public void onStart();
method public void onStop();
+ method public void onTrimMemory(int);
+ method public void onViewCreated(android.view.View, android.os.Bundle);
method public void registerForContextMenu(android.view.View);
method public void setArguments(android.os.Bundle);
method public void setHasOptionsMenu(boolean);
+ method public void setInitialSavedState(android.app.Fragment.SavedState);
+ method public void setMenuVisibility(boolean);
method public void setRetainInstance(boolean);
method public void setTargetFragment(android.app.Fragment, int);
method public void startActivity(android.content.Intent);
@@ -2851,6 +3288,12 @@
ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
}
+ public static class Fragment.SavedState implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.ClassLoaderCreator CREATOR;
+ }
+
public class FragmentBreadCrumbs extends android.view.ViewGroup implements android.app.FragmentManager.OnBackStackChangedListener {
ctor public FragmentBreadCrumbs(android.content.Context);
ctor public FragmentBreadCrumbs(android.content.Context, android.util.AttributeSet);
@@ -2880,6 +3323,7 @@
method public abstract android.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
method public abstract int getBackStackEntryCount();
method public abstract android.app.Fragment getFragment(android.os.Bundle, java.lang.String);
+ method public void invalidateOptionsMenu();
method public abstract void popBackStack();
method public abstract void popBackStack(java.lang.String, int);
method public abstract void popBackStack(int, int);
@@ -2888,6 +3332,7 @@
method public abstract boolean popBackStackImmediate(int, int);
method public abstract void putFragment(android.os.Bundle, java.lang.String, android.app.Fragment);
method public abstract void removeOnBackStackChangedListener(android.app.FragmentManager.OnBackStackChangedListener);
+ method public abstract android.app.Fragment.SavedState saveFragmentInstanceState(android.app.Fragment);
field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
}
@@ -2897,6 +3342,7 @@
method public abstract java.lang.CharSequence getBreadCrumbTitle();
method public abstract int getBreadCrumbTitleRes();
method public abstract int getId();
+ method public abstract java.lang.String getName();
}
public static abstract interface FragmentManager.OnBackStackChangedListener {
@@ -2909,8 +3355,10 @@
method public abstract android.app.FragmentTransaction add(int, android.app.Fragment);
method public abstract android.app.FragmentTransaction add(int, android.app.Fragment, java.lang.String);
method public abstract android.app.FragmentTransaction addToBackStack(java.lang.String);
+ method public abstract android.app.FragmentTransaction attach(android.app.Fragment);
method public abstract int commit();
method public abstract int commitAllowingStateLoss();
+ method public abstract android.app.FragmentTransaction detach(android.app.Fragment);
method public abstract android.app.FragmentTransaction disallowAddToBackStack();
method public abstract android.app.FragmentTransaction hide(android.app.Fragment);
method public abstract boolean isAddToBackStackAllowed();
@@ -2923,6 +3371,7 @@
method public abstract android.app.FragmentTransaction setBreadCrumbTitle(int);
method public abstract android.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
method public abstract android.app.FragmentTransaction setCustomAnimations(int, int);
+ method public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int);
method public abstract android.app.FragmentTransaction setTransition(int);
method public abstract android.app.FragmentTransaction setTransitionStyle(int);
method public abstract android.app.FragmentTransaction show(android.app.Fragment);
@@ -3024,12 +3473,12 @@
}
public class KeyguardManager {
- method public void exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
+ method public deprecated void exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
method public boolean inKeyguardRestrictedInputMode();
- method public android.app.KeyguardManager.KeyguardLock newKeyguardLock(java.lang.String);
+ method public deprecated android.app.KeyguardManager.KeyguardLock newKeyguardLock(java.lang.String);
}
- public class KeyguardManager.KeyguardLock {
+ public deprecated class KeyguardManager.KeyguardLock {
method public void disableKeyguard();
method public void reenableKeyguard();
}
@@ -3104,7 +3553,7 @@
method public abstract void onLoaderReset(android.content.Loader<D>);
}
- public class LocalActivityManager {
+ public deprecated class LocalActivityManager {
ctor public LocalActivityManager(android.app.Activity, boolean);
method public android.view.Window destroyActivity(java.lang.String, boolean);
method public void dispatchCreate(android.os.Bundle);
@@ -3193,6 +3642,7 @@
method public android.app.Notification.Builder setNumber(int);
method public android.app.Notification.Builder setOngoing(boolean);
method public android.app.Notification.Builder setOnlyAlertOnce(boolean);
+ method public android.app.Notification.Builder setProgress(int, int, boolean);
method public android.app.Notification.Builder setSmallIcon(int);
method public android.app.Notification.Builder setSmallIcon(int, int);
method public android.app.Notification.Builder setSound(android.net.Uri);
@@ -3226,6 +3676,7 @@
method public void send(android.content.Context, int, android.content.Intent) throws android.app.PendingIntent.CanceledException;
method public void send(int, android.app.PendingIntent.OnFinished, android.os.Handler) throws android.app.PendingIntent.CanceledException;
method public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler) throws android.app.PendingIntent.CanceledException;
+ method public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler, java.lang.String) throws android.app.PendingIntent.CanceledException;
method public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
@@ -3289,6 +3740,7 @@
field public static final java.lang.String EXTRA_DATA_KEY = "intent_extra_data_key";
field public static final java.lang.String EXTRA_NEW_SEARCH = "new_search";
field public static final java.lang.String EXTRA_SELECT_QUERY = "select_query";
+ field public static final java.lang.String EXTRA_WEB_SEARCH_PENDINGINTENT = "web_search_pendingintent";
field public static final int FLAG_QUERY_REFINEMENT = 1; // 0x1
field public static final java.lang.String INTENT_ACTION_GLOBAL_SEARCH = "android.search.action.GLOBAL_SEARCH";
field public static final java.lang.String INTENT_ACTION_SEARCHABLES_CHANGED = "android.search.action.SEARCHABLES_CHANGED";
@@ -3307,6 +3759,7 @@
field public static final java.lang.String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data";
field public static final java.lang.String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id";
field public static final java.lang.String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data";
+ field public static final java.lang.String SUGGEST_COLUMN_LAST_ACCESS_HINT = "suggest_last_access_hint";
field public static final java.lang.String SUGGEST_COLUMN_QUERY = "suggest_intent_query";
field public static final java.lang.String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id";
field public static final java.lang.String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING = "suggest_spinner_while_refreshing";
@@ -3359,7 +3812,7 @@
field public static final android.os.Parcelable.Creator CREATOR;
}
- public abstract class Service extends android.content.ContextWrapper implements android.content.ComponentCallbacks {
+ public abstract class Service extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Service();
method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
method public final android.app.Application getApplication();
@@ -3371,6 +3824,8 @@
method public void onRebind(android.content.Intent);
method public deprecated void onStart(android.content.Intent, int);
method public int onStartCommand(android.content.Intent, int, int);
+ method public void onTaskRemoved(android.content.Intent);
+ method public void onTrimMemory(int);
method public boolean onUnbind(android.content.Intent);
method public final void startForeground(int, android.app.Notification);
method public final void stopForeground(boolean);
@@ -3386,7 +3841,7 @@
field public static final int START_STICKY_COMPATIBILITY = 0; // 0x0
}
- public class TabActivity extends android.app.ActivityGroup {
+ public deprecated class TabActivity extends android.app.ActivityGroup {
ctor public TabActivity();
method public android.widget.TabHost getTabHost();
method public android.widget.TabWidget getTabWidget();
@@ -3444,6 +3899,7 @@
public class WallpaperManager {
method public void clear() throws java.io.IOException;
method public void clearWallpaperOffsets(android.os.IBinder);
+ method public void forgetLoadedWallpaper();
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.graphics.drawable.Drawable getDrawable();
@@ -3487,6 +3943,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int USES_ENCRYPTED_STORAGE = 7; // 0x7
+ field public static final int USES_POLICY_DISABLE_CAMERA = 8; // 0x8
field public static final int USES_POLICY_EXPIRE_PASSWORD = 6; // 0x6
field public static final int USES_POLICY_FORCE_LOCK = 3; // 0x3
field public static final int USES_POLICY_LIMIT_PASSWORD = 0; // 0x0
@@ -3520,6 +3977,7 @@
public class DevicePolicyManager {
method public java.util.List<android.content.ComponentName> getActiveAdmins();
+ method public boolean getCameraDisabled(android.content.ComponentName);
method public int getCurrentFailedPasswordAttempts();
method public int getMaximumFailedPasswordsForWipe(android.content.ComponentName);
method public long getMaximumTimeToLock(android.content.ComponentName);
@@ -3543,6 +4001,7 @@
method public void lockNow();
method public void removeActiveAdmin(android.content.ComponentName);
method public boolean resetPassword(java.lang.String, int);
+ method public void setCameraDisabled(android.content.ComponentName, boolean);
method public void setMaximumFailedPasswordsForWipe(android.content.ComponentName, int);
method public void setMaximumTimeToLock(android.content.ComponentName, long);
method public void setPasswordExpirationTimeout(android.content.ComponentName, long);
@@ -3568,6 +4027,7 @@
field public static final java.lang.String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN";
field public static final int PASSWORD_QUALITY_ALPHABETIC = 262144; // 0x40000
field public static final int PASSWORD_QUALITY_ALPHANUMERIC = 327680; // 0x50000
+ field public static final int PASSWORD_QUALITY_BIOMETRIC_WEAK = 32768; // 0x8000
field public static final int PASSWORD_QUALITY_COMPLEX = 393216; // 0x60000
field public static final int PASSWORD_QUALITY_NUMERIC = 131072; // 0x20000
field public static final int PASSWORD_QUALITY_SOMETHING = 65536; // 0x10000
@@ -3582,10 +4042,15 @@
public abstract class BackupAgent extends android.content.ContextWrapper {
ctor public BackupAgent();
+ method public final void fullBackupFile(java.io.File, android.app.backup.FullBackupDataOutput);
method public abstract void onBackup(android.os.ParcelFileDescriptor, android.app.backup.BackupDataOutput, android.os.ParcelFileDescriptor) throws java.io.IOException;
method public void onCreate();
method public void onDestroy();
+ method public void onFullBackup(android.app.backup.FullBackupDataOutput) throws java.io.IOException;
method public abstract void onRestore(android.app.backup.BackupDataInput, int, android.os.ParcelFileDescriptor) throws java.io.IOException;
+ method public void onRestoreFile(android.os.ParcelFileDescriptor, long, java.io.File, int, long, long) throws java.io.IOException;
+ field public static final int TYPE_DIRECTORY = 2; // 0x2
+ field public static final int TYPE_FILE = 1; // 0x1
}
public class BackupAgentHelper extends android.app.backup.BackupAgent {
@@ -3637,6 +4102,9 @@
method public void writeNewStateDescription(android.os.ParcelFileDescriptor);
}
+ public class FullBackupDataOutput {
+ }
+
public abstract class RestoreObserver {
ctor public RestoreObserver();
method public void onUpdate(int, java.lang.String);
@@ -3732,6 +4200,8 @@
field public int initialLayout;
field public java.lang.String label;
field public int minHeight;
+ field public int minResizeHeight;
+ field public int minResizeWidth;
field public int minWidth;
field public int previewImage;
field public android.content.ComponentName provider;
@@ -3764,6 +4234,7 @@
method public java.util.Set<android.bluetooth.BluetoothDevice> getBondedDevices();
method public static synchronized android.bluetooth.BluetoothAdapter getDefaultAdapter();
method public java.lang.String getName();
+ method public int getProfileConnectionState(int);
method public boolean getProfileProxy(android.content.Context, android.bluetooth.BluetoothProfile.ServiceListener, int);
method public android.bluetooth.BluetoothDevice getRemoteDevice(java.lang.String);
method public int getScanMode();
@@ -4048,6 +4519,44 @@
field public static final java.lang.String VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY = "android.bluetooth.headset.intent.category.companyid";
}
+ public final class BluetoothHealth implements android.bluetooth.BluetoothProfile {
+ method public boolean connectChannelToSource(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration);
+ method public boolean disconnectChannel(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration, int);
+ method public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
+ method public int getConnectionState(android.bluetooth.BluetoothDevice);
+ method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
+ method public android.os.ParcelFileDescriptor getMainChannelFd(android.bluetooth.BluetoothDevice, android.bluetooth.BluetoothHealthAppConfiguration);
+ method public boolean registerSinkAppConfiguration(java.lang.String, int, android.bluetooth.BluetoothHealthCallback);
+ method public boolean unregisterAppConfiguration(android.bluetooth.BluetoothHealthAppConfiguration);
+ field public static final int APP_CONFIG_REGISTRATION_FAILURE = 1; // 0x1
+ field public static final int APP_CONFIG_REGISTRATION_SUCCESS = 0; // 0x0
+ field public static final int APP_CONFIG_UNREGISTRATION_FAILURE = 3; // 0x3
+ field public static final int APP_CONFIG_UNREGISTRATION_SUCCESS = 2; // 0x2
+ field public static final int CHANNEL_TYPE_RELIABLE = 10; // 0xa
+ field public static final int CHANNEL_TYPE_STREAMING = 11; // 0xb
+ field public static final int SINK_ROLE = 2; // 0x2
+ field public static final int SOURCE_ROLE = 1; // 0x1
+ field public static final int STATE_CHANNEL_CONNECTED = 2; // 0x2
+ field public static final int STATE_CHANNEL_CONNECTING = 1; // 0x1
+ field public static final int STATE_CHANNEL_DISCONNECTED = 0; // 0x0
+ field public static final int STATE_CHANNEL_DISCONNECTING = 3; // 0x3
+ }
+
+ public final class BluetoothHealthAppConfiguration implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getDataType();
+ method public java.lang.String getName();
+ method public int getRole();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+ public abstract class BluetoothHealthCallback {
+ ctor public BluetoothHealthCallback();
+ method public void onHealthAppConfigurationStatusChange(android.bluetooth.BluetoothHealthAppConfiguration, int);
+ method public void onHealthChannelStateChange(android.bluetooth.BluetoothHealthAppConfiguration, android.bluetooth.BluetoothDevice, int, int, android.os.ParcelFileDescriptor, int);
+ }
+
public abstract interface BluetoothProfile {
method public abstract java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
method public abstract int getConnectionState(android.bluetooth.BluetoothDevice);
@@ -4079,6 +4588,7 @@
method public java.io.InputStream getInputStream() throws java.io.IOException;
method public java.io.OutputStream getOutputStream() throws java.io.IOException;
method public android.bluetooth.BluetoothDevice getRemoteDevice();
+ method public boolean isConnected();
}
}
@@ -4242,6 +4752,14 @@
method public abstract void onLowMemory();
}
+ public abstract interface ComponentCallbacks2 implements android.content.ComponentCallbacks {
+ method public abstract void onTrimMemory(int);
+ field public static final int TRIM_MEMORY_BACKGROUND = 40; // 0x28
+ field public static final int TRIM_MEMORY_COMPLETE = 80; // 0x50
+ field public static final int TRIM_MEMORY_MODERATE = 60; // 0x3c
+ field public static final int TRIM_MEMORY_UI_HIDDEN = 20; // 0x14
+ }
+
public final class ComponentName implements java.lang.Cloneable java.lang.Comparable android.os.Parcelable {
ctor public ComponentName(java.lang.String, java.lang.String);
ctor public ComponentName(android.content.Context, java.lang.String);
@@ -4263,7 +4781,7 @@
field public static final android.os.Parcelable.Creator CREATOR;
}
- public abstract class ContentProvider implements android.content.ComponentCallbacks {
+ public abstract class ContentProvider implements android.content.ComponentCallbacks2 {
ctor public ContentProvider();
method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException;
method public void attachInfo(android.content.Context, android.content.pm.ProviderInfo);
@@ -4281,6 +4799,7 @@
method public void onConfigurationChanged(android.content.res.Configuration);
method public abstract boolean onCreate();
method public void onLowMemory();
+ method public void onTrimMemory(int);
method public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
@@ -4534,6 +5053,7 @@
method public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
method public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public abstract deprecated android.graphics.drawable.Drawable peekWallpaper();
+ method public void registerComponentCallbacks(android.content.ComponentCallbacks);
method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
method public abstract void removeStickyBroadcast(android.content.Intent);
@@ -4554,15 +5074,21 @@
method public abstract android.content.ComponentName startService(android.content.Intent);
method public abstract boolean stopService(android.content.Intent);
method public abstract void unbindService(android.content.ServiceConnection);
+ method public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
method public abstract void unregisterReceiver(android.content.BroadcastReceiver);
field public static final java.lang.String ACCESSIBILITY_SERVICE = "accessibility";
field public static final java.lang.String ACCOUNT_SERVICE = "account";
field public static final java.lang.String ACTIVITY_SERVICE = "activity";
field public static final java.lang.String ALARM_SERVICE = "alarm";
field public static final java.lang.String AUDIO_SERVICE = "audio";
+ field public static final int BIND_ABOVE_CLIENT = 8; // 0x8
+ field public static final int BIND_ADJUST_WITH_ACTIVITY = 64; // 0x40
+ field public static final int BIND_ALLOW_OOM_MANAGEMENT = 16; // 0x10
field public static final int BIND_AUTO_CREATE = 1; // 0x1
field public static final int BIND_DEBUG_UNBIND = 2; // 0x2
+ field public static final int BIND_IMPORTANT = 64; // 0x40
field public static final int BIND_NOT_FOREGROUND = 4; // 0x4
+ field public static final int BIND_WAIVE_PRIORITY = 32; // 0x20
field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
@@ -4587,10 +5113,12 @@
field public static final java.lang.String SENSOR_SERVICE = "sensor";
field public static final java.lang.String STORAGE_SERVICE = "storage";
field public static final java.lang.String TELEPHONY_SERVICE = "phone";
+ field public static final java.lang.String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
field public static final java.lang.String UI_MODE_SERVICE = "uimode";
field public static final java.lang.String USB_SERVICE = "usb";
field public static final java.lang.String VIBRATOR_SERVICE = "vibrator";
field public static final java.lang.String WALLPAPER_SERVICE = "wallpaper";
+ field public static final java.lang.String WIFI_P2P_SERVICE = "wifip2p";
field public static final java.lang.String WIFI_SERVICE = "wifi";
field public static final java.lang.String WINDOW_SERVICE = "window";
}
@@ -4867,6 +5395,7 @@
field public static final java.lang.String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
field public static final java.lang.String ACTION_ALL_APPS = "android.intent.action.ALL_APPS";
field public static final java.lang.String ACTION_ANSWER = "android.intent.action.ANSWER";
+ field public static final java.lang.String ACTION_APP_ERROR = "android.intent.action.APP_ERROR";
field public static final java.lang.String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
field public static final java.lang.String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
field public static final java.lang.String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
@@ -4898,8 +5427,10 @@
field public static final java.lang.String ACTION_INPUT_METHOD_CHANGED = "android.intent.action.INPUT_METHOD_CHANGED";
field public static final java.lang.String ACTION_INSERT = "android.intent.action.INSERT";
field public static final java.lang.String ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT";
+ field public static final java.lang.String ACTION_INSTALL_PACKAGE = "android.intent.action.INSTALL_PACKAGE";
field public static final java.lang.String ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED";
field public static final java.lang.String ACTION_MAIN = "android.intent.action.MAIN";
+ field public static final java.lang.String ACTION_MANAGE_NETWORK_USAGE = "android.intent.action.MANAGE_NETWORK_USAGE";
field public static final java.lang.String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE";
field public static final java.lang.String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
field public static final java.lang.String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
@@ -4920,7 +5451,8 @@
field public static final java.lang.String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
field public static final java.lang.String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED";
field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
- field public static final java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
+ field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED";
+ field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
field public static final java.lang.String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
field public static final java.lang.String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
field public static final java.lang.String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
@@ -4948,8 +5480,9 @@
field public static final java.lang.String ACTION_TIME_CHANGED = "android.intent.action.TIME_SET";
field public static final java.lang.String ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
field public static final java.lang.String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
- field public static final java.lang.String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
- field public static final java.lang.String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
+ field public static final deprecated java.lang.String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
+ field public static final deprecated java.lang.String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
+ field public static final java.lang.String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE";
field public static final java.lang.String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
field public static final java.lang.String ACTION_VIEW = "android.intent.action.VIEW";
field public static final java.lang.String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
@@ -4980,7 +5513,9 @@
field public static final java.lang.String CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
field public static final android.os.Parcelable.Creator CREATOR;
field public static final java.lang.String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
+ field public static final java.lang.String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE";
field public static final java.lang.String EXTRA_BCC = "android.intent.extra.BCC";
+ field public static final java.lang.String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
field public static final java.lang.String EXTRA_CC = "android.intent.extra.CC";
field public static final deprecated java.lang.String EXTRA_CHANGED_COMPONENT_NAME = "android.intent.extra.changed_component_name";
field public static final java.lang.String EXTRA_CHANGED_COMPONENT_NAME_LIST = "android.intent.extra.changed_component_name_list";
@@ -4996,12 +5531,15 @@
field public static final java.lang.String EXTRA_DONT_KILL_APP = "android.intent.extra.DONT_KILL_APP";
field public static final java.lang.String EXTRA_EMAIL = "android.intent.extra.EMAIL";
field public static final java.lang.String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS";
+ field public static final java.lang.String EXTRA_INSTALLER_PACKAGE_NAME = "android.intent.extra.INSTALLER_PACKAGE_NAME";
field public static final java.lang.String EXTRA_INTENT = "android.intent.extra.INTENT";
field public static final java.lang.String EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT";
field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.intent.extra.LOCAL_ONLY";
+ field public static final java.lang.String EXTRA_NOT_UNKNOWN_SOURCE = "android.intent.extra.NOT_UNKNOWN_SOURCE";
field public static final java.lang.String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
field public static final java.lang.String EXTRA_REMOTE_INTENT_TOKEN = "android.intent.extra.remote_intent_token";
field public static final java.lang.String EXTRA_REPLACING = "android.intent.extra.REPLACING";
+ field public static final java.lang.String EXTRA_RETURN_RESULT = "android.intent.extra.RETURN_RESULT";
field public static final java.lang.String EXTRA_SHORTCUT_ICON = "android.intent.extra.shortcut.ICON";
field public static final java.lang.String EXTRA_SHORTCUT_ICON_RESOURCE = "android.intent.extra.shortcut.ICON_RESOURCE";
field public static final java.lang.String EXTRA_SHORTCUT_INTENT = "android.intent.extra.shortcut.INTENT";
@@ -5146,6 +5684,7 @@
method public java.lang.String getTargetPackage();
method public static android.content.IntentSender readIntentSenderOrNullFromParcel(android.os.Parcel);
method public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender.OnFinished, android.os.Handler) throws android.content.IntentSender.SendIntentException;
+ method public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender.OnFinished, android.os.Handler, java.lang.String) throws android.content.IntentSender.SendIntentException;
method public static void writeIntentSenderOrNullToParcel(android.content.IntentSender, android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
@@ -5279,6 +5818,7 @@
ctor public SyncAdapterType(android.os.Parcel);
method public boolean allowParallelSyncs();
method public int describeContents();
+ method public java.lang.String getSettingsActivity();
method public boolean isAlwaysSyncable();
method public boolean isUserVisible();
method public static android.content.SyncAdapterType newKey(java.lang.String, java.lang.String);
@@ -5374,6 +5914,8 @@
field public static final int CONFIG_NAVIGATION = 64; // 0x40
field public static final int CONFIG_ORIENTATION = 128; // 0x80
field public static final int CONFIG_SCREEN_LAYOUT = 256; // 0x100
+ field public static final int CONFIG_SCREEN_SIZE = 1024; // 0x400
+ field public static final int CONFIG_SMALLEST_SCREEN_SIZE = 2048; // 0x800
field public static final int CONFIG_TOUCHSCREEN = 8; // 0x8
field public static final int CONFIG_UI_MODE = 512; // 0x200
field public static final android.os.Parcelable.Creator CREATOR;
@@ -5403,6 +5945,7 @@
field public static final int SCREEN_ORIENTATION_SENSOR_PORTRAIT = 7; // 0x7
field public static final int SCREEN_ORIENTATION_UNSPECIFIED = -1; // 0xffffffff
field public static final int SCREEN_ORIENTATION_USER = 2; // 0x2
+ field public static final int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW = 1; // 0x1
field public int configChanges;
field public int flags;
field public int launchMode;
@@ -5412,6 +5955,7 @@
field public java.lang.String targetActivity;
field public java.lang.String taskAffinity;
field public int theme;
+ field public int uiOptions;
}
public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
@@ -5445,20 +5989,24 @@
field public static final int FLAG_VM_SAFE_MODE = 16384; // 0x4000
field public java.lang.String backupAgentName;
field public java.lang.String className;
+ field public int compatibleWidthLimitDp;
field public java.lang.String dataDir;
field public int descriptionRes;
field public boolean enabled;
field public int flags;
+ field public int largestWidthLimitDp;
field public java.lang.String manageSpaceActivityName;
field public java.lang.String nativeLibraryDir;
field public java.lang.String permission;
field public java.lang.String processName;
field public java.lang.String publicSourceDir;
+ field public int requiresSmallestWidthDp;
field public java.lang.String[] sharedLibraryFiles;
field public java.lang.String sourceDir;
field public int targetSdkVersion;
field public java.lang.String taskAffinity;
field public int theme;
+ field public int uiOptions;
field public int uid;
}
@@ -5660,6 +6208,7 @@
method public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0
field public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // 0x2
+ field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
field public static final int DONT_KILL_APP = 1; // 0x1
field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
@@ -5669,12 +6218,16 @@
field public static final java.lang.String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash";
field public static final java.lang.String FEATURE_CAMERA_FRONT = "android.hardware.camera.front";
field public static final java.lang.String FEATURE_FAKETOUCH = "android.hardware.faketouch";
+ field public static final java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT = "android.hardware.faketouch.multitouch.distinct";
+ field public static final java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND = "android.hardware.faketouch.multitouch.jazzhand";
field public static final java.lang.String FEATURE_LIVE_WALLPAPER = "android.software.live_wallpaper";
field public static final java.lang.String FEATURE_LOCATION = "android.hardware.location";
field public static final java.lang.String FEATURE_LOCATION_GPS = "android.hardware.location.gps";
field public static final java.lang.String FEATURE_LOCATION_NETWORK = "android.hardware.location.network";
field public static final java.lang.String FEATURE_MICROPHONE = "android.hardware.microphone";
field public static final java.lang.String FEATURE_NFC = "android.hardware.nfc";
+ field public static final java.lang.String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
+ field public static final java.lang.String FEATURE_SCREEN_PORTRAIT = "android.hardware.screen.portrait";
field public static final java.lang.String FEATURE_SENSOR_ACCELEROMETER = "android.hardware.sensor.accelerometer";
field public static final java.lang.String FEATURE_SENSOR_BAROMETER = "android.hardware.sensor.barometer";
field public static final java.lang.String FEATURE_SENSOR_COMPASS = "android.hardware.sensor.compass";
@@ -5693,6 +6246,7 @@
field public static final java.lang.String FEATURE_USB_ACCESSORY = "android.hardware.usb.accessory";
field public static final java.lang.String FEATURE_USB_HOST = "android.hardware.usb.host";
field public static final java.lang.String FEATURE_WIFI = "android.hardware.wifi";
+ field public static final java.lang.String FEATURE_WIFI_DIRECT = "android.hardware.wifi.direct";
field public static final int GET_ACTIVITIES = 1; // 0x1
field public static final int GET_CONFIGURATIONS = 16384; // 0x4000
field public static final int GET_DISABLED_COMPONENTS = 512; // 0x200
@@ -5736,6 +6290,7 @@
field public long codeSize;
field public long dataSize;
field public long externalCacheSize;
+ field public long externalCodeSize;
field public long externalDataSize;
field public long externalMediaSize;
field public long externalObbSize;
@@ -5826,6 +6381,8 @@
method public int describeContents();
method public void dump(android.util.Printer, java.lang.String);
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int FLAG_STOP_WITH_TASK = 1; // 0x1
+ field public int flags;
field public java.lang.String permission;
}
@@ -5959,6 +6516,9 @@
field public static final int SCREENLAYOUT_SIZE_SMALL = 1; // 0x1
field public static final int SCREENLAYOUT_SIZE_UNDEFINED = 0; // 0x0
field public static final int SCREENLAYOUT_SIZE_XLARGE = 4; // 0x4
+ field public static final int SCREEN_HEIGHT_DP_UNDEFINED = 0; // 0x0
+ field public static final int SCREEN_WIDTH_DP_UNDEFINED = 0; // 0x0
+ field public static final int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED = 0; // 0x0
field public static final int TOUCHSCREEN_FINGER = 3; // 0x3
field public static final int TOUCHSCREEN_NOTOUCH = 1; // 0x1
field public static final int TOUCHSCREEN_STYLUS = 2; // 0x2
@@ -5971,6 +6531,7 @@
field public static final int UI_MODE_TYPE_DESK = 2; // 0x2
field public static final int UI_MODE_TYPE_MASK = 15; // 0xf
field public static final int UI_MODE_TYPE_NORMAL = 1; // 0x1
+ field public static final int UI_MODE_TYPE_TELEVISION = 4; // 0x4
field public static final int UI_MODE_TYPE_UNDEFINED = 0; // 0x0
field public float fontScale;
field public int hardKeyboardHidden;
@@ -5982,7 +6543,10 @@
field public int navigation;
field public int navigationHidden;
field public int orientation;
+ field public int screenHeightDp;
field public int screenLayout;
+ field public int screenWidthDp;
+ field public int smallestScreenWidthDp;
field public int touchscreen;
field public int uiMode;
}
@@ -6693,6 +7257,7 @@
ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int);
ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int, android.database.DatabaseErrorHandler);
method public synchronized void close();
+ method public java.lang.String getDatabaseName();
method public synchronized android.database.sqlite.SQLiteDatabase getReadableDatabase();
method public synchronized android.database.sqlite.SQLiteDatabase getWritableDatabase();
method public abstract void onCreate(android.database.sqlite.SQLiteDatabase);
@@ -6750,6 +7315,7 @@
method public void setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
method public void setDistinct(boolean);
method public void setProjectionMap(java.util.Map<java.lang.String, java.lang.String>);
+ method public void setStrict(boolean);
method public void setTables(java.lang.String);
}
@@ -7250,6 +7816,7 @@
method public static final android.graphics.Bitmap.CompressFormat[] values();
enum_constant public static final android.graphics.Bitmap.CompressFormat JPEG;
enum_constant public static final android.graphics.Bitmap.CompressFormat PNG;
+ enum_constant public static final android.graphics.Bitmap.CompressFormat WEBP;
}
public static final class Bitmap.Config extends java.lang.Enum {
@@ -7403,6 +7970,8 @@
method public int getHeight();
method public void getMatrix(android.graphics.Matrix);
method public final android.graphics.Matrix getMatrix();
+ method public int getMaximumBitmapHeight();
+ method public int getMaximumBitmapWidth();
method public int getSaveCount();
method public int getWidth();
method public boolean isHardwareAccelerated();
@@ -7702,6 +8271,7 @@
method public int getFontMetricsInt(android.graphics.Paint.FontMetricsInt);
method public android.graphics.Paint.FontMetricsInt getFontMetricsInt();
method public float getFontSpacing();
+ method public int getHinting();
method public android.graphics.MaskFilter getMaskFilter();
method public android.graphics.PathEffect getPathEffect();
method public android.graphics.Rasterizer getRasterizer();
@@ -7748,6 +8318,7 @@
method public void setFakeBoldText(boolean);
method public void setFilterBitmap(boolean);
method public void setFlags(int);
+ method public void setHinting(int);
method public void setLinearText(boolean);
method public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
method public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
@@ -7773,6 +8344,8 @@
field public static final int DITHER_FLAG = 4; // 0x4
field public static final int FAKE_BOLD_TEXT_FLAG = 32; // 0x20
field public static final int FILTER_BITMAP_FLAG = 2; // 0x2
+ field public static final int HINTING_OFF = 0; // 0x0
+ field public static final int HINTING_ON = 1; // 0x1
field public static final int LINEAR_TEXT_FLAG = 64; // 0x40
field public static final int STRIKE_THRU_TEXT_FLAG = 16; // 0x10
field public static final int SUBPIXEL_TEXT_FLAG = 128; // 0x80
@@ -7963,29 +8536,37 @@
ctor public PixelXorXfermode(int);
}
- public class Point {
+ public class Point implements android.os.Parcelable {
ctor public Point();
ctor public Point(int, int);
ctor public Point(android.graphics.Point);
+ method public int describeContents();
method public final boolean equals(int, int);
method public final void negate();
method public final void offset(int, int);
+ method public void readFromParcel(android.os.Parcel);
method public void set(int, int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
field public int x;
field public int y;
}
- public class PointF {
+ public class PointF implements android.os.Parcelable {
ctor public PointF();
ctor public PointF(float, float);
ctor public PointF(android.graphics.Point);
+ method public int describeContents();
method public final boolean equals(float, float);
method public final float length();
method public static float length(float, float);
method public final void negate();
method public final void offset(float, float);
+ method public void readFromParcel(android.os.Parcel);
method public final void set(float, float);
method public final void set(android.graphics.PointF);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
field public float x;
field public float y;
}
@@ -8105,6 +8686,7 @@
method public void setEmpty();
method public boolean setIntersect(android.graphics.RectF, android.graphics.RectF);
method public void sort();
+ method public java.lang.String toShortString();
method public void union(float, float, float, float);
method public void union(android.graphics.RectF);
method public void union(float, float);
@@ -8189,7 +8771,9 @@
public class SurfaceTexture {
ctor public SurfaceTexture(int);
+ method public long getTimestamp();
method public void getTransformMatrix(float[]);
+ method public void release();
method public void setOnFrameAvailableListener(android.graphics.SurfaceTexture.OnFrameAvailableListener);
method public void updateTexImage();
}
@@ -8652,6 +9236,7 @@
method public final void release();
method public final void setDisplayOrientation(int);
method public final void setErrorCallback(android.hardware.Camera.ErrorCallback);
+ method public final void setFaceDetectionListener(android.hardware.Camera.FaceDetectionListener);
method public final void setOneShotPreviewCallback(android.hardware.Camera.PreviewCallback);
method public void setParameters(android.hardware.Camera.Parameters);
method public final void setPreviewCallback(android.hardware.Camera.PreviewCallback);
@@ -8659,17 +9244,27 @@
method public final void setPreviewDisplay(android.view.SurfaceHolder) throws java.io.IOException;
method public final void setPreviewTexture(android.graphics.SurfaceTexture) throws java.io.IOException;
method public final void setZoomChangeListener(android.hardware.Camera.OnZoomChangeListener);
+ method public final void startFaceDetection();
method public final void startPreview();
method public final void startSmoothZoom(int);
+ method public final void stopFaceDetection();
method public final void stopPreview();
method public final void stopSmoothZoom();
method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
method public final void unlock();
+ field public static final java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE";
+ field public static final java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO";
field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64
field public static final int CAMERA_ERROR_UNKNOWN = 1; // 0x1
}
+ public static class Camera.Area {
+ ctor public Camera.Area(android.graphics.Rect, int);
+ field public android.graphics.Rect rect;
+ field public int weight;
+ }
+
public static abstract interface Camera.AutoFocusCallback {
method public abstract void onAutoFocus(boolean, android.hardware.Camera);
}
@@ -8686,6 +9281,20 @@
method public abstract void onError(int, android.hardware.Camera);
}
+ public static class Camera.Face {
+ ctor public Camera.Face();
+ field public int id;
+ field public android.graphics.Point leftEye;
+ field public android.graphics.Point mouth;
+ field public android.graphics.Rect rect;
+ field public android.graphics.Point rightEye;
+ field public int score;
+ }
+
+ public static abstract interface Camera.FaceDetectionListener {
+ method public abstract void onFaceDetection(android.hardware.Camera.Face[], android.hardware.Camera);
+ }
+
public static abstract interface Camera.OnZoomChangeListener {
method public abstract void onZoomChange(int, boolean, android.hardware.Camera);
}
@@ -8694,11 +9303,14 @@
method public java.lang.String flatten();
method public java.lang.String get(java.lang.String);
method public java.lang.String getAntibanding();
+ method public boolean getAutoExposureLock();
+ method public boolean getAutoWhiteBalanceLock();
method public java.lang.String getColorEffect();
method public int getExposureCompensation();
method public float getExposureCompensationStep();
method public java.lang.String getFlashMode();
method public float getFocalLength();
+ method public java.util.List<android.hardware.Camera.Area> getFocusAreas();
method public void getFocusDistances(float[]);
method public java.lang.String getFocusMode();
method public float getHorizontalViewAngle();
@@ -8707,7 +9319,11 @@
method public int getJpegThumbnailQuality();
method public android.hardware.Camera.Size getJpegThumbnailSize();
method public int getMaxExposureCompensation();
+ method public int getMaxNumDetectedFaces();
+ method public int getMaxNumFocusAreas();
+ method public int getMaxNumMeteringAreas();
method public int getMaxZoom();
+ method public java.util.List<android.hardware.Camera.Area> getMeteringAreas();
method public int getMinExposureCompensation();
method public int getPictureFormat();
method public android.hardware.Camera.Size getPictureSize();
@@ -8735,16 +9351,22 @@
method public java.lang.String getWhiteBalance();
method public int getZoom();
method public java.util.List<java.lang.Integer> getZoomRatios();
+ method public boolean isAutoExposureLockSupported();
+ method public boolean isAutoWhiteBalanceLockSupported();
method public boolean isSmoothZoomSupported();
+ method public boolean isVideoSnapshotSupported();
method public boolean isZoomSupported();
method public void remove(java.lang.String);
method public void removeGpsData();
method public void set(java.lang.String, java.lang.String);
method public void set(java.lang.String, int);
method public void setAntibanding(java.lang.String);
+ method public void setAutoExposureLock(boolean);
+ method public void setAutoWhiteBalanceLock(boolean);
method public void setColorEffect(java.lang.String);
method public void setExposureCompensation(int);
method public void setFlashMode(java.lang.String);
+ method public void setFocusAreas(java.util.List<android.hardware.Camera.Area>);
method public void setFocusMode(java.lang.String);
method public void setGpsAltitude(double);
method public void setGpsLatitude(double);
@@ -8754,12 +9376,14 @@
method public void setJpegQuality(int);
method public void setJpegThumbnailQuality(int);
method public void setJpegThumbnailSize(int, int);
+ method public void setMeteringAreas(java.util.List<android.hardware.Camera.Area>);
method public void setPictureFormat(int);
method public void setPictureSize(int, int);
method public void setPreviewFormat(int);
method public void setPreviewFpsRange(int, int);
method public deprecated void setPreviewFrameRate(int);
method public void setPreviewSize(int, int);
+ method public void setRecordingHint(boolean);
method public void setRotation(int);
method public void setSceneMode(java.lang.String);
method public void setWhiteBalance(java.lang.String);
@@ -8787,6 +9411,7 @@
field public static final int FOCUS_DISTANCE_NEAR_INDEX = 0; // 0x0
field public static final int FOCUS_DISTANCE_OPTIMAL_INDEX = 1; // 0x1
field public static final java.lang.String FOCUS_MODE_AUTO = "auto";
+ field public static final java.lang.String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
field public static final java.lang.String FOCUS_MODE_CONTINUOUS_VIDEO = "continuous-video";
field public static final java.lang.String FOCUS_MODE_EDOF = "edof";
field public static final java.lang.String FOCUS_MODE_FIXED = "fixed";
@@ -8860,6 +9485,7 @@
method public int getVersion();
field public static final int TYPE_ACCELEROMETER = 1; // 0x1
field public static final int TYPE_ALL = -1; // 0xffffffff
+ field public static final int TYPE_AMBIENT_TEMPERATURE = 13; // 0xd
field public static final int TYPE_GRAVITY = 9; // 0x9
field public static final int TYPE_GYROSCOPE = 4; // 0x4
field public static final int TYPE_LIGHT = 5; // 0x5
@@ -8868,8 +9494,9 @@
field public static final deprecated int TYPE_ORIENTATION = 3; // 0x3
field public static final int TYPE_PRESSURE = 6; // 0x6
field public static final int TYPE_PROXIMITY = 8; // 0x8
+ field public static final int TYPE_RELATIVE_HUMIDITY = 12; // 0xc
field public static final int TYPE_ROTATION_VECTOR = 11; // 0xb
- field public static final int TYPE_TEMPERATURE = 7; // 0x7
+ field public static final deprecated int TYPE_TEMPERATURE = 7; // 0x7
}
public class SensorEvent {
@@ -9044,6 +9671,7 @@
method public void close();
method public int controlTransfer(int, int, int, int, byte[], int, int);
method public int getFileDescriptor();
+ method public byte[] getRawDescriptors();
method public java.lang.String getSerial();
method public boolean releaseInterface(android.hardware.usb.UsbInterface);
method public android.hardware.usb.UsbRequest requestWait();
@@ -9196,6 +9824,7 @@
method public void onUpdateExtractingViews(android.view.inputmethod.EditorInfo);
method public void onUpdateExtractingVisibility(android.view.inputmethod.EditorInfo);
method public void onUpdateSelection(int, int, int, int, int, int);
+ method public void onViewClicked(boolean);
method public void onWindowHidden();
method public void onWindowShown();
method public void requestHideSelf(int);
@@ -9239,6 +9868,7 @@
method public void updateCursor(android.graphics.Rect);
method public void updateExtractedText(int, android.view.inputmethod.ExtractedText);
method public void updateSelection(int, int, int, int, int, int);
+ method public void viewClicked(boolean);
}
public static final class InputMethodService.Insets {
@@ -9683,11 +10313,12 @@
method public boolean isMicrophoneMute();
method public boolean isMusicActive();
method public boolean isSpeakerphoneOn();
- method public boolean isWiredHeadsetOn();
+ method public deprecated boolean isWiredHeadsetOn();
method public void loadSoundEffects();
method public void playSoundEffect(int);
method public void playSoundEffect(int, float);
method public void registerMediaButtonEventReceiver(android.content.ComponentName);
+ method public void registerRemoteControlClient(android.media.RemoteControlClient);
method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
method public deprecated void setBluetoothA2dpOn(boolean);
method public void setBluetoothScoOn(boolean);
@@ -9707,8 +10338,10 @@
method public void stopBluetoothSco();
method public void unloadSoundEffects();
method public void unregisterMediaButtonEventReceiver(android.content.ComponentName);
+ method public void unregisterRemoteControlClient(android.media.RemoteControlClient);
field public static final java.lang.String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";
- field public static final java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED = "android.media.SCO_AUDIO_STATE_CHANGED";
+ field public static final deprecated java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED = "android.media.SCO_AUDIO_STATE_CHANGED";
+ field public static final java.lang.String ACTION_SCO_AUDIO_STATE_UPDATED = "android.media.ACTION_SCO_AUDIO_STATE_UPDATED";
field public static final int ADJUST_LOWER = -1; // 0xffffffff
field public static final int ADJUST_RAISE = 1; // 0x1
field public static final int ADJUST_SAME = 0; // 0x0
@@ -9721,6 +10354,7 @@
field public static final int AUDIOFOCUS_REQUEST_FAILED = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; // 0x1
field public static final java.lang.String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE";
+ field public static final java.lang.String EXTRA_SCO_AUDIO_PREVIOUS_STATE = "android.media.extra.SCO_AUDIO_PREVIOUS_STATE";
field public static final java.lang.String EXTRA_SCO_AUDIO_STATE = "android.media.extra.SCO_AUDIO_STATE";
field public static final java.lang.String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
field public static final java.lang.String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
@@ -9757,6 +10391,7 @@
field public static final deprecated int ROUTE_HEADSET = 8; // 0x8
field public static final deprecated int ROUTE_SPEAKER = 2; // 0x2
field public static final int SCO_AUDIO_STATE_CONNECTED = 1; // 0x1
+ field public static final int SCO_AUDIO_STATE_CONNECTING = 2; // 0x2
field public static final int SCO_AUDIO_STATE_DISCONNECTED = 0; // 0x0
field public static final int SCO_AUDIO_STATE_ERROR = -1; // 0xffffffff
field public static final int STREAM_ALARM = 4; // 0x4
@@ -10014,6 +10649,7 @@
method public android.graphics.Bitmap getFrameAtTime();
method public void release();
method public void setDataSource(java.lang.String) throws java.lang.IllegalArgumentException;
+ method public void setDataSource(java.lang.String, java.util.Map<java.lang.String, java.lang.String>) throws java.lang.IllegalArgumentException;
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.lang.IllegalArgumentException;
method public void setDataSource(java.io.FileDescriptor) throws java.lang.IllegalArgumentException;
method public void setDataSource(android.content.Context, android.net.Uri) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
@@ -10021,6 +10657,7 @@
field public static final int METADATA_KEY_ALBUMARTIST = 13; // 0xd
field public static final int METADATA_KEY_ARTIST = 2; // 0x2
field public static final int METADATA_KEY_AUTHOR = 3; // 0x3
+ field public static final int METADATA_KEY_BITRATE = 20; // 0x14
field public static final int METADATA_KEY_CD_TRACK_NUMBER = 0; // 0x0
field public static final int METADATA_KEY_COMPILATION = 15; // 0xf
field public static final int METADATA_KEY_COMPOSER = 4; // 0x4
@@ -10028,9 +10665,13 @@
field public static final int METADATA_KEY_DISC_NUMBER = 14; // 0xe
field public static final int METADATA_KEY_DURATION = 9; // 0x9
field public static final int METADATA_KEY_GENRE = 6; // 0x6
+ field public static final int METADATA_KEY_HAS_AUDIO = 16; // 0x10
+ field public static final int METADATA_KEY_HAS_VIDEO = 17; // 0x11
field public static final int METADATA_KEY_MIMETYPE = 12; // 0xc
field public static final int METADATA_KEY_NUM_TRACKS = 10; // 0xa
field public static final int METADATA_KEY_TITLE = 7; // 0x7
+ field public static final int METADATA_KEY_VIDEO_HEIGHT = 19; // 0x13
+ field public static final int METADATA_KEY_VIDEO_WIDTH = 18; // 0x12
field public static final int METADATA_KEY_WRITER = 11; // 0xb
field public static final int METADATA_KEY_YEAR = 8; // 0x8
field public static final int OPTION_CLOSEST = 3; // 0x3
@@ -10062,7 +10703,8 @@
method public void setAudioStreamType(int);
method public void setAuxEffectSendLevel(float);
method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
- method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
+ method public void setDataSource(java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDisplay(android.view.SurfaceHolder);
@@ -10075,6 +10717,7 @@
method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener);
method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener);
method public void setScreenOnWhilePlaying(boolean);
+ method public void setSurface(android.view.Surface);
method public void setVolume(float, float);
method public void setWakeMode(android.content.Context, int);
method public void start() throws java.lang.IllegalStateException;
@@ -10131,10 +10774,11 @@
method public void setAudioEncodingBitRate(int);
method public void setAudioSamplingRate(int);
method public void setAudioSource(int) throws java.lang.IllegalStateException;
- method public void setAuxiliaryOutputFile(java.io.FileDescriptor);
- method public void setAuxiliaryOutputFile(java.lang.String);
+ method public deprecated void setAuxiliaryOutputFile(java.io.FileDescriptor);
+ method public deprecated void setAuxiliaryOutputFile(java.lang.String);
method public void setCamera(android.hardware.Camera);
method public void setCaptureRate(double);
+ method public void setLocation(float, float);
method public void setMaxDuration(int) throws java.lang.IllegalArgumentException;
method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
method public void setOnErrorListener(android.media.MediaRecorder.OnErrorListener);
@@ -10225,6 +10869,40 @@
method public abstract void onScanCompleted(java.lang.String, android.net.Uri);
}
+ public class RemoteControlClient {
+ ctor public RemoteControlClient(android.app.PendingIntent);
+ ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper);
+ method public android.media.RemoteControlClient.MetadataEditor editMetadata(boolean);
+ method public void setPlaybackState(int);
+ method public void setTransportControlFlags(int);
+ field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
+ field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
+ field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
+ field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
+ field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
+ field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
+ field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
+ field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
+ field public static final int PLAYSTATE_BUFFERING = 8; // 0x8
+ field public static final int PLAYSTATE_ERROR = 9; // 0x9
+ field public static final int PLAYSTATE_FAST_FORWARDING = 4; // 0x4
+ field public static final int PLAYSTATE_PAUSED = 2; // 0x2
+ field public static final int PLAYSTATE_PLAYING = 3; // 0x3
+ field public static final int PLAYSTATE_REWINDING = 5; // 0x5
+ field public static final int PLAYSTATE_SKIPPING_BACKWARDS = 7; // 0x7
+ field public static final int PLAYSTATE_SKIPPING_FORWARDS = 6; // 0x6
+ field public static final int PLAYSTATE_STOPPED = 1; // 0x1
+ }
+
+ public class RemoteControlClient.MetadataEditor {
+ method public synchronized void apply();
+ method public synchronized void clear();
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putString(int, java.lang.String) throws java.lang.IllegalArgumentException;
+ field public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
+ }
+
public class Ringtone {
method public int getStreamType();
method public java.lang.String getTitle(android.content.Context);
@@ -10669,6 +11347,61 @@
}
+package android.media.effect {
+
+ public abstract class Effect {
+ ctor public Effect();
+ method public abstract void apply(int, int, int, int);
+ method public abstract java.lang.String getName();
+ method public abstract void release();
+ method public abstract void setParameter(java.lang.String, java.lang.Object);
+ method public void setUpdateListener(android.media.effect.EffectUpdateListener);
+ }
+
+ public class EffectContext {
+ method public static android.media.effect.EffectContext createWithCurrentGlContext();
+ method public android.media.effect.EffectFactory getFactory();
+ method public void release();
+ }
+
+ public class EffectFactory {
+ method public android.media.effect.Effect createEffect(java.lang.String);
+ method public static boolean isEffectSupported(java.lang.String);
+ field public static final java.lang.String EFFECT_AUTOFIX = "android.media.effect.effects.AutoFixEffect";
+ field public static final java.lang.String EFFECT_BACKDROPPER = "android.media.effect.effects.BackDropperEffect";
+ field public static final java.lang.String EFFECT_BITMAPOVERLAY = "android.media.effect.effects.BitmapOverlayEffect";
+ field public static final java.lang.String EFFECT_BLACKWHITE = "android.media.effect.effects.BlackWhiteEffect";
+ field public static final java.lang.String EFFECT_BRIGHTNESS = "android.media.effect.effects.BrightnessEffect";
+ field public static final java.lang.String EFFECT_CONTRAST = "android.media.effect.effects.ContrastEffect";
+ field public static final java.lang.String EFFECT_CROP = "android.media.effect.effects.CropEffect";
+ field public static final java.lang.String EFFECT_CROSSPROCESS = "android.media.effect.effects.CrossProcessEffect";
+ field public static final java.lang.String EFFECT_DOCUMENTARY = "android.media.effect.effects.DocumentaryEffect";
+ field public static final java.lang.String EFFECT_DUOTONE = "android.media.effect.effects.DuotoneEffect";
+ field public static final java.lang.String EFFECT_FILLLIGHT = "android.media.effect.effects.FillLightEffect";
+ field public static final java.lang.String EFFECT_FISHEYE = "android.media.effect.effects.FisheyeEffect";
+ field public static final java.lang.String EFFECT_FLIP = "android.media.effect.effects.FlipEffect";
+ field public static final java.lang.String EFFECT_GRAIN = "android.media.effect.effects.GrainEffect";
+ field public static final java.lang.String EFFECT_GRAYSCALE = "android.media.effect.effects.GrayscaleEffect";
+ field public static final java.lang.String EFFECT_LOMOISH = "android.media.effect.effects.LomoishEffect";
+ field public static final java.lang.String EFFECT_NEGATIVE = "android.media.effect.effects.NegativeEffect";
+ field public static final java.lang.String EFFECT_POSTERIZE = "android.media.effect.effects.PosterizeEffect";
+ field public static final java.lang.String EFFECT_REDEYE = "android.media.effect.effects.RedEyeEffect";
+ field public static final java.lang.String EFFECT_ROTATE = "android.media.effect.effects.RotateEffect";
+ field public static final java.lang.String EFFECT_SATURATE = "android.media.effect.effects.SaturateEffect";
+ field public static final java.lang.String EFFECT_SEPIA = "android.media.effect.effects.SepiaEffect";
+ field public static final java.lang.String EFFECT_SHARPEN = "android.media.effect.effects.SharpenEffect";
+ field public static final java.lang.String EFFECT_STRAIGHTEN = "android.media.effect.effects.StraightenEffect";
+ field public static final java.lang.String EFFECT_TEMPERATURE = "android.media.effect.effects.ColorTemperatureEffect";
+ field public static final java.lang.String EFFECT_TINT = "android.media.effect.effects.TintEffect";
+ field public static final java.lang.String EFFECT_VIGNETTE = "android.media.effect.effects.VignetteEffect";
+ }
+
+ public abstract interface EffectUpdateListener {
+ method public abstract void onEffectUpdated(android.media.effect.Effect, java.lang.Object);
+ }
+
+}
+
package android.mtp {
public final class MtpConstants {
@@ -10800,8 +11533,9 @@
public class ConnectivityManager {
method public android.net.NetworkInfo getActiveNetworkInfo();
+ method public android.net.NetworkQuotaInfo getActiveNetworkQuotaInfo();
method public android.net.NetworkInfo[] getAllNetworkInfo();
- method public boolean getBackgroundDataSetting();
+ method public deprecated boolean getBackgroundDataSetting();
method public android.net.NetworkInfo getNetworkInfo(int);
method public int getNetworkPreference();
method public static boolean isNetworkTypeValid(int);
@@ -10814,10 +11548,13 @@
field public static final int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
field public static final java.lang.String EXTRA_EXTRA_INFO = "extraInfo";
field public static final java.lang.String EXTRA_IS_FAILOVER = "isFailover";
- field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
+ field public static final deprecated java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NO_CONNECTIVITY = "noConnectivity";
field public static final java.lang.String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
field public static final java.lang.String EXTRA_REASON = "reason";
+ field public static final int TYPE_BLUETOOTH = 7; // 0x7
+ field public static final int TYPE_DUMMY = 8; // 0x8
+ field public static final int TYPE_ETHERNET = 9; // 0x9
field public static final int TYPE_MOBILE = 0; // 0x0
field public static final int TYPE_MOBILE_DUN = 4; // 0x4
field public static final int TYPE_MOBILE_HIPRI = 5; // 0x5
@@ -10933,6 +11670,7 @@
method public static android.net.NetworkInfo.DetailedState valueOf(java.lang.String);
method public static final android.net.NetworkInfo.DetailedState[] values();
enum_constant public static final android.net.NetworkInfo.DetailedState AUTHENTICATING;
+ enum_constant public static final android.net.NetworkInfo.DetailedState BLOCKED;
enum_constant public static final android.net.NetworkInfo.DetailedState CONNECTED;
enum_constant public static final android.net.NetworkInfo.DetailedState CONNECTING;
enum_constant public static final android.net.NetworkInfo.DetailedState DISCONNECTED;
@@ -10955,6 +11693,16 @@
enum_constant public static final android.net.NetworkInfo.State UNKNOWN;
}
+ public class NetworkQuotaInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getEstimatedBytes();
+ method public long getHardLimitBytes();
+ method public long getSoftLimitBytes();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final long NO_LIMIT = -1L; // 0xffffffffffffffffL
+ }
+
public class ParseException extends java.lang.RuntimeException {
field public java.lang.String response;
}
@@ -10981,6 +11729,8 @@
method public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
method public static javax.net.ssl.SSLSocketFactory getInsecure(int, android.net.SSLSessionCache);
method public java.lang.String[] getSupportedCipherSuites();
+ method public void setKeyManagers(javax.net.ssl.KeyManager[]);
+ method public void setTrustManagers(javax.net.ssl.TrustManager[]);
}
public final class SSLSessionCache {
@@ -10990,10 +11740,12 @@
public class TrafficStats {
ctor public TrafficStats();
+ method public static void clearThreadStatsTag();
method public static long getMobileRxBytes();
method public static long getMobileRxPackets();
method public static long getMobileTxBytes();
method public static long getMobileTxPackets();
+ method public static int getThreadStatsTag();
method public static long getTotalRxBytes();
method public static long getTotalRxPackets();
method public static long getTotalTxBytes();
@@ -11010,6 +11762,11 @@
method public static long getUidUdpRxPackets(int);
method public static long getUidUdpTxBytes(int);
method public static long getUidUdpTxPackets(int);
+ method public static void incrementOperationCount(int);
+ method public static void incrementOperationCount(int, int);
+ method public static void setThreadStatsTag(int);
+ method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
+ method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
field public static final int UNSUPPORTED = -1; // 0xffffffff
}
@@ -11147,6 +11904,32 @@
method public abstract java.lang.String sanitize(java.lang.String);
}
+ public class VpnService extends android.app.Service {
+ ctor public VpnService();
+ method public android.os.IBinder onBind(android.content.Intent);
+ method public void onRevoke();
+ method public static android.content.Intent prepare(android.content.Context);
+ method public boolean protect(int);
+ method public boolean protect(java.net.Socket);
+ method public boolean protect(java.net.DatagramSocket);
+ field public static final java.lang.String SERVICE_INTERFACE = "android.net.VpnService";
+ }
+
+ public class VpnService.Builder {
+ ctor public VpnService.Builder();
+ method public android.net.VpnService.Builder addAddress(java.net.InetAddress, int);
+ method public android.net.VpnService.Builder addAddress(java.lang.String, int);
+ method public android.net.VpnService.Builder addDnsServer(java.net.InetAddress);
+ method public android.net.VpnService.Builder addDnsServer(java.lang.String);
+ method public android.net.VpnService.Builder addRoute(java.net.InetAddress, int);
+ method public android.net.VpnService.Builder addRoute(java.lang.String, int);
+ method public android.net.VpnService.Builder addSearchDomain(java.lang.String);
+ method public android.os.ParcelFileDescriptor establish();
+ method public android.net.VpnService.Builder setConfigureIntent(android.app.PendingIntent);
+ method public android.net.VpnService.Builder setMtu(int);
+ method public android.net.VpnService.Builder setSession(java.lang.String);
+ }
+
}
package android.net.http {
@@ -11175,6 +11958,21 @@
field public static long DEFAULT_SYNC_MIN_GZIP_BYTES;
}
+ public final class HttpResponseCache extends java.net.ResponseCache implements java.io.Closeable {
+ method public void close() throws java.io.IOException;
+ method public void delete() throws java.io.IOException;
+ method public void flush();
+ method public java.net.CacheResponse get(java.net.URI, java.lang.String, java.util.Map<java.lang.String, java.util.List<java.lang.String>>) throws java.io.IOException;
+ method public int getHitCount();
+ method public static android.net.http.HttpResponseCache getInstalled();
+ method public int getNetworkCount();
+ method public int getRequestCount();
+ method public static android.net.http.HttpResponseCache install(java.io.File, long) throws java.io.IOException;
+ method public long maxSize();
+ method public java.net.CacheRequest put(java.net.URI, java.net.URLConnection) throws java.io.IOException;
+ method public long size();
+ }
+
public class SslCertificate {
ctor public deprecated SslCertificate(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
ctor public deprecated SslCertificate(java.lang.String, java.lang.String, java.util.Date, java.util.Date);
@@ -11198,15 +11996,20 @@
}
public class SslError {
- ctor public SslError(int, android.net.http.SslCertificate);
- ctor public SslError(int, java.security.cert.X509Certificate);
+ ctor public deprecated SslError(int, android.net.http.SslCertificate);
+ ctor public deprecated SslError(int, java.security.cert.X509Certificate);
+ ctor public SslError(int, android.net.http.SslCertificate, java.lang.String);
+ ctor public SslError(int, java.security.cert.X509Certificate, java.lang.String);
method public boolean addError(int);
method public android.net.http.SslCertificate getCertificate();
method public int getPrimaryError();
+ method public java.lang.String getUrl();
method public boolean hasError(int);
+ field public static final int SSL_DATE_INVALID = 4; // 0x4
field public static final int SSL_EXPIRED = 1; // 0x1
field public static final int SSL_IDMISMATCH = 2; // 0x2
- field public static final int SSL_MAX_ERROR = 6; // 0x6
+ field public static final int SSL_INVALID = 5; // 0x5
+ field public static final deprecated int SSL_MAX_ERROR = 6; // 0x6
field public static final int SSL_NOTYETVALID = 0; // 0x0
field public static final int SSL_UNTRUSTED = 3; // 0x3
}
@@ -11467,12 +12270,14 @@
method public void writeToParcel(android.os.Parcel, int);
enum_constant public static final android.net.wifi.SupplicantState ASSOCIATED;
enum_constant public static final android.net.wifi.SupplicantState ASSOCIATING;
+ enum_constant public static final android.net.wifi.SupplicantState AUTHENTICATING;
enum_constant public static final android.net.wifi.SupplicantState COMPLETED;
enum_constant public static final android.net.wifi.SupplicantState DISCONNECTED;
enum_constant public static final android.net.wifi.SupplicantState DORMANT;
enum_constant public static final android.net.wifi.SupplicantState FOUR_WAY_HANDSHAKE;
enum_constant public static final android.net.wifi.SupplicantState GROUP_HANDSHAKE;
enum_constant public static final android.net.wifi.SupplicantState INACTIVE;
+ enum_constant public static final android.net.wifi.SupplicantState INTERFACE_DISABLED;
enum_constant public static final android.net.wifi.SupplicantState INVALID;
enum_constant public static final android.net.wifi.SupplicantState SCANNING;
enum_constant public static final android.net.wifi.SupplicantState UNINITIALIZED;
@@ -11595,6 +12400,7 @@
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
+ field public static final java.lang.String EXTRA_WIFI_INFO = "wifiInfo";
field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_state";
field public static final java.lang.String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
field public static final java.lang.String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
@@ -11628,6 +12434,142 @@
method public void setWorkSource(android.os.WorkSource);
}
+ public class WpsInfo implements android.os.Parcelable {
+ ctor public WpsInfo();
+ ctor public WpsInfo(android.net.wifi.WpsInfo);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int DISPLAY = 1; // 0x1
+ field public static final int INVALID = 4; // 0x4
+ field public static final int KEYPAD = 2; // 0x2
+ field public static final int LABEL = 3; // 0x3
+ field public static final int PBC = 0; // 0x0
+ field public java.lang.String pin;
+ field public int setup;
+ }
+
+}
+
+package android.net.wifi.p2p {
+
+ public class WifiP2pConfig implements android.os.Parcelable {
+ ctor public WifiP2pConfig();
+ ctor public WifiP2pConfig(android.net.wifi.p2p.WifiP2pConfig);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public java.lang.String deviceAddress;
+ field public int groupOwnerIntent;
+ field public android.net.wifi.WpsInfo wps;
+ }
+
+ public class WifiP2pDevice implements android.os.Parcelable {
+ ctor public WifiP2pDevice();
+ ctor public WifiP2pDevice(android.net.wifi.p2p.WifiP2pDevice);
+ method public int describeContents();
+ method public boolean isGroupOwner();
+ method public boolean isServiceDiscoveryCapable();
+ method public boolean wpsDisplaySupported();
+ method public boolean wpsKeypadSupported();
+ method public boolean wpsPbcSupported();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int AVAILABLE = 3; // 0x3
+ field public static final int CONNECTED = 0; // 0x0
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int FAILED = 2; // 0x2
+ field public static final int INVITED = 1; // 0x1
+ field public static final int UNAVAILABLE = 4; // 0x4
+ field public java.lang.String deviceAddress;
+ field public java.lang.String deviceName;
+ field public java.lang.String primaryDeviceType;
+ field public java.lang.String secondaryDeviceType;
+ field public int status;
+ }
+
+ public class WifiP2pDeviceList implements android.os.Parcelable {
+ ctor public WifiP2pDeviceList();
+ ctor public WifiP2pDeviceList(android.net.wifi.p2p.WifiP2pDeviceList);
+ method public int describeContents();
+ method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getDeviceList();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+ public class WifiP2pGroup implements android.os.Parcelable {
+ ctor public WifiP2pGroup();
+ ctor public WifiP2pGroup(android.net.wifi.p2p.WifiP2pGroup);
+ method public int describeContents();
+ method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getClientList();
+ method public java.lang.String getInterface();
+ method public java.lang.String getNetworkName();
+ method public android.net.wifi.p2p.WifiP2pDevice getOwner();
+ method public java.lang.String getPassphrase();
+ method public boolean isGroupOwner();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+ public class WifiP2pInfo implements android.os.Parcelable {
+ ctor public WifiP2pInfo();
+ ctor public WifiP2pInfo(android.net.wifi.p2p.WifiP2pInfo);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public boolean groupFormed;
+ field public java.net.InetAddress groupOwnerAddress;
+ field public boolean isGroupOwner;
+ }
+
+ public class WifiP2pManager {
+ method public void cancelConnect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void connect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public android.net.wifi.p2p.WifiP2pManager.Channel initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager.ChannelListener);
+ method public void removeGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener);
+ method public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
+ method public void requestPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PeerListListener);
+ field public static final int BUSY = 2; // 0x2
+ field public static final int ERROR = 0; // 0x0
+ field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
+ field public static final java.lang.String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
+ field public static final java.lang.String EXTRA_WIFI_P2P_INFO = "wifiP2pInfo";
+ field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_p2p_state";
+ field public static final int P2P_UNSUPPORTED = 1; // 0x1
+ field public static final java.lang.String WIFI_P2P_CONNECTION_CHANGED_ACTION = "android.net.wifi.p2p.CONNECTION_STATE_CHANGE";
+ field public static final java.lang.String WIFI_P2P_PEERS_CHANGED_ACTION = "android.net.wifi.p2p.PEERS_CHANGED";
+ field public static final java.lang.String WIFI_P2P_STATE_CHANGED_ACTION = "android.net.wifi.p2p.STATE_CHANGED";
+ field public static final int WIFI_P2P_STATE_DISABLED = 1; // 0x1
+ field public static final int WIFI_P2P_STATE_ENABLED = 2; // 0x2
+ field public static final java.lang.String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION = "android.net.wifi.p2p.THIS_DEVICE_CHANGED";
+ }
+
+ public static abstract interface WifiP2pManager.ActionListener {
+ method public abstract void onFailure(int);
+ method public abstract void onSuccess();
+ }
+
+ public static class WifiP2pManager.Channel {
+ }
+
+ public static abstract interface WifiP2pManager.ChannelListener {
+ method public abstract void onChannelDisconnected();
+ }
+
+ public static abstract interface WifiP2pManager.ConnectionInfoListener {
+ method public abstract void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
+ }
+
+ public static abstract interface WifiP2pManager.GroupInfoListener {
+ method public abstract void onGroupInfoAvailable(android.net.wifi.p2p.WifiP2pGroup);
+ }
+
+ public static abstract interface WifiP2pManager.PeerListListener {
+ method public abstract void onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList);
+ }
+
}
package android.nfc {
@@ -11650,6 +12592,9 @@
public final class NdefRecord implements android.os.Parcelable {
ctor public NdefRecord(short, byte[], byte[], byte[]);
ctor public NdefRecord(byte[]) throws android.nfc.FormatException;
+ method public static android.nfc.NdefRecord createApplicationRecord(java.lang.String);
+ method public static android.nfc.NdefRecord createUri(android.net.Uri);
+ method public static android.nfc.NdefRecord createUri(java.lang.String);
method public int describeContents();
method public byte[] getId();
method public byte[] getPayload();
@@ -11676,12 +12621,15 @@
public final class NfcAdapter {
method public void disableForegroundDispatch(android.app.Activity);
- method public void disableForegroundNdefPush(android.app.Activity);
+ method public deprecated void disableForegroundNdefPush(android.app.Activity);
method public void enableForegroundDispatch(android.app.Activity, android.app.PendingIntent, android.content.IntentFilter[], java.lang.String[][]);
- method public void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage);
+ method public deprecated void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage);
method public static android.nfc.NfcAdapter getDefaultAdapter(android.content.Context);
method public static deprecated android.nfc.NfcAdapter getDefaultAdapter();
method public boolean isEnabled();
+ method public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, android.app.Activity...);
+ method public void setNdefPushMessageCallback(android.nfc.NfcAdapter.CreateNdefMessageCallback, android.app.Activity, android.app.Activity...);
+ method public void setOnNdefPushCompleteCallback(android.nfc.NfcAdapter.OnNdefPushCompleteCallback, android.app.Activity, android.app.Activity...);
field public static final java.lang.String ACTION_NDEF_DISCOVERED = "android.nfc.action.NDEF_DISCOVERED";
field public static final java.lang.String ACTION_TAG_DISCOVERED = "android.nfc.action.TAG_DISCOVERED";
field public static final java.lang.String ACTION_TECH_DISCOVERED = "android.nfc.action.TECH_DISCOVERED";
@@ -11690,6 +12638,18 @@
field public static final java.lang.String EXTRA_TAG = "android.nfc.extra.TAG";
}
+ public static abstract interface NfcAdapter.CreateNdefMessageCallback {
+ method public abstract android.nfc.NdefMessage createNdefMessage(android.nfc.NfcEvent);
+ }
+
+ public static abstract interface NfcAdapter.OnNdefPushCompleteCallback {
+ method public abstract void onNdefPushComplete(android.nfc.NfcEvent);
+ }
+
+ public final class NfcEvent {
+ field public final android.nfc.NfcAdapter nfcAdapter;
+ }
+
public final class NfcManager {
method public android.nfc.NfcAdapter getDefaultAdapter();
}
@@ -11722,6 +12682,8 @@
method public static android.nfc.tech.IsoDep get(android.nfc.Tag);
method public byte[] getHiLayerResponse();
method public byte[] getHistoricalBytes();
+ method public int getMaxTransceiveLength();
+ method public int getTimeout();
method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
}
@@ -11734,13 +12696,16 @@
method public static android.nfc.tech.MifareClassic get(android.nfc.Tag);
method public int getBlockCount();
method public int getBlockCountInSector(int);
+ method public int getMaxTransceiveLength();
method public int getSectorCount();
method public int getSize();
+ method public int getTimeout();
method public int getType();
method public void increment(int, int) throws java.io.IOException;
method public byte[] readBlock(int) throws java.io.IOException;
method public void restore(int) throws java.io.IOException;
method public int sectorToBlock(int);
+ method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
method public void transfer(int) throws java.io.IOException;
method public void writeBlock(int, byte[]) throws java.io.IOException;
@@ -11760,8 +12725,11 @@
public final class MifareUltralight extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.MifareUltralight get(android.nfc.Tag);
+ method public int getMaxTransceiveLength();
+ method public int getTimeout();
method public int getType();
method public byte[] readPages(int) throws java.io.IOException;
+ method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
method public void writePage(int, byte[]) throws java.io.IOException;
field public static final int PAGE_SIZE = 4; // 0x4
@@ -11796,13 +12764,17 @@
public final class NfcA extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.NfcA get(android.nfc.Tag);
method public byte[] getAtqa();
+ method public int getMaxTransceiveLength();
method public short getSak();
+ method public int getTimeout();
+ method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
}
public final class NfcB extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.NfcB get(android.nfc.Tag);
method public byte[] getApplicationData();
+ method public int getMaxTransceiveLength();
method public byte[] getProtocolInfo();
method public byte[] transceive(byte[]) throws java.io.IOException;
}
@@ -11810,13 +12782,17 @@
public final class NfcF extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.NfcF get(android.nfc.Tag);
method public byte[] getManufacturer();
+ method public int getMaxTransceiveLength();
method public byte[] getSystemCode();
+ method public int getTimeout();
+ method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
}
public final class NfcV extends android.nfc.tech.BasicTagTechnology {
method public static android.nfc.tech.NfcV get(android.nfc.Tag);
method public byte getDsfId();
+ method public int getMaxTransceiveLength();
method public byte getResponseFlags();
method public byte[] transceive(byte[]) throws java.io.IOException;
}
@@ -13232,6 +14208,7 @@
}
public final class GLUtils {
+ method public static java.lang.String getEGLErrorString(int);
method public static int getInternalFormat(android.graphics.Bitmap);
method public static int getType(android.graphics.Bitmap);
method public static void texImage2D(int, int, int, android.graphics.Bitmap, int);
@@ -13249,6 +14226,7 @@
method public static void multiplyMM(float[], int, float[], int, float[], int);
method public static void multiplyMV(float[], int, float[], int, float[], int);
method public static void orthoM(float[], int, float, float, float, float, float, float);
+ method public static void perspectiveM(float[], int, float, float, float, float);
method public static void rotateM(float[], int, float[], int, float, float, float, float);
method public static void rotateM(float[], int, float, float, float, float);
method public static void scaleM(float[], int, float[], int, float, float, float);
@@ -13341,6 +14319,7 @@
method public static final long clearCallingIdentity();
method public void dump(java.io.FileDescriptor, java.lang.String[]);
method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+ method public void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
method public static final void flushPendingCommands();
method public static final int getCallingPid();
method public static final int getCallingUid();
@@ -13358,6 +14337,7 @@
public class Build {
ctor public Build();
+ method public static java.lang.String getRadioVersion();
field public static final java.lang.String BOARD;
field public static final java.lang.String BOOTLOADER;
field public static final java.lang.String BRAND;
@@ -13372,7 +14352,7 @@
field public static final java.lang.String MANUFACTURER;
field public static final java.lang.String MODEL;
field public static final java.lang.String PRODUCT;
- field public static final java.lang.String RADIO;
+ field public static final deprecated java.lang.String RADIO;
field public static final java.lang.String SERIAL;
field public static final java.lang.String TAGS;
field public static final long TIME;
@@ -13405,6 +14385,8 @@
field public static final int GINGERBREAD_MR1 = 10; // 0xa
field public static final int HONEYCOMB = 11; // 0xb
field public static final int HONEYCOMB_MR1 = 12; // 0xc
+ field public static final int HONEYCOMB_MR2 = 13; // 0xd
+ field public static final int ICE_CREAM_SANDWICH = 14; // 0xe
}
public final class Bundle implements java.lang.Cloneable android.os.Parcelable {
@@ -13546,6 +14528,7 @@
method public static long getNativeHeapAllocatedSize();
method public static long getNativeHeapFreeSize();
method public static long getNativeHeapSize();
+ method public static long getPss();
method public static int getThreadAllocCount();
method public static int getThreadAllocSize();
method public static deprecated int getThreadExternalAllocCount();
@@ -13601,6 +14584,10 @@
public static class Debug.MemoryInfo implements android.os.Parcelable {
ctor public Debug.MemoryInfo();
method public int describeContents();
+ method public static java.lang.String getOtherLabel(int);
+ method public int getOtherPrivateDirty(int);
+ method public int getOtherPss(int);
+ method public int getOtherSharedDirty(int);
method public int getTotalPrivateDirty();
method public int getTotalPss();
method public int getTotalSharedDirty();
@@ -13709,6 +14696,7 @@
method public void dispatchMessage(android.os.Message);
method public final void dump(android.util.Printer, java.lang.String);
method public final android.os.Looper getLooper();
+ method public java.lang.String getMessageName(android.os.Message);
method public void handleMessage(android.os.Message);
method public final boolean hasMessages(int);
method public final boolean hasMessages(int, java.lang.Object);
@@ -13751,6 +14739,7 @@
public abstract interface IBinder {
method public abstract void dump(java.io.FileDescriptor, java.lang.String[]) throws android.os.RemoteException;
+ method public abstract void dumpAsync(java.io.FileDescriptor, java.lang.String[]) throws android.os.RemoteException;
method public abstract java.lang.String getInterfaceDescriptor() throws android.os.RemoteException;
method public abstract boolean isBinderAlive();
method public abstract void linkToDeath(android.os.IBinder.DeathRecipient, int) throws android.os.RemoteException;
@@ -13764,6 +14753,7 @@
field public static final int INTERFACE_TRANSACTION = 1598968902; // 0x5f4e5446
field public static final int LAST_CALL_TRANSACTION = 16777215; // 0xffffff
field public static final int PING_TRANSACTION = 1599098439; // 0x5f504e47
+ field public static final int TWEET_TRANSACTION = 1599362900; // 0x5f545754
}
public static abstract interface IBinder.DeathRecipient {
@@ -13776,13 +14766,13 @@
public class Looper {
method public void dump(android.util.Printer, java.lang.String);
- method public static final synchronized android.os.Looper getMainLooper();
+ method public static synchronized android.os.Looper getMainLooper();
method public java.lang.Thread getThread();
- method public static final void loop();
- method public static final android.os.Looper myLooper();
- method public static final android.os.MessageQueue myQueue();
- method public static final void prepare();
- method public static final void prepareMainLooper();
+ method public static void loop();
+ method public static android.os.Looper myLooper();
+ method public static android.os.MessageQueue myQueue();
+ method public static void prepare();
+ method public static void prepareMainLooper();
method public void quit();
method public void setMessageLogging(android.util.Printer);
}
@@ -13960,10 +14950,15 @@
public class ParcelFileDescriptor implements android.os.Parcelable {
ctor public ParcelFileDescriptor(android.os.ParcelFileDescriptor);
+ method public static android.os.ParcelFileDescriptor adoptFd(int);
method public void close() throws java.io.IOException;
method public static android.os.ParcelFileDescriptor[] createPipe() throws java.io.IOException;
method public int describeContents();
method public int detachFd();
+ method public static android.os.ParcelFileDescriptor dup(java.io.FileDescriptor) throws java.io.IOException;
+ method public android.os.ParcelFileDescriptor dup() throws java.io.IOException;
+ method public static android.os.ParcelFileDescriptor fromDatagramSocket(java.net.DatagramSocket);
+ method public static android.os.ParcelFileDescriptor fromFd(int) throws java.io.IOException;
method public static android.os.ParcelFileDescriptor fromSocket(java.net.Socket);
method public int getFd();
method public java.io.FileDescriptor getFileDescriptor();
@@ -14010,6 +15005,10 @@
field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1
}
+ public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator {
+ method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
+ }
+
public static abstract interface Parcelable.Creator {
method public abstract T createFromParcel(android.os.Parcel);
method public abstract T[] newArray(int);
@@ -14039,7 +15038,7 @@
field public static final int FULL_WAKE_LOCK = 26; // 0x1a
field public static final int ON_AFTER_RELEASE = 536870912; // 0x20000000
field public static final int PARTIAL_WAKE_LOCK = 1; // 0x1
- field public static final int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa
+ field public static final deprecated int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa
field public static final int SCREEN_DIM_WAKE_LOCK = 6; // 0x6
}
@@ -14065,7 +15064,7 @@
method public static final void sendSignal(int, int);
method public static final void setThreadPriority(int, int) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
method public static final void setThreadPriority(int) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
- method public static final boolean supportsProcesses();
+ method public static final deprecated boolean supportsProcesses();
field public static final int BLUETOOTH_GID = 2000; // 0x7d0
field public static final int FIRST_APPLICATION_UID = 10000; // 0x2710
field public static final int LAST_APPLICATION_UID = 99999; // 0x1869f
@@ -14089,6 +15088,7 @@
public class RecoverySystem {
ctor public RecoverySystem();
method public static void installPackage(android.content.Context, java.io.File) throws java.io.IOException;
+ method public static void rebootWipeCache(android.content.Context) throws java.io.IOException;
method public static void rebootWipeUserData(android.content.Context) throws java.io.IOException;
method public static void verifyPackage(java.io.File, android.os.RecoverySystem.ProgressListener, java.io.File) throws java.security.GeneralSecurityException, java.io.IOException;
}
@@ -14255,7 +15255,7 @@
package android.preference {
- public class CheckBoxPreference extends android.preference.TwoStatePreference {
+ public class CheckBoxPreference extends android.preference.TwoStatePreference {
ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
ctor public CheckBoxPreference(android.content.Context);
@@ -14361,6 +15361,7 @@
method public boolean getShouldDisableView();
method public java.lang.CharSequence getSummary();
method public java.lang.CharSequence getTitle();
+ method public int getTitleRes();
method public android.view.View getView(android.view.View, android.view.ViewGroup);
method public int getWidgetLayoutResource();
method public boolean hasKey();
@@ -14442,6 +15443,7 @@
method public boolean isMultiPane();
method public void loadHeadersFromResource(int, java.util.List<android.preference.PreferenceActivity.Header>);
method public void onBuildHeaders(java.util.List<android.preference.PreferenceActivity.Header>);
+ method public android.content.Intent onBuildStartFragmentIntent(java.lang.String, android.os.Bundle, int, int);
method public android.preference.PreferenceActivity.Header onGetInitialHeader();
method public android.preference.PreferenceActivity.Header onGetNewHeader();
method public void onHeaderClick(android.preference.PreferenceActivity.Header, int);
@@ -14456,11 +15458,14 @@
method public void startPreferenceFragment(android.app.Fragment, boolean);
method public void startPreferencePanel(java.lang.String, android.os.Bundle, int, java.lang.CharSequence, android.app.Fragment, int);
method public void startWithFragment(java.lang.String, android.os.Bundle, android.app.Fragment, int);
+ method public void startWithFragment(java.lang.String, android.os.Bundle, android.app.Fragment, int, int, int);
method public void switchToHeader(java.lang.String, android.os.Bundle);
method public void switchToHeader(android.preference.PreferenceActivity.Header);
field public static final java.lang.String EXTRA_NO_HEADERS = ":android:no_headers";
field public static final java.lang.String EXTRA_SHOW_FRAGMENT = ":android:show_fragment";
field public static final java.lang.String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":android:show_fragment_args";
+ field public static final java.lang.String EXTRA_SHOW_FRAGMENT_SHORT_TITLE = ":android:show_fragment_short_title";
+ field public static final java.lang.String EXTRA_SHOW_FRAGMENT_TITLE = ":android:show_fragment_title";
field public static final long HEADER_ID_UNDEFINED = -1L; // 0xffffffffffffffffL
}
@@ -14581,6 +15586,34 @@
method public void setShowSilent(boolean);
}
+ public class SwitchPreference extends android.preference.TwoStatePreference {
+ ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
+ ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
+ ctor public SwitchPreference(android.content.Context);
+ method public java.lang.CharSequence getSwitchTextOff();
+ method public java.lang.CharSequence getSwitchTextOn();
+ method public void setSwitchTextOff(java.lang.CharSequence);
+ method public void setSwitchTextOff(int);
+ method public void setSwitchTextOn(java.lang.CharSequence);
+ method public void setSwitchTextOn(int);
+ }
+
+ public abstract class TwoStatePreference extends android.preference.Preference {
+ ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
+ ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
+ ctor public TwoStatePreference(android.content.Context);
+ method public boolean getDisableDependentsState();
+ method public java.lang.CharSequence getSummaryOff();
+ method public java.lang.CharSequence getSummaryOn();
+ method public boolean isChecked();
+ method public void setChecked(boolean);
+ method public void setDisableDependentsState(boolean);
+ method public void setSummaryOff(java.lang.CharSequence);
+ method public void setSummaryOff(int);
+ method public void setSummaryOn(java.lang.CharSequence);
+ method public void setSummaryOn(int);
+ }
+
}
package android.provider {
@@ -14654,6 +15687,258 @@
field public static final deprecated java.lang.String URL = "url";
}
+ public final class CalendarContract {
+ field public static final java.lang.String ACCOUNT_TYPE_LOCAL = "LOCAL";
+ field public static final java.lang.String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER";
+ field public static final java.lang.String AUTHORITY = "com.android.calendar";
+ field public static final java.lang.String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String EXTRA_EVENT_ALL_DAY = "allDay";
+ field public static final java.lang.String EXTRA_EVENT_BEGIN_TIME = "beginTime";
+ field public static final java.lang.String EXTRA_EVENT_END_TIME = "endTime";
+ }
+
+ public static final class CalendarContract.Attendees implements android.provider.BaseColumns android.provider.CalendarContract.AttendeesColumns android.provider.CalendarContract.EventsColumns {
+ method public static final android.database.Cursor query(android.content.ContentResolver, long, java.lang.String[]);
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
+ protected static abstract interface CalendarContract.AttendeesColumns {
+ field public static final java.lang.String ATTENDEE_EMAIL = "attendeeEmail";
+ field public static final java.lang.String ATTENDEE_NAME = "attendeeName";
+ field public static final java.lang.String ATTENDEE_RELATIONSHIP = "attendeeRelationship";
+ field public static final java.lang.String ATTENDEE_STATUS = "attendeeStatus";
+ field public static final int ATTENDEE_STATUS_ACCEPTED = 1; // 0x1
+ field public static final int ATTENDEE_STATUS_DECLINED = 2; // 0x2
+ field public static final int ATTENDEE_STATUS_INVITED = 3; // 0x3
+ field public static final int ATTENDEE_STATUS_NONE = 0; // 0x0
+ field public static final int ATTENDEE_STATUS_TENTATIVE = 4; // 0x4
+ field public static final java.lang.String ATTENDEE_TYPE = "attendeeType";
+ field public static final java.lang.String EVENT_ID = "event_id";
+ field public static final int RELATIONSHIP_ATTENDEE = 1; // 0x1
+ field public static final int RELATIONSHIP_NONE = 0; // 0x0
+ field public static final int RELATIONSHIP_ORGANIZER = 2; // 0x2
+ field public static final int RELATIONSHIP_PERFORMER = 3; // 0x3
+ field public static final int RELATIONSHIP_SPEAKER = 4; // 0x4
+ field public static final int TYPE_NONE = 0; // 0x0
+ field public static final int TYPE_OPTIONAL = 2; // 0x2
+ field public static final int TYPE_REQUIRED = 1; // 0x1
+ }
+
+ public static final class CalendarContract.CalendarAlerts implements android.provider.BaseColumns android.provider.CalendarContract.CalendarAlertsColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.EventsColumns {
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final android.net.Uri CONTENT_URI_BY_INSTANCE;
+ }
+
+ protected static abstract interface CalendarContract.CalendarAlertsColumns {
+ field public static final java.lang.String ALARM_TIME = "alarmTime";
+ field public static final java.lang.String BEGIN = "begin";
+ field public static final java.lang.String CREATION_TIME = "creationTime";
+ field public static final java.lang.String DEFAULT_SORT_ORDER = "begin ASC,title ASC";
+ field public static final java.lang.String END = "end";
+ field public static final java.lang.String EVENT_ID = "event_id";
+ field public static final java.lang.String MINUTES = "minutes";
+ field public static final java.lang.String NOTIFY_TIME = "notifyTime";
+ field public static final java.lang.String RECEIVED_TIME = "receivedTime";
+ field public static final java.lang.String STATE = "state";
+ field public static final int STATE_DISMISSED = 2; // 0x2
+ field public static final int STATE_FIRED = 1; // 0x1
+ field public static final int STATE_SCHEDULED = 0; // 0x0
+ }
+
+ public static final class CalendarContract.CalendarCache implements android.provider.CalendarContract.CalendarCacheColumns {
+ field public static final java.lang.String KEY_TIMEZONE_INSTANCES = "timezoneInstances";
+ field public static final java.lang.String KEY_TIMEZONE_INSTANCES_PREVIOUS = "timezoneInstancesPrevious";
+ field public static final java.lang.String KEY_TIMEZONE_TYPE = "timezoneType";
+ field public static final java.lang.String TIMEZONE_TYPE_AUTO = "auto";
+ field public static final java.lang.String TIMEZONE_TYPE_HOME = "home";
+ field public static final android.net.Uri URI;
+ }
+
+ protected static abstract interface CalendarContract.CalendarCacheColumns {
+ field public static final java.lang.String KEY = "key";
+ field public static final java.lang.String VALUE = "value";
+ }
+
+ protected static abstract interface CalendarContract.CalendarColumns {
+ field public static final java.lang.String ALLOWED_REMINDERS = "allowedReminders";
+ field public static final java.lang.String CALENDAR_ACCESS_LEVEL = "calendar_access_level";
+ field public static final java.lang.String CALENDAR_COLOR = "calendar_color";
+ field public static final java.lang.String CALENDAR_DISPLAY_NAME = "calendar_displayName";
+ field public static final java.lang.String CALENDAR_TIME_ZONE = "calendar_timezone";
+ field public static final int CAL_ACCESS_CONTRIBUTOR = 500; // 0x1f4
+ field public static final int CAL_ACCESS_EDITOR = 600; // 0x258
+ field public static final int CAL_ACCESS_FREEBUSY = 100; // 0x64
+ field public static final int CAL_ACCESS_NONE = 0; // 0x0
+ field public static final int CAL_ACCESS_OVERRIDE = 400; // 0x190
+ field public static final int CAL_ACCESS_OWNER = 700; // 0x2bc
+ field public static final int CAL_ACCESS_READ = 200; // 0xc8
+ field public static final int CAL_ACCESS_RESPOND = 300; // 0x12c
+ field public static final int CAL_ACCESS_ROOT = 800; // 0x320
+ field public static final java.lang.String CAN_MODIFY_TIME_ZONE = "canModifyTimeZone";
+ field public static final java.lang.String CAN_ORGANIZER_RESPOND = "canOrganizerRespond";
+ field public static final java.lang.String MAX_REMINDERS = "maxReminders";
+ field public static final java.lang.String OWNER_ACCOUNT = "ownerAccount";
+ field public static final java.lang.String SYNC_EVENTS = "sync_events";
+ field public static final java.lang.String VISIBLE = "visible";
+ }
+
+ public static final class CalendarContract.CalendarEntity implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.SyncColumns {
+ method public static android.content.EntityIterator newEntityIterator(android.database.Cursor);
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
+ protected static abstract interface CalendarContract.CalendarSyncColumns {
+ field public static final java.lang.String CAL_SYNC1 = "cal_sync1";
+ field public static final java.lang.String CAL_SYNC10 = "cal_sync10";
+ field public static final java.lang.String CAL_SYNC2 = "cal_sync2";
+ field public static final java.lang.String CAL_SYNC3 = "cal_sync3";
+ field public static final java.lang.String CAL_SYNC4 = "cal_sync4";
+ field public static final java.lang.String CAL_SYNC5 = "cal_sync5";
+ field public static final java.lang.String CAL_SYNC6 = "cal_sync6";
+ field public static final java.lang.String CAL_SYNC7 = "cal_sync7";
+ field public static final java.lang.String CAL_SYNC8 = "cal_sync8";
+ field public static final java.lang.String CAL_SYNC9 = "cal_sync9";
+ }
+
+ public static final class CalendarContract.Calendars implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.SyncColumns {
+ field public static final java.lang.String CALENDAR_LOCATION = "calendar_location";
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String DEFAULT_SORT_ORDER = "calendar_displayName";
+ field public static final java.lang.String NAME = "name";
+ }
+
+ public static final class CalendarContract.EventDays implements android.provider.CalendarContract.EventDaysColumns {
+ method public static final android.database.Cursor query(android.content.ContentResolver, int, int, java.lang.String[]);
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
+ protected static abstract interface CalendarContract.EventDaysColumns {
+ field public static final java.lang.String ENDDAY = "endDay";
+ field public static final java.lang.String STARTDAY = "startDay";
+ }
+
+ public static final class CalendarContract.Events implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.EventsColumns android.provider.CalendarContract.SyncColumns {
+ field public static final android.net.Uri CONTENT_EXCEPTION_URI;
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
+ protected static abstract interface CalendarContract.EventsColumns {
+ field public static final int ACCESS_CONFIDENTIAL = 1; // 0x1
+ field public static final int ACCESS_DEFAULT = 0; // 0x0
+ field public static final java.lang.String ACCESS_LEVEL = "accessLevel";
+ field public static final int ACCESS_PRIVATE = 2; // 0x2
+ field public static final int ACCESS_PUBLIC = 3; // 0x3
+ field public static final java.lang.String ALL_DAY = "allDay";
+ field public static final java.lang.String AVAILABILITY = "availability";
+ field public static final int AVAILABILITY_BUSY = 0; // 0x0
+ field public static final int AVAILABILITY_FREE = 1; // 0x1
+ field public static final java.lang.String CALENDAR_ID = "calendar_id";
+ field public static final java.lang.String CAN_INVITE_OTHERS = "canInviteOthers";
+ field public static final java.lang.String DESCRIPTION = "description";
+ field public static final java.lang.String DTEND = "dtend";
+ field public static final java.lang.String DTSTART = "dtstart";
+ field public static final java.lang.String DURATION = "duration";
+ field public static final java.lang.String EVENT_COLOR = "eventColor";
+ field public static final java.lang.String EVENT_END_TIMEZONE = "eventEndTimezone";
+ field public static final java.lang.String EVENT_LOCATION = "eventLocation";
+ field public static final java.lang.String EVENT_TIMEZONE = "eventTimezone";
+ field public static final java.lang.String EXDATE = "exdate";
+ field public static final java.lang.String EXRULE = "exrule";
+ field public static final java.lang.String GUESTS_CAN_INVITE_OTHERS = "guestsCanInviteOthers";
+ field public static final java.lang.String GUESTS_CAN_MODIFY = "guestsCanModify";
+ field public static final java.lang.String GUESTS_CAN_SEE_GUESTS = "guestsCanSeeGuests";
+ field public static final java.lang.String HAS_ALARM = "hasAlarm";
+ field public static final java.lang.String HAS_ATTENDEE_DATA = "hasAttendeeData";
+ field public static final java.lang.String HAS_EXTENDED_PROPERTIES = "hasExtendedProperties";
+ field public static final java.lang.String LAST_DATE = "lastDate";
+ field public static final java.lang.String LAST_SYNCED = "lastSynced";
+ field public static final java.lang.String ORGANIZER = "organizer";
+ field public static final java.lang.String ORIGINAL_ALL_DAY = "originalAllDay";
+ field public static final java.lang.String ORIGINAL_ID = "original_id";
+ field public static final java.lang.String ORIGINAL_INSTANCE_TIME = "originalInstanceTime";
+ field public static final java.lang.String ORIGINAL_SYNC_ID = "original_sync_id";
+ field public static final java.lang.String RDATE = "rdate";
+ field public static final java.lang.String RRULE = "rrule";
+ field public static final java.lang.String SELF_ATTENDEE_STATUS = "selfAttendeeStatus";
+ field public static final java.lang.String STATUS = "eventStatus";
+ field public static final int STATUS_CANCELED = 2; // 0x2
+ field public static final int STATUS_CONFIRMED = 1; // 0x1
+ field public static final int STATUS_TENTATIVE = 0; // 0x0
+ field public static final java.lang.String SYNC_DATA1 = "sync_data1";
+ field public static final java.lang.String SYNC_DATA10 = "sync_data10";
+ field public static final java.lang.String SYNC_DATA2 = "sync_data2";
+ field public static final java.lang.String SYNC_DATA3 = "sync_data3";
+ field public static final java.lang.String SYNC_DATA4 = "sync_data4";
+ field public static final java.lang.String SYNC_DATA5 = "sync_data5";
+ field public static final java.lang.String SYNC_DATA6 = "sync_data6";
+ field public static final java.lang.String SYNC_DATA7 = "sync_data7";
+ field public static final java.lang.String SYNC_DATA8 = "sync_data8";
+ field public static final java.lang.String SYNC_DATA9 = "sync_data9";
+ field public static final java.lang.String TITLE = "title";
+ }
+
+ public static final class CalendarContract.EventsEntity implements android.provider.BaseColumns android.provider.CalendarContract.EventsColumns android.provider.CalendarContract.SyncColumns {
+ method public static android.content.EntityIterator newEntityIterator(android.database.Cursor, android.content.ContentResolver);
+ method public static android.content.EntityIterator newEntityIterator(android.database.Cursor, android.content.ContentProviderClient);
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
+ public static final class CalendarContract.ExtendedProperties implements android.provider.BaseColumns android.provider.CalendarContract.EventsColumns android.provider.CalendarContract.ExtendedPropertiesColumns {
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
+ protected static abstract interface CalendarContract.ExtendedPropertiesColumns {
+ field public static final java.lang.String EVENT_ID = "event_id";
+ field public static final java.lang.String NAME = "name";
+ field public static final java.lang.String VALUE = "value";
+ }
+
+ public static final class CalendarContract.Instances implements android.provider.BaseColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.EventsColumns {
+ method public static final android.database.Cursor query(android.content.ContentResolver, java.lang.String[], long, long);
+ method public static final android.database.Cursor query(android.content.ContentResolver, java.lang.String[], long, long, java.lang.String);
+ field public static final java.lang.String BEGIN = "begin";
+ field public static final android.net.Uri CONTENT_BY_DAY_URI;
+ field public static final android.net.Uri CONTENT_SEARCH_BY_DAY_URI;
+ field public static final android.net.Uri CONTENT_SEARCH_URI;
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String END = "end";
+ field public static final java.lang.String END_DAY = "endDay";
+ field public static final java.lang.String END_MINUTE = "endMinute";
+ field public static final java.lang.String EVENT_ID = "event_id";
+ field public static final java.lang.String START_DAY = "startDay";
+ field public static final java.lang.String START_MINUTE = "startMinute";
+ }
+
+ public static final class CalendarContract.Reminders implements android.provider.BaseColumns android.provider.CalendarContract.EventsColumns android.provider.CalendarContract.RemindersColumns {
+ method public static final android.database.Cursor query(android.content.ContentResolver, long, java.lang.String[]);
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
+ protected static abstract interface CalendarContract.RemindersColumns {
+ field public static final java.lang.String EVENT_ID = "event_id";
+ field public static final java.lang.String METHOD = "method";
+ field public static final int METHOD_ALERT = 1; // 0x1
+ field public static final int METHOD_DEFAULT = 0; // 0x0
+ field public static final int METHOD_EMAIL = 2; // 0x2
+ field public static final int METHOD_SMS = 3; // 0x3
+ field public static final java.lang.String MINUTES = "minutes";
+ field public static final int MINUTES_DEFAULT = -1; // 0xffffffff
+ }
+
+ protected static abstract interface CalendarContract.SyncColumns implements android.provider.CalendarContract.CalendarSyncColumns {
+ field public static final java.lang.String ACCOUNT_NAME = "account_name";
+ field public static final java.lang.String ACCOUNT_TYPE = "account_type";
+ field public static final java.lang.String CAN_PARTIALLY_UPDATE = "canPartiallyUpdate";
+ field public static final java.lang.String DELETED = "deleted";
+ field public static final java.lang.String DIRTY = "dirty";
+ field public static final java.lang.String _SYNC_ID = "_sync_id";
+ }
+
+ public static final class CalendarContract.SyncState implements android.provider.SyncStateContract.Columns {
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
public class CallLog {
ctor public CallLog();
field public static final java.lang.String AUTHORITY = "call_log";
@@ -14674,6 +15959,7 @@
field public static final java.lang.String DEFAULT_SORT_ORDER = "date DESC";
field public static final java.lang.String DURATION = "duration";
field public static final int INCOMING_TYPE = 1; // 0x1
+ field public static final java.lang.String IS_READ = "is_read";
field public static final int MISSED_TYPE = 3; // 0x3
field public static final java.lang.String NEW = "new";
field public static final java.lang.String NUMBER = "number";
@@ -14977,11 +16263,14 @@
public final class ContactsContract {
ctor public ContactsContract();
+ method public static boolean isProfileId(long);
field public static final java.lang.String AUTHORITY = "com.android.contacts";
field public static final android.net.Uri AUTHORITY_URI;
field public static final java.lang.String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
field public static final java.lang.String DIRECTORY_PARAM_KEY = "directory";
field public static final java.lang.String LIMIT_PARAM_KEY = "limit";
+ field public static final java.lang.String PRIMARY_ACCOUNT_NAME = "name_for_primary_account";
+ field public static final java.lang.String PRIMARY_ACCOUNT_TYPE = "type_for_primary_account";
}
public static final class ContactsContract.AggregationExceptions implements android.provider.BaseColumns {
@@ -15047,6 +16336,12 @@
field public static final java.lang.String GROUP_SOURCE_ID = "group_sourceid";
}
+ public static final class ContactsContract.CommonDataKinds.Identity implements android.provider.ContactsContract.DataColumnsWithJoins {
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/identity";
+ field public static final java.lang.String IDENTITY = "data1";
+ field public static final java.lang.String NAMESPACE = "data2";
+ }
+
public static final class ContactsContract.CommonDataKinds.Im implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
method public static final java.lang.CharSequence getProtocolLabel(android.content.res.Resources, int, java.lang.CharSequence);
method public static final int getProtocolLabelResource(int);
@@ -15134,6 +16429,7 @@
public static final class ContactsContract.CommonDataKinds.Photo implements android.provider.ContactsContract.DataColumnsWithJoins {
field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo";
field public static final java.lang.String PHOTO = "data15";
+ field public static final java.lang.String PHOTO_FILE_ID = "data14";
}
public static final class ContactsContract.CommonDataKinds.Relation implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
@@ -15244,6 +16540,7 @@
method public static android.net.Uri getLookupUri(long, java.lang.String);
method public static android.net.Uri lookupContact(android.content.ContentResolver, android.net.Uri);
method public static void markAsContacted(android.content.ContentResolver, long);
+ method public static java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri, boolean);
method public static java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri);
field public static final android.net.Uri CONTENT_FILTER_URI;
field public static final android.net.Uri CONTENT_GROUP_URI;
@@ -15273,14 +16570,22 @@
public static final class ContactsContract.Contacts.Photo implements android.provider.BaseColumns android.provider.ContactsContract.DataColumnsWithJoins {
field public static final java.lang.String CONTENT_DIRECTORY = "photo";
+ field public static final java.lang.String DISPLAY_PHOTO = "display_photo";
field public static final java.lang.String PHOTO = "data15";
+ field public static final java.lang.String PHOTO_FILE_ID = "data14";
+ }
+
+ public static final class ContactsContract.Contacts.StreamItems implements android.provider.ContactsContract.StreamItemsColumns {
+ field public static final java.lang.String CONTENT_DIRECTORY = "stream_items";
}
protected static abstract interface ContactsContract.ContactsColumns {
field public static final java.lang.String DISPLAY_NAME = "display_name";
field public static final java.lang.String HAS_PHONE_NUMBER = "has_phone_number";
field public static final java.lang.String IN_VISIBLE_GROUP = "in_visible_group";
+ field public static final java.lang.String IS_USER_PROFILE = "is_user_profile";
field public static final java.lang.String LOOKUP_KEY = "lookup";
+ field public static final java.lang.String PHOTO_FILE_ID = "photo_file_id";
field public static final java.lang.String PHOTO_ID = "photo_id";
field public static final java.lang.String PHOTO_THUMBNAIL_URI = "photo_thumb_uri";
field public static final java.lang.String PHOTO_URI = "photo_uri";
@@ -15323,6 +16628,15 @@
protected static abstract interface ContactsContract.DataColumnsWithJoins implements android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactStatusColumns android.provider.ContactsContract.ContactsColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.RawContactsColumns android.provider.ContactsContract.StatusColumns {
}
+ public static final class ContactsContract.DataUsageFeedback {
+ ctor public ContactsContract.DataUsageFeedback();
+ field public static final android.net.Uri FEEDBACK_URI;
+ field public static final java.lang.String USAGE_TYPE = "type";
+ field public static final java.lang.String USAGE_TYPE_CALL = "call";
+ field public static final java.lang.String USAGE_TYPE_LONG_TEXT = "long_text";
+ field public static final java.lang.String USAGE_TYPE_SHORT_TEXT = "short_text";
+ }
+
public static final class ContactsContract.Directory implements android.provider.BaseColumns {
method public static void notifyDirectoryChange(android.content.ContentResolver);
field public static final java.lang.String ACCOUNT_NAME = "accountName";
@@ -15360,6 +16674,13 @@
field public static final int UNDEFINED = 0; // 0x0
}
+ public static final class ContactsContract.DisplayPhoto {
+ field public static final android.net.Uri CONTENT_MAX_DIMENSIONS_URI;
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String DISPLAY_MAX_DIM = "display_max_dim";
+ field public static final java.lang.String THUMBNAIL_MAX_DIM = "thumbnail_max_dim";
+ }
+
public static abstract interface ContactsContract.FullNameStyle {
field public static final int CHINESE = 3; // 0x3
field public static final int CJK = 2; // 0x2
@@ -15379,6 +16700,7 @@
protected static abstract interface ContactsContract.GroupsColumns {
field public static final java.lang.String AUTO_ADD = "auto_add";
+ field public static final java.lang.String DATA_SET = "data_set";
field public static final java.lang.String DELETED = "deleted";
field public static final java.lang.String FAVORITES = "favorites";
field public static final java.lang.String GROUP_IS_READ_ONLY = "group_is_read_only";
@@ -15396,6 +16718,7 @@
field public static final java.lang.String ATTACH_IMAGE = "com.android.contacts.action.ATTACH_IMAGE";
field public static final java.lang.String EXTRA_CREATE_DESCRIPTION = "com.android.contacts.action.CREATE_DESCRIPTION";
field public static final java.lang.String EXTRA_FORCE_CREATE = "com.android.contacts.action.FORCE_CREATE";
+ field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
field public static final java.lang.String SEARCH_SUGGESTION_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CLICKED";
field public static final java.lang.String SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED";
field public static final java.lang.String SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED";
@@ -15463,6 +16786,22 @@
field public static final java.lang.String PROTOCOL = "protocol";
}
+ public static final class ContactsContract.Profile implements android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.ContactStatusColumns android.provider.ContactsContract.ContactsColumns {
+ field public static final android.net.Uri CONTENT_RAW_CONTACTS_URI;
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final android.net.Uri CONTENT_VCARD_URI;
+ field public static final long MIN_ID = 9223372034707292160L; // 0x7fffffff80000000L
+ }
+
+ public static final class ContactsContract.ProfileSyncState implements android.provider.SyncStateContract.Columns {
+ method public static byte[] get(android.content.ContentProviderClient, android.accounts.Account) throws android.os.RemoteException;
+ method public static android.util.Pair<android.net.Uri, byte[]> getWithUri(android.content.ContentProviderClient, android.accounts.Account) throws android.os.RemoteException;
+ method public static android.content.ContentProviderOperation newSetOperation(android.accounts.Account, byte[]);
+ method public static void set(android.content.ContentProviderClient, android.accounts.Account, byte[]) throws android.os.RemoteException;
+ field public static final java.lang.String CONTENT_DIRECTORY = "syncstate";
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
public static final class ContactsContract.QuickContact {
ctor public ContactsContract.QuickContact();
method public static void showQuickContact(android.content.Context, android.view.View, android.net.Uri, int, java.lang.String[]);
@@ -15488,22 +16827,33 @@
field public static final java.lang.String CONTENT_DIRECTORY = "data";
}
+ public static final class ContactsContract.RawContacts.DisplayPhoto {
+ field public static final java.lang.String CONTENT_DIRECTORY = "display_photo";
+ }
+
public static final class ContactsContract.RawContacts.Entity implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns {
field public static final java.lang.String CONTENT_DIRECTORY = "entity";
field public static final java.lang.String DATA_ID = "data_id";
}
+ public static final class ContactsContract.RawContacts.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
+ field public static final java.lang.String CONTENT_DIRECTORY = "stream_items";
+ }
+
protected static abstract interface ContactsContract.RawContactsColumns {
field public static final java.lang.String AGGREGATION_MODE = "aggregation_mode";
field public static final java.lang.String CONTACT_ID = "contact_id";
+ field public static final java.lang.String DATA_SET = "data_set";
field public static final java.lang.String DELETED = "deleted";
field public static final java.lang.String RAW_CONTACT_IS_READ_ONLY = "raw_contact_is_read_only";
+ field public static final java.lang.String RAW_CONTACT_IS_USER_PROFILE = "raw_contact_is_user_profile";
}
public static final class ContactsContract.RawContactsEntity implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.RawContactsColumns {
field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/raw_contact_entity";
field public static final android.net.Uri CONTENT_URI;
field public static final java.lang.String DATA_ID = "data_id";
+ field public static final android.net.Uri PROFILE_CONTENT_URI;
}
public static final class ContactsContract.Settings implements android.provider.ContactsContract.SettingsColumns {
@@ -15516,6 +16866,7 @@
field public static final java.lang.String ACCOUNT_NAME = "account_name";
field public static final java.lang.String ACCOUNT_TYPE = "account_type";
field public static final java.lang.String ANY_UNSYNCED = "any_unsynced";
+ field public static final java.lang.String DATA_SET = "data_set";
field public static final java.lang.String SHOULD_SYNC = "should_sync";
field public static final java.lang.String UNGROUPED_COUNT = "summ_count";
field public static final java.lang.String UNGROUPED_VISIBLE = "ungrouped_visible";
@@ -15549,6 +16900,57 @@
field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/status-update";
field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/status-update";
field public static final android.net.Uri CONTENT_URI;
+ field public static final android.net.Uri PROFILE_CONTENT_URI;
+ }
+
+ public static final class ContactsContract.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns {
+ field public static final java.lang.String PHOTO = "photo";
+ }
+
+ protected static abstract interface ContactsContract.StreamItemPhotosColumns {
+ field public static final java.lang.String PHOTO_FILE_ID = "photo_file_id";
+ field public static final java.lang.String PHOTO_URI = "photo_uri";
+ field public static final java.lang.String SORT_INDEX = "sort_index";
+ field public static final java.lang.String STREAM_ITEM_ID = "stream_item_id";
+ field public static final java.lang.String SYNC1 = "stream_item_photo_sync1";
+ field public static final java.lang.String SYNC2 = "stream_item_photo_sync2";
+ field public static final java.lang.String SYNC3 = "stream_item_photo_sync3";
+ field public static final java.lang.String SYNC4 = "stream_item_photo_sync4";
+ }
+
+ public static final class ContactsContract.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item";
+ field public static final android.net.Uri CONTENT_LIMIT_URI;
+ field public static final android.net.Uri CONTENT_PHOTO_URI;
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item";
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String MAX_ITEMS = "max_items";
+ }
+
+ public static final class ContactsContract.StreamItems.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns {
+ field public static final java.lang.String CONTENT_DIRECTORY = "photo";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item_photo";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item_photo";
+ }
+
+ protected static abstract interface ContactsContract.StreamItemsColumns {
+ field public static final java.lang.String ACCOUNT_NAME = "account_name";
+ field public static final java.lang.String ACCOUNT_TYPE = "account_type";
+ field public static final java.lang.String COMMENTS = "comments";
+ field public static final java.lang.String CONTACT_ID = "contact_id";
+ field public static final java.lang.String CONTACT_LOOKUP_KEY = "contact_lookup";
+ field public static final java.lang.String DATA_SET = "data_set";
+ field public static final java.lang.String RAW_CONTACT_ID = "raw_contact_id";
+ field public static final java.lang.String RAW_CONTACT_SOURCE_ID = "raw_contact_source_id";
+ field public static final java.lang.String RES_ICON = "icon";
+ field public static final java.lang.String RES_LABEL = "label";
+ field public static final java.lang.String RES_PACKAGE = "res_package";
+ field public static final java.lang.String SYNC1 = "stream_item_sync1";
+ field public static final java.lang.String SYNC2 = "stream_item_sync2";
+ field public static final java.lang.String SYNC3 = "stream_item_sync3";
+ field public static final java.lang.String SYNC4 = "stream_item_sync4";
+ field public static final java.lang.String TEXT = "text";
+ field public static final java.lang.String TIMESTAMP = "timestamp";
}
protected static abstract interface ContactsContract.SyncColumns implements android.provider.ContactsContract.BaseSyncColumns {
@@ -15568,7 +16970,7 @@
field public static final android.net.Uri CONTENT_URI;
}
- public final class LiveFolders implements android.provider.BaseColumns {
+ public final deprecated class LiveFolders implements android.provider.BaseColumns {
field public static final java.lang.String ACTION_CREATE_LIVE_FOLDER = "android.intent.action.CREATE_LIVE_FOLDER";
field public static final java.lang.String DESCRIPTION = "description";
field public static final int DISPLAY_MODE_GRID = 1; // 0x1
@@ -15926,6 +17328,7 @@
field public static final java.lang.String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS";
field public static final java.lang.String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
field public static final java.lang.String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
+ field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
@@ -15971,7 +17374,7 @@
field public static final java.lang.String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins";
field public static final java.lang.String ALLOW_MOCK_LOCATION = "mock_location";
field public static final java.lang.String ANDROID_ID = "android_id";
- field public static final java.lang.String BACKGROUND_DATA = "background_data";
+ field public static final deprecated java.lang.String BACKGROUND_DATA = "background_data";
field public static final java.lang.String BLUETOOTH_ON = "bluetooth_on";
field public static final android.net.Uri CONTENT_URI;
field public static final java.lang.String DATA_ROAMING = "data_roaming";
@@ -15994,14 +17397,15 @@
field public static final java.lang.String SELECTED_INPUT_METHOD_SUBTYPE = "selected_input_method_subtype";
field public static final java.lang.String SETTINGS_CLASSNAME = "settings_classname";
field public static final java.lang.String SYS_PROP_SETTING_VERSION = "sys.settings_secure_version";
- field public static final java.lang.String TTS_DEFAULT_COUNTRY = "tts_default_country";
- field public static final java.lang.String TTS_DEFAULT_LANG = "tts_default_lang";
+ field public static final java.lang.String TOUCH_EXPLORATION_ENABLED = "touch_exploration_enabled";
+ field public static final deprecated java.lang.String TTS_DEFAULT_COUNTRY = "tts_default_country";
+ field public static final deprecated java.lang.String TTS_DEFAULT_LANG = "tts_default_lang";
field public static final java.lang.String TTS_DEFAULT_PITCH = "tts_default_pitch";
field public static final java.lang.String TTS_DEFAULT_RATE = "tts_default_rate";
field public static final java.lang.String TTS_DEFAULT_SYNTH = "tts_default_synth";
- field public static final java.lang.String TTS_DEFAULT_VARIANT = "tts_default_variant";
+ field public static final deprecated java.lang.String TTS_DEFAULT_VARIANT = "tts_default_variant";
field public static final java.lang.String TTS_ENABLED_PLUGINS = "tts_enabled_plugins";
- field public static final java.lang.String TTS_USE_DEFAULTS = "tts_use_defaults";
+ field public static final deprecated java.lang.String TTS_USE_DEFAULTS = "tts_use_defaults";
field public static final java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
field public static final java.lang.String USE_GOOGLE_MAIL = "use_google_mail";
field public static final java.lang.String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
@@ -16010,18 +17414,18 @@
field public static final java.lang.String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
field public static final java.lang.String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
field public static final java.lang.String WIFI_ON = "wifi_on";
- field public static final java.lang.String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage";
- field public static final java.lang.String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
- field public static final java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms";
- field public static final java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled";
- field public static final java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms";
- field public static final java.lang.String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count";
- field public static final java.lang.String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
field public static final java.lang.String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
- field public static final java.lang.String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
- field public static final java.lang.String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
- field public static final java.lang.String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
- field public static final java.lang.String WIFI_WATCHDOG_WATCH_LIST = "wifi_watchdog_watch_list";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
+ field public static final deprecated java.lang.String WIFI_WATCHDOG_WATCH_LIST = "wifi_watchdog_watch_list";
}
public static class Settings.SettingNotFoundException extends android.util.AndroidException {
@@ -16090,6 +17494,7 @@
field public static final deprecated java.lang.String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
field public static final java.lang.String RADIO_BLUETOOTH = "bluetooth";
field public static final java.lang.String RADIO_CELL = "cell";
+ field public static final java.lang.String RADIO_NFC = "nfc";
field public static final java.lang.String RADIO_WIFI = "wifi";
field public static final java.lang.String RINGTONE = "ringtone";
field public static final java.lang.String SCREEN_BRIGHTNESS = "screen_brightness";
@@ -16203,6 +17608,50 @@
field public static final java.lang.String _ID = "_id";
}
+ public class VoicemailContract {
+ field public static final java.lang.String ACTION_FETCH_VOICEMAIL = "android.intent.action.FETCH_VOICEMAIL";
+ field public static final java.lang.String ACTION_NEW_VOICEMAIL = "android.intent.action.NEW_VOICEMAIL";
+ field public static final java.lang.String AUTHORITY = "com.android.voicemail";
+ field public static final java.lang.String EXTRA_SELF_CHANGE = "com.android.voicemail.extra.SELF_CHANGE";
+ field public static final java.lang.String PARAM_KEY_SOURCE_PACKAGE = "source_package";
+ }
+
+ public static final class VoicemailContract.Status implements android.provider.BaseColumns {
+ method public static android.net.Uri buildSourceUri(java.lang.String);
+ field public static final java.lang.String CONFIGURATION_STATE = "configuration_state";
+ field public static final int CONFIGURATION_STATE_CAN_BE_CONFIGURED = 2; // 0x2
+ field public static final int CONFIGURATION_STATE_NOT_CONFIGURED = 1; // 0x1
+ field public static final int CONFIGURATION_STATE_OK = 0; // 0x0
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String DATA_CHANNEL_STATE = "data_channel_state";
+ field public static final int DATA_CHANNEL_STATE_NO_CONNECTION = 1; // 0x1
+ field public static final int DATA_CHANNEL_STATE_OK = 0; // 0x0
+ field public static final java.lang.String DIR_TYPE = "vnd.android.cursor.dir/voicemail.source.status";
+ field public static final java.lang.String ITEM_TYPE = "vnd.android.cursor.item/voicemail.source.status";
+ field public static final java.lang.String NOTIFICATION_CHANNEL_STATE = "notification_channel_state";
+ field public static final int NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING = 2; // 0x2
+ field public static final int NOTIFICATION_CHANNEL_STATE_NO_CONNECTION = 1; // 0x1
+ field public static final int NOTIFICATION_CHANNEL_STATE_OK = 0; // 0x0
+ field public static final java.lang.String SETTINGS_URI = "settings_uri";
+ field public static final java.lang.String SOURCE_PACKAGE = "source_package";
+ field public static final java.lang.String VOICEMAIL_ACCESS_URI = "voicemail_access_uri";
+ }
+
+ public static final class VoicemailContract.Voicemails implements android.provider.BaseColumns android.provider.OpenableColumns {
+ method public static android.net.Uri buildSourceUri(java.lang.String);
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String DATE = "date";
+ field public static final java.lang.String DIR_TYPE = "vnd.android.cursor.dir/voicemails";
+ field public static final java.lang.String DURATION = "duration";
+ field public static final java.lang.String HAS_CONTENT = "has_content";
+ field public static final java.lang.String IS_READ = "is_read";
+ field public static final java.lang.String ITEM_TYPE = "vnd.android.cursor.item/voicemail";
+ field public static final java.lang.String MIME_TYPE = "mime_type";
+ field public static final java.lang.String NUMBER = "number";
+ field public static final java.lang.String SOURCE_DATA = "source_data";
+ field public static final java.lang.String SOURCE_PACKAGE = "source_package";
+ }
+
}
package android.renderscript {
@@ -16212,6 +17661,7 @@
method public void copy1DRangeFrom(int, int, short[]);
method public void copy1DRangeFrom(int, int, byte[]);
method public void copy1DRangeFrom(int, int, float[]);
+ method public void copy1DRangeFrom(int, int, android.renderscript.Allocation, int);
method public void copy1DRangeFromUnchecked(int, int, int[]);
method public void copy1DRangeFromUnchecked(int, int, short[]);
method public void copy1DRangeFromUnchecked(int, int, byte[]);
@@ -16220,6 +17670,7 @@
method public void copy2DRangeFrom(int, int, int, int, short[]);
method public void copy2DRangeFrom(int, int, int, int, int[]);
method public void copy2DRangeFrom(int, int, int, int, float[]);
+ method public void copy2DRangeFrom(int, int, int, int, android.renderscript.Allocation, int, int);
method public void copy2DRangeFrom(int, int, android.graphics.Bitmap);
method public void copyFrom(android.renderscript.BaseObj[]);
method public void copyFrom(int[]);
@@ -16257,6 +17708,7 @@
method public void setFromFieldPacker(int, int, android.renderscript.FieldPacker);
method public void syncAll(int);
field public static final int USAGE_GRAPHICS_CONSTANTS = 8; // 0x8
+ field public static final int USAGE_GRAPHICS_RENDER_TARGET = 16; // 0x10
field public static final int USAGE_GRAPHICS_TEXTURE = 2; // 0x2
field public static final int USAGE_GRAPHICS_VERTEX = 4; // 0x4
field public static final int USAGE_SCRIPT = 1; // 0x1
@@ -16271,6 +17723,7 @@
}
public class AllocationAdapter extends android.renderscript.Allocation {
+ method public static android.renderscript.AllocationAdapter create1D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter create2D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public void setFace(android.renderscript.Type.CubemapFace);
method public void setLOD(int);
@@ -16278,19 +17731,22 @@
method public void setZ(int);
}
- class BaseObj {
+ public class BaseObj {
method public synchronized void destroy();
+ method public java.lang.String getName();
method public void setName(java.lang.String);
}
public class Byte2 {
ctor public Byte2();
+ ctor public Byte2(byte, byte);
field public byte x;
field public byte y;
}
public class Byte3 {
ctor public Byte3();
+ ctor public Byte3(byte, byte, byte);
field public byte x;
field public byte y;
field public byte z;
@@ -16298,12 +17754,37 @@
public class Byte4 {
ctor public Byte4();
+ ctor public Byte4(byte, byte, byte, byte);
field public byte w;
field public byte x;
field public byte y;
field public byte z;
}
+ public class Double2 {
+ ctor public Double2();
+ ctor public Double2(double, double);
+ field public double x;
+ field public double y;
+ }
+
+ public class Double3 {
+ ctor public Double3();
+ ctor public Double3(double, double, double);
+ field public double x;
+ field public double y;
+ field public double z;
+ }
+
+ public class Double4 {
+ ctor public Double4();
+ ctor public Double4(double, double, double, double);
+ field public double w;
+ field public double x;
+ field public double y;
+ field public double z;
+ }
+
public class Element extends android.renderscript.BaseObj {
method public static android.renderscript.Element ALLOCATION(android.renderscript.RenderScript);
method public static android.renderscript.Element A_8(android.renderscript.RenderScript);
@@ -16314,10 +17795,25 @@
method public static android.renderscript.Element F32_3(android.renderscript.RenderScript);
method public static android.renderscript.Element F32_4(android.renderscript.RenderScript);
method public static android.renderscript.Element F64(android.renderscript.RenderScript);
+ method public static android.renderscript.Element F64_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element F64_3(android.renderscript.RenderScript);
+ method public static android.renderscript.Element F64_4(android.renderscript.RenderScript);
method public static android.renderscript.Element I16(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I16_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I16_3(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I16_4(android.renderscript.RenderScript);
method public static android.renderscript.Element I32(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I32_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I32_3(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I32_4(android.renderscript.RenderScript);
method public static android.renderscript.Element I64(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I64_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I64_3(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I64_4(android.renderscript.RenderScript);
method public static android.renderscript.Element I8(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I8_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I8_3(android.renderscript.RenderScript);
+ method public static android.renderscript.Element I8_4(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX4X4(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX_2X2(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX_3X3(android.renderscript.RenderScript);
@@ -16336,12 +17832,24 @@
method public static android.renderscript.Element SCRIPT(android.renderscript.RenderScript);
method public static android.renderscript.Element TYPE(android.renderscript.RenderScript);
method public static android.renderscript.Element U16(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U16_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U16_3(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U16_4(android.renderscript.RenderScript);
method public static android.renderscript.Element U32(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U32_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U32_3(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U32_4(android.renderscript.RenderScript);
method public static android.renderscript.Element U64(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U64_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U64_3(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U64_4(android.renderscript.RenderScript);
method public static android.renderscript.Element U8(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U8_2(android.renderscript.RenderScript);
+ method public static android.renderscript.Element U8_3(android.renderscript.RenderScript);
method public static android.renderscript.Element U8_4(android.renderscript.RenderScript);
method public static android.renderscript.Element createPixel(android.renderscript.RenderScript, android.renderscript.Element.DataType, android.renderscript.Element.DataKind);
method public static android.renderscript.Element createVector(android.renderscript.RenderScript, android.renderscript.Element.DataType, int);
+ method public boolean isCompatible(android.renderscript.Element);
method public boolean isComplex();
}
@@ -16404,6 +17912,9 @@
method public void addF32(android.renderscript.Float3);
method public void addF32(android.renderscript.Float4);
method public void addF64(double);
+ method public void addF64(android.renderscript.Double2);
+ method public void addF64(android.renderscript.Double3);
+ method public void addF64(android.renderscript.Double4);
method public void addI16(short);
method public void addI16(android.renderscript.Short2);
method public void addI16(android.renderscript.Short3);
@@ -16413,6 +17924,9 @@
method public void addI32(android.renderscript.Int3);
method public void addI32(android.renderscript.Int4);
method public void addI64(long);
+ method public void addI64(android.renderscript.Long2);
+ method public void addI64(android.renderscript.Long3);
+ method public void addI64(android.renderscript.Long4);
method public void addI8(byte);
method public void addI8(android.renderscript.Byte2);
method public void addI8(android.renderscript.Byte3);
@@ -16430,6 +17944,9 @@
method public void addU32(android.renderscript.Long3);
method public void addU32(android.renderscript.Long4);
method public void addU64(long);
+ method public void addU64(android.renderscript.Long2);
+ method public void addU64(android.renderscript.Long3);
+ method public void addU64(android.renderscript.Long4);
method public void addU8(short);
method public void addU8(android.renderscript.Short2);
method public void addU8(android.renderscript.Short3);
@@ -16507,12 +18024,14 @@
public class Int2 {
ctor public Int2();
+ ctor public Int2(int, int);
field public int x;
field public int y;
}
public class Int3 {
ctor public Int3();
+ ctor public Int3(int, int, int);
field public int x;
field public int y;
field public int z;
@@ -16520,6 +18039,7 @@
public class Int4 {
ctor public Int4();
+ ctor public Int4(int, int, int, int);
field public int w;
field public int x;
field public int y;
@@ -16528,12 +18048,14 @@
public class Long2 {
ctor public Long2();
+ ctor public Long2(long, long);
field public long x;
field public long y;
}
public class Long3 {
ctor public Long3();
+ ctor public Long3(long, long, long);
field public long x;
field public long y;
field public long z;
@@ -16541,6 +18063,7 @@
public class Long4 {
ctor public Long4();
+ ctor public Long4(long, long, long, long);
field public long w;
field public long x;
field public long y;
@@ -16863,6 +18386,21 @@
method public void surfaceDestroyed(android.view.SurfaceHolder);
}
+ public class RSTextureView extends android.view.TextureView implements android.view.TextureView.SurfaceTextureListener {
+ ctor public RSTextureView(android.content.Context);
+ ctor public RSTextureView(android.content.Context, android.util.AttributeSet);
+ method public android.renderscript.RenderScriptGL createRenderScriptGL(android.renderscript.RenderScriptGL.SurfaceConfig);
+ method public void destroyRenderScriptGL();
+ method public android.renderscript.RenderScriptGL getRenderScriptGL();
+ method public void onSurfaceTextureAvailable(android.graphics.SurfaceTexture, int, int);
+ method public boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture);
+ method public void onSurfaceTextureSizeChanged(android.graphics.SurfaceTexture, int, int);
+ method public void onSurfaceTextureUpdated(android.graphics.SurfaceTexture);
+ method public void pause();
+ method public void resume();
+ method public void setRenderScriptGL(android.renderscript.RenderScriptGL);
+ }
+
public class RenderScript {
method public void contextDump();
method public static android.renderscript.RenderScript create(android.content.Context);
@@ -16910,6 +18448,7 @@
method public void pause();
method public void resume();
method public void setSurface(android.view.SurfaceHolder, int, int);
+ method public void setSurfaceTexture(android.graphics.SurfaceTexture, int, int);
}
public static class RenderScriptGL.SurfaceConfig {
@@ -16953,6 +18492,7 @@
public class Script extends android.renderscript.BaseObj {
method public void bindAllocation(android.renderscript.Allocation, int);
+ method protected void forEach(int, android.renderscript.Allocation, android.renderscript.Allocation, android.renderscript.FieldPacker);
method protected void invoke(int);
method protected void invoke(int, android.renderscript.FieldPacker);
method public void setTimeZone(java.lang.String);
@@ -16987,12 +18527,14 @@
public class Short2 {
ctor public Short2();
+ ctor public Short2(short, short);
field public short x;
field public short y;
}
public class Short3 {
ctor public Short3();
+ ctor public Short3(short, short, short);
field public short x;
field public short y;
field public short z;
@@ -17000,6 +18542,7 @@
public class Short4 {
ctor public Short4();
+ ctor public Short4(short, short, short, short);
field public short w;
field public short x;
field public short y;
@@ -17031,9 +18574,12 @@
enum_constant public static final android.renderscript.Type.CubemapFace NEGATIVE_X;
enum_constant public static final android.renderscript.Type.CubemapFace NEGATIVE_Y;
enum_constant public static final android.renderscript.Type.CubemapFace NEGATIVE_Z;
- enum_constant public static final android.renderscript.Type.CubemapFace POSITVE_X;
- enum_constant public static final android.renderscript.Type.CubemapFace POSITVE_Y;
- enum_constant public static final android.renderscript.Type.CubemapFace POSITVE_Z;
+ enum_constant public static final android.renderscript.Type.CubemapFace POSITIVE_X;
+ enum_constant public static final android.renderscript.Type.CubemapFace POSITIVE_Y;
+ enum_constant public static final android.renderscript.Type.CubemapFace POSITIVE_Z;
+ enum_constant public static final deprecated android.renderscript.Type.CubemapFace POSITVE_X;
+ enum_constant public static final deprecated android.renderscript.Type.CubemapFace POSITVE_Y;
+ enum_constant public static final deprecated android.renderscript.Type.CubemapFace POSITVE_Z;
}
}
@@ -17078,6 +18624,53 @@
}
+package android.security {
+
+ public final class KeyChain {
+ ctor public KeyChain();
+ method public static void choosePrivateKeyAlias(android.app.Activity, android.security.KeyChainAliasCallback, java.lang.String[], java.security.Principal[], java.lang.String, int, java.lang.String);
+ method public static android.content.Intent createInstallIntent();
+ method public static java.security.cert.X509Certificate[] getCertificateChain(android.content.Context, java.lang.String) throws java.lang.InterruptedException, android.security.KeyChainException;
+ method public static java.security.PrivateKey getPrivateKey(android.content.Context, java.lang.String) throws java.lang.InterruptedException, android.security.KeyChainException;
+ field public static final java.lang.String EXTRA_CERTIFICATE = "CERT";
+ field public static final java.lang.String EXTRA_NAME = "name";
+ field public static final java.lang.String EXTRA_PKCS12 = "PKCS12";
+ }
+
+ public abstract interface KeyChainAliasCallback {
+ method public abstract void alias(java.lang.String);
+ }
+
+ public class KeyChainException extends java.lang.Exception {
+ ctor public KeyChainException();
+ ctor public KeyChainException(java.lang.String);
+ ctor public KeyChainException(java.lang.String, java.lang.Throwable);
+ ctor public KeyChainException(java.lang.Throwable);
+ }
+
+}
+
+package android.service.textservice {
+
+ public abstract class SpellCheckerService extends android.app.Service {
+ ctor public SpellCheckerService();
+ method public abstract android.service.textservice.SpellCheckerService.Session createSession();
+ method public final android.os.IBinder onBind(android.content.Intent);
+ field public static final java.lang.String SERVICE_INTERFACE = "android.service.textservice.SpellCheckerService";
+ }
+
+ public static abstract class SpellCheckerService.Session {
+ ctor public SpellCheckerService.Session();
+ method public android.os.Bundle getBundle();
+ method public java.lang.String getLocale();
+ method public void onCancel();
+ method public abstract void onCreate();
+ method public abstract android.view.textservice.SuggestionsInfo onGetSuggestions(android.view.textservice.TextInfo, int);
+ method public android.view.textservice.SuggestionsInfo[] onGetSuggestionsMultiple(android.view.textservice.TextInfo[], int, boolean);
+ }
+
+}
+
package android.service.wallpaper {
public abstract class WallpaperService extends android.app.Service {
@@ -17090,6 +18683,7 @@
public class WallpaperService.Engine {
ctor public WallpaperService.Engine();
+ method protected void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
method public int getDesiredMinimumHeight();
method public int getDesiredMinimumWidth();
method public android.view.SurfaceHolder getSurfaceHolder();
@@ -17153,11 +18747,13 @@
field public static final java.lang.String ACTION_WEB_SEARCH = "android.speech.action.WEB_SEARCH";
field public static final java.lang.String DETAILS_META_DATA = "android.speech.DETAILS";
field public static final java.lang.String EXTRA_CALLING_PACKAGE = "calling_package";
+ field public static final java.lang.String EXTRA_CONFIDENCE_SCORES = "android.speech.extra.CONFIDENCE_SCORES";
field public static final java.lang.String EXTRA_LANGUAGE = "android.speech.extra.LANGUAGE";
field public static final java.lang.String EXTRA_LANGUAGE_MODEL = "android.speech.extra.LANGUAGE_MODEL";
field public static final java.lang.String EXTRA_LANGUAGE_PREFERENCE = "android.speech.extra.LANGUAGE_PREFERENCE";
field public static final java.lang.String EXTRA_MAX_RESULTS = "android.speech.extra.MAX_RESULTS";
field public static final java.lang.String EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE = "android.speech.extra.ONLY_RETURN_LANGUAGE_PREFERENCE";
+ field public static final java.lang.String EXTRA_ORIGIN = "android.speech.extra.ORIGIN";
field public static final java.lang.String EXTRA_PARTIAL_RESULTS = "android.speech.extra.PARTIAL_RESULTS";
field public static final java.lang.String EXTRA_PROMPT = "android.speech.extra.PROMPT";
field public static final java.lang.String EXTRA_RESULTS = "android.speech.extra.RESULTS";
@@ -17196,6 +18792,7 @@
method public void setRecognitionListener(android.speech.RecognitionListener);
method public void startListening(android.content.Intent);
method public void stopListening();
+ field public static final java.lang.String CONFIDENCE_SCORES = "confidence_scores";
field public static final int ERROR_AUDIO = 3; // 0x3
field public static final int ERROR_CLIENT = 5; // 0x5
field public static final int ERROR_INSUFFICIENT_PERMISSIONS = 9; // 0x9
@@ -17212,20 +18809,41 @@
package android.speech.tts {
+ public abstract interface SynthesisCallback {
+ method public abstract int audioAvailable(byte[], int, int);
+ method public abstract int done();
+ method public abstract void error();
+ method public abstract int getMaxBufferSize();
+ method public abstract int start(int, int, int);
+ }
+
+ public final class SynthesisRequest {
+ ctor public SynthesisRequest(java.lang.String, android.os.Bundle);
+ method public java.lang.String getCountry();
+ method public java.lang.String getLanguage();
+ method public android.os.Bundle getParams();
+ method public int getPitch();
+ method public int getSpeechRate();
+ method public java.lang.String getText();
+ method public java.lang.String getVariant();
+ }
+
public class TextToSpeech {
ctor public TextToSpeech(android.content.Context, android.speech.tts.TextToSpeech.OnInitListener);
+ ctor public TextToSpeech(android.content.Context, android.speech.tts.TextToSpeech.OnInitListener, java.lang.String);
method public int addEarcon(java.lang.String, java.lang.String, int);
method public int addEarcon(java.lang.String, java.lang.String);
method public int addSpeech(java.lang.String, java.lang.String, int);
method public int addSpeech(java.lang.String, java.lang.String);
method public boolean areDefaultsEnforced();
method public java.lang.String getDefaultEngine();
+ method public java.util.List<android.speech.tts.TextToSpeech.EngineInfo> getEngines();
method public java.util.Locale getLanguage();
method public int isLanguageAvailable(java.util.Locale);
method public boolean isSpeaking();
method public int playEarcon(java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>);
method public int playSilence(long, int, java.util.HashMap<java.lang.String, java.lang.String>);
- method public int setEngineByPackageName(java.lang.String);
+ method public deprecated int setEngineByPackageName(java.lang.String);
method public int setLanguage(java.util.Locale);
method public int setOnUtteranceCompletedListener(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener);
method public int setPitch(float);
@@ -17264,10 +18882,19 @@
field public static final java.lang.String EXTRA_VOICE_DATA_FILES = "dataFiles";
field public static final java.lang.String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
field public static final java.lang.String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
+ field public static final java.lang.String INTENT_ACTION_TTS_SERVICE = "android.intent.action.TTS_SERVICE";
field public static final java.lang.String KEY_PARAM_PAN = "pan";
field public static final java.lang.String KEY_PARAM_STREAM = "streamType";
field public static final java.lang.String KEY_PARAM_UTTERANCE_ID = "utteranceId";
field public static final java.lang.String KEY_PARAM_VOLUME = "volume";
+ field public static final java.lang.String SERVICE_META_DATA = "android.speech.tts";
+ }
+
+ public static class TextToSpeech.EngineInfo {
+ ctor public TextToSpeech.EngineInfo();
+ field public int icon;
+ field public java.lang.String label;
+ field public java.lang.String name;
}
public static abstract interface TextToSpeech.OnInitListener {
@@ -17278,6 +18905,16 @@
method public abstract void onUtteranceCompleted(java.lang.String);
}
+ public abstract class TextToSpeechService extends android.app.Service {
+ ctor public TextToSpeechService();
+ method public android.os.IBinder onBind(android.content.Intent);
+ method protected abstract java.lang.String[] onGetLanguage();
+ method protected abstract int onIsLanguageAvailable(java.lang.String, java.lang.String, java.lang.String);
+ method protected abstract int onLoadLanguage(java.lang.String, java.lang.String, java.lang.String);
+ method protected abstract void onStop();
+ method protected abstract void onSynthesizeText(android.speech.tts.SynthesisRequest, android.speech.tts.SynthesisCallback);
+ }
+
}
package android.telephony {
@@ -17547,6 +19184,7 @@
field public static final int NETWORK_TYPE_GPRS = 1; // 0x1
field public static final int NETWORK_TYPE_HSDPA = 8; // 0x8
field public static final int NETWORK_TYPE_HSPA = 10; // 0xa
+ field public static final int NETWORK_TYPE_HSPAP = 15; // 0xf
field public static final int NETWORK_TYPE_HSUPA = 9; // 0x9
field public static final int NETWORK_TYPE_IDEN = 11; // 0xb
field public static final int NETWORK_TYPE_LTE = 13; // 0xd
@@ -18489,6 +20127,7 @@
method public abstract int getTopPadding();
method public final int getWidth();
method public final void increaseWidthTo(int);
+ method public boolean isRtlCharAt(int);
method protected final boolean isSpanned();
field public static final int DIR_LEFT_TO_RIGHT = 1; // 0x1
field public static final int DIR_RIGHT_TO_LEFT = -1; // 0xffffffff
@@ -19258,6 +20897,13 @@
field protected final int mVerticalAlignment;
}
+ public class EasyEditSpan implements android.text.ParcelableSpan {
+ ctor public EasyEditSpan();
+ method public int describeContents();
+ method public int getSpanTypeId();
+ method public void writeToParcel(android.os.Parcel, int);
+ }
+
public class ForegroundColorSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
ctor public ForegroundColorSpan(int);
ctor public ForegroundColorSpan(android.os.Parcel);
@@ -19417,6 +21063,29 @@
method public void writeToParcel(android.os.Parcel, int);
}
+ public class SuggestionSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan {
+ ctor public SuggestionSpan(android.content.Context, java.lang.String[], int);
+ ctor public SuggestionSpan(java.util.Locale, java.lang.String[], int);
+ ctor public SuggestionSpan(android.content.Context, java.util.Locale, java.lang.String[], int, java.lang.Class<?>);
+ ctor public SuggestionSpan(android.os.Parcel);
+ method public int describeContents();
+ method public int getFlags();
+ method public java.lang.String getLocale();
+ method public int getSpanTypeId();
+ method public java.lang.String[] getSuggestions();
+ method public void setFlags(int);
+ method public void updateDrawState(android.text.TextPaint);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final java.lang.String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED";
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int FLAG_EASY_CORRECT = 1; // 0x1
+ field public static final int FLAG_MISSPELLED = 2; // 0x2
+ field public static final int SUGGESTIONS_MAX_SIZE = 5; // 0x5
+ field public static final java.lang.String SUGGESTION_SPAN_PICKED_AFTER = "after";
+ field public static final java.lang.String SUGGESTION_SPAN_PICKED_BEFORE = "before";
+ field public static final java.lang.String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
+ }
+
public class SuperscriptSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public SuperscriptSpan();
ctor public SuperscriptSpan(android.os.Parcel);
@@ -19615,6 +21284,14 @@
ctor public Base64OutputStream(java.io.OutputStream, int);
}
+ public final deprecated class Config {
+ field public static final deprecated boolean DEBUG = false;
+ field public static final deprecated boolean LOGD = true;
+ field public static final deprecated boolean LOGV = false;
+ field public static final deprecated boolean PROFILE = false;
+ field public static final deprecated boolean RELEASE = true;
+ }
+
public class DebugUtils {
method public static boolean isObjectSelected(java.lang.Object);
}
@@ -19627,6 +21304,7 @@
field public static final int DENSITY_HIGH = 240; // 0xf0
field public static final int DENSITY_LOW = 120; // 0x78
field public static final int DENSITY_MEDIUM = 160; // 0xa0
+ field public static final int DENSITY_TV = 213; // 0xd5
field public static final int DENSITY_XHIGH = 320; // 0x140
field public float density;
field public int densityDpi;
@@ -19804,6 +21482,10 @@
method public void previousMonth();
}
+ public class NoSuchPropertyException extends java.lang.RuntimeException {
+ ctor public NoSuchPropertyException(java.lang.String);
+ }
+
public class Pair {
ctor public Pair(F, S);
method public static android.util.Pair<A, B> create(A, B);
@@ -19839,11 +21521,22 @@
method public abstract void println(java.lang.String);
}
- public class SparseArray {
+ public abstract class Property {
+ ctor public Property(java.lang.Class<V>, java.lang.String);
+ method public abstract V get(T);
+ method public java.lang.String getName();
+ method public java.lang.Class<V> getType();
+ method public boolean isReadOnly();
+ method public static android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String);
+ method public void set(T, V);
+ }
+
+ public class SparseArray implements java.lang.Cloneable {
ctor public SparseArray();
ctor public SparseArray(int);
method public void append(int, E);
method public void clear();
+ method public android.util.SparseArray<E> clone();
method public void delete(int);
method public E get(int);
method public E get(int, E);
@@ -19858,11 +21551,12 @@
method public E valueAt(int);
}
- public class SparseBooleanArray {
+ public class SparseBooleanArray implements java.lang.Cloneable {
ctor public SparseBooleanArray();
ctor public SparseBooleanArray(int);
method public void append(int, boolean);
method public void clear();
+ method public android.util.SparseBooleanArray clone();
method public void delete(int);
method public boolean get(int);
method public boolean get(int, boolean);
@@ -19874,11 +21568,12 @@
method public boolean valueAt(int);
}
- public class SparseIntArray {
+ public class SparseIntArray implements java.lang.Cloneable {
ctor public SparseIntArray();
ctor public SparseIntArray(int);
method public void append(int, int);
method public void clear();
+ method public android.util.SparseIntArray clone();
method public void delete(int);
method public int get(int);
method public int get(int, int);
@@ -20025,11 +21720,13 @@
method public abstract android.view.Menu getMenu();
method public abstract android.view.MenuInflater getMenuInflater();
method public abstract java.lang.CharSequence getSubtitle();
+ method public java.lang.Object getTag();
method public abstract java.lang.CharSequence getTitle();
method public abstract void invalidate();
method public abstract void setCustomView(android.view.View);
method public abstract void setSubtitle(java.lang.CharSequence);
method public abstract void setSubtitle(int);
+ method public void setTag(java.lang.Object);
method public abstract void setTitle(java.lang.CharSequence);
method public abstract void setTitle(int);
}
@@ -20041,6 +21738,19 @@
method public abstract boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);
}
+ public abstract class ActionProvider {
+ ctor public ActionProvider(android.content.Context);
+ method public boolean hasSubMenu();
+ method public abstract android.view.View onCreateActionView();
+ method public boolean onPerformDefaultAction();
+ method public void onPrepareSubMenu(android.view.SubMenu);
+ }
+
+ public abstract interface CollapsibleActionView {
+ method public abstract void onActionViewCollapsed();
+ method public abstract void onActionViewExpanded();
+ }
+
public abstract interface ContextMenu implements android.view.Menu {
method public abstract void clearHeader();
method public abstract android.view.ContextMenu setHeaderIcon(int);
@@ -20061,13 +21771,15 @@
public class Display {
method public int getDisplayId();
- method public int getHeight();
+ method public deprecated int getHeight();
method public void getMetrics(android.util.DisplayMetrics);
method public deprecated int getOrientation();
method public int getPixelFormat();
+ method public void getRectSize(android.graphics.Rect);
method public float getRefreshRate();
method public int getRotation();
- method public int getWidth();
+ method public void getSize(android.graphics.Point);
+ method public deprecated int getWidth();
field public static final int DEFAULT_DISPLAY = 0; // 0x0
}
@@ -20142,6 +21854,7 @@
method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect);
method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect);
method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect);
+ method public static int getAbsoluteGravity(int, int);
method public static boolean isHorizontal(int);
method public static boolean isVertical(int);
field public static final int AXIS_CLIP = 8; // 0x8
@@ -20158,13 +21871,17 @@
field public static final int CLIP_VERTICAL = 128; // 0x80
field public static final int DISPLAY_CLIP_HORIZONTAL = 16777216; // 0x1000000
field public static final int DISPLAY_CLIP_VERTICAL = 268435456; // 0x10000000
+ field public static final int END = 8388613; // 0x800005
field public static final int FILL = 119; // 0x77
field public static final int FILL_HORIZONTAL = 7; // 0x7
field public static final int FILL_VERTICAL = 112; // 0x70
field public static final int HORIZONTAL_GRAVITY_MASK = 7; // 0x7
field public static final int LEFT = 3; // 0x3
field public static final int NO_GRAVITY = 0; // 0x0
+ field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+ field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
field public static final int RIGHT = 5; // 0x5
+ field public static final int START = 8388611; // 0x800003
field public static final int TOP = 48; // 0x30
field public static final int VERTICAL_GRAVITY_MASK = 112; // 0x70
}
@@ -20222,6 +21939,7 @@
field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
field public static final int SOURCE_KEYBOARD = 257; // 0x101
field public static final int SOURCE_MOUSE = 8194; // 0x2002
+ field public static final int SOURCE_STYLUS = 16386; // 0x4002
field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
@@ -20328,6 +22046,7 @@
method public static int getMaxKeyCode();
method public final int getMetaState();
method public static int getModifierMetaStateMask();
+ method public final int getModifiers();
method public char getNumber();
method public final int getRepeatCount();
method public final int getScanCode();
@@ -20379,6 +22098,7 @@
field public static final int KEYCODE_1 = 8; // 0x8
field public static final int KEYCODE_2 = 9; // 0x9
field public static final int KEYCODE_3 = 10; // 0xa
+ field public static final int KEYCODE_3D_MODE = 206; // 0xce
field public static final int KEYCODE_4 = 11; // 0xb
field public static final int KEYCODE_5 = 12; // 0xc
field public static final int KEYCODE_6 = 13; // 0xd
@@ -20484,8 +22204,10 @@
field public static final int KEYCODE_J = 38; // 0x26
field public static final int KEYCODE_K = 39; // 0x27
field public static final int KEYCODE_L = 40; // 0x28
+ field public static final int KEYCODE_LANGUAGE_SWITCH = 204; // 0xcc
field public static final int KEYCODE_LEFT_BRACKET = 71; // 0x47
field public static final int KEYCODE_M = 41; // 0x29
+ field public static final int KEYCODE_MANNER_MODE = 205; // 0xcd
field public static final int KEYCODE_MEDIA_CLOSE = 128; // 0x80
field public static final int KEYCODE_MEDIA_EJECT = 129; // 0x81
field public static final int KEYCODE_MEDIA_FAST_FORWARD = 90; // 0x5a
@@ -20695,6 +22417,9 @@
}
public abstract interface MenuItem {
+ method public abstract boolean collapseActionView();
+ method public abstract boolean expandActionView();
+ method public abstract android.view.ActionProvider getActionProvider();
method public abstract android.view.View getActionView();
method public abstract char getAlphabeticShortcut();
method public abstract int getGroupId();
@@ -20708,10 +22433,12 @@
method public abstract java.lang.CharSequence getTitle();
method public abstract java.lang.CharSequence getTitleCondensed();
method public abstract boolean hasSubMenu();
+ method public abstract boolean isActionViewExpanded();
method public abstract boolean isCheckable();
method public abstract boolean isChecked();
method public abstract boolean isEnabled();
method public abstract boolean isVisible();
+ method public abstract android.view.MenuItem setActionProvider(android.view.ActionProvider);
method public abstract android.view.MenuItem setActionView(android.view.View);
method public abstract android.view.MenuItem setActionView(int);
method public abstract android.view.MenuItem setAlphabeticShortcut(char);
@@ -20722,19 +22449,27 @@
method public abstract android.view.MenuItem setIcon(int);
method public abstract android.view.MenuItem setIntent(android.content.Intent);
method public abstract android.view.MenuItem setNumericShortcut(char);
+ method public abstract android.view.MenuItem setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener);
method public abstract android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
method public abstract android.view.MenuItem setShortcut(char, char);
method public abstract void setShowAsAction(int);
+ method public abstract android.view.MenuItem setShowAsActionFlags(int);
method public abstract android.view.MenuItem setTitle(java.lang.CharSequence);
method public abstract android.view.MenuItem setTitle(int);
method public abstract android.view.MenuItem setTitleCondensed(java.lang.CharSequence);
method public abstract android.view.MenuItem setVisible(boolean);
field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+ field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
}
+ public static abstract interface MenuItem.OnActionExpandListener {
+ method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
+ method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
+ }
+
public static abstract interface MenuItem.OnMenuItemClickListener {
method public abstract boolean onMenuItemClick(android.view.MenuItem);
}
@@ -20750,6 +22485,7 @@
method public final int getActionMasked();
method public final float getAxisValue(int);
method public final float getAxisValue(int, int);
+ method public final int getButtonState();
method public final int getDeviceId();
method public final long getDownTime();
method public final int getEdgeFlags();
@@ -20784,6 +22520,7 @@
method public final void getPointerCoords(int, android.view.MotionEvent.PointerCoords);
method public final int getPointerCount();
method public final int getPointerId(int);
+ method public final void getPointerProperties(int, android.view.MotionEvent.PointerProperties);
method public final float getPressure();
method public final float getPressure(int);
method public final float getRawX();
@@ -20795,6 +22532,7 @@
method public final float getToolMajor(int);
method public final float getToolMinor();
method public final float getToolMinor(int);
+ method public final int getToolType(int);
method public final float getTouchMajor();
method public final float getTouchMajor(int);
method public final float getTouchMinor();
@@ -20805,7 +22543,8 @@
method public final float getY();
method public final float getY(int);
method public final float getYPrecision();
- method public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent.PointerCoords[], int, float, float, int, int, int, int);
+ method public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent.PointerProperties[], android.view.MotionEvent.PointerCoords[], int, int, float, float, int, int, int, int);
+ method public static deprecated android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent.PointerCoords[], int, float, float, int, int, int, int);
method public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
method public static deprecated android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
method public static android.view.MotionEvent obtain(long, long, int, float, float, int);
@@ -20821,6 +22560,8 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACTION_CANCEL = 3; // 0x3
field public static final int ACTION_DOWN = 0; // 0x0
+ field public static final int ACTION_HOVER_ENTER = 9; // 0x9
+ field public static final int ACTION_HOVER_EXIT = 10; // 0xa
field public static final int ACTION_HOVER_MOVE = 7; // 0x7
field public static final int ACTION_MASK = 255; // 0xff
field public static final int ACTION_MOVE = 2; // 0x2
@@ -20840,6 +22581,7 @@
field public static final int ACTION_SCROLL = 8; // 0x8
field public static final int ACTION_UP = 1; // 0x1
field public static final int AXIS_BRAKE = 23; // 0x17
+ field public static final int AXIS_DISTANCE = 24; // 0x18
field public static final int AXIS_GAS = 22; // 0x16
field public static final int AXIS_GENERIC_1 = 32; // 0x20
field public static final int AXIS_GENERIC_10 = 41; // 0x29
@@ -20870,6 +22612,7 @@
field public static final int AXIS_RZ = 14; // 0xe
field public static final int AXIS_SIZE = 3; // 0x3
field public static final int AXIS_THROTTLE = 19; // 0x13
+ field public static final int AXIS_TILT = 25; // 0x19
field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
field public static final int AXIS_TOOL_MINOR = 7; // 0x7
field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
@@ -20879,12 +22622,23 @@
field public static final int AXIS_X = 0; // 0x0
field public static final int AXIS_Y = 1; // 0x1
field public static final int AXIS_Z = 11; // 0xb
+ field public static final int BUTTON_BACK = 8; // 0x8
+ field public static final int BUTTON_FORWARD = 16; // 0x10
+ field public static final int BUTTON_PRIMARY = 1; // 0x1
+ field public static final int BUTTON_SECONDARY = 2; // 0x2
+ field public static final int BUTTON_TERTIARY = 4; // 0x4
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int EDGE_BOTTOM = 2; // 0x2
field public static final int EDGE_LEFT = 4; // 0x4
field public static final int EDGE_RIGHT = 8; // 0x8
field public static final int EDGE_TOP = 1; // 0x1
field public static final int FLAG_WINDOW_IS_OBSCURED = 1; // 0x1
+ field public static final int INVALID_POINTER_ID = -1; // 0xffffffff
+ field public static final int TOOL_TYPE_ERASER = 4; // 0x4
+ field public static final int TOOL_TYPE_FINGER = 1; // 0x1
+ field public static final int TOOL_TYPE_MOUSE = 3; // 0x3
+ field public static final int TOOL_TYPE_STYLUS = 2; // 0x2
+ field public static final int TOOL_TYPE_UNKNOWN = 0; // 0x0
}
public static final class MotionEvent.PointerCoords {
@@ -20905,6 +22659,15 @@
field public float y;
}
+ public static final class MotionEvent.PointerProperties {
+ ctor public MotionEvent.PointerProperties();
+ ctor public MotionEvent.PointerProperties(android.view.MotionEvent.PointerProperties);
+ method public void clear();
+ method public void copyFrom(android.view.MotionEvent.PointerProperties);
+ field public int id;
+ field public int toolType;
+ }
+
public abstract class OrientationEventListener {
ctor public OrientationEventListener(android.content.Context);
ctor public OrientationEventListener(android.content.Context, int);
@@ -20978,10 +22741,12 @@
}
public class Surface implements android.os.Parcelable {
+ ctor public Surface(android.graphics.SurfaceTexture);
method public int describeContents();
method public boolean isValid();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException;
method public void readFromParcel(android.os.Parcel);
+ method public void release();
method public void unlockCanvas(android.graphics.Canvas);
method public void unlockCanvasAndPost(android.graphics.Canvas);
method public void writeToParcel(android.os.Parcel, int);
@@ -21042,6 +22807,34 @@
method public void setZOrderOnTop(boolean);
}
+ public class TextureView extends android.view.View {
+ ctor public TextureView(android.content.Context);
+ ctor public TextureView(android.content.Context, android.util.AttributeSet);
+ ctor public TextureView(android.content.Context, android.util.AttributeSet, int);
+ method public final void draw(android.graphics.Canvas);
+ method public android.graphics.Bitmap getBitmap();
+ method public android.graphics.Bitmap getBitmap(int, int);
+ method public android.graphics.Bitmap getBitmap(android.graphics.Bitmap);
+ method public android.graphics.SurfaceTexture getSurfaceTexture();
+ method public android.view.TextureView.SurfaceTextureListener getSurfaceTextureListener();
+ method public android.graphics.Matrix getTransform(android.graphics.Matrix);
+ method public boolean isAvailable();
+ method public android.graphics.Canvas lockCanvas();
+ method public android.graphics.Canvas lockCanvas(android.graphics.Rect);
+ method protected final void onDraw(android.graphics.Canvas);
+ method public void setOpaque(boolean);
+ method public void setSurfaceTextureListener(android.view.TextureView.SurfaceTextureListener);
+ method public void setTransform(android.graphics.Matrix);
+ method public void unlockCanvasAndPost(android.graphics.Canvas);
+ }
+
+ public static abstract interface TextureView.SurfaceTextureListener {
+ method public abstract void onSurfaceTextureAvailable(android.graphics.SurfaceTexture, int, int);
+ method public abstract boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture);
+ method public abstract void onSurfaceTextureSizeChanged(android.graphics.SurfaceTexture, int, int);
+ method public abstract void onSurfaceTextureUpdated(android.graphics.SurfaceTexture);
+ }
+
public class TouchDelegate {
ctor public TouchDelegate(android.graphics.Rect, android.view.View);
method public boolean onTouchEvent(android.view.MotionEvent);
@@ -21081,6 +22874,8 @@
method public void buildDrawingCache();
method public void buildDrawingCache(boolean);
method public void buildLayer();
+ method public boolean canScrollHorizontally(int);
+ method public boolean canScrollVertically(int);
method public void cancelLongPress();
method public boolean checkInputConnectionProxy(android.view.View);
method public void clearAnimation();
@@ -21093,13 +22888,17 @@
method protected int computeVerticalScrollExtent();
method protected int computeVerticalScrollOffset();
method protected int computeVerticalScrollRange();
+ method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo();
method public void createContextMenu(android.view.ContextMenu);
method public void destroyDrawingCache();
method public void dispatchConfigurationChanged(android.content.res.Configuration);
method public void dispatchDisplayHint(int);
method public boolean dispatchDragEvent(android.view.DragEvent);
method protected void dispatchDraw(android.graphics.Canvas);
+ method protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
method public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
+ method protected boolean dispatchGenericPointerEvent(android.view.MotionEvent);
+ method protected boolean dispatchHoverEvent(android.view.MotionEvent);
method public boolean dispatchKeyEvent(android.view.KeyEvent);
method public boolean dispatchKeyEventPreIme(android.view.KeyEvent);
method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
@@ -21121,7 +22920,9 @@
method public android.view.View findFocus();
method public final android.view.View findViewById(int);
method public final android.view.View findViewWithTag(java.lang.Object);
+ method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int);
method protected boolean fitSystemWindows(android.graphics.Rect);
+ method public boolean fitsSystemWindows();
method public android.view.View focusSearch(int);
method public void forceLayout();
method public float getAlpha();
@@ -21245,6 +23046,7 @@
method public boolean isHardwareAccelerated();
method public boolean isHorizontalFadingEdgeEnabled();
method public boolean isHorizontalScrollBarEnabled();
+ method public boolean isHovered();
method public boolean isInEditMode();
method public boolean isInTouchMode();
method public boolean isLayoutRequested();
@@ -21284,6 +23086,10 @@
method public void onFinishTemporaryDetach();
method protected void onFocusChanged(boolean, int, android.graphics.Rect);
method public boolean onGenericMotionEvent(android.view.MotionEvent);
+ method public void onHoverChanged(boolean);
+ method public boolean onHoverEvent(android.view.MotionEvent);
+ method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
method public boolean onKeyDown(int, android.view.KeyEvent);
method public boolean onKeyLongPress(int, android.view.KeyEvent);
method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
@@ -21293,6 +23099,7 @@
method protected void onLayout(boolean, int, int, int, int);
method protected void onMeasure(int, int);
method protected void onOverScrolled(int, int, boolean, boolean);
+ method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method protected void onRestoreInstanceState(android.os.Parcelable);
method protected android.os.Parcelable onSaveInstanceState();
method protected void onScrollChanged(int, int, int, int);
@@ -21336,6 +23143,7 @@
method public void scrollTo(int, int);
method public void sendAccessibilityEvent(int);
method public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
+ method public void setAccessibilityDelegate(android.view.View.AccessibilityDelegate);
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
@@ -21353,11 +23161,13 @@
method public void setEnabled(boolean);
method public void setFadingEdgeLength(int);
method public void setFilterTouchesWhenObscured(boolean);
+ method public void setFitsSystemWindows(boolean);
method public void setFocusable(boolean);
method public void setFocusableInTouchMode(boolean);
method public void setHapticFeedbackEnabled(boolean);
method public void setHorizontalFadingEdgeEnabled(boolean);
method public void setHorizontalScrollBarEnabled(boolean);
+ method public void setHovered(boolean);
method public void setId(int);
method public void setKeepScreenOn(boolean);
method public void setLayerType(int, android.graphics.Paint);
@@ -21377,6 +23187,7 @@
method public void setOnDragListener(android.view.View.OnDragListener);
method public void setOnFocusChangeListener(android.view.View.OnFocusChangeListener);
method public void setOnGenericMotionListener(android.view.View.OnGenericMotionListener);
+ method public void setOnHoverListener(android.view.View.OnHoverListener);
method public void setOnKeyListener(android.view.View.OnKeyListener);
method public void setOnLongClickListener(android.view.View.OnLongClickListener);
method public void setOnSystemUiVisibilityChangeListener(android.view.View.OnSystemUiVisibilityChangeListener);
@@ -21396,6 +23207,8 @@
method public void setScaleY(float);
method public void setScrollBarStyle(int);
method public void setScrollContainer(boolean);
+ method public void setScrollX(int);
+ method public void setScrollY(int);
method public void setScrollbarFadingEnabled(boolean);
method public void setSelected(boolean);
method public void setSoundEffectsEnabled(boolean);
@@ -21423,6 +23236,7 @@
method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
method public boolean willNotCacheDrawing();
method public boolean willNotDraw();
+ field public static android.util.Property ALPHA;
field public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0
field public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000
field public static final int DRAWING_CACHE_QUALITY_LOW = 524288; // 0x80000
@@ -21435,6 +23249,8 @@
field protected static final int[] ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
field protected static final int[] ENABLED_STATE_SET;
field protected static final int[] ENABLED_WINDOW_FOCUSED_STATE_SET;
+ field public static final int FIND_VIEWS_WITH_CONTENT_DESCRIPTION = 2; // 0x2
+ field public static final int FIND_VIEWS_WITH_TEXT = 1; // 0x1
field public static final int FOCUSABLES_ALL = 0; // 0x0
field public static final int FOCUSABLES_TOUCH_MODE = 1; // 0x1
field protected static final int[] FOCUSED_SELECTED_STATE_SET;
@@ -21477,6 +23293,11 @@
field protected static final int[] PRESSED_SELECTED_STATE_SET;
field protected static final int[] PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
field protected static final int[] PRESSED_WINDOW_FOCUSED_STATE_SET;
+ field public static android.util.Property ROTATION;
+ field public static android.util.Property ROTATION_X;
+ field public static android.util.Property ROTATION_Y;
+ field public static android.util.Property SCALE_X;
+ field public static android.util.Property SCALE_Y;
field public static final int SCROLLBARS_INSIDE_INSET = 16777216; // 0x1000000
field public static final int SCROLLBARS_INSIDE_OVERLAY = 0; // 0x0
field public static final int SCROLLBARS_OUTSIDE_INSET = 50331648; // 0x3000000
@@ -21487,11 +23308,29 @@
field protected static final int[] SELECTED_STATE_SET;
field protected static final int[] SELECTED_WINDOW_FOCUSED_STATE_SET;
field public static final int SOUND_EFFECTS_ENABLED = 134217728; // 0x8000000
- field public static final int STATUS_BAR_HIDDEN = 1; // 0x1
- field public static final int STATUS_BAR_VISIBLE = 0; // 0x0
+ field public static final deprecated int STATUS_BAR_HIDDEN = 1; // 0x1
+ field public static final deprecated int STATUS_BAR_VISIBLE = 0; // 0x0
+ field public static final int SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2; // 0x2
+ field public static final int SYSTEM_UI_FLAG_LOW_PROFILE = 1; // 0x1
+ field public static final int SYSTEM_UI_FLAG_VISIBLE = 0; // 0x0
+ field public static android.util.Property TRANSLATION_X;
+ field public static android.util.Property TRANSLATION_Y;
field protected static final java.lang.String VIEW_LOG_TAG = "View";
field public static final int VISIBLE = 0; // 0x0
field protected static final int[] WINDOW_FOCUSED_STATE_SET;
+ field public static android.util.Property X;
+ field public static android.util.Property Y;
+ }
+
+ public static class View.AccessibilityDelegate {
+ ctor public View.AccessibilityDelegate();
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo);
+ method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public void sendAccessibilityEvent(android.view.View, int);
+ method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
}
public static class View.BaseSavedState extends android.view.AbsSavedState {
@@ -21544,6 +23383,10 @@
method public abstract boolean onGenericMotion(android.view.View, android.view.MotionEvent);
}
+ public static abstract interface View.OnHoverListener {
+ method public abstract boolean onHover(android.view.View, android.view.MotionEvent);
+ }
+
public static abstract interface View.OnKeyListener {
method public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);
}
@@ -21599,6 +23442,7 @@
method public static deprecated int getTouchSlop();
method public static deprecated int getWindowTouchSlop();
method public static long getZoomControlsTimeout();
+ method public boolean hasPermanentMenuKey();
}
public class ViewDebug {
@@ -21714,9 +23558,11 @@
method protected void measureChildren(int, int);
method public final void offsetDescendantRectToMyCoords(android.view.View, android.graphics.Rect);
method public final void offsetRectIntoDescendantCoords(android.view.View, android.graphics.Rect);
+ method public boolean onInterceptHoverEvent(android.view.MotionEvent);
method public boolean onInterceptTouchEvent(android.view.MotionEvent);
method protected abstract void onLayout(boolean, int, int, int, int);
method protected boolean onRequestFocusInDescendants(int, android.graphics.Rect);
+ method public boolean onRequestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
method public void recomputeViewAttributes(android.view.View);
method public void removeAllViews();
method public void removeAllViewsInLayout();
@@ -21729,7 +23575,10 @@
method public void requestChildFocus(android.view.View, android.view.View);
method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
method public void requestDisallowInterceptTouchEvent(boolean);
+ method public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
method public void requestTransparentRegion(android.view.View);
+ method protected void resetResolvedLayoutDirection();
+ method protected void resetResolvedTextDirection();
method public void scheduleLayoutAnimation();
method public void setAddStatesFromChildren(boolean);
method public void setAlwaysDrawnWithCacheEnabled(boolean);
@@ -21747,6 +23596,7 @@
method public void setOnHierarchyChangeListener(android.view.ViewGroup.OnHierarchyChangeListener);
method public void setPersistentDrawingCache(int);
method protected void setStaticTransformationsEnabled(boolean);
+ method public boolean shouldDelayChildPressedState();
method public boolean showContextMenuForChild(android.view.View);
method public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback);
method public void startLayoutAnimation();
@@ -21815,6 +23665,7 @@
method public abstract boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
method public abstract void requestDisallowInterceptTouchEvent(boolean);
method public abstract void requestLayout();
+ method public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
method public abstract void requestTransparentRegion(android.view.View);
method public abstract boolean showContextMenuForChild(android.view.View);
method public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode.Callback);
@@ -21823,6 +23674,9 @@
public class ViewPropertyAnimator {
method public android.view.ViewPropertyAnimator alpha(float);
method public android.view.ViewPropertyAnimator alphaBy(float);
+ method public void cancel();
+ method public long getDuration();
+ method public long getStartDelay();
method public android.view.ViewPropertyAnimator rotation(float);
method public android.view.ViewPropertyAnimator rotationBy(float);
method public android.view.ViewPropertyAnimator rotationX(float);
@@ -21836,6 +23690,8 @@
method public android.view.ViewPropertyAnimator setDuration(long);
method public android.view.ViewPropertyAnimator setInterpolator(android.animation.TimeInterpolator);
method public android.view.ViewPropertyAnimator setListener(android.animation.Animator.AnimatorListener);
+ method public android.view.ViewPropertyAnimator setStartDelay(long);
+ method public void start();
method public android.view.ViewPropertyAnimator translationX(float);
method public android.view.ViewPropertyAnimator translationXBy(float);
method public android.view.ViewPropertyAnimator translationY(float);
@@ -21949,6 +23805,7 @@
method public abstract void setContentView(android.view.View);
method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
method protected void setDefaultWindowFormat(int);
+ method public void setDimAmount(float);
method public abstract void setFeatureDrawable(int, android.graphics.drawable.Drawable);
method public abstract void setFeatureDrawableAlpha(int, int);
method public abstract void setFeatureDrawableResource(int, int);
@@ -21962,6 +23819,8 @@
method public abstract void setTitle(java.lang.CharSequence);
method public abstract void setTitleColor(int);
method public void setType(int);
+ method public void setUiOptions(int);
+ method public void setUiOptions(int, int);
method public abstract void setVolumeControlStream(int);
method public void setWindowAnimations(int);
method public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String);
@@ -22060,7 +23919,7 @@
field public static final int FLAGS_CHANGED = 4; // 0x4
field public static final int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 1; // 0x1
field public static final int FLAG_ALT_FOCUSABLE_IM = 131072; // 0x20000
- field public static final int FLAG_BLUR_BEHIND = 4; // 0x4
+ field public static final deprecated int FLAG_BLUR_BEHIND = 4; // 0x4
field public static final int FLAG_DIM_BEHIND = 2; // 0x2
field public static final int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
field public static final int FLAG_DITHER = 4096; // 0x1000
@@ -22163,6 +24022,7 @@
public final class AccessibilityEvent extends android.view.accessibility.AccessibilityRecord implements android.os.Parcelable {
method public void appendRecord(android.view.accessibility.AccessibilityRecord);
method public int describeContents();
+ method public static java.lang.String eventTypeToString(int);
method public long getEventTime();
method public int getEventType();
method public java.lang.CharSequence getPackageName();
@@ -22170,6 +24030,7 @@
method public int getRecordCount();
method public void initFromParcel(android.os.Parcel);
method public static android.view.accessibility.AccessibilityEvent obtain(int);
+ method public static android.view.accessibility.AccessibilityEvent obtain(android.view.accessibility.AccessibilityEvent);
method public static android.view.accessibility.AccessibilityEvent obtain();
method public void setEventTime(long);
method public void setEventType(int);
@@ -22180,11 +24041,18 @@
field public static final deprecated int MAX_TEXT_LENGTH = 500; // 0x1f4
field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
field public static final int TYPE_NOTIFICATION_STATE_CHANGED = 64; // 0x40
+ field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+ field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
field public static final int TYPE_VIEW_CLICKED = 1; // 0x1
field public static final int TYPE_VIEW_FOCUSED = 8; // 0x8
+ field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+ field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
field public static final int TYPE_VIEW_LONG_CLICKED = 2; // 0x2
+ field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
field public static final int TYPE_VIEW_SELECTED = 4; // 0x4
field public static final int TYPE_VIEW_TEXT_CHANGED = 16; // 0x10
+ field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+ field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
field public static final int TYPE_WINDOW_STATE_CHANGED = 32; // 0x20
}
@@ -22194,12 +24062,78 @@
}
public final class AccessibilityManager {
- method public java.util.List<android.content.pm.ServiceInfo> getAccessibilityServiceList();
+ method public boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
+ method public deprecated java.util.List<android.content.pm.ServiceInfo> getAccessibilityServiceList();
+ method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int);
+ method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList();
method public void interrupt();
method public boolean isEnabled();
+ method public boolean isTouchExplorationEnabled();
+ method public boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
method public void sendAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
}
+ public static abstract interface AccessibilityManager.AccessibilityStateChangeListener {
+ method public abstract void onAccessibilityStateChanged(boolean);
+ }
+
+ public class AccessibilityNodeInfo implements android.os.Parcelable {
+ method public void addAction(int);
+ method public void addChild(android.view.View);
+ method public int describeContents();
+ method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String);
+ method public int getActions();
+ method public void getBoundsInParent(android.graphics.Rect);
+ method public void getBoundsInScreen(android.graphics.Rect);
+ method public android.view.accessibility.AccessibilityNodeInfo getChild(int);
+ method public int getChildCount();
+ method public java.lang.CharSequence getClassName();
+ method public java.lang.CharSequence getContentDescription();
+ method public java.lang.CharSequence getPackageName();
+ method public android.view.accessibility.AccessibilityNodeInfo getParent();
+ method public java.lang.CharSequence getText();
+ method public int getWindowId();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isClickable();
+ method public boolean isEnabled();
+ method public boolean isFocusable();
+ method public boolean isFocused();
+ method public boolean isLongClickable();
+ method public boolean isPassword();
+ method public boolean isScrollable();
+ method public boolean isSelected();
+ method public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View);
+ method public static android.view.accessibility.AccessibilityNodeInfo obtain();
+ method public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.accessibility.AccessibilityNodeInfo);
+ method public boolean performAction(int);
+ method public void recycle();
+ method public void setBoundsInParent(android.graphics.Rect);
+ method public void setBoundsInScreen(android.graphics.Rect);
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setClassName(java.lang.CharSequence);
+ method public void setClickable(boolean);
+ method public void setContentDescription(java.lang.CharSequence);
+ method public void setEnabled(boolean);
+ method public void setFocusable(boolean);
+ method public void setFocused(boolean);
+ method public void setLongClickable(boolean);
+ method public void setPackageName(java.lang.CharSequence);
+ method public void setParent(android.view.View);
+ method public void setPassword(boolean);
+ method public void setScrollable(boolean);
+ method public void setSelected(boolean);
+ method public void setSource(android.view.View);
+ method public void setText(java.lang.CharSequence);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+ field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+ field public static final int ACTION_FOCUS = 1; // 0x1
+ field public static final int ACTION_SELECT = 4; // 0x4
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
public class AccessibilityRecord {
method public int getAddedCount();
method public java.lang.CharSequence getBeforeText();
@@ -22210,11 +24144,18 @@
method public int getItemCount();
method public android.os.Parcelable getParcelableData();
method public int getRemovedCount();
+ method public int getScrollX();
+ method public int getScrollY();
+ method public android.view.accessibility.AccessibilityNodeInfo getSource();
method public java.util.List<java.lang.CharSequence> getText();
+ method public int getToIndex();
+ method public int getWindowId();
method public boolean isChecked();
method public boolean isEnabled();
method public boolean isFullScreen();
method public boolean isPassword();
+ method public boolean isScrollable();
+ method public static android.view.accessibility.AccessibilityRecord obtain(android.view.accessibility.AccessibilityRecord);
method public static android.view.accessibility.AccessibilityRecord obtain();
method public void recycle();
method public void setAddedCount(int);
@@ -22230,7 +24171,13 @@
method public void setParcelableData(android.os.Parcelable);
method public void setPassword(boolean);
method public void setRemovedCount(int);
+ method public void setScrollX(int);
+ method public void setScrollY(int);
+ method public void setScrollable(boolean);
+ method public void setSource(android.view.View);
+ method public void setToIndex(int);
}
+
}
package android.view.animation {
@@ -22732,6 +24679,7 @@
method public java.util.List<android.view.inputmethod.InputMethodInfo> getEnabledInputMethodList();
method public java.util.List<android.view.inputmethod.InputMethodSubtype> getEnabledInputMethodSubtypeList(android.view.inputmethod.InputMethodInfo, boolean);
method public java.util.List<android.view.inputmethod.InputMethodInfo> getInputMethodList();
+ method public android.view.inputmethod.InputMethodSubtype getLastInputMethodSubtype();
method public java.util.Map<android.view.inputmethod.InputMethodInfo, java.util.List<android.view.inputmethod.InputMethodSubtype>> getShortcutInputMethodsAndSubtypes();
method public void hideSoftInputFromInputMethod(android.os.IBinder, int);
method public boolean hideSoftInputFromWindow(android.os.IBinder, int);
@@ -22744,6 +24692,7 @@
method public boolean isWatchingCursor(android.view.View);
method public void restartInput(android.view.View);
method public void sendAppPrivateCommand(android.view.View, java.lang.String, android.os.Bundle);
+ method public void setAdditionalInputMethodSubtypes(java.lang.String, android.view.inputmethod.InputMethodSubtype[]);
method public boolean setCurrentInputMethodSubtype(android.view.inputmethod.InputMethodSubtype);
method public void setInputMethod(android.os.IBinder, java.lang.String);
method public void setInputMethodAndSubtype(android.os.IBinder, java.lang.String, android.view.inputmethod.InputMethodSubtype);
@@ -22759,6 +24708,7 @@
method public void updateCursor(android.view.View, int, int, int, int);
method public void updateExtractedText(android.view.View, int, android.view.inputmethod.ExtractedText);
method public void updateSelection(android.view.View, int, int, int, int);
+ method public void viewClicked(android.view.View);
field public static final int HIDE_IMPLICIT_ONLY = 1; // 0x1
field public static final int HIDE_NOT_ALWAYS = 2; // 0x2
field public static final int RESULT_HIDDEN = 3; // 0x3
@@ -22779,6 +24729,7 @@
method public abstract void updateCursor(android.graphics.Rect);
method public abstract void updateExtractedText(int, android.view.inputmethod.ExtractedText);
method public abstract void updateSelection(int, int, int, int, int, int);
+ method public abstract void viewClicked(boolean);
}
public static abstract interface InputMethodSession.EventCallback {
@@ -22786,20 +24737,100 @@
}
public final class InputMethodSubtype implements android.os.Parcelable {
+ ctor public InputMethodSubtype(int, int, java.lang.String, java.lang.String, java.lang.String, boolean, boolean);
method public boolean containsExtraValueKey(java.lang.String);
method public int describeContents();
+ method public java.lang.CharSequence getDisplayName(android.content.Context, java.lang.String, android.content.pm.ApplicationInfo);
method public java.lang.String getExtraValue();
method public java.lang.String getExtraValueOf(java.lang.String);
method public int getIconResId();
method public java.lang.String getLocale();
method public java.lang.String getMode();
method public int getNameResId();
+ method public boolean isAuxiliary();
+ method public boolean overridesImplicitlyEnabledSubtype();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
}
}
+package android.view.textservice {
+
+ public final class SpellCheckerInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.content.ComponentName getComponent();
+ method public java.lang.String getId();
+ method public java.lang.String getPackageName();
+ method public android.content.pm.ServiceInfo getServiceInfo();
+ method public java.lang.String getSettingsActivity();
+ method public android.view.textservice.SpellCheckerSubtype getSubtypeAt(int);
+ method public int getSubtypeCount();
+ method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
+ method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+ public class SpellCheckerSession {
+ method public void close();
+ method public android.view.textservice.SpellCheckerInfo getSpellChecker();
+ method public void getSuggestions(android.view.textservice.TextInfo, int);
+ method public void getSuggestions(android.view.textservice.TextInfo[], int, boolean);
+ method public boolean isSessionDisconnected();
+ field public static final java.lang.String SERVICE_META_DATA = "android.view.textservice.scs";
+ }
+
+ public static abstract interface SpellCheckerSession.SpellCheckerSessionListener {
+ method public abstract void onGetSuggestions(android.view.textservice.SuggestionsInfo[]);
+ }
+
+ public final class SpellCheckerSubtype implements android.os.Parcelable {
+ ctor public SpellCheckerSubtype(int, java.lang.String, java.lang.String);
+ method public int describeContents();
+ method public java.lang.CharSequence getDisplayName(android.content.Context, java.lang.String, android.content.pm.ApplicationInfo);
+ method public java.lang.String getExtraValue();
+ method public java.lang.String getLocale();
+ method public int getNameResId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+ public final class SuggestionsInfo implements android.os.Parcelable {
+ ctor public SuggestionsInfo(int, java.lang.String[]);
+ ctor public SuggestionsInfo(int, java.lang.String[], int, int);
+ ctor public SuggestionsInfo(android.os.Parcel);
+ method public int describeContents();
+ method public int getCookie();
+ method public int getSequence();
+ method public java.lang.String getSuggestionAt(int);
+ method public int getSuggestionsAttributes();
+ method public int getSuggestionsCount();
+ method public void setCookieAndSequence(int, int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int RESULT_ATTR_IN_THE_DICTIONARY = 1; // 0x1
+ field public static final int RESULT_ATTR_LOOKS_LIKE_TYPO = 2; // 0x2
+ }
+
+ public final class TextInfo implements android.os.Parcelable {
+ ctor public TextInfo(java.lang.String);
+ ctor public TextInfo(java.lang.String, int, int);
+ ctor public TextInfo(android.os.Parcel);
+ method public int describeContents();
+ method public int getCookie();
+ method public int getSequence();
+ method public java.lang.String getText();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+ public final class TextServicesManager {
+ method public android.view.textservice.SpellCheckerSession newSpellCheckerSession(android.os.Bundle, java.util.Locale, android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener, boolean);
+ }
+
+}
+
package android.webkit {
public final deprecated class CacheManager {
@@ -22987,6 +25018,7 @@
method public void onReceivedTouchIconUrl(android.webkit.WebView, java.lang.String, boolean);
method public void onRequestFocus(android.webkit.WebView);
method public void onShowCustomView(android.view.View, android.webkit.WebChromeClient.CustomViewCallback);
+ method public void onShowCustomView(android.view.View, int, android.webkit.WebChromeClient.CustomViewCallback);
}
public static abstract interface WebChromeClient.CustomViewCallback {
@@ -23061,7 +25093,8 @@
method public boolean getSavePassword();
method public synchronized java.lang.String getSerifFontFamily();
method public synchronized java.lang.String getStandardFontFamily();
- method public synchronized android.webkit.WebSettings.TextSize getTextSize();
+ method public deprecated synchronized android.webkit.WebSettings.TextSize getTextSize();
+ method public synchronized int getTextZoom();
method public deprecated synchronized boolean getUseDoubleTree();
method public deprecated boolean getUseWebViewBackgroundForOverscrollBackground();
method public synchronized boolean getUseWideViewPort();
@@ -23111,7 +25144,8 @@
method public synchronized void setStandardFontFamily(java.lang.String);
method public synchronized void setSupportMultipleWindows(boolean);
method public void setSupportZoom(boolean);
- method public synchronized void setTextSize(android.webkit.WebSettings.TextSize);
+ method public deprecated synchronized void setTextSize(android.webkit.WebSettings.TextSize);
+ method public synchronized void setTextZoom(int);
method public deprecated synchronized void setUseDoubleTree(boolean);
method public deprecated void setUseWebViewBackgroundForOverscrollBackground(boolean);
method public synchronized void setUseWideViewPort(boolean);
@@ -23150,7 +25184,7 @@
enum_constant public static final android.webkit.WebSettings.RenderPriority NORMAL;
}
- public static final class WebSettings.TextSize extends java.lang.Enum {
+ public static final deprecated class WebSettings.TextSize extends java.lang.Enum {
method public static android.webkit.WebSettings.TextSize valueOf(java.lang.String);
method public static final android.webkit.WebSettings.TextSize[] values();
enum_constant public static final android.webkit.WebSettings.TextSize LARGER;
@@ -23300,11 +25334,11 @@
public class WebView.HitTestResult {
method public java.lang.String getExtra();
method public int getType();
- field public static final int ANCHOR_TYPE = 1; // 0x1
+ field public static final deprecated int ANCHOR_TYPE = 1; // 0x1
field public static final int EDIT_TEXT_TYPE = 9; // 0x9
field public static final int EMAIL_TYPE = 4; // 0x4
field public static final int GEO_TYPE = 3; // 0x3
- field public static final int IMAGE_ANCHOR_TYPE = 6; // 0x6
+ field public static final deprecated int IMAGE_ANCHOR_TYPE = 6; // 0x6
field public static final int IMAGE_TYPE = 5; // 0x5
field public static final int PHONE_TYPE = 2; // 0x2
field public static final int SRC_ANCHOR_TYPE = 7; // 0x7
@@ -23384,6 +25418,7 @@
method public void beforeTextChanged(java.lang.CharSequence, int, int, int);
method public void clearChoices();
method public void clearTextFilter();
+ method public void deferNotifyDataSetChanged();
method public int getCacheColorHint();
method public int getCheckedItemCount();
method public long[] getCheckedItemIds();
@@ -23597,7 +25632,9 @@
public abstract class AdapterViewAnimator extends android.widget.AdapterView {
ctor public AdapterViewAnimator(android.content.Context);
ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet);
+ ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet, int);
method public void advance();
+ method public void deferNotifyDataSetChanged();
method public void fyiWillBeAdvancedByHostKThx();
method public android.widget.Adapter getAdapter();
method public android.view.View getCurrentView();
@@ -23954,6 +25991,17 @@
ctor public DigitalClock(android.content.Context, android.util.AttributeSet);
}
+ public class EdgeEffect {
+ ctor public EdgeEffect(android.content.Context);
+ method public boolean draw(android.graphics.Canvas);
+ method public void finish();
+ method public boolean isFinished();
+ method public void onAbsorb(int);
+ method public void onPull(float);
+ method public void onRelease();
+ method public void setSize(int, int);
+ }
+
public class EditText extends android.widget.TextView {
ctor public EditText(android.content.Context);
ctor public EditText(android.content.Context, android.util.AttributeSet);
@@ -23991,6 +26039,7 @@
ctor public ExpandableListView(android.content.Context, android.util.AttributeSet, int);
method public boolean collapseGroup(int);
method public boolean expandGroup(int);
+ method public boolean expandGroup(int, boolean);
method public android.widget.ExpandableListAdapter getExpandableListAdapter();
method public long getExpandableListPosition(int);
method public int getFlatListPosition(long);
@@ -24075,8 +26124,9 @@
ctor public FrameLayout(android.content.Context);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int);
- method public boolean getConsiderGoneChildrenWhenMeasuring();
+ method public deprecated boolean getConsiderGoneChildrenWhenMeasuring();
method public android.graphics.drawable.Drawable getForeground();
+ method public boolean getMeasureAllChildren();
method protected void onLayout(boolean, int, int, int, int);
method public void setForeground(android.graphics.drawable.Drawable);
method public void setForegroundGravity(int);
@@ -24115,6 +26165,61 @@
ctor public Gallery.LayoutParams(android.view.ViewGroup.LayoutParams);
}
+ public class GridLayout extends android.view.ViewGroup {
+ ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
+ ctor public GridLayout(android.content.Context, android.util.AttributeSet);
+ ctor public GridLayout(android.content.Context);
+ method public int getAlignmentMode();
+ method public int getColumnCount();
+ method public int getOrientation();
+ method public int getRowCount();
+ method public boolean getUseDefaultMargins();
+ method public boolean isColumnOrderPreserved();
+ method public boolean isRowOrderPreserved();
+ method protected void onLayout(boolean, int, int, int, int);
+ method public void setAlignmentMode(int);
+ method public void setColumnCount(int);
+ method public void setColumnOrderPreserved(boolean);
+ method public void setOrientation(int);
+ method public void setRowCount(int);
+ method public void setRowOrderPreserved(boolean);
+ method public void setUseDefaultMargins(boolean);
+ method public static android.widget.GridLayout.Spec spec(int, int, android.widget.GridLayout.Alignment);
+ method public static android.widget.GridLayout.Spec spec(int, android.widget.GridLayout.Alignment);
+ method public static android.widget.GridLayout.Spec spec(int, int);
+ method public static android.widget.GridLayout.Spec spec(int);
+ field public static final int ALIGN_BOUNDS = 0; // 0x0
+ field public static final int ALIGN_MARGINS = 1; // 0x1
+ field public static final android.widget.GridLayout.Alignment BASELINE;
+ field public static final android.widget.GridLayout.Alignment BOTTOM;
+ field public static final android.widget.GridLayout.Alignment CENTER;
+ field public static final android.widget.GridLayout.Alignment FILL;
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final android.widget.GridLayout.Alignment LEFT;
+ field public static final android.widget.GridLayout.Alignment RIGHT;
+ field public static final android.widget.GridLayout.Alignment TOP;
+ field public static final int UNDEFINED = -2147483648; // 0x80000000
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public static abstract class GridLayout.Alignment {
+ }
+
+ public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public GridLayout.LayoutParams(android.widget.GridLayout.Spec, android.widget.GridLayout.Spec);
+ ctor public GridLayout.LayoutParams();
+ ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+ ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+ ctor public GridLayout.LayoutParams(android.widget.GridLayout.LayoutParams);
+ ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+ method public void setGravity(int);
+ field public android.widget.GridLayout.Spec columnSpec;
+ field public android.widget.GridLayout.Spec rowSpec;
+ }
+
+ public static class GridLayout.Spec {
+ }
+
public class GridView extends android.widget.AbsListView {
ctor public GridView(android.content.Context);
ctor public GridView(android.content.Context, android.util.AttributeSet);
@@ -24247,6 +26352,7 @@
ctor public LinearLayout(android.content.Context, android.util.AttributeSet);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int);
method public int getBaselineAlignedChildIndex();
+ method public int getDividerPadding();
method public int getOrientation();
method public int getShowDividers();
method public float getWeightSum();
@@ -24256,6 +26362,7 @@
method public void setBaselineAligned(boolean);
method public void setBaselineAlignedChildIndex(int);
method public void setDividerDrawable(android.graphics.drawable.Drawable);
+ method public void setDividerPadding(int);
method public void setGravity(int);
method public void setHorizontalGravity(int);
method public void setMeasureWithLargestChildEnabled(boolean);
@@ -24481,6 +26588,7 @@
method public void fling(int, int, int, int, int, int, int, int);
method public void fling(int, int, int, int, int, int, int, int, int, int);
method public final void forceFinished(boolean);
+ method public float getCurrVelocity();
method public final int getCurrX();
method public final int getCurrY();
method public final int getFinalX();
@@ -24502,10 +26610,16 @@
method public void dismiss();
method public android.view.Menu getMenu();
method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(int);
+ method public void setOnDismissListener(android.widget.PopupMenu.OnDismissListener);
method public void setOnMenuItemClickListener(android.widget.PopupMenu.OnMenuItemClickListener);
method public void show();
}
+ public static abstract interface PopupMenu.OnDismissListener {
+ method public abstract void onDismiss(android.widget.PopupMenu);
+ }
+
public static abstract interface PopupMenu.OnMenuItemClickListener {
method public abstract boolean onMenuItemClick(android.view.MenuItem);
}
@@ -24731,7 +26845,8 @@
method public void setPendingIntentTemplate(int, android.app.PendingIntent);
method public void setProgressBar(int, int, int, boolean);
method public void setRelativeScrollPosition(int, int);
- method public void setRemoteAdapter(int, int, android.content.Intent);
+ method public deprecated void setRemoteAdapter(int, int, android.content.Intent);
+ method public void setRemoteAdapter(int, android.content.Intent);
method public void setScrollPosition(int, int);
method public void setShort(int, java.lang.String, short);
method public void setString(int, java.lang.String, java.lang.String);
@@ -24816,6 +26931,7 @@
method public void extendDuration(int);
method public void fling(int, int, int, int, int, int, int, int);
method public final void forceFinished(boolean);
+ method public float getCurrVelocity();
method public final int getCurrX();
method public final int getCurrY();
method public final int getDuration();
@@ -24832,7 +26948,7 @@
method public int timePassed();
}
- public class SearchView extends android.widget.LinearLayout {
+ public class SearchView extends android.widget.LinearLayout implements android.view.CollapsibleActionView {
ctor public SearchView(android.content.Context);
ctor public SearchView(android.content.Context, android.util.AttributeSet);
method public java.lang.CharSequence getQuery();
@@ -24841,8 +26957,12 @@
method public boolean isIconified();
method public boolean isQueryRefinementEnabled();
method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
method public void setIconified(boolean);
method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
method public void setMaxWidth(int);
method public void setOnCloseListener(android.widget.SearchView.OnCloseListener);
method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
@@ -24890,6 +27010,19 @@
method public abstract void onStopTrackingTouch(android.widget.SeekBar);
}
+ public class ShareActionProvider extends android.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context);
+ method public android.view.View onCreateActionView();
+ method public void setOnShareTargetSelectedListener(android.widget.ShareActionProvider.OnShareTargetSelectedListener);
+ method public void setShareHistoryFileName(java.lang.String);
+ method public void setShareIntent(android.content.Intent);
+ field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public abstract boolean onShareTargetSelected(android.widget.ShareActionProvider, android.content.Intent);
+ }
+
public class SimpleAdapter extends android.widget.BaseAdapter implements android.widget.Filterable {
ctor public SimpleAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String, ?>>, int, java.lang.String[], int[]);
method public int getCount();
@@ -25002,6 +27135,12 @@
method public abstract void onScrollStarted();
}
+ public final class Space extends android.view.View {
+ ctor public Space(android.content.Context, android.util.AttributeSet, int);
+ ctor public Space(android.content.Context, android.util.AttributeSet);
+ ctor public Space(android.content.Context);
+ }
+
public class Spinner extends android.widget.AbsSpinner implements android.content.DialogInterface.OnClickListener {
ctor public Spinner(android.content.Context);
ctor public Spinner(android.content.Context, int);
@@ -25024,6 +27163,21 @@
public class StackView extends android.widget.AdapterViewAnimator {
ctor public StackView(android.content.Context);
ctor public StackView(android.content.Context, android.util.AttributeSet);
+ ctor public StackView(android.content.Context, android.util.AttributeSet, int);
+ }
+
+ public class Switch extends android.widget.CompoundButton {
+ ctor public Switch(android.content.Context);
+ ctor public Switch(android.content.Context, android.util.AttributeSet);
+ ctor public Switch(android.content.Context, android.util.AttributeSet, int);
+ method public java.lang.CharSequence getTextOff();
+ method public java.lang.CharSequence getTextOn();
+ method public void onMeasure(int, int);
+ method public void setSwitchTextAppearance(android.content.Context, int);
+ method public void setSwitchTypeface(android.graphics.Typeface, int);
+ method public void setSwitchTypeface(android.graphics.Typeface);
+ method public void setTextOff(java.lang.CharSequence);
+ method public void setTextOn(java.lang.CharSequence);
}
public class TabHost extends android.widget.FrameLayout implements android.view.ViewTreeObserver.OnTouchModeChangeListener {
@@ -25182,6 +27336,7 @@
method public final android.content.res.ColorStateList getLinkTextColors();
method public final boolean getLinksClickable();
method public final android.text.method.MovementMethod getMovementMethod();
+ method public int getOffsetForPosition(float, float);
method public android.text.TextPaint getPaint();
method public int getPaintFlags();
method public java.lang.String getPrivateImeOptions();
@@ -25202,6 +27357,7 @@
method public android.text.style.URLSpan[] getUrls();
method public boolean hasSelection();
method public boolean isInputMethodTarget();
+ method public boolean isSuggestionsEnabled();
method public boolean isTextSelectable();
method public int length();
method public boolean moveCursorToVisibleOffset();
@@ -25218,6 +27374,11 @@
method protected void onTextChanged(java.lang.CharSequence, int, int, int);
method public boolean onTextContextMenuItem(int);
method public void removeTextChangedListener(android.text.TextWatcher);
+ method protected void resetResolvedDrawables();
+ method protected void resetResolvedLayoutDirection();
+ method protected void resolveDrawables();
+ method protected void resolveTextDirection();
+ method public void setAllCaps(boolean);
method public final void setAutoLinkMask(int);
method public void setCompoundDrawablePadding(int);
method public void setCompoundDrawables(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
@@ -25490,10 +27651,10 @@
package dalvik.annotation {
- public abstract class TestTarget implements java.lang.annotation.Annotation {
+ public abstract deprecated class TestTarget implements java.lang.annotation.Annotation {
}
- public abstract class TestTargetClass implements java.lang.annotation.Annotation {
+ public abstract deprecated class TestTargetClass implements java.lang.annotation.Annotation {
}
}
@@ -25788,6 +27949,11 @@
package dalvik.system {
+ public class BaseDexClassLoader extends java.lang.ClassLoader {
+ ctor public BaseDexClassLoader(java.lang.String, java.io.File, java.lang.String, java.lang.ClassLoader);
+ method public java.lang.String findLibrary(java.lang.String);
+ }
+
public class DexClassLoader extends dalvik.system.BaseDexClassLoader {
ctor public DexClassLoader(java.lang.String, java.lang.String, java.lang.String, java.lang.ClassLoader);
}
@@ -25806,7 +27972,6 @@
public class PathClassLoader extends dalvik.system.BaseDexClassLoader {
ctor public PathClassLoader(java.lang.String, java.lang.ClassLoader);
ctor public PathClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader);
- method public java.lang.String findLibrary(java.lang.String);
}
}
@@ -26241,9 +28406,7 @@
public final class FilePermission extends java.security.Permission implements java.io.Serializable {
ctor public FilePermission(java.lang.String, java.lang.String);
- method public boolean equals(java.lang.Object);
method public java.lang.String getActions();
- method public int hashCode();
method public boolean implies(java.security.Permission);
}
@@ -26380,10 +28543,10 @@
}
public class ObjectInputStream extends java.io.InputStream implements java.io.ObjectInput java.io.ObjectStreamConstants {
- ctor protected ObjectInputStream() throws java.io.IOException, java.lang.SecurityException;
+ ctor protected ObjectInputStream() throws java.io.IOException;
ctor public ObjectInputStream(java.io.InputStream) throws java.io.IOException, java.io.StreamCorruptedException;
method public void defaultReadObject() throws java.lang.ClassNotFoundException, java.io.IOException, java.io.NotActiveException;
- method protected boolean enableResolveObject(boolean) throws java.lang.SecurityException;
+ method protected boolean enableResolveObject(boolean);
method public int read() throws java.io.IOException;
method public boolean readBoolean() throws java.io.IOException;
method public byte readByte() throws java.io.IOException;
@@ -26441,13 +28604,13 @@
}
public class ObjectOutputStream extends java.io.OutputStream implements java.io.ObjectOutput java.io.ObjectStreamConstants {
- ctor protected ObjectOutputStream() throws java.io.IOException, java.lang.SecurityException;
+ ctor protected ObjectOutputStream() throws java.io.IOException;
ctor public ObjectOutputStream(java.io.OutputStream) throws java.io.IOException;
method protected void annotateClass(java.lang.Class<?>) throws java.io.IOException;
method protected void annotateProxyClass(java.lang.Class<?>) throws java.io.IOException;
method public void defaultWriteObject() throws java.io.IOException;
method protected void drain() throws java.io.IOException;
- method protected boolean enableReplaceObject(boolean) throws java.lang.SecurityException;
+ method protected boolean enableReplaceObject(boolean);
method public java.io.ObjectOutputStream.PutField putFields() throws java.io.IOException;
method protected java.lang.Object replaceObject(java.lang.Object) throws java.io.IOException;
method public void reset() throws java.io.IOException;
@@ -27276,28 +29439,28 @@
method public java.lang.ClassLoader getClassLoader();
method public java.lang.Class<?>[] getClasses();
method public java.lang.Class<?> getComponentType();
- method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
- method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
+ method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException;
+ method public java.lang.reflect.Constructor<?>[] getConstructors();
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- method public java.lang.Class<?>[] getDeclaredClasses() throws java.lang.SecurityException;
- method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
- method public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException;
- method public java.lang.reflect.Field getDeclaredField(java.lang.String) throws java.lang.NoSuchFieldException, java.lang.SecurityException;
- method public java.lang.reflect.Field[] getDeclaredFields() throws java.lang.SecurityException;
- method public java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
- method public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException;
+ method public java.lang.Class<?>[] getDeclaredClasses();
+ method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException;
+ method public java.lang.reflect.Constructor<?>[] getDeclaredConstructors();
+ method public java.lang.reflect.Field getDeclaredField(java.lang.String) throws java.lang.NoSuchFieldException;
+ method public java.lang.reflect.Field[] getDeclaredFields();
+ method public java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class<?>...) throws java.lang.NoSuchMethodException;
+ method public java.lang.reflect.Method[] getDeclaredMethods();
method public java.lang.Class<?> getDeclaringClass();
method public java.lang.Class<?> getEnclosingClass();
method public java.lang.reflect.Constructor<?> getEnclosingConstructor();
method public java.lang.reflect.Method getEnclosingMethod();
method public T[] getEnumConstants();
- method public java.lang.reflect.Field getField(java.lang.String) throws java.lang.NoSuchFieldException, java.lang.SecurityException;
- method public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException;
+ method public java.lang.reflect.Field getField(java.lang.String) throws java.lang.NoSuchFieldException;
+ method public java.lang.reflect.Field[] getFields();
method public java.lang.reflect.Type[] getGenericInterfaces();
method public java.lang.reflect.Type getGenericSuperclass();
method public java.lang.Class<?>[] getInterfaces();
- method public java.lang.reflect.Method getMethod(java.lang.String, java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
- method public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException;
+ method public java.lang.reflect.Method getMethod(java.lang.String, java.lang.Class<?>...) throws java.lang.NoSuchMethodException;
+ method public java.lang.reflect.Method[] getMethods();
method public int getModifiers();
method public java.lang.String getName();
method public java.lang.Package getPackage();
@@ -28478,7 +30641,7 @@
ctor public ReferenceQueue();
method public synchronized java.lang.ref.Reference<? extends T> poll();
method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException;
- method public synchronized java.lang.ref.Reference<? extends T> remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException;
+ method public synchronized java.lang.ref.Reference<? extends T> remove(long) throws java.lang.InterruptedException;
}
public class SoftReference extends java.lang.ref.Reference {
@@ -28502,8 +30665,8 @@
method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
method public boolean isAccessible();
method public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
- method public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean) throws java.lang.SecurityException;
- method public void setAccessible(boolean) throws java.lang.SecurityException;
+ method public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean);
+ method public void setAccessible(boolean);
}
public abstract interface AnnotatedElement {
@@ -28538,6 +30701,7 @@
}
public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
+ method public A getAnnotation(java.lang.Class<A>);
method public java.lang.Class<T> getDeclaringClass();
method public java.lang.Class<?>[] getExceptionTypes();
method public java.lang.reflect.Type[] getGenericExceptionTypes();
@@ -28555,6 +30719,7 @@
public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member {
method public java.lang.Object get(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
+ method public A getAnnotation(java.lang.Class<A>);
method public boolean getBoolean(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public byte getByte(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
method public char getChar(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
@@ -28619,6 +30784,7 @@
}
public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
+ method public A getAnnotation(java.lang.Class<A>);
method public java.lang.Class<?> getDeclaringClass();
method public java.lang.Object getDefaultValue();
method public java.lang.Class<?>[] getExceptionTypes();
@@ -28999,8 +31165,8 @@
ctor public DatagramSocket(java.net.SocketAddress) throws java.net.SocketException;
method public void bind(java.net.SocketAddress) throws java.net.SocketException;
method public void close();
- method public void connect(java.net.InetAddress, int);
method public void connect(java.net.SocketAddress) throws java.net.SocketException;
+ method public void connect(java.net.InetAddress, int);
method public void disconnect();
method public boolean getBroadcast() throws java.net.SocketException;
method public java.nio.channels.DatagramChannel getChannel();
@@ -29488,9 +31654,7 @@
public final class SocketPermission extends java.security.Permission implements java.io.Serializable {
ctor public SocketPermission(java.lang.String, java.lang.String);
- method public boolean equals(java.lang.Object);
method public java.lang.String getActions();
- method public int hashCode();
method public boolean implies(java.security.Permission);
}
@@ -30497,9 +32661,7 @@
public final class AllPermission extends java.security.Permission {
ctor public AllPermission(java.lang.String, java.lang.String);
ctor public AllPermission();
- method public boolean equals(java.lang.Object);
method public java.lang.String getActions();
- method public int hashCode();
method public boolean implies(java.security.Permission);
}
@@ -30513,9 +32675,7 @@
public abstract class BasicPermission extends java.security.Permission implements java.io.Serializable {
ctor public BasicPermission(java.lang.String);
ctor public BasicPermission(java.lang.String, java.lang.String);
- method public boolean equals(java.lang.Object);
method public java.lang.String getActions();
- method public int hashCode();
method public boolean implies(java.security.Permission);
}
@@ -30878,10 +33038,8 @@
public abstract class Permission implements java.security.Guard java.io.Serializable {
ctor public Permission(java.lang.String);
method public void checkGuard(java.lang.Object) throws java.lang.SecurityException;
- method public abstract boolean equals(java.lang.Object);
method public abstract java.lang.String getActions();
method public final java.lang.String getName();
- method public abstract int hashCode();
method public abstract boolean implies(java.security.Permission);
method public java.security.PermissionCollection newPermissionCollection();
}
@@ -31138,13 +33296,11 @@
public final class UnresolvedPermission extends java.security.Permission implements java.io.Serializable {
ctor public UnresolvedPermission(java.lang.String, java.lang.String, java.lang.String, java.security.cert.Certificate[]);
- method public boolean equals(java.lang.Object);
method public java.lang.String getActions();
method public java.lang.String getUnresolvedActions();
method public java.security.cert.Certificate[] getUnresolvedCerts();
method public java.lang.String getUnresolvedName();
method public java.lang.String getUnresolvedType();
- method public int hashCode();
method public boolean implies(java.security.Permission);
}
@@ -33935,8 +36091,8 @@
method public void and(java.util.BitSet);
method public void andNot(java.util.BitSet);
method public int cardinality();
- method public void clear();
method public void clear(int);
+ method public void clear();
method public void clear(int, int);
method public java.lang.Object clone();
method public void flip(int);
@@ -33951,8 +36107,8 @@
method public void or(java.util.BitSet);
method public void set(int);
method public void set(int, boolean);
- method public void set(int, int);
method public void set(int, int, boolean);
+ method public void set(int, int);
method public int size();
method public void xor(java.util.BitSet);
}
@@ -36363,7 +38519,7 @@
method public boolean isLoggable(java.util.logging.LogRecord);
method public abstract void publish(java.util.logging.LogRecord);
method protected void reportError(java.lang.String, java.lang.Exception, int);
- method public void setEncoding(java.lang.String) throws java.lang.SecurityException, java.io.UnsupportedEncodingException;
+ method public void setEncoding(java.lang.String) throws java.io.UnsupportedEncodingException;
method public void setErrorManager(java.util.logging.ErrorManager);
method public void setFilter(java.util.logging.Filter);
method public void setFormatter(java.util.logging.Formatter);
@@ -38660,11 +40816,9 @@
public final class PrivateCredentialPermission extends java.security.Permission {
ctor public PrivateCredentialPermission(java.lang.String, java.lang.String);
- method public boolean equals(java.lang.Object);
method public java.lang.String getActions();
method public java.lang.String getCredentialClass();
method public java.lang.String[][] getPrincipals();
- method public int hashCode();
method public boolean implies(java.security.Permission);
}
diff --git a/api/current.txt b/api/current.txt
index d91a887..0aa94b2 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -190,15 +190,15 @@
field public static final int accountPreferences = 16843423; // 0x101029f
field public static final int accountType = 16843407; // 0x101028f
field public static final int action = 16842797; // 0x101002d
- field public static final int actionBarDivider = 16843689; // 0x10103a9
- field public static final int actionBarItemBackground = 16843690; // 0x10103aa
+ field public static final int actionBarDivider = 16843675; // 0x101039b
+ field public static final int actionBarItemBackground = 16843676; // 0x101039c
field public static final int actionBarSize = 16843499; // 0x10102eb
- field public static final int actionBarSplitStyle = 16843670; // 0x1010396
+ field public static final int actionBarSplitStyle = 16843656; // 0x1010388
field public static final int actionBarStyle = 16843470; // 0x10102ce
field public static final int actionBarTabBarStyle = 16843508; // 0x10102f4
field public static final int actionBarTabStyle = 16843507; // 0x10102f3
field public static final int actionBarTabTextStyle = 16843509; // 0x10102f5
- field public static final int actionBarWidgetTheme = 16843685; // 0x10103a5
+ field public static final int actionBarWidgetTheme = 16843671; // 0x1010397
field public static final int actionButtonStyle = 16843480; // 0x10102d8
field public static final int actionDropDownStyle = 16843479; // 0x10102d7
field public static final int actionLayout = 16843515; // 0x10102fb
@@ -211,10 +211,10 @@
field public static final int actionModeCutDrawable = 16843537; // 0x1010311
field public static final int actionModePasteDrawable = 16843539; // 0x1010313
field public static final int actionModeSelectAllDrawable = 16843646; // 0x101037e
- field public static final int actionModeSplitBackground = 16843691; // 0x10103ab
- field public static final int actionModeStyle = 16843682; // 0x10103a2
+ field public static final int actionModeSplitBackground = 16843677; // 0x101039d
+ field public static final int actionModeStyle = 16843668; // 0x1010394
field public static final int actionOverflowButtonStyle = 16843510; // 0x10102f6
- field public static final int actionProviderClass = 16843671; // 0x1010397
+ field public static final int actionProviderClass = 16843657; // 0x1010389
field public static final int actionViewClass = 16843516; // 0x10102fc
field public static final int activatedBackgroundIndicator = 16843517; // 0x10102fd
field public static final int activityCloseEnterAnimation = 16842938; // 0x10100ba
@@ -260,8 +260,8 @@
field public static final int background = 16842964; // 0x10100d4
field public static final int backgroundDimAmount = 16842802; // 0x1010032
field public static final int backgroundDimEnabled = 16843295; // 0x101021f
- field public static final int backgroundSplit = 16843673; // 0x1010399
- field public static final int backgroundStacked = 16843672; // 0x1010398
+ field public static final int backgroundSplit = 16843659; // 0x101038b
+ field public static final int backgroundStacked = 16843658; // 0x101038a
field public static final int backupAgent = 16843391; // 0x101027f
field public static final int baseline = 16843548; // 0x101031c
field public static final int baselineAlignBottom = 16843042; // 0x1010122
@@ -270,7 +270,6 @@
field public static final int borderlessButtonStyle = 16843563; // 0x101032b
field public static final int bottom = 16843184; // 0x10101b0
field public static final int bottomBright = 16842957; // 0x10100cd
- field public static final int bottomChevronDrawable = 16843659; // 0x101038b
field public static final int bottomDark = 16842953; // 0x10100c9
field public static final int bottomLeftRadius = 16843179; // 0x10101ab
field public static final int bottomMedium = 16842958; // 0x10100ce
@@ -318,15 +317,15 @@
field public static final int codes = 16843330; // 0x1010242
field public static final int collapseColumns = 16843083; // 0x101014b
field public static final int color = 16843173; // 0x10101a5
- field public static final int colorActivatedHighlight = 16843678; // 0x101039e
+ field public static final int colorActivatedHighlight = 16843664; // 0x1010390
field public static final int colorBackground = 16842801; // 0x1010031
field public static final int colorBackgroundCacheHint = 16843435; // 0x10102ab
- field public static final int colorFocusedHighlight = 16843677; // 0x101039d
+ field public static final int colorFocusedHighlight = 16843663; // 0x101038f
field public static final int colorForeground = 16842800; // 0x1010030
field public static final int colorForegroundInverse = 16843270; // 0x1010206
- field public static final int colorLongPressedHighlight = 16843676; // 0x101039c
- field public static final int colorMultiSelectHighlight = 16843679; // 0x101039f
- field public static final int colorPressedHighlight = 16843675; // 0x101039b
+ field public static final int colorLongPressedHighlight = 16843662; // 0x101038e
+ field public static final int colorMultiSelectHighlight = 16843665; // 0x1010391
+ field public static final int colorPressedHighlight = 16843661; // 0x101038d
field public static final int columnCount = 16843639; // 0x1010377
field public static final int columnDelay = 16843215; // 0x10101cf
field public static final int columnOrderPreserved = 16843640; // 0x1010378
@@ -370,7 +369,7 @@
field public static final int dialogTitle = 16843250; // 0x10101f2
field public static final int digits = 16843110; // 0x1010166
field public static final int direction = 16843217; // 0x10101d1
- field public static final int directionDescriptions = 16843695; // 0x10103af
+ field public static final int directionDescriptions = 16843681; // 0x10103a1
field public static final int directionPriority = 16843218; // 0x10101d2
field public static final int disableDependentsState = 16843249; // 0x10101f1
field public static final int disabledAlpha = 16842803; // 0x1010033
@@ -384,11 +383,11 @@
field public static final int drawSelectorOnTop = 16843004; // 0x10100fc
field public static final int drawable = 16843161; // 0x1010199
field public static final int drawableBottom = 16843118; // 0x101016e
- field public static final int drawableEnd = 16843681; // 0x10103a1
+ field public static final int drawableEnd = 16843667; // 0x1010393
field public static final int drawableLeft = 16843119; // 0x101016f
field public static final int drawablePadding = 16843121; // 0x1010171
field public static final int drawableRight = 16843120; // 0x1010170
- field public static final int drawableStart = 16843680; // 0x10103a0
+ field public static final int drawableStart = 16843666; // 0x1010392
field public static final int drawableTop = 16843117; // 0x101016d
field public static final int drawingCacheQuality = 16842984; // 0x10100e8
field public static final int dropDownAnchor = 16843363; // 0x1010263
@@ -435,7 +434,7 @@
field public static final int fadeEnabled = 16843390; // 0x101027e
field public static final int fadeOffset = 16843383; // 0x1010277
field public static final int fadeScrollbars = 16843434; // 0x10102aa
- field public static final int fadingEdge = 16842975; // 0x10100df
+ field public static final deprecated int fadingEdge = 16842975; // 0x10100df
field public static final int fadingEdgeLength = 16842976; // 0x10100e0
field public static final int fastScrollAlwaysVisible = 16843573; // 0x1010335
field public static final int fastScrollEnabled = 16843302; // 0x1010226
@@ -445,7 +444,6 @@
field public static final int fastScrollTextColor = 16843609; // 0x1010359
field public static final int fastScrollThumbDrawable = 16843574; // 0x1010336
field public static final int fastScrollTrackDrawable = 16843577; // 0x1010339
- field public static final int feedbackCount = 16843665; // 0x1010391
field public static final int fillAfter = 16843197; // 0x10101bd
field public static final int fillBefore = 16843196; // 0x10101bc
field public static final int fillEnabled = 16843343; // 0x101024f
@@ -498,7 +496,6 @@
field public static final int hand_hour = 16843011; // 0x1010103
field public static final int hand_minute = 16843012; // 0x1010104
field public static final int handle = 16843354; // 0x101025a
- field public static final int handleDrawable = 16843655; // 0x1010387
field public static final int handleProfiling = 16842786; // 0x1010022
field public static final int hapticFeedbackEnabled = 16843358; // 0x101025e
field public static final int hardwareAccelerated = 16843475; // 0x10102d3
@@ -507,12 +504,10 @@
field public static final int headerDividersEnabled = 16843310; // 0x101022e
field public static final int height = 16843093; // 0x1010155
field public static final int hint = 16843088; // 0x1010150
- field public static final int hitRadius = 16843662; // 0x101038e
field public static final int homeAsUpIndicator = 16843531; // 0x101030b
field public static final int homeLayout = 16843549; // 0x101031d
field public static final int horizontalDivider = 16843053; // 0x101012d
field public static final int horizontalGap = 16843327; // 0x101023f
- field public static final int horizontalOffset = 16843667; // 0x1010393
field public static final int horizontalScrollViewStyle = 16843603; // 0x1010353
field public static final int horizontalSpacing = 16843028; // 0x1010114
field public static final int host = 16842792; // 0x1010028
@@ -630,7 +625,6 @@
field public static final int layout_x = 16843135; // 0x101017f
field public static final int layout_y = 16843136; // 0x1010180
field public static final int left = 16843181; // 0x10101ad
- field public static final int leftChevronDrawable = 16843656; // 0x1010388
field public static final int lineSpacingExtra = 16843287; // 0x1010217
field public static final int lineSpacingMultiplier = 16843288; // 0x1010218
field public static final int lines = 16843092; // 0x1010154
@@ -642,8 +636,10 @@
field public static final int listDividerAlertDialog = 16843525; // 0x1010305
field public static final int listPopupWindowStyle = 16843519; // 0x10102ff
field public static final int listPreferredItemHeight = 16842829; // 0x101004d
- field public static final int listPreferredItemHeightLarge = 16843668; // 0x1010394
- field public static final int listPreferredItemHeightSmall = 16843669; // 0x1010395
+ field public static final int listPreferredItemHeightLarge = 16843654; // 0x1010386
+ field public static final int listPreferredItemHeightSmall = 16843655; // 0x1010387
+ field public static final int listPreferredItemPaddingLeft = 16843683; // 0x10103a3
+ field public static final int listPreferredItemPaddingRight = 16843684; // 0x10103a4
field public static final int listSelector = 16843003; // 0x10100fb
field public static final int listSeparatorTextViewStyle = 16843272; // 0x1010208
field public static final int listViewStyle = 16842868; // 0x1010074
@@ -674,8 +670,8 @@
field public static final int minHeight = 16843072; // 0x1010140
field public static final int minLevel = 16843185; // 0x10101b1
field public static final int minLines = 16843094; // 0x1010156
- field public static final int minResizeHeight = 16843684; // 0x10103a4
- field public static final int minResizeWidth = 16843683; // 0x10103a3
+ field public static final int minResizeHeight = 16843670; // 0x1010396
+ field public static final int minResizeWidth = 16843669; // 0x1010395
field public static final int minSdkVersion = 16843276; // 0x101020c
field public static final int minWidth = 16843071; // 0x101013f
field public static final int mode = 16843134; // 0x101017e
@@ -705,11 +701,10 @@
field public static final int orderingFromXml = 16843239; // 0x10101e7
field public static final int orientation = 16842948; // 0x10100c4
field public static final int outAnimation = 16843128; // 0x1010178
- field public static final int outerRadius = 16843661; // 0x101038d
field public static final int overScrollFooter = 16843459; // 0x10102c3
field public static final int overScrollHeader = 16843458; // 0x10102c2
field public static final int overScrollMode = 16843457; // 0x10102c1
- field public static final int overridesImplicitlyEnabledSubtype = 16843696; // 0x10103b0
+ field public static final int overridesImplicitlyEnabledSubtype = 16843682; // 0x10103a2
field public static final int packageNames = 16843649; // 0x1010381
field public static final int padding = 16842965; // 0x10100d5
field public static final int paddingBottom = 16842969; // 0x10100d9
@@ -788,6 +783,7 @@
field public static final int reqNavigation = 16843306; // 0x101022a
field public static final int reqTouchScreen = 16843303; // 0x1010227
field public static final int required = 16843406; // 0x101028e
+ field public static final int requiresFadingEdge = 16843685; // 0x10103a5
field public static final int requiresSmallestWidthDp = 16843620; // 0x1010364
field public static final int resizeMode = 16843619; // 0x1010363
field public static final int resizeable = 16843405; // 0x101028d
@@ -795,7 +791,6 @@
field public static final int restoreAnyVersion = 16843450; // 0x10102ba
field public static final deprecated int restoreNeedsApplication = 16843421; // 0x101029d
field public static final int right = 16843183; // 0x10101af
- field public static final int rightChevronDrawable = 16843657; // 0x1010389
field public static final int ringtonePreferenceStyle = 16842899; // 0x1010093
field public static final int ringtoneType = 16843257; // 0x10101f9
field public static final int rotation = 16843558; // 0x1010326
@@ -871,7 +866,6 @@
field public static final int smallIcon = 16843422; // 0x101029e
field public static final int smallScreens = 16843396; // 0x1010284
field public static final int smoothScrollbar = 16843313; // 0x1010231
- field public static final int snapMargin = 16843664; // 0x1010390
field public static final int soundEffectsEnabled = 16843285; // 0x1010215
field public static final int spacing = 16843027; // 0x1010113
field public static final int spinnerDropDownItemStyle = 16842887; // 0x1010087
@@ -917,8 +911,8 @@
field public static final int stretchMode = 16843030; // 0x1010116
field public static final int subtitle = 16843473; // 0x10102d1
field public static final int subtitleTextStyle = 16843513; // 0x10102f9
- field public static final int subtypeExtraValue = 16843688; // 0x10103a8
- field public static final int subtypeLocale = 16843687; // 0x10103a7
+ field public static final int subtypeExtraValue = 16843674; // 0x101039a
+ field public static final int subtypeLocale = 16843673; // 0x1010399
field public static final int suggestActionMsg = 16843228; // 0x10101dc
field public static final int suggestActionMsgColumn = 16843229; // 0x10101dd
field public static final int summary = 16843241; // 0x10101e9
@@ -940,8 +934,7 @@
field public static final int tag = 16842961; // 0x10100d1
field public static final int targetActivity = 16843266; // 0x1010202
field public static final int targetClass = 16842799; // 0x101002f
- field public static final int targetDescriptions = 16843694; // 0x10103ae
- field public static final int targetDrawables = 16843654; // 0x1010386
+ field public static final int targetDescriptions = 16843680; // 0x10103a0
field public static final int targetPackage = 16842785; // 0x1010021
field public static final int targetSdkVersion = 16843376; // 0x1010270
field public static final int taskAffinity = 16842770; // 0x1010012
@@ -956,15 +949,15 @@
field public static final int tension = 16843370; // 0x101026a
field public static final int testOnly = 16843378; // 0x1010272
field public static final int text = 16843087; // 0x101014f
- field public static final int textAllCaps = 16843674; // 0x101039a
+ field public static final int textAllCaps = 16843660; // 0x101038c
field public static final int textAppearance = 16842804; // 0x1010034
field public static final int textAppearanceButton = 16843271; // 0x1010207
field public static final int textAppearanceInverse = 16842805; // 0x1010035
field public static final int textAppearanceLarge = 16842816; // 0x1010040
field public static final int textAppearanceLargeInverse = 16842819; // 0x1010043
field public static final int textAppearanceLargePopupMenu = 16843521; // 0x1010301
- field public static final int textAppearanceListItem = 16843692; // 0x10103ac
- field public static final int textAppearanceListItemSmall = 16843693; // 0x10103ad
+ field public static final int textAppearanceListItem = 16843678; // 0x101039e
+ 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 textAppearanceSearchResultSubtitle = 16843424; // 0x10102a0
@@ -1033,7 +1026,6 @@
field public static final int toYScale = 16843205; // 0x10101c5
field public static final int top = 16843182; // 0x10101ae
field public static final int topBright = 16842955; // 0x10100cb
- field public static final int topChevronDrawable = 16843658; // 0x101038a
field public static final int topDark = 16842951; // 0x10100c7
field public static final int topLeftRadius = 16843177; // 0x10101a9
field public static final int topOffset = 16843352; // 0x1010258
@@ -1046,7 +1038,7 @@
field public static final int translationY = 16843555; // 0x1010323
field public static final int type = 16843169; // 0x10101a1
field public static final int typeface = 16842902; // 0x1010096
- field public static final int uiOptions = 16843686; // 0x10103a6
+ field public static final int uiOptions = 16843672; // 0x1010398
field public static final int uncertainGestureColor = 16843382; // 0x1010276
field public static final int unfocusedMonthDateColor = 16843588; // 0x1010344
field public static final int unselectedAlpha = 16843278; // 0x101020e
@@ -1065,10 +1057,8 @@
field public static final int verticalCorrection = 16843322; // 0x101023a
field public static final int verticalDivider = 16843054; // 0x101012e
field public static final int verticalGap = 16843328; // 0x1010240
- field public static final int verticalOffset = 16843666; // 0x1010392
field public static final int verticalScrollbarPosition = 16843572; // 0x1010334
field public static final int verticalSpacing = 16843029; // 0x1010115
- field public static final int vibrationDuration = 16843663; // 0x101038f
field public static final int visibility = 16842972; // 0x10100dc
field public static final int visible = 16843156; // 0x1010194
field public static final int vmSafeMode = 16843448; // 0x10102b8
@@ -1085,7 +1075,6 @@
field public static final int wallpaperIntraOpenExitAnimation = 16843416; // 0x1010298
field public static final int wallpaperOpenEnterAnimation = 16843411; // 0x1010293
field public static final int wallpaperOpenExitAnimation = 16843412; // 0x1010294
- field public static final int waveDrawable = 16843660; // 0x101038c
field public static final int webTextViewStyle = 16843449; // 0x10102b9
field public static final int webViewStyle = 16842885; // 0x1010085
field public static final int weekDayTextAppearance = 16843592; // 0x1010348
@@ -2075,13 +2064,15 @@
method public android.accounts.Account[] getAccountsByType(java.lang.String);
method public android.accounts.AccountManagerFuture<android.accounts.Account[]> getAccountsByTypeAndFeatures(java.lang.String, java.lang.String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
- method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method public deprecated android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, boolean, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> getAuthTokenByFeatures(java.lang.String, java.lang.String, java.lang.String[], android.app.Activity, android.os.Bundle, android.os.Bundle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AuthenticatorDescription[] getAuthenticatorTypes();
method public java.lang.String getPassword(android.accounts.Account);
method public java.lang.String getUserData(android.accounts.Account, java.lang.String);
method public android.accounts.AccountManagerFuture<java.lang.Boolean> hasFeatures(android.accounts.Account, java.lang.String[], android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
method public void invalidateAuthToken(java.lang.String, java.lang.String);
+ method public static android.content.Intent newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, java.lang.String[], android.os.Bundle);
method public java.lang.String peekAuthToken(android.accounts.Account, java.lang.String);
method public android.accounts.AccountManagerFuture<java.lang.Boolean> removeAccount(android.accounts.Account, android.accounts.AccountManagerCallback<java.lang.Boolean>, android.os.Handler);
method public void removeOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener);
@@ -2104,6 +2095,7 @@
field public static final java.lang.String KEY_ACCOUNT_MANAGER_RESPONSE = "accountManagerResponse";
field public static final java.lang.String KEY_ACCOUNT_NAME = "authAccount";
field public static final java.lang.String KEY_ACCOUNT_TYPE = "accountType";
+ field public static final java.lang.String KEY_ANDROID_PACKAGE_NAME = "androidPackageName";
field public static final java.lang.String KEY_AUTHENTICATOR_TYPES = "authenticator_types";
field public static final java.lang.String KEY_AUTHTOKEN = "authtoken";
field public static final java.lang.String KEY_AUTH_FAILED_MESSAGE = "authFailedMessage";
@@ -5127,6 +5119,7 @@
field public static final java.lang.String USB_SERVICE = "usb";
field public static final java.lang.String VIBRATOR_SERVICE = "vibrator";
field public static final java.lang.String WALLPAPER_SERVICE = "wallpaper";
+ field public static final java.lang.String WIFI_P2P_SERVICE = "wifip2p";
field public static final java.lang.String WIFI_SERVICE = "wifi";
field public static final java.lang.String WINDOW_SERVICE = "window";
}
@@ -10877,19 +10870,9 @@
method public abstract void onScanCompleted(java.lang.String, android.net.Uri);
}
- public class Metadata {
- method public boolean getBoolean(int);
- method public boolean has(int);
- method public java.util.Set<java.lang.Integer> keySet();
- field public static final int PAUSE_AVAILABLE = 1; // 0x1
- field public static final int SEEK_AVAILABLE = 4; // 0x4
- field public static final int SEEK_BACKWARD_AVAILABLE = 2; // 0x2
- field public static final int SEEK_FORWARD_AVAILABLE = 3; // 0x3
- }
-
public class RemoteControlClient {
- ctor public RemoteControlClient(android.content.ComponentName);
- ctor public RemoteControlClient(android.content.ComponentName, android.os.Looper);
+ ctor public RemoteControlClient(android.app.PendingIntent);
+ ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper);
method public android.media.RemoteControlClient.MetadataEditor editMetadata(boolean);
method public void setPlaybackState(int);
method public void setTransportControlFlags(int);
@@ -11387,13 +11370,13 @@
method public static boolean isEffectSupported(java.lang.String);
field public static final java.lang.String EFFECT_AUTOFIX = "android.media.effect.effects.AutoFixEffect";
field public static final java.lang.String EFFECT_BACKDROPPER = "android.media.effect.effects.BackDropperEffect";
+ field public static final java.lang.String EFFECT_BITMAPOVERLAY = "android.media.effect.effects.BitmapOverlayEffect";
field public static final java.lang.String EFFECT_BLACKWHITE = "android.media.effect.effects.BlackWhiteEffect";
field public static final java.lang.String EFFECT_BRIGHTNESS = "android.media.effect.effects.BrightnessEffect";
field public static final java.lang.String EFFECT_CONTRAST = "android.media.effect.effects.ContrastEffect";
field public static final java.lang.String EFFECT_CROP = "android.media.effect.effects.CropEffect";
field public static final java.lang.String EFFECT_CROSSPROCESS = "android.media.effect.effects.CrossProcessEffect";
field public static final java.lang.String EFFECT_DOCUMENTARY = "android.media.effect.effects.DocumentaryEffect";
- field public static final java.lang.String EFFECT_DOODLE = "android.media.effect.effects.DoodleEffect";
field public static final java.lang.String EFFECT_DUOTONE = "android.media.effect.effects.DuotoneEffect";
field public static final java.lang.String EFFECT_FILLLIGHT = "android.media.effect.effects.FillLightEffect";
field public static final java.lang.String EFFECT_FISHEYE = "android.media.effect.effects.FisheyeEffect";
@@ -11783,7 +11766,6 @@
method public static void incrementOperationCount(int);
method public static void incrementOperationCount(int, int);
method public static void setThreadStatsTag(int);
- method public static deprecated void setThreadStatsTag(java.lang.String);
method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
field public static final int UNSUPPORTED = -1; // 0xffffffff
@@ -12453,6 +12435,142 @@
method public void setWorkSource(android.os.WorkSource);
}
+ public class WpsInfo implements android.os.Parcelable {
+ ctor public WpsInfo();
+ ctor public WpsInfo(android.net.wifi.WpsInfo);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int DISPLAY = 1; // 0x1
+ field public static final int INVALID = 4; // 0x4
+ field public static final int KEYPAD = 2; // 0x2
+ field public static final int LABEL = 3; // 0x3
+ field public static final int PBC = 0; // 0x0
+ field public java.lang.String pin;
+ field public int setup;
+ }
+
+}
+
+package android.net.wifi.p2p {
+
+ public class WifiP2pConfig implements android.os.Parcelable {
+ ctor public WifiP2pConfig();
+ ctor public WifiP2pConfig(android.net.wifi.p2p.WifiP2pConfig);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public java.lang.String deviceAddress;
+ field public int groupOwnerIntent;
+ field public android.net.wifi.WpsInfo wps;
+ }
+
+ public class WifiP2pDevice implements android.os.Parcelable {
+ ctor public WifiP2pDevice();
+ ctor public WifiP2pDevice(android.net.wifi.p2p.WifiP2pDevice);
+ method public int describeContents();
+ method public boolean isGroupOwner();
+ method public boolean isServiceDiscoveryCapable();
+ method public boolean wpsDisplaySupported();
+ method public boolean wpsKeypadSupported();
+ method public boolean wpsPbcSupported();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int AVAILABLE = 3; // 0x3
+ field public static final int CONNECTED = 0; // 0x0
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int FAILED = 2; // 0x2
+ field public static final int INVITED = 1; // 0x1
+ field public static final int UNAVAILABLE = 4; // 0x4
+ field public java.lang.String deviceAddress;
+ field public java.lang.String deviceName;
+ field public java.lang.String primaryDeviceType;
+ field public java.lang.String secondaryDeviceType;
+ field public int status;
+ }
+
+ public class WifiP2pDeviceList implements android.os.Parcelable {
+ ctor public WifiP2pDeviceList();
+ ctor public WifiP2pDeviceList(android.net.wifi.p2p.WifiP2pDeviceList);
+ method public int describeContents();
+ method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getDeviceList();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+ public class WifiP2pGroup implements android.os.Parcelable {
+ ctor public WifiP2pGroup();
+ ctor public WifiP2pGroup(android.net.wifi.p2p.WifiP2pGroup);
+ method public int describeContents();
+ method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getClientList();
+ method public java.lang.String getInterface();
+ method public java.lang.String getNetworkName();
+ method public android.net.wifi.p2p.WifiP2pDevice getOwner();
+ method public java.lang.String getPassphrase();
+ method public boolean isGroupOwner();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+ public class WifiP2pInfo implements android.os.Parcelable {
+ ctor public WifiP2pInfo();
+ ctor public WifiP2pInfo(android.net.wifi.p2p.WifiP2pInfo);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public boolean groupFormed;
+ field public java.net.InetAddress groupOwnerAddress;
+ field public boolean isGroupOwner;
+ }
+
+ public class WifiP2pManager {
+ method public void cancelConnect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void connect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public android.net.wifi.p2p.WifiP2pManager.Channel initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager.ChannelListener);
+ method public void removeGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener);
+ method public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
+ method public void requestPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PeerListListener);
+ field public static final int BUSY = 2; // 0x2
+ field public static final int ERROR = 0; // 0x0
+ field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
+ field public static final java.lang.String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
+ field public static final java.lang.String EXTRA_WIFI_P2P_INFO = "wifiP2pInfo";
+ field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_p2p_state";
+ field public static final int P2P_UNSUPPORTED = 1; // 0x1
+ field public static final java.lang.String WIFI_P2P_CONNECTION_CHANGED_ACTION = "android.net.wifi.p2p.CONNECTION_STATE_CHANGE";
+ field public static final java.lang.String WIFI_P2P_PEERS_CHANGED_ACTION = "android.net.wifi.p2p.PEERS_CHANGED";
+ field public static final java.lang.String WIFI_P2P_STATE_CHANGED_ACTION = "android.net.wifi.p2p.STATE_CHANGED";
+ field public static final int WIFI_P2P_STATE_DISABLED = 1; // 0x1
+ field public static final int WIFI_P2P_STATE_ENABLED = 2; // 0x2
+ field public static final java.lang.String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION = "android.net.wifi.p2p.THIS_DEVICE_CHANGED";
+ }
+
+ public static abstract interface WifiP2pManager.ActionListener {
+ method public abstract void onFailure(int);
+ method public abstract void onSuccess();
+ }
+
+ public static class WifiP2pManager.Channel {
+ }
+
+ public static abstract interface WifiP2pManager.ChannelListener {
+ method public abstract void onChannelDisconnected();
+ }
+
+ public static abstract interface WifiP2pManager.ConnectionInfoListener {
+ method public abstract void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
+ }
+
+ public static abstract interface WifiP2pManager.GroupInfoListener {
+ method public abstract void onGroupInfoAvailable(android.net.wifi.p2p.WifiP2pGroup);
+ }
+
+ public static abstract interface WifiP2pManager.PeerListListener {
+ method public abstract void onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList);
+ }
+
}
package android.nfc {
@@ -14269,7 +14387,7 @@
field public static final int HONEYCOMB = 11; // 0xb
field public static final int HONEYCOMB_MR1 = 12; // 0xc
field public static final int HONEYCOMB_MR2 = 13; // 0xd
- field public static final int ICE_CREAM_SANDWICH = 10000; // 0x2710
+ field public static final int ICE_CREAM_SANDWICH = 14; // 0xe
}
public final class Bundle implements java.lang.Cloneable android.os.Parcelable {
@@ -22803,7 +22921,7 @@
method public android.view.View findFocus();
method public final android.view.View findViewById(int);
method public final android.view.View findViewWithTag(java.lang.Object);
- method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence);
+ method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int);
method protected boolean fitSystemWindows(android.graphics.Rect);
method public boolean fitsSystemWindows();
method public android.view.View focusSearch(int);
@@ -23026,6 +23144,7 @@
method public void scrollTo(int, int);
method public void sendAccessibilityEvent(int);
method public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
+ method public void setAccessibilityDelegate(android.view.View.AccessibilityDelegate);
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
@@ -23131,6 +23250,8 @@
field protected static final int[] ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
field protected static final int[] ENABLED_STATE_SET;
field protected static final int[] ENABLED_WINDOW_FOCUSED_STATE_SET;
+ field public static final int FIND_VIEWS_WITH_CONTENT_DESCRIPTION = 2; // 0x2
+ field public static final int FIND_VIEWS_WITH_TEXT = 1; // 0x1
field public static final int FOCUSABLES_ALL = 0; // 0x0
field public static final int FOCUSABLES_TOUCH_MODE = 1; // 0x1
field protected static final int[] FOCUSED_SELECTED_STATE_SET;
@@ -23202,6 +23323,17 @@
field public static android.util.Property Y;
}
+ public static class View.AccessibilityDelegate {
+ ctor public View.AccessibilityDelegate();
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo);
+ method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public void sendAccessibilityEvent(android.view.View, int);
+ method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
+ }
+
public static class View.BaseSavedState extends android.view.AbsSavedState {
ctor public View.BaseSavedState(android.os.Parcel);
ctor public View.BaseSavedState(android.os.Parcelable);
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 2156425..530ecf1 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -32,6 +32,7 @@
import android.text.TextUtils;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
@@ -41,6 +42,7 @@
import java.util.HashMap;
import java.util.Map;
+import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
/**
@@ -189,6 +191,7 @@
public static final String KEY_ERROR_CODE = "errorCode";
public static final String KEY_ERROR_MESSAGE = "errorMessage";
public static final String KEY_USERDATA = "userdata";
+
/**
* Authenticators using 'customTokens' option will also get the UID of the
* caller
@@ -197,6 +200,16 @@
public static final String KEY_CALLER_PID = "callerPid";
/**
+ * The Android package of the caller will be set in the options bundle by the
+ * {@link AccountManager} and will be passed to the AccountManagerService and
+ * to the AccountAuthenticators. The uid of the caller will be known by the
+ * AccountManagerService as well as the AccountAuthenticators so they will be able to
+ * verify that the package is consistent with the uid (a uid might be shared by many
+ * packages).
+ */
+ public static final String KEY_ANDROID_PACKAGE_NAME = "androidPackageName";
+
+ /**
* Boolean, if set and 'customTokens' the authenticator is responsible for
* notifications.
* @hide
@@ -804,11 +817,16 @@
final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) {
if (account == null) throw new IllegalArgumentException("account is null");
if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
+ final Bundle optionsIn = new Bundle();
+ if (options != null) {
+ optionsIn.putAll(options);
+ }
+ optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName());
return new AmsTask(activity, handler, callback) {
public void doWork() throws RemoteException {
mService.getAuthToken(mResponse, account, authTokenType,
false /* notifyOnAuthFailure */, true /* expectActivityLaunch */,
- options);
+ optionsIn);
}
}.start();
}
@@ -880,16 +898,104 @@
* If the account is no longer present on the device, the return value is
* authenticator-dependent. The caller should verify the validity of the
* account before requesting an auth token.
+ * @deprecated use {@link #getAuthToken(Account, String, android.os.Bundle,
+ * boolean, AccountManagerCallback, android.os.Handler)} instead
+ */
+ @Deprecated
+ public AccountManagerFuture<Bundle> getAuthToken(
+ final Account account, final String authTokenType,
+ final boolean notifyAuthFailure,
+ AccountManagerCallback<Bundle> callback, Handler handler) {
+ return getAuthToken(account, authTokenType, null, notifyAuthFailure, callback,
+ handler);
+ }
+
+ /**
+ * Gets an auth token of the specified type for a particular account,
+ * optionally raising a notification if the user must enter credentials.
+ * This method is intended for background tasks and services where the
+ * user should not be immediately interrupted with a password prompt.
+ *
+ * <p>If a previously generated auth token is cached for this account and
+ * type, then it is returned. Otherwise, if a saved password is
+ * available, it is sent to the server to generate a new auth token.
+ * Otherwise, an {@link Intent} is returned which, when started, will
+ * prompt the user for a password. If the notifyAuthFailure parameter is
+ * set, a status bar notification is also created with the same Intent,
+ * alerting the user that they need to enter a password at some point.
+ *
+ * <p>In that case, you may need to wait until the user responds, which
+ * could take hours or days or forever. When the user does respond and
+ * supply a new password, the account manager will broadcast the
+ * {@link #LOGIN_ACCOUNTS_CHANGED_ACTION} Intent, which applications can
+ * use to try again.
+ *
+ * <p>If notifyAuthFailure is not set, it is the application's
+ * responsibility to launch the returned Intent at some point.
+ * Either way, the result from this call will not wait for user action.
+ *
+ * <p>Some authenticators have auth token <em>types</em>, whose value
+ * is authenticator-dependent. Some services use different token types to
+ * access different functionality -- for example, Google uses different auth
+ * tokens to access Gmail and Google Calendar for the same account.
+ *
+ * <p>This method may be called from any thread, but the returned
+ * {@link AccountManagerFuture} must not be used on the main thread.
+ *
+ * <p>This method requires the caller to hold the permission
+ * {@link android.Manifest.permission#USE_CREDENTIALS}.
+ *
+ * @param account The account to fetch an auth token for
+ * @param authTokenType The auth token type, an authenticator-dependent
+ * string token, must not be null
+ * @param options Authenticator-specific options for the request,
+ * may be null or empty
+ * @param notifyAuthFailure True to add a notification to prompt the
+ * user for a password if necessary, false to leave that to the caller
+ * @param callback Callback to invoke when the request completes,
+ * null for no callback
+ * @param handler {@link Handler} identifying the callback thread,
+ * null for the main thread
+ * @return An {@link AccountManagerFuture} which resolves to a Bundle with
+ * at least the following fields on success:
+ * <ul>
+ * <li> {@link #KEY_ACCOUNT_NAME} - the name of the account you supplied
+ * <li> {@link #KEY_ACCOUNT_TYPE} - the type of the account
+ * <li> {@link #KEY_AUTHTOKEN} - the auth token you wanted
+ * </ul>
+ *
+ * (Other authenticator-specific values may be returned.) If the user
+ * must enter credentials, the returned Bundle contains only
+ * {@link #KEY_INTENT} with the {@link Intent} needed to launch a prompt.
+ *
+ * If an error occurred, {@link AccountManagerFuture#getResult()} throws:
+ * <ul>
+ * <li> {@link AuthenticatorException} if the authenticator failed to respond
+ * <li> {@link OperationCanceledException} if the operation is canceled for
+ * any reason, incluidng the user canceling a credential request
+ * <li> {@link IOException} if the authenticator experienced an I/O problem
+ * creating a new auth token, usually because of network trouble
+ * </ul>
+ * If the account is no longer present on the device, the return value is
+ * authenticator-dependent. The caller should verify the validity of the
+ * account before requesting an auth token.
*/
public AccountManagerFuture<Bundle> getAuthToken(
- final Account account, final String authTokenType, final boolean notifyAuthFailure,
+ final Account account, final String authTokenType, final Bundle options,
+ final boolean notifyAuthFailure,
AccountManagerCallback<Bundle> callback, Handler handler) {
+
if (account == null) throw new IllegalArgumentException("account is null");
if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
+ final Bundle optionsIn = new Bundle();
+ if (options != null) {
+ optionsIn.putAll(options);
+ }
+ optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName());
return new AmsTask(null, handler, callback) {
public void doWork() throws RemoteException {
mService.getAuthToken(mResponse, account, authTokenType,
- notifyAuthFailure, false /* expectActivityLaunch */, null /* options */);
+ notifyAuthFailure, false /* expectActivityLaunch */, optionsIn);
}
}.start();
}
@@ -947,10 +1053,16 @@
final Bundle addAccountOptions,
final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) {
if (accountType == null) throw new IllegalArgumentException("accountType is null");
+ final Bundle optionsIn = new Bundle();
+ if (addAccountOptions != null) {
+ optionsIn.putAll(addAccountOptions);
+ }
+ optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName());
+
return new AmsTask(activity, handler, callback) {
public void doWork() throws RemoteException {
mService.addAcount(mResponse, accountType, authTokenType,
- requiredFeatures, activity != null, addAccountOptions);
+ requiredFeatures, activity != null, optionsIn);
}
}.start();
}
@@ -1659,6 +1771,44 @@
return task;
}
+ /**
+ * Returns an intent to an {@link Activity} that prompts the user to choose from a list of
+ * accounts.
+ * The caller will then typically start the activity by calling
+ * <code>startActivityWithResult(intent, ...);</code>.
+ * <p>
+ * On success the activity returns a Bundle with the account name and type specified using
+ * keys {@link #KEY_ACCOUNT_NAME} and {@link #KEY_ACCOUNT_TYPE}.
+ * <p>
+ * The most common case is to call this with one account type, e.g.:
+ * <p>
+ * <pre> newChooseAccountsIntent(null, null, new String[]{"com.google"}, null);</pre>
+ * @param selectedAccount if specified, indicates that the {@link Account} is the currently
+ * selected one, according to the caller's definition of selected.
+ * @param allowableAccounts an optional {@link ArrayList} of accounts that are allowed to be
+ * shown. If not specified then this field will not limit the displayed accounts.
+ * @param allowableAccountTypes an optional string array of account types. These are used
+ * both to filter the shown accounts and to filter the list of account types that are shown
+ * when adding an account.
+ * @param addAccountOptions This {@link Bundle} is passed as the addAccount options
+ * @return an {@link Intent} that can be used to launch the ChooseAccount activity flow.
+ */
+ static public Intent newChooseAccountIntent(Account selectedAccount,
+ ArrayList<Account> allowableAccounts,
+ String[] allowableAccountTypes,
+ Bundle addAccountOptions) {
+ Intent intent = new Intent();
+ intent.setClassName("android", "android.accounts.ChooseTypeAndAccountActivity");
+ intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST,
+ allowableAccounts);
+ intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_ALLOWABLE_ACCOUNT_TYPES_ARRAYLIST,
+ allowableAccountTypes != null ? Lists.newArrayList(allowableAccountTypes) : 0);
+ intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE,
+ addAccountOptions);
+ intent.putExtra(ChooseTypeAndAccountActivity.EXTRA_SELECTED_ACCOUNT, selectedAccount);
+ return intent;
+ }
+
private final HashMap<OnAccountsUpdateListener, Handler> mAccountsUpdatedListeners =
Maps.newHashMap();
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index 20d5b96..173da8d 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -16,10 +16,6 @@
package android.accounts;
-import com.android.internal.R;
-import com.android.internal.telephony.ITelephony;
-import com.android.internal.telephony.TelephonyIntents;
-
import android.Manifest;
import android.app.ActivityManager;
import android.app.Notification;
@@ -51,13 +47,13 @@
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.SystemClock;
-import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
+import com.android.internal.R;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -924,9 +920,6 @@
if (account == null) throw new IllegalArgumentException("account is null");
if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
checkBinderPermission(Manifest.permission.USE_CREDENTIALS);
- final int callerUid = Binder.getCallingUid();
- final int callerPid = Binder.getCallingPid();
-
AccountAuthenticatorCache.ServiceInfo<AuthenticatorDescription> authenticatorInfo =
mAuthenticatorCache.getServiceInfo(
AuthenticatorDescription.newKey(account.type));
@@ -934,20 +927,19 @@
authenticatorInfo != null && authenticatorInfo.type.customTokens;
// skip the check if customTokens
+ final int callerUid = Binder.getCallingUid();
final boolean permissionGranted = customTokens ||
permissionIsGranted(account, authTokenType, callerUid);
final Bundle loginOptions = (loginOptionsIn == null) ? new Bundle() :
loginOptionsIn;
- if (customTokens) {
- // let authenticator know the identity of the caller
- loginOptions.putInt(AccountManager.KEY_CALLER_UID, callerUid);
- loginOptions.putInt(AccountManager.KEY_CALLER_PID, callerPid);
- if (notifyOnAuthFailure) {
- loginOptions.putBoolean(AccountManager.KEY_NOTIFY_ON_FAILURE, true);
- }
+ // let authenticator know the identity of the caller
+ loginOptions.putInt(AccountManager.KEY_CALLER_UID, callerUid);
+ loginOptions.putInt(AccountManager.KEY_CALLER_PID, Binder.getCallingPid());
+ if (notifyOnAuthFailure) {
+ loginOptions.putBoolean(AccountManager.KEY_NOTIFY_ON_FAILURE, true);
}
-
+
long identityToken = clearCallingIdentity();
try {
// if the caller has permission, do the peek. otherwise go the more expensive
@@ -1120,7 +1112,7 @@
public void addAcount(final IAccountManagerResponse response, final String accountType,
final String authTokenType, final String[] requiredFeatures,
- final boolean expectActivityLaunch, final Bundle options) {
+ final boolean expectActivityLaunch, final Bundle optionsIn) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "addAccount: accountType " + accountType
+ ", response " + response
@@ -1133,6 +1125,13 @@
if (response == null) throw new IllegalArgumentException("response is null");
if (accountType == null) throw new IllegalArgumentException("accountType is null");
checkManageAccountsPermission();
+
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final Bundle options = (optionsIn == null) ? new Bundle() : optionsIn;
+ options.putInt(AccountManager.KEY_CALLER_UID, uid);
+ options.putInt(AccountManager.KEY_CALLER_PID, pid);
+
long identityToken = clearCallingIdentity();
try {
new Session(response, accountType, expectActivityLaunch,
diff --git a/core/java/android/accounts/ChooseAccountTypeActivity.java b/core/java/android/accounts/ChooseAccountTypeActivity.java
new file mode 100644
index 0000000..836164c
--- /dev/null
+++ b/core/java/android/accounts/ChooseAccountTypeActivity.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.accounts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+import com.android.internal.R;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @hide
+ */
+public class ChooseAccountTypeActivity extends Activity implements AccountManagerCallback<Bundle> {
+ private static final String TAG = "AccountManager";
+
+ private HashMap<String, AuthInfo> mTypeToAuthenticatorInfo = new HashMap<String, AuthInfo>();
+ private ArrayList<AuthInfo> mAuthenticatorInfosToDisplay;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.choose_account);
+
+ // Read the validAccountTypes, if present, and add them to the setOfAllowableAccountTypes
+ Set<String> setOfAllowableAccountTypes = null;
+ ArrayList<String> validAccountTypes = getIntent().getStringArrayListExtra(
+ ChooseTypeAndAccountActivity.EXTRA_ALLOWABLE_ACCOUNT_TYPES_ARRAYLIST);
+ if (validAccountTypes != null) {
+ setOfAllowableAccountTypes = new HashSet<String>(validAccountTypes.size());
+ for (String type : validAccountTypes) {
+ setOfAllowableAccountTypes.add(type);
+ }
+ }
+
+ // create a map of account authenticators
+ buildTypeToAuthDescriptionMap();
+
+ // Create a list of authenticators that are allowable. Filter out those that
+ // don't match the allowable account types, if provided.
+ mAuthenticatorInfosToDisplay = new ArrayList<AuthInfo>(mTypeToAuthenticatorInfo.size());
+ for (Map.Entry<String, AuthInfo> entry: mTypeToAuthenticatorInfo.entrySet()) {
+ final String type = entry.getKey();
+ final AuthInfo info = entry.getValue();
+ if (setOfAllowableAccountTypes != null
+ && !setOfAllowableAccountTypes.contains(type)) {
+ continue;
+ }
+ mAuthenticatorInfosToDisplay.add(info);
+ }
+
+ if (mAuthenticatorInfosToDisplay.isEmpty()) {
+ Bundle bundle = new Bundle();
+ bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "no allowable account types");
+ setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
+ finish();
+ return;
+ }
+
+ if (mAuthenticatorInfosToDisplay.size() == 1) {
+ runAddAccountForAuthenticator(mAuthenticatorInfosToDisplay.get(0));
+ return;
+ }
+
+ // Setup the list
+ ListView list = (ListView) findViewById(android.R.id.list);
+ // Use an existing ListAdapter that will map an array of strings to TextViews
+ list.setAdapter(new AccountArrayAdapter(this,
+ android.R.layout.simple_list_item_1, mAuthenticatorInfosToDisplay));
+ list.setChoiceMode(ListView.CHOICE_MODE_NONE);
+ list.setTextFilterEnabled(false);
+ list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
+ runAddAccountForAuthenticator(mAuthenticatorInfosToDisplay.get(position));
+ }
+ });
+ }
+
+ private void buildTypeToAuthDescriptionMap() {
+ for(AuthenticatorDescription desc : AccountManager.get(this).getAuthenticatorTypes()) {
+ String name = null;
+ Drawable icon = null;
+ try {
+ Context authContext = createPackageContext(desc.packageName, 0);
+ icon = authContext.getResources().getDrawable(desc.iconId);
+ final CharSequence sequence = authContext.getResources().getText(desc.labelId);
+ if (sequence != null) {
+ name = sequence.toString();
+ }
+ name = sequence.toString();
+ } catch (PackageManager.NameNotFoundException e) {
+ // Nothing we can do much here, just log
+ if (Log.isLoggable(TAG, Log.WARN)) {
+ Log.w(TAG, "No icon name for account type " + desc.type);
+ }
+ } catch (Resources.NotFoundException e) {
+ // Nothing we can do much here, just log
+ if (Log.isLoggable(TAG, Log.WARN)) {
+ Log.w(TAG, "No icon resource for account type " + desc.type);
+ }
+ }
+ AuthInfo authInfo = new AuthInfo(desc, name, icon);
+ mTypeToAuthenticatorInfo.put(desc.type, authInfo);
+ }
+ }
+
+ protected void runAddAccountForAuthenticator(AuthInfo authInfo) {
+ Log.d(TAG, "selected account type " + authInfo.name);
+ Bundle options = getIntent().getBundleExtra(
+ ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE);
+ AccountManager.get(this).addAccount(authInfo.desc.type, null, null, options,
+ this, this, null);
+ }
+
+ public void run(final AccountManagerFuture<Bundle> accountManagerFuture) {
+ try {
+ Bundle accountManagerResult = accountManagerFuture.getResult();
+ Bundle bundle = new Bundle();
+ bundle.putString(AccountManager.KEY_ACCOUNT_NAME,
+ accountManagerResult.getString(AccountManager.KEY_ACCOUNT_NAME));
+ bundle.putString(AccountManager.KEY_ACCOUNT_TYPE,
+ accountManagerResult.getString(AccountManager.KEY_ACCOUNT_TYPE));
+ setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
+ finish();
+ return;
+ } catch (OperationCanceledException e) {
+ setResult(Activity.RESULT_CANCELED);
+ finish();
+ return;
+ } catch (IOException e) {
+ } catch (AuthenticatorException e) {
+ }
+ Bundle bundle = new Bundle();
+ bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "error communicating with server");
+ setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
+ finish();
+ }
+
+ private static class AuthInfo {
+ final AuthenticatorDescription desc;
+ final String name;
+ final Drawable drawable;
+
+ AuthInfo(AuthenticatorDescription desc, String name, Drawable drawable) {
+ this.desc = desc;
+ this.name = name;
+ this.drawable = drawable;
+ }
+ }
+
+ private static class ViewHolder {
+ ImageView icon;
+ TextView text;
+ }
+
+ private static class AccountArrayAdapter extends ArrayAdapter<AuthInfo> {
+ private LayoutInflater mLayoutInflater;
+ private ArrayList<AuthInfo> mInfos;
+
+ public AccountArrayAdapter(Context context, int textViewResourceId,
+ ArrayList<AuthInfo> infos) {
+ super(context, textViewResourceId, infos);
+ mInfos = infos;
+ mLayoutInflater = (LayoutInflater) context.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder holder;
+
+ if (convertView == null) {
+ convertView = mLayoutInflater.inflate(R.layout.choose_account_row, null);
+ holder = new ViewHolder();
+ holder.text = (TextView) convertView.findViewById(R.id.account_row_text);
+ holder.icon = (ImageView) convertView.findViewById(R.id.account_row_icon);
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ }
+
+ holder.text.setText(mInfos.get(position).name);
+ holder.icon.setImageDrawable(mInfos.get(position).drawable);
+
+ return convertView;
+ }
+ }
+}
diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
new file mode 100644
index 0000000..a903399
--- /dev/null
+++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.accounts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+import com.android.internal.R;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @hide
+ */
+public class ChooseTypeAndAccountActivity extends Activity {
+ private static final String TAG = "AccountManager";
+
+ /**
+ * A Parcelable ArrayList of Account objects that limits the choosable accounts to those
+ * in this list, if this parameter is supplied.
+ */
+ public static final String EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST = "allowableAccounts";
+
+ /**
+ * A Parcelable ArrayList of String objects that limits the accounts to choose to those
+ * that match the types in this list, if this parameter is supplied. This list is also
+ * used to filter the allowable account types if add account is selected.
+ */
+ public static final String EXTRA_ALLOWABLE_ACCOUNT_TYPES_ARRAYLIST = "allowableAccountTypes";
+
+ /**
+ * This is passed as the options bundle in AccountManager.addAccount() if it is called.
+ */
+ public static final String EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE = "addAccountOptions";
+
+ /**
+ * If set then the specified account is already "selected".
+ */
+ public static final String EXTRA_SELECTED_ACCOUNT = "selectedAccount";
+
+ private ArrayList<AccountInfo> mAccountInfos;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.choose_type_and_account);
+ final AccountManager accountManager = AccountManager.get(this);
+
+ // build an efficiently queryable map of account types to authenticator descriptions
+ final HashMap<String, AuthenticatorDescription> typeToAuthDescription =
+ new HashMap<String, AuthenticatorDescription>();
+ for(AuthenticatorDescription desc : accountManager.getAuthenticatorTypes()) {
+ typeToAuthDescription.put(desc.type, desc);
+ }
+
+ // Read the validAccounts, if present, and add them to the setOfAllowableAccounts
+ Set<Account> setOfAllowableAccounts = null;
+ final ArrayList<Parcelable> validAccounts =
+ getIntent().getParcelableArrayListExtra(EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST);
+ if (validAccounts != null) {
+ setOfAllowableAccounts = new HashSet<Account>(validAccounts.size());
+ for (Parcelable parcelable : validAccounts) {
+ setOfAllowableAccounts.add((Account)parcelable);
+ }
+ }
+
+ // Read the validAccountTypes, if present, and add them to the setOfAllowableAccountTypes
+ Set<String> setOfAllowableAccountTypes = null;
+ final ArrayList<String> validAccountTypes =
+ getIntent().getStringArrayListExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_ARRAYLIST);
+ if (validAccountTypes != null) {
+ setOfAllowableAccountTypes = new HashSet<String>(validAccountTypes.size());
+ for (String type : validAccountTypes) {
+ setOfAllowableAccountTypes.add(type);
+ }
+ }
+
+ // Create a list of AccountInfo objects for each account that is allowable. Filter out
+ // accounts that don't match the allowable types, if provided, or that don't match the
+ // allowable accounts, if provided.
+ final Account[] accounts = accountManager.getAccounts();
+ mAccountInfos = new ArrayList<AccountInfo>(accounts.length);
+ for (Account account : accounts) {
+ if (setOfAllowableAccounts != null
+ && !setOfAllowableAccounts.contains(account)) {
+ continue;
+ }
+ if (setOfAllowableAccountTypes != null
+ && !setOfAllowableAccountTypes.contains(account.type)) {
+ continue;
+ }
+ mAccountInfos.add(new AccountInfo(account,
+ getDrawableForType(typeToAuthDescription, account.type)));
+ }
+
+ // If there are no allowable accounts go directly to add account
+ if (mAccountInfos.isEmpty()) {
+ startChooseAccountTypeActivity();
+ return;
+ }
+
+ // if there is only one allowable account return it
+ if (mAccountInfos.size() == 1) {
+ Account account = mAccountInfos.get(0).account;
+ setResultAndFinish(account.name, account.type);
+ return;
+ }
+
+ // there is more than one allowable account. initialize the list adapter to allow
+ // the user to select an account.
+ ListView list = (ListView) findViewById(android.R.id.list);
+ list.setAdapter(new AccountArrayAdapter(this,
+ android.R.layout.simple_list_item_1, mAccountInfos));
+ list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+ list.setTextFilterEnabled(false);
+ list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
+ onListItemClick((ListView)parent, v, position, id);
+ }
+ });
+
+ // set the listener for the addAccount button
+ Button addAccountButton = (Button) findViewById(R.id.addAccount);
+ addAccountButton.setOnClickListener(new View.OnClickListener() {
+ public void onClick(final View v) {
+ startChooseAccountTypeActivity();
+ }
+ });
+ }
+
+ // Called when the choose account type activity (for adding an account) returns.
+ // If it was a success read the account and set it in the result. In all cases
+ // return the result and finish this activity.
+ @Override
+ protected void onActivityResult(final int requestCode, final int resultCode,
+ final Intent data) {
+ if (resultCode == RESULT_OK && data != null) {
+ String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
+ String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
+ if (accountName != null && accountType != null) {
+ setResultAndFinish(accountName, accountType);
+ return;
+ }
+ }
+ setResult(Activity.RESULT_CANCELED);
+ finish();
+ }
+
+ private Drawable getDrawableForType(
+ final HashMap<String, AuthenticatorDescription> typeToAuthDescription,
+ String accountType) {
+ Drawable icon = null;
+ if (typeToAuthDescription.containsKey(accountType)) {
+ try {
+ AuthenticatorDescription desc = typeToAuthDescription.get(accountType);
+ Context authContext = createPackageContext(desc.packageName, 0);
+ icon = authContext.getResources().getDrawable(desc.iconId);
+ } catch (PackageManager.NameNotFoundException e) {
+ // Nothing we can do much here, just log
+ if (Log.isLoggable(TAG, Log.WARN)) {
+ Log.w(TAG, "No icon name for account type " + accountType);
+ }
+ } catch (Resources.NotFoundException e) {
+ // Nothing we can do much here, just log
+ if (Log.isLoggable(TAG, Log.WARN)) {
+ Log.w(TAG, "No icon resource for account type " + accountType);
+ }
+ }
+ }
+ return icon;
+ }
+
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ AccountInfo accountInfo = mAccountInfos.get(position);
+ Log.d(TAG, "selected account " + accountInfo.account);
+ setResultAndFinish(accountInfo.account.name, accountInfo.account.type);
+ }
+
+ private void setResultAndFinish(final String accountName, final String accountType) {
+ Bundle bundle = new Bundle();
+ bundle.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
+ bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
+ setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
+ finish();
+ }
+
+ private void startChooseAccountTypeActivity() {
+ final Intent intent = new Intent(this, ChooseAccountTypeActivity.class);
+ intent.putStringArrayListExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_ARRAYLIST,
+ getIntent().getStringArrayListExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_ARRAYLIST));
+ intent.putExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE,
+ getIntent().getBundleExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_ARRAYLIST));
+ startActivityForResult(intent, 0);
+ }
+
+ private static class AccountInfo {
+ final Account account;
+ final Drawable drawable;
+
+ AccountInfo(Account account, Drawable drawable) {
+ this.account = account;
+ this.drawable = drawable;
+ }
+ }
+
+ private static class ViewHolder {
+ ImageView icon;
+ TextView text;
+ }
+
+ private static class AccountArrayAdapter extends ArrayAdapter<AccountInfo> {
+ private LayoutInflater mLayoutInflater;
+ private ArrayList<AccountInfo> mInfos;
+
+ public AccountArrayAdapter(Context context, int textViewResourceId,
+ ArrayList<AccountInfo> infos) {
+ super(context, textViewResourceId, infos);
+ mInfos = infos;
+ mLayoutInflater = (LayoutInflater) context.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder holder;
+
+ if (convertView == null) {
+ convertView = mLayoutInflater.inflate(R.layout.choose_account_row, null);
+ holder = new ViewHolder();
+ holder.text = (TextView) convertView.findViewById(R.id.account_row_text);
+ holder.icon = (ImageView) convertView.findViewById(R.id.account_row_icon);
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ }
+
+ holder.text.setText(mInfos.get(position).account.name);
+ holder.icon.setImageDrawable(mInfos.get(position).drawable);
+
+ return convertView;
+ }
+ }
+}
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java
index 0d4a067..be00aa5 100644
--- a/core/java/android/app/ActionBar.java
+++ b/core/java/android/app/ActionBar.java
@@ -915,6 +915,7 @@
com.android.internal.R.styleable.ActionBar_LayoutParams);
gravity = a.getInt(
com.android.internal.R.styleable.ActionBar_LayoutParams_layout_gravity, -1);
+ a.recycle();
}
public LayoutParams(int width, int height) {
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 4b2a8d2..bd42e34 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -42,6 +42,7 @@
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.content.pm.ManifestDigest;
+import android.content.pm.VerifierDeviceIdentity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
@@ -1208,6 +1209,19 @@
// TODO:
}
+ /**
+ * @hide
+ */
+ @Override
+ public VerifierDeviceIdentity getVerifierDeviceIdentity() {
+ try {
+ return mPM.getVerifierDeviceIdentity();
+ } catch (RemoteException e) {
+ // Should never happen!
+ }
+ return null;
+ }
+
private final ContextImpl mContext;
private final IPackageManager mPM;
diff --git a/core/java/android/app/ProgressDialog.java b/core/java/android/app/ProgressDialog.java
index f1a04f8..7f1f385 100644
--- a/core/java/android/app/ProgressDialog.java
+++ b/core/java/android/app/ProgressDialog.java
@@ -16,7 +16,10 @@
package android.app;
+import com.android.internal.R;
+
import android.content.Context;
+import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
@@ -29,8 +32,6 @@
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.android.internal.R;
-
import java.text.NumberFormat;
/**
@@ -119,6 +120,9 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(mContext);
+ TypedArray a = mContext.obtainStyledAttributes(null,
+ com.android.internal.R.styleable.AlertDialog,
+ com.android.internal.R.attr.alertDialogStyle, 0);
if (mProgressStyle == STYLE_HORIZONTAL) {
/* Use a separate handler to update the text views as they
@@ -149,17 +153,22 @@
}
}
};
- View view = inflater.inflate(R.layout.alert_dialog_progress, null);
+ View view = inflater.inflate(a.getResourceId(
+ com.android.internal.R.styleable.AlertDialog_horizontalProgressLayout,
+ R.layout.alert_dialog_progress), null);
mProgress = (ProgressBar) view.findViewById(R.id.progress);
mProgressNumber = (TextView) view.findViewById(R.id.progress_number);
mProgressPercent = (TextView) view.findViewById(R.id.progress_percent);
setView(view);
} else {
- View view = inflater.inflate(R.layout.progress_dialog, null);
+ View view = inflater.inflate(a.getResourceId(
+ com.android.internal.R.styleable.AlertDialog_progressLayout,
+ R.layout.progress_dialog), null);
mProgress = (ProgressBar) view.findViewById(R.id.progress);
mMessageView = (TextView) view.findViewById(R.id.message);
setView(view);
}
+ a.recycle();
if (mMax > 0) {
setMax(mMax);
}
diff --git a/core/java/android/bluetooth/BluetoothHealth.java b/core/java/android/bluetooth/BluetoothHealth.java
index c165d92..9b2b8ca 100644
--- a/core/java/android/bluetooth/BluetoothHealth.java
+++ b/core/java/android/bluetooth/BluetoothHealth.java
@@ -81,6 +81,20 @@
*/
public static final int CHANNEL_TYPE_ANY = 12;
+ /** @hide */
+ public static final int HEALTH_OPERATION_SUCCESS = 6000;
+ /** @hide */
+ public static final int HEALTH_OPERATION_ERROR = 6001;
+ /** @hide */
+ public static final int HEALTH_OPERATION_INVALID_ARGS = 6002;
+ /** @hide */
+ public static final int HEALTH_OPERATION_GENERIC_FAILURE = 6003;
+ /** @hide */
+ public static final int HEALTH_OPERATION_NOT_FOUND = 6004;
+ /** @hide */
+ public static final int HEALTH_OPERATION_NOT_ALLOWED = 6005;
+
+
/**
* Register an application configuration that acts as a Health SINK.
* This is the configuration that will be used to communicate with health devices
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 48f94d0..9468581 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -1647,11 +1647,10 @@
/**
* Use with {@link #getSystemService} to retrieve a {@link
* android.net.wifi.p2p.WifiP2pManager} for handling management of
- * Wi-Fi p2p.
+ * Wi-Fi peer-to-peer connections.
*
* @see #getSystemService
* @see android.net.wifi.p2p.WifiP2pManager
- * @hide
*/
public static final String WIFI_P2P_SERVICE = "wifip2p";
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 9678d48..684c4fe 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -191,12 +191,6 @@
private static final long SYNC_ALARM_TIMEOUT_MIN = 30 * 1000; // 30 seconds
private static final long SYNC_ALARM_TIMEOUT_MAX = 2 * 60 * 60 * 1000; // two hours
- /**
- * The amount of time (in milliseconds) to wait after attempting a bind
- * before canceling a sync and disabling the sync adapter
- */
- public static final long BIND_TIMEOUT_MS = 5 * 60 * 1000;
-
public void onAccountsUpdated(Account[] accounts) {
// remember if this was the first time this was called after an update
final boolean justBootedUp = mAccounts == INITIAL_ACCOUNTS_ARRAY;
@@ -1074,9 +1068,6 @@
pw.print(" - ");
pw.print(activeSyncContext.mSyncOperation.dump(false));
pw.println();
- if (activeSyncContext.mSyncAdapter == null) {
- pw.println(" **** Waiting for onServiceConnected ****");
- }
}
synchronized (mSyncQueue) {
@@ -1433,7 +1424,6 @@
public void handleMessage(Message msg) {
long earliestFuturePollTime = Long.MAX_VALUE;
long nextPendingSyncTime = Long.MAX_VALUE;
- long nextBindTimeoutTime = Long.MAX_VALUE;
// Setting the value here instead of a method because we want the dumpsys logs
// to have the most recent value used.
@@ -1441,7 +1431,6 @@
waitUntilReadyToRun();
mDataConnectionIsConnected = readDataConnectionState();
mSyncManagerWakeLock.acquire();
- nextBindTimeoutTime = auditRunningSyncsForStuckBindsLocked();
// Always do this first so that we be sure that any periodic syncs that
// are ready to run have been converted into pending syncs. This allows the
// logic that considers the next steps to take based on the set of pending syncs
@@ -1543,7 +1532,6 @@
break;
}
} finally {
- nextPendingSyncTime = Math.min(nextBindTimeoutTime, nextPendingSyncTime);
manageSyncNotificationLocked();
manageSyncAlarmLocked(earliestFuturePollTime, nextPendingSyncTime);
mSyncTimeTracker.update();
@@ -1552,36 +1540,6 @@
}
/**
- * Looks to see if any of the active syncs have been waiting for a bind for too long,
- * and if so the sync is canceled and the sync adapter is disabled for that account.
- * @return the earliest time that an active sync can have waited too long to bind,
- * relative to {@link android.os.SystemClock#elapsedRealtime()}.
- */
- private long auditRunningSyncsForStuckBindsLocked() {
- final long now = SystemClock.elapsedRealtime();
- long oldest = Long.MAX_VALUE;
- for (ActiveSyncContext active : mActiveSyncContexts) {
- if (active.mSyncAdapter == null) {
- final long timeoutTime = active.mStartTime + BIND_TIMEOUT_MS;
- if (timeoutTime < now) {
- Log.w(TAG, "canceling long-running bind and disabling sync for "
- + active.mSyncOperation.account + ", authority "
- + active.mSyncOperation.authority);
- runSyncFinishedOrCanceledLocked(null, active);
- ContentResolver.setIsSyncable(active.mSyncOperation.account,
- active.mSyncOperation.authority, 0);
- } else {
- if (oldest > timeoutTime) {
- oldest = timeoutTime;
- }
- }
- }
- }
-
- return oldest;
- }
-
- /**
* Turn any periodic sync operations that are ready to run into pending sync operations.
* @return the desired start time of the earliest future periodic sync operation,
* in milliseconds since boot
@@ -1861,17 +1819,13 @@
synchronized (mSyncQueue){
mSyncQueue.remove(candidate);
}
- ActiveSyncContext newSyncContext = dispatchSyncOperation(candidate);
- if (newSyncContext != null) {
- nextReadyToRunTime = Math.min(nextReadyToRunTime,
- newSyncContext.mStartTime + BIND_TIMEOUT_MS);
- }
+ dispatchSyncOperation(candidate);
}
return nextReadyToRunTime;
}
- private ActiveSyncContext dispatchSyncOperation(SyncOperation op) {
+ private boolean dispatchSyncOperation(SyncOperation op) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "dispatchSyncOperation: we are going to sync " + op);
Log.v(TAG, "num active syncs: " + mActiveSyncContexts.size());
@@ -1888,7 +1842,7 @@
Log.d(TAG, "can't find a sync adapter for " + syncAdapterType
+ ", removing settings for it");
mSyncStorageEngine.removeAuthority(op.account, op.authority);
- return null;
+ return false;
}
ActiveSyncContext activeSyncContext =
@@ -1901,10 +1855,10 @@
if (!activeSyncContext.bindToSyncAdapter(syncAdapterInfo)) {
Log.e(TAG, "Bind attempt failed to " + syncAdapterInfo);
closeActiveSyncContext(activeSyncContext);
- return null;
+ return false;
}
- return activeSyncContext;
+ return true;
}
private void runBoundToSyncAdapter(final ActiveSyncContext activeSyncContext,
diff --git a/core/java/android/content/pm/ActivityInfo.aidl b/core/java/android/content/pm/ActivityInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/ApplicationInfo.aidl b/core/java/android/content/pm/ApplicationInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/ConfigurationInfo.java b/core/java/android/content/pm/ConfigurationInfo.java
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/FeatureInfo.aidl b/core/java/android/content/pm/FeatureInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/IPackageDataObserver.aidl b/core/java/android/content/pm/IPackageDataObserver.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 08aef16..5e6e768 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -38,6 +38,7 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
+import android.content.pm.VerifierDeviceIdentity;
import android.net.Uri;
import android.content.IntentSender;
@@ -359,4 +360,6 @@
in ManifestDigest manifestDigest);
void verifyPendingInstall(int id, boolean verified, in String message);
+
+ VerifierDeviceIdentity getVerifierDeviceIdentity();
}
diff --git a/core/java/android/content/pm/IPackageStatsObserver.aidl b/core/java/android/content/pm/IPackageStatsObserver.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/InstrumentationInfo.aidl b/core/java/android/content/pm/InstrumentationInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/ManifestDigest.aidl b/core/java/android/content/pm/ManifestDigest.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/PackageInfo.aidl b/core/java/android/content/pm/PackageInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/PackageInfoLite.aidl b/core/java/android/content/pm/PackageInfoLite.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index b4e3988..dcb6776 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2614,4 +2614,14 @@
public static int getAppId(int uid) {
return uid % PER_USER_RANGE;
}
+
+ /**
+ * Returns the device identity that verifiers can use to associate their
+ * scheme to a particular device. This should not be used by anything other
+ * than a package verifier.
+ *
+ * @return identity that uniquely identifies current device
+ * @hide
+ */
+ public abstract VerifierDeviceIdentity getVerifierDeviceIdentity();
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index c61e32f..e7b844c 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -92,6 +92,7 @@
private String mArchiveSourcePath;
private String[] mSeparateProcesses;
+ private boolean mOnlyCoreApps;
private static final int SDK_VERSION = Build.VERSION.SDK_INT;
private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME)
? null : Build.VERSION.CODENAME;
@@ -180,6 +181,10 @@
mSeparateProcesses = procs;
}
+ public void setOnlyCoreApps(boolean onlyCoreApps) {
+ mOnlyCoreApps = onlyCoreApps;
+ }
+
private static final boolean isPackageFilename(String name) {
return name.endsWith(".apk");
}
@@ -433,18 +438,22 @@
if (pkg == null) {
- if (errorException != null) {
- Slog.w(TAG, mArchiveSourcePath, errorException);
- } else {
- Slog.w(TAG, mArchiveSourcePath + " (at "
- + parser.getPositionDescription()
- + "): " + errorText[0]);
+ // If we are only parsing core apps, then a null with INSTALL_SUCCEEDED
+ // just means to skip this app so don't make a fuss about it.
+ if (!mOnlyCoreApps || mParseError != PackageManager.INSTALL_SUCCEEDED) {
+ if (errorException != null) {
+ Slog.w(TAG, mArchiveSourcePath, errorException);
+ } else {
+ Slog.w(TAG, mArchiveSourcePath + " (at "
+ + parser.getPositionDescription()
+ + "): " + errorText[0]);
+ }
+ if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
+ mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
+ }
}
parser.close();
assmgr.close();
- if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
- mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
- }
return null;
}
@@ -782,6 +791,14 @@
}
int type;
+ if (mOnlyCoreApps) {
+ boolean core = attrs.getAttributeBooleanValue(null, "coreApp", false);
+ if (!core) {
+ mParseError = PackageManager.INSTALL_SUCCEEDED;
+ return null;
+ }
+ }
+
final Package pkg = new Package(pkgName);
boolean foundApp = false;
diff --git a/core/java/android/content/pm/PackageStats.aidl b/core/java/android/content/pm/PackageStats.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/PackageStats.java b/core/java/android/content/pm/PackageStats.java
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/ParceledListSlice.aidl b/core/java/android/content/pm/ParceledListSlice.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/PermissionGroupInfo.aidl b/core/java/android/content/pm/PermissionGroupInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/PermissionInfo.aidl b/core/java/android/content/pm/PermissionInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/ProviderInfo.aidl b/core/java/android/content/pm/ProviderInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/ResolveInfo.aidl b/core/java/android/content/pm/ResolveInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/ServiceInfo.aidl b/core/java/android/content/pm/ServiceInfo.aidl
old mode 100755
new mode 100644
diff --git a/core/java/android/content/pm/Signature.aidl b/core/java/android/content/pm/Signature.aidl
old mode 100755
new mode 100644
diff --git a/wifi/java/android/net/wifi/Wps.aidl b/core/java/android/content/pm/VerifierDeviceIdentity.aidl
similarity index 82%
copy from wifi/java/android/net/wifi/Wps.aidl
copy to core/java/android/content/pm/VerifierDeviceIdentity.aidl
index ba82a9a..eb076ae 100644
--- a/wifi/java/android/net/wifi/Wps.aidl
+++ b/core/java/android/content/pm/VerifierDeviceIdentity.aidl
@@ -1,5 +1,5 @@
-/**
- * Copyright (c) 2010, The Android Open Source Project
+/*
+ * Copyright 2011, 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.
@@ -14,6 +14,6 @@
* limitations under the License.
*/
-package android.net.wifi;
+package android.content.pm;
-parcelable Wps;
+parcelable VerifierDeviceIdentity;
diff --git a/core/java/android/content/pm/VerifierDeviceIdentity.java b/core/java/android/content/pm/VerifierDeviceIdentity.java
new file mode 100644
index 0000000..a8cdb6a
--- /dev/null
+++ b/core/java/android/content/pm/VerifierDeviceIdentity.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.io.UnsupportedEncodingException;
+import java.security.SecureRandom;
+import java.util.Random;
+
+/**
+ * An identity that uniquely identifies a particular device. In this
+ * implementation, the identity is represented as a 64-bit integer encoded to a
+ * 13-character string using RFC 4648's Base32 encoding without the trailing
+ * padding. This makes it easy for users to read and write the code without
+ * confusing 'I' (letter) with '1' (one) or 'O' (letter) with '0' (zero).
+ *
+ * @hide
+ */
+public class VerifierDeviceIdentity implements Parcelable {
+ /**
+ * Encoded size of a long (64-bit) into Base32. This format will end up
+ * looking like XXXX-XXXX-XXXX-X (length ignores hyphens) when applied with
+ * the GROUP_SIZE below.
+ */
+ private static final int LONG_SIZE = 13;
+
+ /**
+ * Size of groupings when outputting as strings. This helps people read it
+ * out and keep track of where they are.
+ */
+ private static final int GROUP_SIZE = 4;
+
+ private final long mIdentity;
+
+ private final String mIdentityString;
+
+ /**
+ * Create a verifier device identity from a long.
+ *
+ * @param identity device identity in a 64-bit integer.
+ * @throws
+ */
+ public VerifierDeviceIdentity(long identity) {
+ mIdentity = identity;
+ mIdentityString = encodeBase32(identity);
+ }
+
+ private VerifierDeviceIdentity(Parcel source) {
+ final long identity = source.readLong();
+
+ mIdentity = identity;
+ mIdentityString = encodeBase32(identity);
+ }
+
+ /**
+ * Generate a new device identity.
+ *
+ * @return random uniformly-distributed device identity
+ */
+ public static VerifierDeviceIdentity generate() {
+ final SecureRandom sr = new SecureRandom();
+ return generate(sr);
+ }
+
+ /**
+ * Generate a new device identity using a provided random number generator
+ * class. This is used for testing.
+ *
+ * @param rng random number generator to retrieve the next long from
+ * @return verifier device identity based on the input from the provided
+ * random number generator
+ */
+ static VerifierDeviceIdentity generate(Random rng) {
+ long identity = rng.nextLong();
+ return new VerifierDeviceIdentity(identity);
+ }
+
+ private static final char ENCODE[] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', '2', '3', '4', '5', '6', '7',
+ };
+
+ private static final char SEPARATOR = '-';
+
+ private static final String encodeBase32(long input) {
+ final char[] alphabet = ENCODE;
+
+ /*
+ * Make a character array with room for the separators between each
+ * group.
+ */
+ final char encoded[] = new char[LONG_SIZE + (LONG_SIZE / GROUP_SIZE)];
+
+ int index = encoded.length;
+ for (int i = 0; i < LONG_SIZE; i++) {
+ /*
+ * Make sure we don't put a separator at the beginning. Since we're
+ * building from the rear of the array, we use (LONG_SIZE %
+ * GROUP_SIZE) to make the odd-size group appear at the end instead
+ * of the beginning.
+ */
+ if (i > 0 && (i % GROUP_SIZE) == (LONG_SIZE % GROUP_SIZE)) {
+ encoded[--index] = SEPARATOR;
+ }
+
+ /*
+ * Extract 5 bits of data, then shift it out.
+ */
+ final int group = (int) (input & 0x1F);
+ input >>>= 5;
+
+ encoded[--index] = alphabet[group];
+ }
+
+ return String.valueOf(encoded);
+ }
+
+ // TODO move this out to its own class (android.util.Base32)
+ private static final long decodeBase32(byte[] input) throws IllegalArgumentException {
+ long output = 0L;
+ int numParsed = 0;
+
+ final int N = input.length;
+ for (int i = 0; i < N; i++) {
+ final int group = input[i];
+
+ /*
+ * This essentially does the reverse of the ENCODED alphabet above
+ * without a table. A..Z are 0..25 and 2..7 are 26..31.
+ */
+ final int value;
+ if ('A' <= group && group <= 'Z') {
+ value = group - 'A';
+ } else if ('2' <= group && group <= '7') {
+ value = group - ('2' - 26);
+ } else if (group == SEPARATOR) {
+ continue;
+ } else if ('a' <= group && group <= 'z') {
+ /* Lowercase letters should be the same as uppercase for Base32 */
+ value = group - 'a';
+ } else if (group == '0') {
+ /* Be nice to users that mistake O (letter) for 0 (zero) */
+ value = 'O' - 'A';
+ } else if (group == '1') {
+ /* Be nice to users that mistake I (letter) for 1 (one) */
+ value = 'I' - 'A';
+ } else {
+ throw new IllegalArgumentException("base base-32 character: " + group);
+ }
+
+ output = (output << 5) | value;
+ numParsed++;
+
+ if (numParsed == 1) {
+ if ((value & 0xF) != value) {
+ throw new IllegalArgumentException("illegal start character; will overflow");
+ }
+ } else if (numParsed > 13) {
+ throw new IllegalArgumentException("too long; should have 13 characters");
+ }
+ }
+
+ if (numParsed != 13) {
+ throw new IllegalArgumentException("too short; should have 13 characters");
+ }
+
+ return output;
+ }
+
+ @Override
+ public int hashCode() {
+ return (int) mIdentity;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof VerifierDeviceIdentity)) {
+ return false;
+ }
+
+ final VerifierDeviceIdentity o = (VerifierDeviceIdentity) other;
+ return mIdentity == o.mIdentity;
+ }
+
+ @Override
+ public String toString() {
+ return mIdentityString;
+ }
+
+ public static VerifierDeviceIdentity parse(String deviceIdentity)
+ throws IllegalArgumentException {
+ final byte[] input;
+ try {
+ input = deviceIdentity.getBytes("US-ASCII");
+ } catch (UnsupportedEncodingException e) {
+ throw new IllegalArgumentException("bad base-32 characters in input");
+ }
+
+ return new VerifierDeviceIdentity(decodeBase32(input));
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeLong(mIdentity);
+ }
+
+ public static final Parcelable.Creator<VerifierDeviceIdentity> CREATOR
+ = new Parcelable.Creator<VerifierDeviceIdentity>() {
+ public VerifierDeviceIdentity createFromParcel(Parcel source) {
+ return new VerifierDeviceIdentity(source);
+ }
+
+ public VerifierDeviceIdentity[] newArray(int size) {
+ return new VerifierDeviceIdentity[size];
+ }
+ };
+}
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index d7f901a..4f19010 100755
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -72,6 +72,7 @@
static final String TAG = "Resources";
private static final boolean DEBUG_LOAD = false;
private static final boolean DEBUG_CONFIG = false;
+ private static final boolean DEBUG_ATTRIBUTES_CACHE = false;
private static final boolean TRACE_FOR_PRELOAD = false;
private static final boolean TRACE_FOR_MISS_PRELOAD = false;
@@ -104,6 +105,7 @@
private boolean mPreloading;
/*package*/ TypedArray mCachedStyledAttributes = null;
+ RuntimeException mLastRetrievedAttrs = null;
private int mLastCachedXmlBlockIndex = -1;
private final int[] mCachedXmlBlockIds = { 0, 0, 0, 0 };
@@ -2167,6 +2169,10 @@
TypedArray attrs = mCachedStyledAttributes;
if (attrs != null) {
mCachedStyledAttributes = null;
+ if (DEBUG_ATTRIBUTES_CACHE) {
+ mLastRetrievedAttrs = new RuntimeException("here");
+ mLastRetrievedAttrs.fillInStackTrace();
+ }
attrs.mLength = len;
int fullLen = len * AssetManager.STYLE_NUM_ENTRIES;
@@ -2177,6 +2183,15 @@
attrs.mIndices = new int[1+len];
return attrs;
}
+ if (DEBUG_ATTRIBUTES_CACHE) {
+ RuntimeException here = new RuntimeException("here");
+ here.fillInStackTrace();
+ if (mLastRetrievedAttrs != null) {
+ Log.i(TAG, "Allocated new TypedArray of " + len + " in " + this, here);
+ Log.i(TAG, "Last retrieved attributes here", mLastRetrievedAttrs);
+ }
+ mLastRetrievedAttrs = here;
+ }
return new TypedArray(this,
new int[len*AssetManager.STYLE_NUM_ENTRIES],
new int[1+len], len);
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index 2111cce..aeb5d92 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -1090,7 +1090,7 @@
delay = 20000;
break;
case SENSOR_DELAY_UI:
- delay = 60000;
+ delay = 66667;
break;
case SENSOR_DELAY_NORMAL:
delay = 200000;
diff --git a/core/java/android/inputmethodservice/ExtractEditLayout.java b/core/java/android/inputmethodservice/ExtractEditLayout.java
index 5cfa998..220214b 100644
--- a/core/java/android/inputmethodservice/ExtractEditLayout.java
+++ b/core/java/android/inputmethodservice/ExtractEditLayout.java
@@ -26,6 +26,7 @@
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.Button;
import android.widget.LinearLayout;
@@ -56,11 +57,28 @@
mExtractActionButton.setVisibility(INVISIBLE);
mEditButton.setVisibility(VISIBLE);
mActionMode = mode;
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
return mode;
}
return null;
}
+ /**
+ * @return true if an action mode is currently active.
+ */
+ public boolean isActionModeStarted() {
+ return mActionMode != null;
+ }
+
+ /**
+ * Finishes a possibly started action mode.
+ */
+ public void finishActionMode() {
+ if (mActionMode != null) {
+ mActionMode.finish();
+ }
+ }
+
@Override
public void onFinishInflate() {
super.onFinishInflate();
@@ -92,7 +110,7 @@
@Override
public void setTitle(int resId) {
- // Title will nor be shown.
+ // Title will not be shown.
}
@Override
@@ -142,6 +160,8 @@
mExtractActionButton.setVisibility(VISIBLE);
mEditButton.setVisibility(INVISIBLE);
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+
mActionMode = null;
}
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 7d3cd92..60188ea 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -637,6 +637,7 @@
* configuration change happens.
*/
public void onInitializeInterface() {
+ // Intentionally empty
}
void initialize() {
@@ -686,11 +687,16 @@
super.onDestroy();
mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
mInsetsComputer);
+ finishViews();
if (mWindowAdded) {
+ // Disable exit animation for the current IME window
+ // to avoid the race condition between the exit and enter animations
+ // when the current IME is being switched to another one.
+ mWindow.getWindow().setWindowAnimations(0);
mWindow.dismiss();
}
}
-
+
/**
* Take care of handling configuration changes. Subclasses of
* InputMethodService generally don't need to deal directly with
@@ -876,8 +882,7 @@
}
if (changed) {
- onConfigureWindow(mWindow.getWindow(), isFullscreen,
- !mShowInputRequested);
+ onConfigureWindow(mWindow.getWindow(), isFullscreen, !mShowInputRequested);
mLastShowInputRequested = mShowInputRequested;
}
}
@@ -935,7 +940,7 @@
}
return true;
}
-
+
/**
* Controls the visibility of the extracted text area. This only applies
* when the input method is in fullscreen mode, and thus showing extracted
@@ -1242,6 +1247,7 @@
* same text field as before.
*/
public void onStartInputView(EditorInfo info, boolean restarting) {
+ // Intentionally empty
}
/**
@@ -1286,6 +1292,7 @@
* same text field as before.
*/
public void onStartCandidatesView(EditorInfo info, boolean restarting) {
+ // Intentionally empty
}
/**
@@ -1430,7 +1437,7 @@
}
}
- public void hideWindow() {
+ private void finishViews() {
if (mInputViewStarted) {
if (DEBUG) Log.v(TAG, "CALL: onFinishInputView");
onFinishInputView(false);
@@ -1440,6 +1447,10 @@
}
mInputViewStarted = false;
mCandidatesViewStarted = false;
+ }
+
+ public void hideWindow() {
+ finishViews();
mImm.setImeWindowStatus(mToken, 0, mBackDisposition);
if (mWindowVisible) {
mWindow.hide();
@@ -1455,6 +1466,7 @@
* for the window has occurred (creating its views etc).
*/
public void onWindowShown() {
+ // Intentionally empty
}
/**
@@ -1462,6 +1474,7 @@
* after previously being visible.
*/
public void onWindowHidden() {
+ // Intentionally empty
}
/**
@@ -1472,6 +1485,7 @@
* and {@link #getCurrentInputConnection} return valid objects.
*/
public void onBindInput() {
+ // Intentionally empty
}
/**
@@ -1481,6 +1495,7 @@
* valid objects.
*/
public void onUnbindInput() {
+ // Intentionally empty
}
/**
@@ -1496,6 +1511,7 @@
* session with the editor.
*/
public void onStartInput(EditorInfo attribute, boolean restarting) {
+ // Intentionally empty
}
void doFinishInput() {
@@ -1570,6 +1586,7 @@
* <p>The default implementation here does nothing.
*/
public void onDisplayCompletions(CompletionInfo[] completions) {
+ // Intentionally empty
}
/**
@@ -1626,6 +1643,7 @@
* @param focusChanged true if the user changed the focused view by this click.
*/
public void onViewClicked(boolean focusChanged) {
+ // Intentionally empty
}
/**
@@ -1634,6 +1652,7 @@
* The default implementation does nothing.
*/
public void onUpdateCursor(Rect newCursor) {
+ // Intentionally empty
}
/**
@@ -1664,6 +1683,13 @@
private boolean handleBack(boolean doIt) {
if (mShowInputRequested) {
+ if (isExtractViewShown() && mExtractView instanceof ExtractEditLayout) {
+ ExtractEditLayout extractEditLayout = (ExtractEditLayout) mExtractView;
+ if (extractEditLayout.isActionModeStarted()) {
+ if (doIt) extractEditLayout.finishActionMode();
+ return true;
+ }
+ }
// If the soft input area is shown, back closes it and we
// consume the back key.
if (doIt) requestHideSelf(0);
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index 65c1bd5..bcf6239 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -394,7 +394,7 @@
&& lastReason != null)
reason = lastReason;
mNetworkInfo.setDetailedState(state, reason, extraInfo);
- Message msg = mTarget.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
+ Message msg = mTarget.obtainMessage(EVENT_STATE_CHANGED, new NetworkInfo(mNetworkInfo));
msg.sendToTarget();
}
}
diff --git a/core/java/android/net/NetworkStatsHistory.java b/core/java/android/net/NetworkStatsHistory.java
index d07d899..d8ac31f 100644
--- a/core/java/android/net/NetworkStatsHistory.java
+++ b/core/java/android/net/NetworkStatsHistory.java
@@ -29,6 +29,7 @@
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.MathUtils;
import java.io.CharArrayWriter;
import java.io.DataInputStream;
@@ -207,6 +208,34 @@
}
/**
+ * Return index of bucket that contains or is immediately before the
+ * requested time.
+ */
+ public int getIndexBefore(long time) {
+ int index = Arrays.binarySearch(bucketStart, 0, bucketCount, time);
+ if (index < 0) {
+ index = (~index) - 1;
+ } else {
+ index -= 1;
+ }
+ return MathUtils.constrain(index, 0, bucketCount - 1);
+ }
+
+ /**
+ * Return index of bucket that contains or is immediately after the
+ * requested time.
+ */
+ public int getIndexAfter(long time) {
+ int index = Arrays.binarySearch(bucketStart, 0, bucketCount, time);
+ if (index < 0) {
+ index = ~index;
+ } else {
+ index += 1;
+ }
+ return MathUtils.constrain(index, 0, bucketCount - 1);
+ }
+
+ /**
* Return specific stats entry.
*/
public Entry getValues(int i, Entry recycle) {
@@ -247,7 +276,8 @@
// distribute data usage into buckets
long duration = end - start;
- for (int i = bucketCount - 1; i >= 0; i--) {
+ final int startIndex = getIndexAfter(end);
+ for (int i = startIndex; i >= 0; i--) {
final long curStart = bucketStart[i];
final long curEnd = curStart + bucketDuration;
@@ -406,7 +436,8 @@
entry.txPackets = txPackets != null ? 0 : UNKNOWN;
entry.operations = operations != null ? 0 : UNKNOWN;
- for (int i = bucketCount - 1; i >= 0; i--) {
+ final int startIndex = getIndexAfter(end);
+ for (int i = startIndex; i >= 0; i--) {
final long curStart = bucketStart[i];
final long curEnd = curStart + bucketDuration;
@@ -417,8 +448,14 @@
// include full value for active buckets, otherwise only fractional
final boolean activeBucket = curStart < now && curEnd > now;
- final long overlap = activeBucket ? bucketDuration
- : Math.min(curEnd, end) - Math.max(curStart, start);
+ final long overlap;
+ if (activeBucket) {
+ overlap = bucketDuration;
+ } else {
+ final long overlapEnd = curEnd < end ? curEnd : end;
+ final long overlapStart = curStart > start ? curStart : start;
+ overlap = overlapEnd - overlapStart;
+ }
if (overlap <= 0) continue;
// integer math each time is faster than floating point
diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java
index ec3b1e1..47cfa73 100644
--- a/core/java/android/net/TrafficStats.java
+++ b/core/java/android/net/TrafficStats.java
@@ -104,14 +104,6 @@
return NetworkManagementSocketTagger.getThreadSocketStatsTag();
}
- /**
- * @deprecated unsupported, will eventually be removed
- */
- @Deprecated
- public static void setThreadStatsTag(String tag) {
- setThreadStatsTag(tag.hashCode());
- }
-
public static void clearThreadStatsTag() {
NetworkManagementSocketTagger.setThreadSocketStatsTag(-1);
}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 1e9ee7c..1d8ea12 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -277,7 +277,7 @@
public static final int HONEYCOMB_MR2 = 13;
/**
- * Current version under development.
+ * Android 4.0.
*
* <p>Applications targeting this or a later release will get these
* new changes in behavior:</p>
@@ -298,7 +298,7 @@
* {@link android.R.style#Theme_DeviceDefault} family.
* </ul>
*/
- public static final int ICE_CREAM_SANDWICH = CUR_DEVELOPMENT;
+ public static final int ICE_CREAM_SANDWICH = 14;
}
/** The type of build, like "user" or "eng". */
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index 0440923..4e5645d 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -74,6 +74,11 @@
void setInterfaceUp(String iface);
/**
+ * Set interface IPv6 privacy extensions
+ */
+ void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable);
+
+ /**
* Retrieves the network routes currently configured on the specified
* interface
*/
diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java
index e0130b5..d1dc6e5 100644
--- a/core/java/android/os/storage/IMountService.java
+++ b/core/java/android/os/storage/IMountService.java
@@ -169,13 +169,15 @@
* is an asynchronous operation. Applications should register
* StorageEventListener for storage related status changes.
*/
- public void unmountVolume(String mountPoint, boolean force) throws RemoteException {
+ public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
+ throws RemoteException {
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(mountPoint);
_data.writeInt((force ? 1 : 0));
+ _data.writeInt((removeEncryption ? 1 : 0));
mRemote.transact(Stub.TRANSACTION_unmountVolume, _data, _reply, 0);
_reply.readException();
} finally {
@@ -842,9 +844,9 @@
data.enforceInterface(DESCRIPTOR);
String mountPoint;
mountPoint = data.readString();
- boolean force;
- force = 0 != data.readInt();
- unmountVolume(mountPoint, force);
+ boolean force = 0 != data.readInt();
+ boolean removeEncrypt = 0 != data.readInt();
+ unmountVolume(mountPoint, force, removeEncrypt);
reply.writeNoException();
return true;
}
@@ -1234,8 +1236,14 @@
* Safely unmount external storage at given mount point. The unmount is an
* asynchronous operation. Applications should register StorageEventListener
* for storage related status changes.
+ * @param mountPoint the mount point
+ * @param force whether or not to forcefully unmount it (e.g. even if programs are using this
+ * data currently)
+ * @param removeEncryption whether or not encryption mapping should be removed from the volume.
+ * This value implies {@code force}.
*/
- public void unmountVolume(String mountPoint, boolean force) throws RemoteException;
+ public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
+ throws RemoteException;
/**
* Unregisters an IMountServiceListener
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index bc5994e..e5882fc 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4031,6 +4031,8 @@
public static final String NETSTATS_UID_MAX_HISTORY = "netstats_uid_max_history";
/** {@hide} */
public static final String NETSTATS_TAG_MAX_HISTORY = "netstats_tag_max_history";
+ /** {@hide} */
+ public static final String NETSTATS_FORCE_COMPLETE_POLL = "netstats_force_complete_poll";
/** Preferred NTP server. {@hide} */
public static final String NTP_SERVER = "ntp_server";
diff --git a/core/java/android/provider/SyncStateContract.java b/core/java/android/provider/SyncStateContract.java
index e8177ca..f1189e4 100644
--- a/core/java/android/provider/SyncStateContract.java
+++ b/core/java/android/provider/SyncStateContract.java
@@ -74,6 +74,12 @@
Account account) throws RemoteException {
Cursor c = provider.query(uri, DATA_PROJECTION, SELECT_BY_ACCOUNT,
new String[]{account.name, account.type}, null);
+
+ // Unable to query the provider
+ if (c == null) {
+ throw new RemoteException();
+ }
+
try {
if (c.moveToNext()) {
return c.getBlob(c.getColumnIndexOrThrow(Columns.DATA));
@@ -123,6 +129,11 @@
Account account) throws RemoteException {
Cursor c = provider.query(uri, DATA_PROJECTION, SELECT_BY_ACCOUNT,
new String[]{account.name, account.type}, null);
+
+ if (c == null) {
+ throw new RemoteException();
+ }
+
try {
if (c.moveToNext()) {
long rowId = c.getLong(1);
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
old mode 100644
new mode 100755
index 6585e82..e849b71
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -1798,6 +1798,20 @@
public static final String ROAMING_PROTOCOL = "roaming_protocol";
public static final String CURRENT = "current";
+
+ /**
+ * Current status of APN
+ * true : enabled APN, false : disabled APN.
+ */
+ public static final String CARRIER_ENABLED = "carrier_enabled";
+
+ /**
+ * Radio Access Technology info
+ * To check what values can hold, refer to ServiceState.java.
+ * This should be spread to other technologies,
+ * but currently only used for LTE(14) and EHRPD(13).
+ */
+ public static final String BEARER = "bearer";
}
public static final class Intents {
diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java
index e4f2d32..1b473ec 100644
--- a/core/java/android/server/BluetoothEventLoop.java
+++ b/core/java/android/server/BluetoothEventLoop.java
@@ -20,6 +20,7 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHealth;
import android.bluetooth.BluetoothInputDevice;
import android.bluetooth.BluetoothPan;
import android.bluetooth.BluetoothProfile;
@@ -400,6 +401,7 @@
Intent intent = new Intent(BluetoothDevice.ACTION_NAME_CHANGED);
intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
intent.putExtra(BluetoothDevice.EXTRA_NAME, propValues[1]);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
mContext.sendBroadcast(intent, BLUETOOTH_PERM);
} else if (name.equals("Alias")) {
mBluetoothService.setRemoteDeviceProperty(address, name, propValues[1]);
@@ -409,6 +411,7 @@
intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
intent.putExtra(BluetoothDevice.EXTRA_CLASS,
new BluetoothClass(Integer.valueOf(propValues[1])));
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
mContext.sendBroadcast(intent, BLUETOOTH_PERM);
} else if (name.equals("Connected")) {
mBluetoothService.setRemoteDeviceProperty(address, name, propValues[1]);
@@ -424,6 +427,7 @@
intent = new Intent(BluetoothDevice.ACTION_ACL_DISCONNECTED);
}
intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
mContext.sendBroadcast(intent, BLUETOOTH_PERM);
} else if (name.equals("UUIDs")) {
String uuid = null;
@@ -974,6 +978,22 @@
}
/**
+ * Called by native code for the async response to a Connect
+ * method call to org.bluez.Health
+ *
+ * @param chanCode The internal id of the channel
+ * @param result Result code of the operation.
+ */
+ private void onHealthDeviceConnectionResult(int chanCode, int result) {
+ log ("onHealthDeviceConnectionResult " + chanCode + " " + result);
+ // Success case gets handled by Property Change signal
+ if (result != BluetoothHealth.HEALTH_OPERATION_SUCCESS) {
+ mBluetoothService.onHealthDeviceChannelConnectionError(chanCode,
+ BluetoothHealth.STATE_CHANNEL_DISCONNECTED);
+ }
+ }
+
+ /**
* Called by native code on a DeviceDisconnected signal from
* org.bluez.NetworkServer.
*
diff --git a/core/java/android/server/BluetoothHealthProfileHandler.java b/core/java/android/server/BluetoothHealthProfileHandler.java
index a6ada2b..2961fd2 100644
--- a/core/java/android/server/BluetoothHealthProfileHandler.java
+++ b/core/java/android/server/BluetoothHealthProfileHandler.java
@@ -29,12 +29,12 @@
import android.os.RemoteException;
import android.util.Log;
-import java.io.FileDescriptor;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* This handles all the operations on the Bluetooth Health profile.
@@ -58,6 +58,7 @@
private static final int MESSAGE_REGISTER_APPLICATION = 0;
private static final int MESSAGE_UNREGISTER_APPLICATION = 1;
private static final int MESSAGE_CONNECT_CHANNEL = 2;
+ private static final AtomicInteger sChannelId = new AtomicInteger();
class HealthChannel {
private ParcelFileDescriptor mChannelFd;
@@ -67,6 +68,7 @@
private BluetoothHealthAppConfiguration mConfig;
private int mState;
private int mChannelType;
+ private int mId;
HealthChannel(BluetoothDevice device, BluetoothHealthAppConfiguration config,
ParcelFileDescriptor fd, boolean mainChannel, String channelPath) {
@@ -76,17 +78,7 @@
mDevice = device;
mConfig = config;
mState = BluetoothHealth.STATE_CHANNEL_DISCONNECTED;
- }
-
- @Override
- public int hashCode() {
- int result = 17;
- result = 31 * result + (mChannelPath == null ? 0 : mChannelPath.hashCode());
- result = 31 * result + mDevice.hashCode();
- result = 31 * result + mConfig.hashCode();
- result = 31 * result + mState;
- result = 31 * result + mChannelType;
- return result;
+ mId = getChannelId();
}
}
@@ -128,7 +120,7 @@
for (HealthChannel chan : mHealthChannels) {
if (chan.mConfig.equals(unregisterApp) &&
chan.mState != BluetoothHealth.STATE_CHANNEL_DISCONNECTED) {
- disconnectChannel(chan.mDevice, unregisterApp, chan.hashCode());
+ disconnectChannel(chan.mDevice, unregisterApp, chan.mId);
}
}
@@ -152,11 +144,11 @@
String channelType = getStringChannelType(chan.mChannelType);
if (!mBluetoothService.createChannelNative(deviceObjectPath, configPath,
- channelType)) {
+ channelType, chan.mId)) {
int prevState = chan.mState;
int state = BluetoothHealth.STATE_CHANNEL_DISCONNECTED;
callHealthChannelCallback(chan.mConfig, chan.mDevice, prevState, state, null,
- chan.hashCode());
+ chan.mId);
mHealthChannels.remove(chan);
}
}
@@ -227,7 +219,7 @@
int prevState = BluetoothHealth.STATE_CHANNEL_DISCONNECTED;
int state = BluetoothHealth.STATE_CHANNEL_CONNECTING;
- callHealthChannelCallback(config, device, prevState, state, null, chan.hashCode());
+ callHealthChannelCallback(config, device, prevState, state, null, chan.mId);
Message msg = mHandler.obtainMessage(MESSAGE_CONNECT_CHANNEL);
msg.obj = chan;
@@ -256,9 +248,26 @@
}
}
+ private int getChannelId() {
+ // The function doesn't need to be synchronized, as the health profile handler
+ // will only allow one health channel object creation at a time.
+ // In the worst case the while loop will have to break out at some point of
+ // time, because only a limited number of L2CAP channels are possible.
+ int id;
+ boolean found;
+ do {
+ id = sChannelId.incrementAndGet();
+ found = false;
+ for (HealthChannel chan: mHealthChannels) {
+ if (chan.mId == id) found = true;
+ }
+ } while (found);
+ return id;
+ }
+
boolean disconnectChannel(BluetoothDevice device,
BluetoothHealthAppConfiguration config, int id) {
- HealthChannel chan = findChannelById(device, config, id);
+ HealthChannel chan = findChannelById(id);
if (chan == null) {
return false;
}
@@ -271,23 +280,23 @@
int prevState = chan.mState;
chan.mState = BluetoothHealth.STATE_CHANNEL_DISCONNECTING;
callHealthChannelCallback(config, device, prevState, chan.mState,
- null, chan.hashCode());
+ null, chan.mId);
- if (!mBluetoothService.destroyChannelNative(deviceObjectPath, chan.mChannelPath)) {
+ if (!mBluetoothService.destroyChannelNative(deviceObjectPath, chan.mChannelPath,
+ chan.mId)) {
prevState = chan.mState;
chan.mState = BluetoothHealth.STATE_CHANNEL_CONNECTED;
callHealthChannelCallback(config, device, prevState, chan.mState,
- chan.mChannelFd, chan.hashCode());
+ chan.mChannelFd, chan.mId);
return false;
} else {
return true;
}
}
- private HealthChannel findChannelById(BluetoothDevice device,
- BluetoothHealthAppConfiguration config, int id) {
+ private HealthChannel findChannelById(int id) {
for (HealthChannel chan : mHealthChannels) {
- if (chan.hashCode() == id) return chan;
+ if (chan.mId == id) return chan;
}
return null;
}
@@ -384,6 +393,15 @@
}
}
+ /*package*/ void onHealthDeviceChannelConnectionError(int chanCode,
+ int state) {
+ HealthChannel channel = findChannelById(chanCode);
+ if (channel == null) errorLog("No record of this channel:" + chanCode);
+
+ callHealthChannelCallback(channel.mConfig, channel.mDevice, channel.mState, state, null,
+ chanCode);
+ }
+
private BluetoothHealthAppConfiguration findHealthApplication(
BluetoothDevice device, String channelPath) {
BluetoothHealthAppConfiguration config = null;
@@ -424,9 +442,19 @@
config = findHealthApplication(device, channelPath);
if (exists) {
+ channel = findConnectingChannel(device, config);
+ if (channel == null) {
+ channel = new HealthChannel(device, config, null, false,
+ channelPath);
+ channel.mState = BluetoothHealth.STATE_CHANNEL_DISCONNECTED;
+ mHealthChannels.add(channel);
+ }
+ channel.mChannelPath = channelPath;
+
fd = mBluetoothService.getChannelFdNative(channelPath);
if (fd == null) {
errorLog("Error obtaining fd for channel:" + channelPath);
+ disconnectChannel(device, config, channel.mId);
return;
}
boolean mainChannel =
@@ -440,18 +468,10 @@
}
if (mainChannelPath.equals(channelPath)) mainChannel = true;
}
- channel = findConnectingChannel(device, config);
- if (channel != null) {
- channel.mChannelFd = fd;
- channel.mMainChannel = mainChannel;
- channel.mChannelPath = channelPath;
- prevState = channel.mState;
- } else {
- channel = new HealthChannel(device, config, fd, mainChannel,
- channelPath);
- mHealthChannels.add(channel);
- prevState = BluetoothHealth.STATE_CHANNEL_DISCONNECTED;
- }
+
+ channel.mChannelFd = fd;
+ channel.mMainChannel = mainChannel;
+ prevState = channel.mState;
state = BluetoothHealth.STATE_CHANNEL_CONNECTED;
} else {
channel = findChannelByPath(device, channelPath);
@@ -467,7 +487,7 @@
}
channel.mState = state;
callHealthChannelCallback(config, device, prevState, state, channel.mChannelFd,
- channel.hashCode());
+ channel.mId);
}
private void callHealthChannelCallback(BluetoothHealthAppConfiguration config,
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index 03180ca..f0fb4e0 100755
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -145,7 +145,7 @@
private final ArrayList<String> mUuidIntentTracker;
private final HashMap<RemoteService, IBluetoothCallback> mUuidCallbackTracker;
- private final HashMap<Integer, Integer> mServiceRecordToPid;
+ private final HashMap<Integer, Pair<Integer, IBinder>> mServiceRecordToPid;
private final HashMap<String, BluetoothDeviceProfileState> mDeviceProfileState;
private final BluetoothProfileState mA2dpProfileState;
@@ -221,7 +221,7 @@
mDeviceOobData = new HashMap<String, Pair<byte[], byte[]>>();
mUuidIntentTracker = new ArrayList<String>();
mUuidCallbackTracker = new HashMap<RemoteService, IBluetoothCallback>();
- mServiceRecordToPid = new HashMap<Integer, Integer>();
+ mServiceRecordToPid = new HashMap<Integer, Pair<Integer, IBinder>>();
mDeviceProfileState = new HashMap<String, BluetoothDeviceProfileState>();
mA2dpProfileState = new BluetoothProfileState(mContext, BluetoothProfileState.A2DP);
mHfpProfileState = new BluetoothProfileState(mContext, BluetoothProfileState.HFP);
@@ -1516,10 +1516,10 @@
}
int pid = Binder.getCallingPid();
- mServiceRecordToPid.put(new Integer(handle), new Integer(pid));
+ mServiceRecordToPid.put(new Integer(handle), new Pair<Integer, IBinder>(pid, b));
try {
b.linkToDeath(new Reaper(handle, pid, RFCOMM_RECORD_REAPER), 0);
- } catch (RemoteException e) {}
+ } catch (RemoteException e) {Log.e(TAG, "", e);}
return handle;
}
@@ -1532,12 +1532,12 @@
}
private synchronized void checkAndRemoveRecord(int handle, int pid) {
- Integer handleInt = new Integer(handle);
- Integer owner = mServiceRecordToPid.get(handleInt);
+ Pair<Integer, IBinder> pidPair = mServiceRecordToPid.get(handle);
+ Integer owner = pidPair.first;
if (owner != null && pid == owner.intValue()) {
if (DBG) Log.d(TAG, "Removing service record " +
Integer.toHexString(handle) + " for pid " + pid);
- mServiceRecordToPid.remove(handleInt);
+ mServiceRecordToPid.remove(handle);
removeServiceRecordNative(handle);
}
}
@@ -1593,6 +1593,7 @@
try {
binder.linkToDeath(new Reaper(pid, STATE_CHANGE_REAPER), 0);
} catch (RemoteException e) {
+ Log.e(TAG, "", e);
return false;
}
}
@@ -1867,7 +1868,7 @@
private void dumpApplicationServiceRecords(PrintWriter pw) {
pw.println("\n--Application Service Records--");
for (Integer handle : mServiceRecordToPid.keySet()) {
- Integer pid = mServiceRecordToPid.get(handle);
+ Integer pid = mServiceRecordToPid.get(handle).first;
pw.println("\tpid " + pid + " handle " + Integer.toHexString(handle));
}
mAdapter.closeProfileProxy(BluetoothProfile.PAN, mBluetoothHeadset);
@@ -2255,6 +2256,14 @@
}
}
+ /*package*/ void onHealthDeviceChannelConnectionError(int channelCode,
+ int newState) {
+ synchronized(mBluetoothHealthProfileHandler) {
+ mBluetoothHealthProfileHandler.onHealthDeviceChannelConnectionError(channelCode,
+ newState);
+ }
+ }
+
public int getHealthDeviceConnectionState(BluetoothDevice device) {
mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM,
"Need BLUETOOTH permission");
@@ -2785,8 +2794,9 @@
String channelType);
native String registerHealthApplicationNative(int dataType, String role, String name);
native boolean unregisterHealthApplicationNative(String path);
- native boolean createChannelNative(String devicePath, String appPath, String channelType);
- native boolean destroyChannelNative(String devicePath, String channelpath);
+ native boolean createChannelNative(String devicePath, String appPath, String channelType,
+ int code);
+ native boolean destroyChannelNative(String devicePath, String channelpath, int code);
native String getMainChannelNative(String path);
native String getChannelApplicationNative(String channelPath);
native ParcelFileDescriptor getChannelFdNative(String channelPath);
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 39f9367..713bb91 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -36,6 +36,7 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.util.Log;
@@ -716,7 +717,9 @@
mSession = ViewRootImpl.getWindowSession(getMainLooper());
mWindow.setSession(mSession);
-
+
+ mScreenOn = ((PowerManager)getSystemService(Context.POWER_SERVICE)).isScreenOn();
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
diff --git a/core/java/android/speech/tts/AudioPlaybackHandler.java b/core/java/android/speech/tts/AudioPlaybackHandler.java
index 75dcd6e..d970ae6 100644
--- a/core/java/android/speech/tts/AudioPlaybackHandler.java
+++ b/core/java/android/speech/tts/AudioPlaybackHandler.java
@@ -450,6 +450,19 @@
*/
private static final long MIN_SLEEP_TIME_MS = 20;
+ /**
+ * The maximum increment of time to sleep while waiting for an audiotrack
+ * to finish playing.
+ */
+ private static final long MAX_SLEEP_TIME_MS = 2500;
+
+ /**
+ * The maximum amount of time to wait for an audio track to make progress while
+ * it remains in PLAYSTATE_PLAYING. This should never happen in normal usage, but
+ * could happen in exceptional circumstances like a media_server crash.
+ */
+ private static final long MAX_PROGRESS_WAIT_MS = MAX_SLEEP_TIME_MS;
+
private static void blockUntilDone(SynthesisMessageParams params) {
if (params.mAudioTrack == null || params.mBytesWritten <= 0) {
return;
@@ -490,16 +503,34 @@
final AudioTrack audioTrack = params.mAudioTrack;
final int lengthInFrames = params.mBytesWritten / params.mBytesPerFrame;
+ int previousPosition = -1;
int currentPosition = 0;
- while ((currentPosition = audioTrack.getPlaybackHeadPosition()) < lengthInFrames) {
- if (audioTrack.getPlayState() != AudioTrack.PLAYSTATE_PLAYING) {
- break;
- }
+ long blockedTimeMs = 0;
+
+ while ((currentPosition = audioTrack.getPlaybackHeadPosition()) < lengthInFrames &&
+ audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
final long estimatedTimeMs = ((lengthInFrames - currentPosition) * 1000) /
audioTrack.getSampleRate();
+ final long sleepTimeMs = clip(estimatedTimeMs, MIN_SLEEP_TIME_MS, MAX_SLEEP_TIME_MS);
- final long sleepTimeMs = Math.max(estimatedTimeMs, MIN_SLEEP_TIME_MS);
+ // Check if the audio track has made progress since the last loop
+ // iteration. We should then add in the amount of time that was
+ // spent sleeping in the last iteration.
+ if (currentPosition == previousPosition) {
+ // This works only because the sleep time that would have been calculated
+ // would be the same in the previous iteration too.
+ blockedTimeMs += sleepTimeMs;
+ // If we've taken too long to make progress, bail.
+ if (blockedTimeMs > MAX_PROGRESS_WAIT_MS) {
+ Log.w(TAG, "Waited unsuccessfully for " + MAX_PROGRESS_WAIT_MS + "ms " +
+ "for AudioTrack to make progress, Aborting");
+ break;
+ }
+ } else {
+ blockedTimeMs = 0;
+ }
+ previousPosition = currentPosition;
if (DBG) Log.d(TAG, "About to sleep for : " + sleepTimeMs + " ms," +
" Playback position : " + currentPosition + ", Length in frames : "
@@ -512,6 +543,18 @@
}
}
+ private static final long clip(long value, long min, long max) {
+ if (value < min) {
+ return min;
+ }
+
+ if (value > max) {
+ return max;
+ }
+
+ return value;
+ }
+
private static AudioTrack createStreamingAudioTrack(SynthesisMessageParams params) {
final int channelConfig = getChannelConfig(params.mChannelCount);
final int sampleRateInHz = params.mSampleRateInHz;
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index 68a6b3e..a52d48e 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -723,7 +723,7 @@
float ret = 0;
int contextLen = contextEnd - contextStart;
- if (needWidth || (c != null && (wp.bgColor != 0 || wp.underlineCount != 0 || runIsRtl))) {
+ if (needWidth || (c != null && (wp.bgColor != 0 || wp.underlineColor != 0 || runIsRtl))) {
int flags = runIsRtl ? Paint.DIRECTION_RTL : Paint.DIRECTION_LTR;
if (mCharsValid) {
ret = wp.getTextRunAdvances(mChars, start, runLen,
@@ -753,7 +753,7 @@
wp.setColor(previousColor);
}
- if (wp.underlineCount != 0) {
+ if (wp.underlineColor != 0) {
// kStdUnderline_Offset = 1/9, defined in SkTextFormatParams.h
float underlineTop = y + wp.baselineShift + (1.0f / 9.0f) * wp.getTextSize();
@@ -764,11 +764,8 @@
wp.setStyle(Paint.Style.FILL);
wp.setAntiAlias(true);
- for (int i = 0; i < wp.underlineCount; i++) {
- wp.setColor(wp.underlineColors[i]);
- c.drawRect(x, underlineTop, x + ret, underlineTop + wp.underlineThicknesses[i],
- wp);
- }
+ wp.setColor(wp.underlineColor);
+ c.drawRect(x, underlineTop, x + ret, underlineTop + wp.underlineThickness, wp);
wp.setStyle(previousStyle);
wp.setColor(previousColor);
diff --git a/core/java/android/text/TextPaint.java b/core/java/android/text/TextPaint.java
index afd9892..0447117 100644
--- a/core/java/android/text/TextPaint.java
+++ b/core/java/android/text/TextPaint.java
@@ -24,8 +24,6 @@
*/
public class TextPaint extends Paint {
- private static final int DEFAULT_UNDERLINE_SIZE = 3;
-
// Special value 0 means no background paint
public int bgColor;
public int baselineShift;
@@ -36,17 +34,12 @@
* Special value 0 means no custom underline
* @hide
*/
- public int[] underlineColors;
+ public int underlineColor = 0;
/**
* Defined as a multiplier of the default underline thickness. Use 1.0f for default thickness.
* @hide
*/
- public float[] underlineThicknesses;
- /**
- * The number of underlines currently stored in the array. If 0, no underline is drawn.
- * @hide
- */
- public int underlineCount;
+ public float underlineThickness;
public TextPaint() {
super();
@@ -72,16 +65,8 @@
linkColor = tp.linkColor;
drawableState = tp.drawableState;
density = tp.density;
-
- if (tp.underlineColors != null) {
- if (underlineColors == null || underlineColors.length < tp.underlineCount) {
- underlineColors = new int[tp.underlineCount];
- underlineThicknesses = new float[tp.underlineCount];
- }
- System.arraycopy(tp.underlineColors, 0, underlineColors, 0, tp.underlineCount);
- System.arraycopy(tp.underlineThicknesses, 0, underlineThicknesses, 0, tp.underlineCount);
- }
- underlineCount = tp.underlineCount;
+ underlineColor = tp.underlineColor;
+ underlineThickness = tp.underlineThickness;
}
/**
@@ -91,31 +76,7 @@
* @hide
*/
public void setUnderlineText(int color, float thickness) {
- if (color == 0) {
- // No underline
- return;
- }
-
- if (underlineCount == 0) {
- underlineColors = new int[DEFAULT_UNDERLINE_SIZE];
- underlineThicknesses = new float[DEFAULT_UNDERLINE_SIZE];
- underlineColors[underlineCount] = color;
- underlineThicknesses[underlineCount] = thickness;
- underlineCount++;
- } else {
- if (underlineCount == underlineColors.length) {
- int[] newColors = new int[underlineColors.length + DEFAULT_UNDERLINE_SIZE];
- float[] newThickness = new float[underlineThicknesses.length
- + DEFAULT_UNDERLINE_SIZE];
- System.arraycopy(underlineColors, 0, newColors, 0, underlineColors.length);
- System.arraycopy(
- underlineThicknesses, 0, newThickness, 0, underlineThicknesses.length);
- underlineColors = newColors;
- underlineThicknesses = newThickness;
- }
- underlineColors[underlineCount] = color;
- underlineThicknesses[underlineCount] = thickness;
- underlineCount++;
- }
+ underlineColor = color;
+ underlineThickness = thickness;
}
}
diff --git a/core/java/android/text/style/SuggestionRangeSpan.java b/core/java/android/text/style/SuggestionRangeSpan.java
index a637b1c..2dbfc72 100644
--- a/core/java/android/text/style/SuggestionRangeSpan.java
+++ b/core/java/android/text/style/SuggestionRangeSpan.java
@@ -28,15 +28,11 @@
* @hide
*/
public class SuggestionRangeSpan extends CharacterStyle implements ParcelableSpan {
- private final int mBackgroundColor;
+ private int mBackgroundColor;
- @Override
- public void updateDrawState(TextPaint tp) {
- tp.bgColor = mBackgroundColor;
- }
-
- public SuggestionRangeSpan(int color) {
- mBackgroundColor = color;
+ public SuggestionRangeSpan() {
+ // 0 is a fully transparent black. Has to be set using #setBackgroundColor
+ mBackgroundColor = 0;
}
public SuggestionRangeSpan(Parcel src) {
@@ -57,4 +53,13 @@
public int getSpanTypeId() {
return TextUtils.SUGGESTION_RANGE_SPAN;
}
+
+ public void setBackgroundColor(int backgroundColor) {
+ mBackgroundColor = backgroundColor;
+ }
+
+ @Override
+ public void updateDrawState(TextPaint tp) {
+ tp.bgColor = mBackgroundColor;
+ }
}
diff --git a/core/java/android/text/style/SuggestionSpan.java b/core/java/android/text/style/SuggestionSpan.java
index 693a7a9..1379dd2d 100644
--- a/core/java/android/text/style/SuggestionSpan.java
+++ b/core/java/android/text/style/SuggestionSpan.java
@@ -108,7 +108,8 @@
/**
* @param context Context for the application
* @param locale locale Locale of the suggestions
- * @param suggestions Suggestions for the string under the span
+ * @param suggestions Suggestions for the string under the span. Only the first up to
+ * {@link SuggestionSpan#SUGGESTIONS_MAX_SIZE} will be considered.
* @param flags Additional flags indicating how this span is handled in TextView
* @param notificationTargetClass if not null, this class will get notified when the user
* selects one of the suggestions.
@@ -258,10 +259,35 @@
@Override
public void updateDrawState(TextPaint tp) {
- if ((mFlags & FLAG_MISSPELLED) != 0) {
- tp.setUnderlineText(mMisspelledUnderlineColor, mMisspelledUnderlineThickness);
- } else if ((mFlags & FLAG_EASY_CORRECT) != 0) {
- tp.setUnderlineText(mEasyCorrectUnderlineColor, mEasyCorrectUnderlineThickness);
+ final boolean misspelled = (mFlags & FLAG_MISSPELLED) != 0;
+ final boolean easy = (mFlags & FLAG_EASY_CORRECT) != 0;
+ if (easy) {
+ if (!misspelled) {
+ tp.setUnderlineText(mEasyCorrectUnderlineColor, mEasyCorrectUnderlineThickness);
+ } else if (tp.underlineColor == 0) {
+ // Spans are rendered in an arbitrary order. Since misspelled is less prioritary
+ // than just easy, do not apply misspelled if an easy (or a mispelled) has been set
+ tp.setUnderlineText(mMisspelledUnderlineColor, mMisspelledUnderlineThickness);
+ }
}
}
+
+ /**
+ * @return The color of the underline for that span, or 0 if there is no underline
+ *
+ * @hide
+ */
+ public int getUnderlineColor() {
+ // The order here should match what is used in updateDrawState
+ final boolean misspelled = (mFlags & FLAG_MISSPELLED) != 0;
+ final boolean easy = (mFlags & FLAG_EASY_CORRECT) != 0;
+ if (easy) {
+ if (!misspelled) {
+ return mEasyCorrectUnderlineColor;
+ } else {
+ return mMisspelledUnderlineColor;
+ }
+ }
+ return 0;
+ }
}
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 85e990aa..3bd0f76 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -30,7 +30,7 @@
*/
public class Display {
static final String TAG = "Display";
- static final boolean DEBUG_COMPAT = false;
+ static final boolean DEBUG_DISPLAY_SIZE = false;
/**
* The default Display id.
@@ -117,7 +117,8 @@
outSize.x = getRawWidth();
outSize.y = getRawHeight();
}
- if (DEBUG_COMPAT && doCompat) Slog.v(TAG, "Returning display size: " + outSize);
+ if (DEBUG_DISPLAY_SIZE && doCompat) Slog.v(
+ TAG, "Returning display size: " + outSize);
} catch (RemoteException e) {
Slog.w("Display", "Unable to get display size", e);
}
@@ -203,6 +204,8 @@
outSize.x = getRawWidth();
outSize.y = getRawHeight();
}
+ if (DEBUG_DISPLAY_SIZE) Slog.v(
+ TAG, "Returning real display size: " + outSize);
} catch (RemoteException e) {
Slog.w("Display", "Unable to get real display size", e);
}
@@ -215,7 +218,13 @@
* </p>
* @hide
*/
- native public int getRawWidth();
+ public int getRawWidth() {
+ int w = getRawWidthNative();
+ if (DEBUG_DISPLAY_SIZE) Slog.v(
+ TAG, "Returning raw display width: " + w);
+ return w;
+ }
+ private native int getRawWidthNative();
/**
* Gets the raw height of the display, in pixels.
@@ -224,7 +233,13 @@
* </p>
* @hide
*/
- native public int getRawHeight();
+ public int getRawHeight() {
+ int h = getRawHeightNative();
+ if (DEBUG_DISPLAY_SIZE) Slog.v(
+ TAG, "Returning raw display height: " + h);
+ return h;
+ }
+ private native int getRawHeightNative();
/**
* Returns the rotation of the screen from its "natural" orientation.
@@ -293,8 +308,9 @@
ci.applyToDisplayMetrics(outMetrics);
}
- if (DEBUG_COMPAT) Slog.v(TAG, "Returning DisplayMetrics: " + outMetrics.widthPixels
- + "x" + outMetrics.heightPixels + " " + outMetrics.density);
+ if (DEBUG_DISPLAY_SIZE) Slog.v(TAG, "Returning DisplayMetrics: "
+ + outMetrics.widthPixels + "x" + outMetrics.heightPixels
+ + " " + outMetrics.density);
}
/**
diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java
index 5a91d31..dfb2c32 100644
--- a/core/java/android/view/VelocityTracker.java
+++ b/core/java/android/view/VelocityTracker.java
@@ -59,6 +59,8 @@
private static native void nativeComputeCurrentVelocity(int ptr, int units, float maxVelocity);
private static native float nativeGetXVelocity(int ptr, int id);
private static native float nativeGetYVelocity(int ptr, int id);
+ private static native boolean nativeGetEstimator(int ptr, int id,
+ int degree, int horizonMillis, Estimator outEstimator);
/**
* Retrieve a new VelocityTracker object to watch the velocity of a
@@ -215,4 +217,94 @@
public float getYVelocity(int id) {
return nativeGetYVelocity(mPtr, id);
}
+
+ /**
+ * Get an estimator for the movements of a pointer using past movements of the
+ * pointer to predict future movements.
+ *
+ * It is not necessary to call {@link #computeCurrentVelocity(int)} before calling
+ * this method.
+ *
+ * @param id Which pointer's velocity to return.
+ * @param degree The desired polynomial degree. The actual estimator may have
+ * a lower degree than what is requested here. If -1, uses the default degree.
+ * @param horizonMillis The maximum age of the oldest sample to consider, in milliseconds.
+ * If -1, uses the default horizon.
+ * @param outEstimator The estimator to populate.
+ * @return True if an estimator was obtained, false if there is no information
+ * available about the pointer.
+ *
+ * @hide For internal use only. Not a final API.
+ */
+ public boolean getEstimator(int id, int degree, int horizonMillis, Estimator outEstimator) {
+ if (outEstimator == null) {
+ throw new IllegalArgumentException("outEstimator must not be null");
+ }
+ return nativeGetEstimator(mPtr, id, degree, horizonMillis, outEstimator);
+ }
+
+ /**
+ * An estimator for the movements of a pointer based on a polynomial model.
+ *
+ * The last recorded position of the pointer is at time zero seconds.
+ * Past estimated positions are at negative times and future estimated positions
+ * are at positive times.
+ *
+ * First coefficient is position (in pixels), second is velocity (in pixels per second),
+ * third is acceleration (in pixels per second squared).
+ *
+ * @hide For internal use only. Not a final API.
+ */
+ public static final class Estimator {
+ // Must match VelocityTracker::Estimator::MAX_DEGREE
+ private static final int MAX_DEGREE = 2;
+
+ /**
+ * Polynomial coefficients describing motion in X.
+ */
+ public final float[] xCoeff = new float[MAX_DEGREE + 1];
+
+ /**
+ * Polynomial coefficients describing motion in Y.
+ */
+ public final float[] yCoeff = new float[MAX_DEGREE + 1];
+
+ /**
+ * Polynomial degree, or zero if only position information is available.
+ */
+ public int degree;
+
+ /**
+ * Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit).
+ */
+ public float confidence;
+
+ /**
+ * Gets an estimate of the X position of the pointer at the specified time point.
+ * @param time The time point in seconds, 0 is the last recorded time.
+ * @return The estimated X coordinate.
+ */
+ public float estimateX(float time) {
+ return estimate(time, xCoeff);
+ }
+
+ /**
+ * Gets an estimate of the Y position of the pointer at the specified time point.
+ * @param time The time point in seconds, 0 is the last recorded time.
+ * @return The estimated Y coordinate.
+ */
+ public float estimateY(float time) {
+ return estimate(time, yCoeff);
+ }
+
+ private float estimate(float time, float[] c) {
+ float a = 0;
+ float scale = 1;
+ for (int i = 0; i <= degree; i++) {
+ a += c[i] * scale;
+ scale *= time;
+ }
+ return a;
+ }
+ }
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 4a9c5bd..ca06b9c 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -45,6 +45,7 @@
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.LocaleUtil;
@@ -68,6 +69,8 @@
import android.view.inputmethod.InputMethodManager;
import android.widget.ScrollBarDrawable;
+import static android.os.Build.VERSION_CODES.*;
+
import com.android.internal.R;
import com.android.internal.util.Predicate;
import com.android.internal.view.menu.MenuBuilder;
@@ -584,7 +587,7 @@
* @attr ref android.R.styleable#View_drawingCacheQuality
* @attr ref android.R.styleable#View_duplicateParentState
* @attr ref android.R.styleable#View_id
- * @attr ref android.R.styleable#View_fadingEdge
+ * @attr ref android.R.styleable#View_requiresFadingEdge
* @attr ref android.R.styleable#View_fadingEdgeLength
* @attr ref android.R.styleable#View_filterTouchesWhenObscured
* @attr ref android.R.styleable#View_fitsSystemWindows
@@ -1926,6 +1929,20 @@
public static final int PUBLIC_STATUS_BAR_VISIBILITY_MASK = 0x0000FFFF;
/**
+ * Find views that render the specified text.
+ *
+ * @see #findViewsWithText(ArrayList, CharSequence, int)
+ */
+ public static final int FIND_VIEWS_WITH_TEXT = 0x00000001;
+
+ /**
+ * Find find views that contain the specified content description.
+ *
+ * @see #findViewsWithText(ArrayList, CharSequence, int)
+ */
+ public static final int FIND_VIEWS_WITH_CONTENT_DESCRIPTION = 0x00000002;
+
+ /**
* Controls the over-scroll mode for this view.
* See {@link #overScrollBy(int, int, int, int, int, int, int, int, boolean)},
* {@link #OVER_SCROLL_ALWAYS}, {@link #OVER_SCROLL_IF_CONTENT_SCROLLS},
@@ -2001,64 +2018,133 @@
@ViewDebug.ExportedProperty
int mViewFlags;
- /**
- * The transform matrix for the View. This transform is calculated internally
- * based on the rotation, scaleX, and scaleY properties. The identity matrix
- * is used by default. Do *not* use this variable directly; instead call
- * getMatrix(), which will automatically recalculate the matrix if necessary
- * to get the correct matrix based on the latest rotation and scale properties.
- */
- private final Matrix mMatrix = new Matrix();
+ static class TransformationInfo {
+ /**
+ * The transform matrix for the View. This transform is calculated internally
+ * based on the rotation, scaleX, and scaleY properties. The identity matrix
+ * is used by default. Do *not* use this variable directly; instead call
+ * getMatrix(), which will automatically recalculate the matrix if necessary
+ * to get the correct matrix based on the latest rotation and scale properties.
+ */
+ private final Matrix mMatrix = new Matrix();
- /**
- * The transform matrix for the View. This transform is calculated internally
- * based on the rotation, scaleX, and scaleY properties. The identity matrix
- * is used by default. Do *not* use this variable directly; instead call
- * getInverseMatrix(), which will automatically recalculate the matrix if necessary
- * to get the correct matrix based on the latest rotation and scale properties.
- */
- private Matrix mInverseMatrix;
+ /**
+ * The transform matrix for the View. This transform is calculated internally
+ * based on the rotation, scaleX, and scaleY properties. The identity matrix
+ * is used by default. Do *not* use this variable directly; instead call
+ * getInverseMatrix(), which will automatically recalculate the matrix if necessary
+ * to get the correct matrix based on the latest rotation and scale properties.
+ */
+ private Matrix mInverseMatrix;
- /**
- * An internal variable that tracks whether we need to recalculate the
- * transform matrix, based on whether the rotation or scaleX/Y properties
- * have changed since the matrix was last calculated.
- */
- boolean mMatrixDirty = false;
+ /**
+ * An internal variable that tracks whether we need to recalculate the
+ * transform matrix, based on whether the rotation or scaleX/Y properties
+ * have changed since the matrix was last calculated.
+ */
+ boolean mMatrixDirty = false;
- /**
- * An internal variable that tracks whether we need to recalculate the
- * transform matrix, based on whether the rotation or scaleX/Y properties
- * have changed since the matrix was last calculated.
- */
- private boolean mInverseMatrixDirty = true;
+ /**
+ * An internal variable that tracks whether we need to recalculate the
+ * transform matrix, based on whether the rotation or scaleX/Y properties
+ * have changed since the matrix was last calculated.
+ */
+ private boolean mInverseMatrixDirty = true;
- /**
- * A variable that tracks whether we need to recalculate the
- * transform matrix, based on whether the rotation or scaleX/Y properties
- * have changed since the matrix was last calculated. This variable
- * is only valid after a call to updateMatrix() or to a function that
- * calls it such as getMatrix(), hasIdentityMatrix() and getInverseMatrix().
- */
- private boolean mMatrixIsIdentity = true;
+ /**
+ * A variable that tracks whether we need to recalculate the
+ * transform matrix, based on whether the rotation or scaleX/Y properties
+ * have changed since the matrix was last calculated. This variable
+ * is only valid after a call to updateMatrix() or to a function that
+ * calls it such as getMatrix(), hasIdentityMatrix() and getInverseMatrix().
+ */
+ private boolean mMatrixIsIdentity = true;
- /**
- * The Camera object is used to compute a 3D matrix when rotationX or rotationY are set.
- */
- private Camera mCamera = null;
+ /**
+ * The Camera object is used to compute a 3D matrix when rotationX or rotationY are set.
+ */
+ private Camera mCamera = null;
- /**
- * This matrix is used when computing the matrix for 3D rotations.
- */
- private Matrix matrix3D = null;
+ /**
+ * This matrix is used when computing the matrix for 3D rotations.
+ */
+ private Matrix matrix3D = null;
- /**
- * These prev values are used to recalculate a centered pivot point when necessary. The
- * pivot point is only used in matrix operations (when rotation, scale, or translation are
- * set), so thes values are only used then as well.
- */
- private int mPrevWidth = -1;
- private int mPrevHeight = -1;
+ /**
+ * These prev values are used to recalculate a centered pivot point when necessary. The
+ * pivot point is only used in matrix operations (when rotation, scale, or translation are
+ * set), so thes values are only used then as well.
+ */
+ private int mPrevWidth = -1;
+ private int mPrevHeight = -1;
+
+ /**
+ * The degrees rotation around the vertical axis through the pivot point.
+ */
+ @ViewDebug.ExportedProperty
+ float mRotationY = 0f;
+
+ /**
+ * The degrees rotation around the horizontal axis through the pivot point.
+ */
+ @ViewDebug.ExportedProperty
+ float mRotationX = 0f;
+
+ /**
+ * The degrees rotation around the pivot point.
+ */
+ @ViewDebug.ExportedProperty
+ float mRotation = 0f;
+
+ /**
+ * The amount of translation of the object away from its left property (post-layout).
+ */
+ @ViewDebug.ExportedProperty
+ float mTranslationX = 0f;
+
+ /**
+ * The amount of translation of the object away from its top property (post-layout).
+ */
+ @ViewDebug.ExportedProperty
+ float mTranslationY = 0f;
+
+ /**
+ * The amount of scale in the x direction around the pivot point. A
+ * value of 1 means no scaling is applied.
+ */
+ @ViewDebug.ExportedProperty
+ float mScaleX = 1f;
+
+ /**
+ * The amount of scale in the y direction around the pivot point. A
+ * value of 1 means no scaling is applied.
+ */
+ @ViewDebug.ExportedProperty
+ float mScaleY = 1f;
+
+ /**
+ * The amount of scale in the x direction around the pivot point. A
+ * value of 1 means no scaling is applied.
+ */
+ @ViewDebug.ExportedProperty
+ float mPivotX = 0f;
+
+ /**
+ * The amount of scale in the y direction around the pivot point. A
+ * value of 1 means no scaling is applied.
+ */
+ @ViewDebug.ExportedProperty
+ float mPivotY = 0f;
+
+ /**
+ * The opacity of the View. This is a value from 0 to 1, where 0 means
+ * completely transparent and 1 means completely opaque.
+ */
+ @ViewDebug.ExportedProperty
+ float mAlpha = 1f;
+ }
+
+ TransformationInfo mTransformationInfo;
private boolean mLastIsOpaque;
@@ -2069,71 +2155,6 @@
private static final float NONZERO_EPSILON = .001f;
/**
- * The degrees rotation around the vertical axis through the pivot point.
- */
- @ViewDebug.ExportedProperty
- float mRotationY = 0f;
-
- /**
- * The degrees rotation around the horizontal axis through the pivot point.
- */
- @ViewDebug.ExportedProperty
- float mRotationX = 0f;
-
- /**
- * The degrees rotation around the pivot point.
- */
- @ViewDebug.ExportedProperty
- float mRotation = 0f;
-
- /**
- * The amount of translation of the object away from its left property (post-layout).
- */
- @ViewDebug.ExportedProperty
- float mTranslationX = 0f;
-
- /**
- * The amount of translation of the object away from its top property (post-layout).
- */
- @ViewDebug.ExportedProperty
- float mTranslationY = 0f;
-
- /**
- * The amount of scale in the x direction around the pivot point. A
- * value of 1 means no scaling is applied.
- */
- @ViewDebug.ExportedProperty
- float mScaleX = 1f;
-
- /**
- * The amount of scale in the y direction around the pivot point. A
- * value of 1 means no scaling is applied.
- */
- @ViewDebug.ExportedProperty
- float mScaleY = 1f;
-
- /**
- * The amount of scale in the x direction around the pivot point. A
- * value of 1 means no scaling is applied.
- */
- @ViewDebug.ExportedProperty
- float mPivotX = 0f;
-
- /**
- * The amount of scale in the y direction around the pivot point. A
- * value of 1 means no scaling is applied.
- */
- @ViewDebug.ExportedProperty
- float mPivotY = 0f;
-
- /**
- * The opacity of the View. This is a value from 0 to 1, where 0 means
- * completely transparent and 1 means completely opaque.
- */
- @ViewDebug.ExportedProperty
- float mAlpha = 1f;
-
- /**
* The distance in pixels from the left edge of this view's parent
* to the left edge of this view.
* {@hide}
@@ -2265,8 +2286,6 @@
*/
int mOldHeightMeasureSpec = Integer.MIN_VALUE;
- private Resources mResources = null;
-
private Drawable mBGDrawable;
private int mBackgroundResource;
@@ -2329,6 +2348,8 @@
*/
protected Context mContext;
+ private final Resources mResources;
+
private ScrollabilityCache mScrollCache;
private int[] mDrawableState = null;
@@ -2545,6 +2566,11 @@
private boolean mSendingHoverAccessibilityEvents;
/**
+ * Delegate for injecting accessiblity functionality.
+ */
+ AccessibilityDelegate mAccessibilityDelegate;
+
+ /**
* Text direction is inherited thru {@link ViewGroup}
* @hide
*/
@@ -2890,6 +2916,12 @@
}
break;
case R.styleable.View_fadingEdge:
+ if (context.getApplicationInfo().targetSdkVersion >= ICE_CREAM_SANDWICH) {
+ // Ignore the attribute starting with ICS
+ break;
+ }
+ // With builds < ICS, fall through and apply fading edges
+ case R.styleable.View_requiresFadingEdge:
final int fadingEdge = a.getInt(attr, FADING_EDGE_NONE);
if (fadingEdge != FADING_EDGE_NONE) {
viewFlagValues |= fadingEdge;
@@ -2999,6 +3031,8 @@
}
}
+ a.recycle();
+
setOverScrollMode(overScrollMode);
if (background != null) {
@@ -3056,14 +3090,13 @@
}
computeOpaqueFlags();
-
- a.recycle();
}
/**
* Non-public constructor for use in testing
*/
View() {
+ mResources = null;
}
/**
@@ -3761,14 +3794,34 @@
* and last calls
* {@link ViewParent#requestSendAccessibilityEvent(View, AccessibilityEvent)}
* on its parent to resuest sending of the event to interested parties.
+ * <p>
+ * If an {@link AccessibilityDelegate} has been specified via calling
+ * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
+ * {@link AccessibilityDelegate#sendAccessibilityEvent(View, int)} is
+ * responsible for handling this call.
+ * </p>
*
* @param eventType The type of the event to send.
*
* @see #onInitializeAccessibilityEvent(AccessibilityEvent)
* @see #dispatchPopulateAccessibilityEvent(AccessibilityEvent)
* @see ViewParent#requestSendAccessibilityEvent(View, AccessibilityEvent)
+ * @see AccessibilityDelegate
*/
public void sendAccessibilityEvent(int eventType) {
+ if (mAccessibilityDelegate != null) {
+ mAccessibilityDelegate.sendAccessibilityEvent(this, eventType);
+ } else {
+ sendAccessibilityEventInternal(eventType);
+ }
+ }
+
+ /**
+ * @see #sendAccessibilityEvent(int)
+ *
+ * Note: Called from the default {@link AccessibilityDelegate}.
+ */
+ void sendAccessibilityEventInternal(int eventType) {
if (AccessibilityManager.getInstance(mContext).isEnabled()) {
sendAccessibilityEventUnchecked(AccessibilityEvent.obtain(eventType));
}
@@ -3777,13 +3830,32 @@
/**
* This method behaves exactly as {@link #sendAccessibilityEvent(int)} but
* takes as an argument an empty {@link AccessibilityEvent} and does not
- * perfrom a check whether accessibility is enabled.
+ * perform a check whether accessibility is enabled.
+ * <p>
+ * If an {@link AccessibilityDelegate} has been specified via calling
+ * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
+ * {@link AccessibilityDelegate#sendAccessibilityEventUnchecked(View, AccessibilityEvent)}
+ * is responsible for handling this call.
+ * </p>
*
* @param event The event to send.
*
* @see #sendAccessibilityEvent(int)
*/
public void sendAccessibilityEventUnchecked(AccessibilityEvent event) {
+ if (mAccessibilityDelegate != null) {
+ mAccessibilityDelegate.sendAccessibilityEventUnchecked(this, event);
+ } else {
+ sendAccessibilityEventUncheckedInternal(event);
+ }
+ }
+
+ /**
+ * @see #sendAccessibilityEventUnchecked(AccessibilityEvent)
+ *
+ * Note: Called from the default {@link AccessibilityDelegate}.
+ */
+ void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) {
if (!isShown()) {
return;
}
@@ -3798,18 +3870,36 @@
* to its children for adding their text content to the event. Note that the
* event text is populated in a separate dispatch path since we add to the
* event not only the text of the source but also the text of all its descendants.
- * </p>
* A typical implementation will call
* {@link #onPopulateAccessibilityEvent(AccessibilityEvent)} on the this view
* and then call the {@link #dispatchPopulateAccessibilityEvent(AccessibilityEvent)}
* on each child. Override this method if custom population of the event text
* content is required.
+ * <p>
+ * If an {@link AccessibilityDelegate} has been specified via calling
+ * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
+ * {@link AccessibilityDelegate#dispatchPopulateAccessibilityEvent(View, AccessibilityEvent)}
+ * is responsible for handling this call.
+ * </p>
*
* @param event The event.
*
* @return True if the event population was completed.
*/
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (mAccessibilityDelegate != null) {
+ return mAccessibilityDelegate.dispatchPopulateAccessibilityEvent(this, event);
+ } else {
+ return dispatchPopulateAccessibilityEventInternal(event);
+ }
+ }
+
+ /**
+ * @see #dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+ *
+ * Note: Called from the default {@link AccessibilityDelegate}.
+ */
+ boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
onPopulateAccessibilityEvent(event);
return false;
}
@@ -3832,6 +3922,12 @@
* event.getText().add(selectedDateUtterance);
* }
* </code></pre></p>
+ * <p>
+ * If an {@link AccessibilityDelegate} has been specified via calling
+ * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
+ * {@link AccessibilityDelegate#onPopulateAccessibilityEvent(View, AccessibilityEvent)}
+ * is responsible for handling this call.
+ * </p>
*
* @param event The accessibility event which to populate.
*
@@ -3839,13 +3935,27 @@
* @see #dispatchPopulateAccessibilityEvent(AccessibilityEvent)
*/
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (mAccessibilityDelegate != null) {
+ mAccessibilityDelegate.onPopulateAccessibilityEvent(this, event);
+ } else {
+ onPopulateAccessibilityEventInternal(event);
+ }
}
/**
- * Initializes an {@link AccessibilityEvent} with information about the
- * the type of the event and this View which is the event source. In other
- * words, the source of an accessibility event is the view whose state
- * change triggered firing the event.
+ * @see #onPopulateAccessibilityEvent(AccessibilityEvent)
+ *
+ * Note: Called from the default {@link AccessibilityDelegate}.
+ */
+ void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+
+ }
+
+ /**
+ * Initializes an {@link AccessibilityEvent} with information about
+ * this View which is the event source. In other words, the source of
+ * an accessibility event is the view whose state change triggered firing
+ * the event.
* <p>
* Example: Setting the password property of an event in addition
* to properties set by the super implementation.
@@ -3855,12 +3965,32 @@
* event.setPassword(true);
* }
* </code></pre></p>
- * @param event The event to initialeze.
+ * <p>
+ * If an {@link AccessibilityDelegate} has been specified via calling
+ * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
+ * {@link AccessibilityDelegate#onInitializeAccessibilityEvent(View, AccessibilityEvent)}
+ * is responsible for handling this call.
+ * </p>
+ *
+ * @param event The event to initialize.
*
* @see #sendAccessibilityEvent(int)
* @see #dispatchPopulateAccessibilityEvent(AccessibilityEvent)
*/
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ if (mAccessibilityDelegate != null) {
+ mAccessibilityDelegate.onInitializeAccessibilityEvent(this, event);
+ } else {
+ onInitializeAccessibilityEventInternal(event);
+ }
+ }
+
+ /**
+ * @see #onInitializeAccessibilityEvent(AccessibilityEvent)
+ *
+ * Note: Called from the default {@link AccessibilityDelegate}.
+ */
+ void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
event.setSource(this);
event.setClassName(getClass().getName());
event.setPackageName(getContext().getPackageName());
@@ -3929,9 +4059,29 @@
* Subclasses should override this method, call the super implementation,
* and set additional attributes.
* </p>
+ * <p>
+ * If an {@link AccessibilityDelegate} has been specified via calling
+ * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
+ * {@link AccessibilityDelegate#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfo)}
+ * is responsible for handling this call.
+ * </p>
+ *
* @param info The instance to initialize.
*/
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ if (mAccessibilityDelegate != null) {
+ mAccessibilityDelegate.onInitializeAccessibilityNodeInfo(this, info);
+ } else {
+ onInitializeAccessibilityNodeInfoInternal(info);
+ }
+ }
+
+ /**
+ * @see #onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
+ *
+ * Note: Called from the default {@link AccessibilityDelegate}.
+ */
+ void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
Rect bounds = mAttachInfo.mTmpInvalRect;
getDrawingRect(bounds);
info.setBoundsInParent(bounds);
@@ -3975,6 +4125,19 @@
}
/**
+ * Sets a delegate for implementing accessibility support via compositon as
+ * opposed to inheritance. The delegate's primary use is for implementing
+ * backwards compatible widgets. For more details see {@link AccessibilityDelegate}.
+ *
+ * @param delegate The delegate instance.
+ *
+ * @see AccessibilityDelegate
+ */
+ public void setAccessibilityDelegate(AccessibilityDelegate delegate) {
+ mAccessibilityDelegate = delegate;
+ }
+
+ /**
* Gets the unique identifier of this view on the screen for accessibility purposes.
* If this {@link View} is not attached to any window, {@value #NO_ID} is returned.
*
@@ -4984,12 +5147,28 @@
/**
* Finds the Views that contain given text. The containment is case insensitive.
- * As View's text is considered any text content that View renders.
+ * The search is performed by either the text that the View renders or the content
+ * description that describes the view for accessibility purposes and the view does
+ * not render or both. Clients can specify how the search is to be performed via
+ * passing the {@link #FIND_VIEWS_WITH_TEXT} and
+ * {@link #FIND_VIEWS_WITH_CONTENT_DESCRIPTION} flags.
*
* @param outViews The output list of matching Views.
- * @param text The text to match against.
+ * @param searched The text to match against.
+ *
+ * @see #FIND_VIEWS_WITH_TEXT
+ * @see #FIND_VIEWS_WITH_CONTENT_DESCRIPTION
+ * @see #setContentDescription(CharSequence)
*/
- public void findViewsWithText(ArrayList<View> outViews, CharSequence text) {
+ public void findViewsWithText(ArrayList<View> outViews, CharSequence searched, int flags) {
+ if ((flags & FIND_VIEWS_WITH_CONTENT_DESCRIPTION) != 0 && !TextUtils.isEmpty(searched)
+ && !TextUtils.isEmpty(mContentDescription)) {
+ String searchedLowerCase = searched.toString().toLowerCase();
+ String contentDescriptionLowerCase = mContentDescription.toString().toLowerCase();
+ if (contentDescriptionLowerCase.contains(searchedLowerCase)) {
+ outViews.add(this);
+ }
+ }
}
/**
@@ -6776,8 +6955,11 @@
* @return The current transform matrix for the view
*/
public Matrix getMatrix() {
- updateMatrix();
- return mMatrix;
+ if (mTransformationInfo != null) {
+ updateMatrix();
+ return mTransformationInfo.mMatrix;
+ }
+ return Matrix.IDENTITY_MATRIX;
}
/**
@@ -6797,49 +6979,63 @@
* @return True if the transform matrix is the identity matrix, false otherwise.
*/
final boolean hasIdentityMatrix() {
- updateMatrix();
- return mMatrixIsIdentity;
+ if (mTransformationInfo != null) {
+ updateMatrix();
+ return mTransformationInfo.mMatrixIsIdentity;
+ }
+ return true;
+ }
+
+ void ensureTransformationInfo() {
+ if (mTransformationInfo == null) {
+ mTransformationInfo = new TransformationInfo();
+ }
}
/**
* Recomputes the transform matrix if necessary.
*/
private void updateMatrix() {
- if (mMatrixDirty) {
+ final TransformationInfo info = mTransformationInfo;
+ if (info == null) {
+ return;
+ }
+ if (info.mMatrixDirty) {
// transform-related properties have changed since the last time someone
// asked for the matrix; recalculate it with the current values
// Figure out if we need to update the pivot point
if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
- if ((mRight - mLeft) != mPrevWidth || (mBottom - mTop) != mPrevHeight) {
- mPrevWidth = mRight - mLeft;
- mPrevHeight = mBottom - mTop;
- mPivotX = mPrevWidth / 2f;
- mPivotY = mPrevHeight / 2f;
+ if ((mRight - mLeft) != info.mPrevWidth || (mBottom - mTop) != info.mPrevHeight) {
+ info.mPrevWidth = mRight - mLeft;
+ info.mPrevHeight = mBottom - mTop;
+ info.mPivotX = info.mPrevWidth / 2f;
+ info.mPivotY = info.mPrevHeight / 2f;
}
}
- mMatrix.reset();
- if (!nonzero(mRotationX) && !nonzero(mRotationY)) {
- mMatrix.setTranslate(mTranslationX, mTranslationY);
- mMatrix.preRotate(mRotation, mPivotX, mPivotY);
- mMatrix.preScale(mScaleX, mScaleY, mPivotX, mPivotY);
+ info.mMatrix.reset();
+ if (!nonzero(info.mRotationX) && !nonzero(info.mRotationY)) {
+ info.mMatrix.setTranslate(info.mTranslationX, info.mTranslationY);
+ info.mMatrix.preRotate(info.mRotation, info.mPivotX, info.mPivotY);
+ info.mMatrix.preScale(info.mScaleX, info.mScaleY, info.mPivotX, info.mPivotY);
} else {
- if (mCamera == null) {
- mCamera = new Camera();
- matrix3D = new Matrix();
+ if (info.mCamera == null) {
+ info.mCamera = new Camera();
+ info.matrix3D = new Matrix();
}
- mCamera.save();
- mMatrix.preScale(mScaleX, mScaleY, mPivotX, mPivotY);
- mCamera.rotate(mRotationX, mRotationY, -mRotation);
- mCamera.getMatrix(matrix3D);
- matrix3D.preTranslate(-mPivotX, -mPivotY);
- matrix3D.postTranslate(mPivotX + mTranslationX, mPivotY + mTranslationY);
- mMatrix.postConcat(matrix3D);
- mCamera.restore();
+ info.mCamera.save();
+ info.mMatrix.preScale(info.mScaleX, info.mScaleY, info.mPivotX, info.mPivotY);
+ info.mCamera.rotate(info.mRotationX, info.mRotationY, -info.mRotation);
+ info.mCamera.getMatrix(info.matrix3D);
+ info.matrix3D.preTranslate(-info.mPivotX, -info.mPivotY);
+ info.matrix3D.postTranslate(info.mPivotX + info.mTranslationX,
+ info.mPivotY + info.mTranslationY);
+ info.mMatrix.postConcat(info.matrix3D);
+ info.mCamera.restore();
}
- mMatrixDirty = false;
- mMatrixIsIdentity = mMatrix.isIdentity();
- mInverseMatrixDirty = true;
+ info.mMatrixDirty = false;
+ info.mMatrixIsIdentity = info.mMatrix.isIdentity();
+ info.mInverseMatrixDirty = true;
}
}
@@ -6851,15 +7047,19 @@
* @return The inverse of the current matrix of this view.
*/
final Matrix getInverseMatrix() {
- updateMatrix();
- if (mInverseMatrixDirty) {
- if (mInverseMatrix == null) {
- mInverseMatrix = new Matrix();
+ final TransformationInfo info = mTransformationInfo;
+ if (info != null) {
+ updateMatrix();
+ if (info.mInverseMatrixDirty) {
+ if (info.mInverseMatrix == null) {
+ info.mInverseMatrix = new Matrix();
+ }
+ info.mMatrix.invert(info.mInverseMatrix);
+ info.mInverseMatrixDirty = false;
}
- mMatrix.invert(mInverseMatrix);
- mInverseMatrixDirty = false;
+ return info.mInverseMatrix;
}
- return mInverseMatrix;
+ return Matrix.IDENTITY_MATRIX;
}
/**
@@ -6905,14 +7105,16 @@
invalidateParentCaches();
invalidate(false);
+ ensureTransformationInfo();
final float dpi = mResources.getDisplayMetrics().densityDpi;
- if (mCamera == null) {
- mCamera = new Camera();
- matrix3D = new Matrix();
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mCamera == null) {
+ info.mCamera = new Camera();
+ info.matrix3D = new Matrix();
}
- mCamera.setLocation(0.0f, 0.0f, -Math.abs(distance) / dpi);
- mMatrixDirty = true;
+ info.mCamera.setLocation(0.0f, 0.0f, -Math.abs(distance) / dpi);
+ info.mMatrixDirty = true;
invalidate(false);
}
@@ -6927,7 +7129,7 @@
* @return The degrees of rotation.
*/
public float getRotation() {
- return mRotation;
+ return mTransformationInfo != null ? mTransformationInfo.mRotation : 0;
}
/**
@@ -6945,12 +7147,14 @@
* @attr ref android.R.styleable#View_rotation
*/
public void setRotation(float rotation) {
- if (mRotation != rotation) {
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mRotation != rotation) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mRotation = rotation;
- mMatrixDirty = true;
+ info.mRotation = rotation;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -6966,7 +7170,7 @@
* @return The degrees of Y rotation.
*/
public float getRotationY() {
- return mRotationY;
+ return mTransformationInfo != null ? mTransformationInfo.mRotationY : 0;
}
/**
@@ -6989,12 +7193,14 @@
* @attr ref android.R.styleable#View_rotationY
*/
public void setRotationY(float rotationY) {
- if (mRotationY != rotationY) {
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mRotationY != rotationY) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mRotationY = rotationY;
- mMatrixDirty = true;
+ info.mRotationY = rotationY;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7010,7 +7216,7 @@
* @return The degrees of X rotation.
*/
public float getRotationX() {
- return mRotationX;
+ return mTransformationInfo != null ? mTransformationInfo.mRotationX : 0;
}
/**
@@ -7033,12 +7239,14 @@
* @attr ref android.R.styleable#View_rotationX
*/
public void setRotationX(float rotationX) {
- if (mRotationX != rotationX) {
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mRotationX != rotationX) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mRotationX = rotationX;
- mMatrixDirty = true;
+ info.mRotationX = rotationX;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7055,7 +7263,7 @@
* @return The scaling factor.
*/
public float getScaleX() {
- return mScaleX;
+ return mTransformationInfo != null ? mTransformationInfo.mScaleX : 1;
}
/**
@@ -7069,12 +7277,14 @@
* @attr ref android.R.styleable#View_scaleX
*/
public void setScaleX(float scaleX) {
- if (mScaleX != scaleX) {
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mScaleX != scaleX) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mScaleX = scaleX;
- mMatrixDirty = true;
+ info.mScaleX = scaleX;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7091,7 +7301,7 @@
* @return The scaling factor.
*/
public float getScaleY() {
- return mScaleY;
+ return mTransformationInfo != null ? mTransformationInfo.mScaleY : 1;
}
/**
@@ -7105,12 +7315,14 @@
* @attr ref android.R.styleable#View_scaleY
*/
public void setScaleY(float scaleY) {
- if (mScaleY != scaleY) {
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mScaleY != scaleY) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mScaleY = scaleY;
- mMatrixDirty = true;
+ info.mScaleY = scaleY;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7127,7 +7339,7 @@
* @return The x location of the pivot point.
*/
public float getPivotX() {
- return mPivotX;
+ return mTransformationInfo != null ? mTransformationInfo.mPivotX : 0;
}
/**
@@ -7146,13 +7358,15 @@
* @attr ref android.R.styleable#View_transformPivotX
*/
public void setPivotX(float pivotX) {
+ ensureTransformationInfo();
mPrivateFlags |= PIVOT_EXPLICITLY_SET;
- if (mPivotX != pivotX) {
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mPivotX != pivotX) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mPivotX = pivotX;
- mMatrixDirty = true;
+ info.mPivotX = pivotX;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7169,7 +7383,7 @@
* @return The y location of the pivot point.
*/
public float getPivotY() {
- return mPivotY;
+ return mTransformationInfo != null ? mTransformationInfo.mPivotY : 0;
}
/**
@@ -7187,13 +7401,15 @@
* @attr ref android.R.styleable#View_transformPivotY
*/
public void setPivotY(float pivotY) {
+ ensureTransformationInfo();
mPrivateFlags |= PIVOT_EXPLICITLY_SET;
- if (mPivotY != pivotY) {
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mPivotY != pivotY) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mPivotY = pivotY;
- mMatrixDirty = true;
+ info.mPivotY = pivotY;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7207,7 +7423,7 @@
* @return The opacity of the view.
*/
public float getAlpha() {
- return mAlpha;
+ return mTransformationInfo != null ? mTransformationInfo.mAlpha : 1;
}
/**
@@ -7226,7 +7442,8 @@
* @attr ref android.R.styleable#View_alpha
*/
public void setAlpha(float alpha) {
- mAlpha = alpha;
+ ensureTransformationInfo();
+ mTransformationInfo.mAlpha = alpha;
invalidateParentCaches();
if (onSetAlpha((int) (alpha * 255))) {
mPrivateFlags |= ALPHA_SET;
@@ -7248,7 +7465,8 @@
* @return true if the View subclass handles alpha (the return value for onSetAlpha())
*/
boolean setAlphaNoInvalidation(float alpha) {
- mAlpha = alpha;
+ ensureTransformationInfo();
+ mTransformationInfo.mAlpha = alpha;
boolean subclassHandlesAlpha = onSetAlpha((int) (alpha * 255));
if (subclassHandlesAlpha) {
mPrivateFlags |= ALPHA_SET;
@@ -7278,7 +7496,9 @@
public final void setTop(int top) {
if (top != mTop) {
updateMatrix();
- if (mMatrixIsIdentity) {
+ final boolean matrixIsIdentity = mTransformationInfo == null
+ || mTransformationInfo.mMatrixIsIdentity;
+ if (matrixIsIdentity) {
if (mAttachInfo != null) {
int minTop;
int yLoc;
@@ -7303,10 +7523,10 @@
onSizeChanged(width, mBottom - mTop, width, oldHeight);
- if (!mMatrixIsIdentity) {
+ if (!matrixIsIdentity) {
if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
// A change in dimension means an auto-centered pivot point changes, too
- mMatrixDirty = true;
+ mTransformationInfo.mMatrixDirty = true;
}
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(true);
@@ -7345,7 +7565,9 @@
public final void setBottom(int bottom) {
if (bottom != mBottom) {
updateMatrix();
- if (mMatrixIsIdentity) {
+ final boolean matrixIsIdentity = mTransformationInfo == null
+ || mTransformationInfo.mMatrixIsIdentity;
+ if (matrixIsIdentity) {
if (mAttachInfo != null) {
int maxBottom;
if (bottom < mBottom) {
@@ -7367,10 +7589,10 @@
onSizeChanged(width, mBottom - mTop, width, oldHeight);
- if (!mMatrixIsIdentity) {
+ if (!matrixIsIdentity) {
if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
// A change in dimension means an auto-centered pivot point changes, too
- mMatrixDirty = true;
+ mTransformationInfo.mMatrixDirty = true;
}
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(true);
@@ -7400,7 +7622,9 @@
public final void setLeft(int left) {
if (left != mLeft) {
updateMatrix();
- if (mMatrixIsIdentity) {
+ final boolean matrixIsIdentity = mTransformationInfo == null
+ || mTransformationInfo.mMatrixIsIdentity;
+ if (matrixIsIdentity) {
if (mAttachInfo != null) {
int minLeft;
int xLoc;
@@ -7425,10 +7649,10 @@
onSizeChanged(mRight - mLeft, height, oldWidth, height);
- if (!mMatrixIsIdentity) {
+ if (!matrixIsIdentity) {
if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
// A change in dimension means an auto-centered pivot point changes, too
- mMatrixDirty = true;
+ mTransformationInfo.mMatrixDirty = true;
}
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(true);
@@ -7458,7 +7682,9 @@
public final void setRight(int right) {
if (right != mRight) {
updateMatrix();
- if (mMatrixIsIdentity) {
+ final boolean matrixIsIdentity = mTransformationInfo == null
+ || mTransformationInfo.mMatrixIsIdentity;
+ if (matrixIsIdentity) {
if (mAttachInfo != null) {
int maxRight;
if (right < mRight) {
@@ -7480,10 +7706,10 @@
onSizeChanged(mRight - mLeft, height, oldWidth, height);
- if (!mMatrixIsIdentity) {
+ if (!matrixIsIdentity) {
if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
// A change in dimension means an auto-centered pivot point changes, too
- mMatrixDirty = true;
+ mTransformationInfo.mMatrixDirty = true;
}
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(true);
@@ -7501,7 +7727,7 @@
* @return The visual x position of this view, in pixels.
*/
public float getX() {
- return mLeft + mTranslationX;
+ return mLeft + (mTransformationInfo != null ? mTransformationInfo.mTranslationX : 0);
}
/**
@@ -7523,7 +7749,7 @@
* @return The visual y position of this view, in pixels.
*/
public float getY() {
- return mTop + mTranslationY;
+ return mTop + (mTransformationInfo != null ? mTransformationInfo.mTranslationY : 0);
}
/**
@@ -7546,7 +7772,7 @@
* @return The horizontal position of this view relative to its left position, in pixels.
*/
public float getTranslationX() {
- return mTranslationX;
+ return mTransformationInfo != null ? mTransformationInfo.mTranslationX : 0;
}
/**
@@ -7560,12 +7786,14 @@
* @attr ref android.R.styleable#View_translationX
*/
public void setTranslationX(float translationX) {
- if (mTranslationX != translationX) {
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mTranslationX != translationX) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mTranslationX = translationX;
- mMatrixDirty = true;
+ info.mTranslationX = translationX;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7580,7 +7808,7 @@
* in pixels.
*/
public float getTranslationY() {
- return mTranslationY;
+ return mTransformationInfo != null ? mTransformationInfo.mTranslationY : 0;
}
/**
@@ -7594,12 +7822,14 @@
* @attr ref android.R.styleable#View_translationY
*/
public void setTranslationY(float translationY) {
- if (mTranslationY != translationY) {
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ if (info.mTranslationY != translationY) {
invalidateParentCaches();
// Double-invalidation is necessary to capture view's old and new areas
invalidate(false);
- mTranslationY = translationY;
- mMatrixDirty = true;
+ info.mTranslationY = translationY;
+ info.mMatrixDirty = true;
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7609,63 +7839,78 @@
* @hide
*/
public void setFastTranslationX(float x) {
- mTranslationX = x;
- mMatrixDirty = true;
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ info.mTranslationX = x;
+ info.mMatrixDirty = true;
}
/**
* @hide
*/
public void setFastTranslationY(float y) {
- mTranslationY = y;
- mMatrixDirty = true;
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ info.mTranslationY = y;
+ info.mMatrixDirty = true;
}
/**
* @hide
*/
public void setFastX(float x) {
- mTranslationX = x - mLeft;
- mMatrixDirty = true;
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ info.mTranslationX = x - mLeft;
+ info.mMatrixDirty = true;
}
/**
* @hide
*/
public void setFastY(float y) {
- mTranslationY = y - mTop;
- mMatrixDirty = true;
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ info.mTranslationY = y - mTop;
+ info.mMatrixDirty = true;
}
/**
* @hide
*/
public void setFastScaleX(float x) {
- mScaleX = x;
- mMatrixDirty = true;
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ info.mScaleX = x;
+ info.mMatrixDirty = true;
}
/**
* @hide
*/
public void setFastScaleY(float y) {
- mScaleY = y;
- mMatrixDirty = true;
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ info.mScaleY = y;
+ info.mMatrixDirty = true;
}
/**
* @hide
*/
public void setFastAlpha(float alpha) {
- mAlpha = alpha;
+ ensureTransformationInfo();
+ mTransformationInfo.mAlpha = alpha;
}
/**
* @hide
*/
public void setFastRotationY(float y) {
- mRotationY = y;
- mMatrixDirty = true;
+ ensureTransformationInfo();
+ final TransformationInfo info = mTransformationInfo;
+ info.mRotationY = y;
+ info.mMatrixDirty = true;
}
/**
@@ -7675,12 +7920,14 @@
*/
public void getHitRect(Rect outRect) {
updateMatrix();
- if (mMatrixIsIdentity || mAttachInfo == null) {
+ final TransformationInfo info = mTransformationInfo;
+ if (info == null || info.mMatrixIsIdentity || mAttachInfo == null) {
outRect.set(mLeft, mTop, mRight, mBottom);
} else {
final RectF tmpRect = mAttachInfo.mTmpTransformRect;
- tmpRect.set(-mPivotX, -mPivotY, getWidth() - mPivotX, getHeight() - mPivotY);
- mMatrix.mapRect(tmpRect);
+ tmpRect.set(-info.mPivotX, -info.mPivotY,
+ getWidth() - info.mPivotX, getHeight() - info.mPivotY);
+ info.mMatrix.mapRect(tmpRect);
outRect.set((int) tmpRect.left + mLeft, (int) tmpRect.top + mTop,
(int) tmpRect.right + mLeft, (int) tmpRect.bottom + mTop);
}
@@ -7768,7 +8015,9 @@
public void offsetTopAndBottom(int offset) {
if (offset != 0) {
updateMatrix();
- if (mMatrixIsIdentity) {
+ final boolean matrixIsIdentity = mTransformationInfo == null
+ || mTransformationInfo.mMatrixIsIdentity;
+ if (matrixIsIdentity) {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
final Rect r = mAttachInfo.mTmpInvalRect;
@@ -7794,7 +8043,7 @@
mTop += offset;
mBottom += offset;
- if (!mMatrixIsIdentity) {
+ if (!matrixIsIdentity) {
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -7810,7 +8059,9 @@
public void offsetLeftAndRight(int offset) {
if (offset != 0) {
updateMatrix();
- if (mMatrixIsIdentity) {
+ final boolean matrixIsIdentity = mTransformationInfo == null
+ || mTransformationInfo.mMatrixIsIdentity;
+ if (matrixIsIdentity) {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
final Rect r = mAttachInfo.mTmpInvalRect;
@@ -7833,7 +8084,7 @@
mLeft += offset;
mRight += offset;
- if (!mMatrixIsIdentity) {
+ if (!matrixIsIdentity) {
mPrivateFlags |= DRAWN; // force another invalidation with the new orientation
invalidate(false);
}
@@ -8108,6 +8359,7 @@
(mPrivateFlags & INVALIDATED) != INVALIDATED) {
mPrivateFlags &= ~DRAWING_CACHE_VALID;
mPrivateFlags |= INVALIDATED;
+ mPrivateFlags |= DIRTY;
final ViewParent p = mParent;
final AttachInfo ai = mAttachInfo;
//noinspection PointlessBooleanExpression,ConstantConditions
@@ -8154,6 +8406,7 @@
(mPrivateFlags & INVALIDATED) != INVALIDATED) {
mPrivateFlags &= ~DRAWING_CACHE_VALID;
mPrivateFlags |= INVALIDATED;
+ mPrivateFlags |= DIRTY;
final ViewParent p = mParent;
final AttachInfo ai = mAttachInfo;
//noinspection PointlessBooleanExpression,ConstantConditions
@@ -8209,6 +8462,7 @@
(mPrivateFlags & INVALIDATED) != INVALIDATED || isOpaque() != mLastIsOpaque) {
mLastIsOpaque = isOpaque();
mPrivateFlags &= ~DRAWN;
+ mPrivateFlags |= DIRTY;
if (invalidateCache) {
mPrivateFlags |= INVALIDATED;
mPrivateFlags &= ~DRAWING_CACHE_VALID;
@@ -8249,6 +8503,7 @@
((View) mParent).mPrivateFlags |= INVALIDATED;
}
mPrivateFlags &= ~DRAWN;
+ mPrivateFlags |= DIRTY;
mPrivateFlags |= INVALIDATED;
mPrivateFlags &= ~DRAWING_CACHE_VALID;
if (mParent != null && mAttachInfo != null) {
@@ -8309,7 +8564,8 @@
@ViewDebug.ExportedProperty(category = "drawing")
public boolean isOpaque() {
return (mPrivateFlags & OPAQUE_MASK) == OPAQUE_MASK &&
- (mAlpha >= 1.0f - ViewConfiguration.ALPHA_THRESHOLD);
+ ((mTransformationInfo != null ? mTransformationInfo.mAlpha : 1)
+ >= 1.0f - ViewConfiguration.ALPHA_THRESHOLD);
}
/**
@@ -8564,7 +8820,7 @@
* otherwise
*
* @see #setHorizontalFadingEdgeEnabled(boolean)
- * @attr ref android.R.styleable#View_fadingEdge
+ * @attr ref android.R.styleable#View_requiresFadingEdge
*/
public boolean isHorizontalFadingEdgeEnabled() {
return (mViewFlags & FADING_EDGE_HORIZONTAL) == FADING_EDGE_HORIZONTAL;
@@ -8579,7 +8835,7 @@
* horizontally
*
* @see #isHorizontalFadingEdgeEnabled()
- * @attr ref android.R.styleable#View_fadingEdge
+ * @attr ref android.R.styleable#View_requiresFadingEdge
*/
public void setHorizontalFadingEdgeEnabled(boolean horizontalFadingEdgeEnabled) {
if (isHorizontalFadingEdgeEnabled() != horizontalFadingEdgeEnabled) {
@@ -8599,7 +8855,7 @@
* otherwise
*
* @see #setVerticalFadingEdgeEnabled(boolean)
- * @attr ref android.R.styleable#View_fadingEdge
+ * @attr ref android.R.styleable#View_requiresFadingEdge
*/
public boolean isVerticalFadingEdgeEnabled() {
return (mViewFlags & FADING_EDGE_VERTICAL) == FADING_EDGE_VERTICAL;
@@ -8614,7 +8870,7 @@
* vertically
*
* @see #isVerticalFadingEdgeEnabled()
- * @attr ref android.R.styleable#View_fadingEdge
+ * @attr ref android.R.styleable#View_requiresFadingEdge
*/
public void setVerticalFadingEdgeEnabled(boolean verticalFadingEdgeEnabled) {
if (isVerticalFadingEdgeEnabled() != verticalFadingEdgeEnabled) {
@@ -10102,7 +10358,7 @@
/**
* Setting a solid background color for the drawing cache's bitmaps will improve
- * perfromance and memory usage. Note, though that this should only be used if this
+ * performance and memory usage. Note, though that this should only be used if this
* view will always be drawn on top of a solid color.
*
* @param color The background color to use for the drawing cache's bitmap
@@ -10954,7 +11210,9 @@
if (sizeChanged) {
if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
// A change in dimension means an auto-centered pivot point changes, too
- mMatrixDirty = true;
+ if (mTransformationInfo != null) {
+ mTransformationInfo.mMatrixDirty = true;
+ }
}
onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);
}
@@ -11747,14 +12005,22 @@
+ "two integers");
}
- location[0] = mLeft + (int) (mTranslationX + 0.5f);
- location[1] = mTop + (int) (mTranslationY + 0.5f);
+ location[0] = mLeft;
+ location[1] = mTop;
+ if (mTransformationInfo != null) {
+ location[0] += (int) (mTransformationInfo.mTranslationX + 0.5f);
+ location[1] += (int) (mTransformationInfo.mTranslationY + 0.5f);
+ }
ViewParent viewParent = mParent;
while (viewParent instanceof View) {
final View view = (View)viewParent;
- location[0] += view.mLeft + (int) (view.mTranslationX + 0.5f) - view.mScrollX;
- location[1] += view.mTop + (int) (view.mTranslationY + 0.5f) - view.mScrollY;
+ location[0] += view.mLeft - view.mScrollX;
+ location[1] += view.mTop - view.mScrollY;
+ if (view.mTransformationInfo != null) {
+ location[0] += (int) (view.mTransformationInfo.mTranslationX + 0.5f);
+ location[1] += (int) (view.mTransformationInfo.mTranslationY + 0.5f);
+ }
viewParent = view.mParent;
}
@@ -12939,6 +13205,10 @@
shadowSize.x, shadowSize.y,
shadowTouchPoint.x, shadowTouchPoint.y, data);
if (ViewDebug.DEBUG_DRAG) Log.d(VIEW_LOG_TAG, "performDrag returned " + okay);
+
+ // Off and running! Release our local surface instance; the drag
+ // shadow surface is now managed by the system process.
+ surface.release();
}
} catch (Exception e) {
Log.e(VIEW_LOG_TAG, "Unable to initiate drag", e);
@@ -14317,4 +14587,205 @@
mIsPending = false;
}
}
+
+ /**
+ * <p>
+ * This class represents a delegate that can be registered in a {@link View}
+ * to enhance accessibility support via composition rather via inheritance.
+ * It is specifically targeted to widget developers that extend basic View
+ * classes i.e. classes in package android.view, that would like their
+ * applications to be backwards compatible.
+ * </p>
+ * <p>
+ * A scenario in which a developer would like to use an accessibility delegate
+ * is overriding a method introduced in a later API version then the minimal API
+ * version supported by the application. For example, the method
+ * {@link View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)} is not available
+ * in API version 4 when the accessibility APIs were first introduced. If a
+ * developer would like his application to run on API version 4 devices (assuming
+ * all other APIs used by the application are version 4 or lower) and take advantage
+ * of this method, instead of overriding the method which would break the application's
+ * backwards compatibility, he can override the corresponding method in this
+ * delegate and register the delegate in the target View if the API version of
+ * the system is high enough i.e. the API version is same or higher to the API
+ * version that introduced
+ * {@link View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)}.
+ * </p>
+ * <p>
+ * Here is an example implementation:
+ * </p>
+ * <code><pre><p>
+ * if (Build.VERSION.SDK_INT >= 14) {
+ * // If the API version is equal of higher than the version in
+ * // which onInitializeAccessibilityNodeInfo was introduced we
+ * // register a delegate with a customized implementation.
+ * View view = findViewById(R.id.view_id);
+ * view.setAccessibilityDelegate(new AccessibilityDelegate() {
+ * public void onInitializeAccessibilityNodeInfo(View host,
+ * AccessibilityNodeInfo info) {
+ * // Let the default implementation populate the info.
+ * super.onInitializeAccessibilityNodeInfo(host, info);
+ * // Set some other information.
+ * info.setEnabled(host.isEnabled());
+ * }
+ * });
+ * }
+ * </code></pre></p>
+ * <p>
+ * This delegate contains methods that correspond to the accessibility methods
+ * in View. If a delegate has been specified the implementation in View hands
+ * off handling to the corresponding method in this delegate. The default
+ * implementation the delegate methods behaves exactly as the corresponding
+ * method in View for the case of no accessibility delegate been set. Hence,
+ * to customize the behavior of a View method, clients can override only the
+ * corresponding delegate method without altering the behavior of the rest
+ * accessibility related methods of the host view.
+ * </p>
+ */
+ public static class AccessibilityDelegate {
+
+ /**
+ * Sends an accessibility event of the given type. If accessibility is not
+ * enabled this method has no effect.
+ * <p>
+ * The default implementation behaves as {@link View#sendAccessibilityEvent(int)
+ * View#sendAccessibilityEvent(int)} for the case of no accessibility delegate
+ * been set.
+ * </p>
+ *
+ * @param host The View hosting the delegate.
+ * @param eventType The type of the event to send.
+ *
+ * @see View#sendAccessibilityEvent(int) View#sendAccessibilityEvent(int)
+ */
+ public void sendAccessibilityEvent(View host, int eventType) {
+ host.sendAccessibilityEventInternal(eventType);
+ }
+
+ /**
+ * Sends an accessibility event. This method behaves exactly as
+ * {@link #sendAccessibilityEvent(View, int)} but takes as an argument an
+ * empty {@link AccessibilityEvent} and does not perform a check whether
+ * accessibility is enabled.
+ * <p>
+ * The default implementation behaves as
+ * {@link View#sendAccessibilityEventUnchecked(AccessibilityEvent)
+ * View#sendAccessibilityEventUnchecked(AccessibilityEvent)} for
+ * the case of no accessibility delegate been set.
+ * </p>
+ *
+ * @param host The View hosting the delegate.
+ * @param event The event to send.
+ *
+ * @see View#sendAccessibilityEventUnchecked(AccessibilityEvent)
+ * View#sendAccessibilityEventUnchecked(AccessibilityEvent)
+ */
+ public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
+ host.sendAccessibilityEventUncheckedInternal(event);
+ }
+
+ /**
+ * Dispatches an {@link AccessibilityEvent} to the host {@link View} first and then
+ * to its children for adding their text content to the event.
+ * <p>
+ * The default implementation behaves as
+ * {@link View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+ * View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)} for
+ * the case of no accessibility delegate been set.
+ * </p>
+ *
+ * @param host The View hosting the delegate.
+ * @param event The event.
+ * @return True if the event population was completed.
+ *
+ * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+ * View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+ */
+ public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+ return host.dispatchPopulateAccessibilityEventInternal(event);
+ }
+
+ /**
+ * Gives a chance to the host View to populate the accessibility event with its
+ * text content.
+ * <p>
+ * The default implementation behaves as
+ * {@link View#onPopulateAccessibilityEvent(AccessibilityEvent)
+ * View#onPopulateAccessibilityEvent(AccessibilityEvent)} for
+ * the case of no accessibility delegate been set.
+ * </p>
+ *
+ * @param host The View hosting the delegate.
+ * @param event The accessibility event which to populate.
+ *
+ * @see View#onPopulateAccessibilityEvent(AccessibilityEvent)
+ * View#onPopulateAccessibilityEvent(AccessibilityEvent)
+ */
+ public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+ host.onPopulateAccessibilityEventInternal(event);
+ }
+
+ /**
+ * Initializes an {@link AccessibilityEvent} with information about the
+ * the host View which is the event source.
+ * <p>
+ * The default implementation behaves as
+ * {@link View#onInitializeAccessibilityEvent(AccessibilityEvent)
+ * View#onInitializeAccessibilityEvent(AccessibilityEvent)} for
+ * the case of no accessibility delegate been set.
+ * </p>
+ *
+ * @param host The View hosting the delegate.
+ * @param event The event to initialize.
+ *
+ * @see View#onInitializeAccessibilityEvent(AccessibilityEvent)
+ * View#onInitializeAccessibilityEvent(AccessibilityEvent)
+ */
+ public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+ host.onInitializeAccessibilityEventInternal(event);
+ }
+
+ /**
+ * Initializes an {@link AccessibilityNodeInfo} with information about the host view.
+ * <p>
+ * The default implementation behaves as
+ * {@link View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
+ * View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)} for
+ * the case of no accessibility delegate been set.
+ * </p>
+ *
+ * @param host The View hosting the delegate.
+ * @param info The instance to initialize.
+ *
+ * @see View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
+ * View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
+ */
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ host.onInitializeAccessibilityNodeInfoInternal(info);
+ }
+
+ /**
+ * Called when a child of the host View has requested sending an
+ * {@link AccessibilityEvent} and gives an opportunity to the parent (the host)
+ * to augment the event.
+ * <p>
+ * The default implementation behaves as
+ * {@link ViewGroup#onRequestSendAccessibilityEvent(View, AccessibilityEvent)
+ * ViewGroup#onRequestSendAccessibilityEvent(View, AccessibilityEvent)} for
+ * the case of no accessibility delegate been set.
+ * </p>
+ *
+ * @param host The View hosting the delegate.
+ * @param child The child which requests sending the event.
+ * @param event The event to be sent.
+ * @return True if the event should be sent
+ *
+ * @see ViewGroup#onRequestSendAccessibilityEvent(View, AccessibilityEvent)
+ * ViewGroup#onRequestSendAccessibilityEvent(View, AccessibilityEvent)
+ */
+ public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
+ AccessibilityEvent event) {
+ return host.onRequestSendAccessibilityEventInternal(child, event);
+ }
+ }
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 0e420d6..c7b59b8 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -34,6 +34,7 @@
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
+import android.view.View.AccessibilityDelegate;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.Animation;
@@ -606,6 +607,12 @@
/**
* Called when a child has requested sending an {@link AccessibilityEvent} and
* gives an opportunity to its parent to augment the event.
+ * <p>
+ * If an {@link AccessibilityDelegate} has been specified via calling
+ * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
+ * {@link AccessibilityDelegate#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)}
+ * is responsible for handling this call.
+ * </p>
*
* @param child The child which requests sending the event.
* @param event The event to be sent.
@@ -614,6 +621,19 @@
* @see #requestSendAccessibilityEvent(View, AccessibilityEvent)
*/
public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
+ if (mAccessibilityDelegate != null) {
+ return mAccessibilityDelegate.onRequestSendAccessibilityEvent(this, child, event);
+ } else {
+ return onRequestSendAccessibilityEventInternal(child, event);
+ }
+ }
+
+ /**
+ * @see #onRequestSendAccessibilityEvent(View, AccessibilityEvent)
+ *
+ * Note: Called from the default {@link View.AccessibilityDelegate}.
+ */
+ boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
return true;
}
@@ -782,13 +802,15 @@
}
@Override
- public void findViewsWithText(ArrayList<View> outViews, CharSequence text) {
+ public void findViewsWithText(ArrayList<View> outViews, CharSequence text, int flags) {
+ super.findViewsWithText(outViews, text, flags);
final int childrenCount = mChildrenCount;
final View[] children = mChildren;
for (int i = 0; i < childrenCount; i++) {
View child = children[i];
- if ((child.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) {
- child.findViewsWithText(outViews, text);
+ if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE
+ && (child.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) {
+ child.findViewsWithText(outViews, text, flags);
}
}
}
@@ -2142,9 +2164,9 @@
}
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
// We first get a chance to populate the event.
- onPopulateAccessibilityEvent(event);
+ super.dispatchPopulateAccessibilityEventInternal(event);
// Let our children have a shot in populating the event.
for (int i = 0, count = getChildCount(); i < count; i++) {
View child = getChildAt(i);
@@ -2159,8 +2181,8 @@
}
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
// If the view is not the topmost one in the view hierarchy and it is
// marked as the logical root of a view hierarchy, do not go any deeper.
if ((!(getParent() instanceof ViewRootImpl)) && (mPrivateFlags & IS_ROOT_NAMESPACE) != 0) {
diff --git a/core/java/android/view/ViewPropertyAnimator.java b/core/java/android/view/ViewPropertyAnimator.java
index 6ed49ee..84dc7d8 100644
--- a/core/java/android/view/ViewPropertyAnimator.java
+++ b/core/java/android/view/ViewPropertyAnimator.java
@@ -51,7 +51,7 @@
* The View whose properties are being animated by this class. This is set at
* construction time.
*/
- private View mView;
+ private final View mView;
/**
* The duration of the underlying Animator object. By default, we don't set the duration
@@ -225,6 +225,7 @@
*/
ViewPropertyAnimator(View view) {
mView = view;
+ view.ensureTransformationInfo();
}
/**
@@ -721,36 +722,37 @@
* @param value The value to set the property to
*/
private void setValue(int propertyConstant, float value) {
+ final View.TransformationInfo info = mView.mTransformationInfo;
switch (propertyConstant) {
case TRANSLATION_X:
- mView.mTranslationX = value;
+ info.mTranslationX = value;
break;
case TRANSLATION_Y:
- mView.mTranslationY = value;
+ info.mTranslationY = value;
break;
case ROTATION:
- mView.mRotation = value;
+ info.mRotation = value;
break;
case ROTATION_X:
- mView.mRotationX = value;
+ info.mRotationX = value;
break;
case ROTATION_Y:
- mView.mRotationY = value;
+ info.mRotationY = value;
break;
case SCALE_X:
- mView.mScaleX = value;
+ info.mScaleX = value;
break;
case SCALE_Y:
- mView.mScaleY = value;
+ info.mScaleY = value;
break;
case X:
- mView.mTranslationX = value - mView.mLeft;
+ info.mTranslationX = value - mView.mLeft;
break;
case Y:
- mView.mTranslationY = value - mView.mTop;
+ info.mTranslationY = value - mView.mTop;
break;
case ALPHA:
- mView.mAlpha = value;
+ info.mAlpha = value;
break;
}
}
@@ -762,27 +764,28 @@
* @return float The value of the named property
*/
private float getValue(int propertyConstant) {
+ final View.TransformationInfo info = mView.mTransformationInfo;
switch (propertyConstant) {
case TRANSLATION_X:
- return mView.mTranslationX;
+ return info.mTranslationX;
case TRANSLATION_Y:
- return mView.mTranslationY;
+ return info.mTranslationY;
case ROTATION:
- return mView.mRotation;
+ return info.mRotation;
case ROTATION_X:
- return mView.mRotationX;
+ return info.mRotationX;
case ROTATION_Y:
- return mView.mRotationY;
+ return info.mRotationY;
case SCALE_X:
- return mView.mScaleX;
+ return info.mScaleX;
case SCALE_Y:
- return mView.mScaleY;
+ return info.mScaleY;
case X:
- return mView.mLeft + mView.mTranslationX;
+ return mView.mLeft + info.mTranslationX;
case Y:
- return mView.mTop + mView.mTranslationY;
+ return mView.mTop + info.mTranslationY;
case ALPHA:
- return mView.mAlpha;
+ return info.mAlpha;
}
return 0;
}
@@ -861,7 +864,7 @@
}
}
if ((propertyMask & TRANSFORM_MASK) != 0) {
- mView.mMatrixDirty = true;
+ mView.mTransformationInfo.mMatrixDirty = true;
mView.mPrivateFlags |= View.DRAWN; // force another invalidation
}
// invalidate(false) in all cases except if alphaHandled gets set to true
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index fb3f6e8..4611984 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -164,11 +164,14 @@
final W mWindow;
+ final int mTargetSdkVersion;
+
View mView;
View mFocusedView;
View mRealFocusedView; // this is not set to null in touch mode
int mViewVisibility;
boolean mAppVisible = true;
+ int mOrigWindowType = -1;
// Set to true if the owner of this window is in the stopped state,
// so the window should no longer be active.
@@ -331,6 +334,7 @@
mVisRect = new Rect();
mWinFrame = new Rect();
mWindow = new W(this);
+ mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
mInputMethodCallback = new InputMethodCallback(this);
mViewVisibility = View.GONE;
mTransparentRegion = new Region();
@@ -461,6 +465,7 @@
mInputChannel = new InputChannel();
}
try {
+ mOrigWindowType = mWindowAttributes.type;
res = sWindowSession.add(mWindow, mWindowAttributes,
getHostVisibility(), mAttachInfo.mContentInsets,
mInputChannel);
@@ -3481,6 +3486,14 @@
}
mPendingConfiguration.seq = 0;
//Log.d(TAG, ">>>>>> CALLING relayout");
+ if (params != null && mOrigWindowType != params.type) {
+ // For compatibility with old apps, don't crash here.
+ if (mTargetSdkVersion < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ Slog.w(TAG, "Window type can not be changed after "
+ + "the window is added; ignoring change of " + mView);
+ params.type = mOrigWindowType;
+ }
+ }
int relayoutResult = sWindowSession.relayout(
mWindow, params,
(int) (mView.getMeasuredWidth() * appScale + 0.5f),
@@ -4648,7 +4661,8 @@
return;
}
- root.findViewsWithText(foundViews, text);
+ root.findViewsWithText(foundViews, text, View.FIND_VIEWS_WITH_TEXT
+ | View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
if (foundViews.isEmpty()) {
return;
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 96c1512..17a516c 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -177,7 +177,14 @@
@ViewDebug.IntToString(from = TYPE_SYSTEM_ERROR, to = "TYPE_SYSTEM_ERROR"),
@ViewDebug.IntToString(from = TYPE_INPUT_METHOD, to = "TYPE_INPUT_METHOD"),
@ViewDebug.IntToString(from = TYPE_INPUT_METHOD_DIALOG, to = "TYPE_INPUT_METHOD_DIALOG"),
+ @ViewDebug.IntToString(from = TYPE_WALLPAPER, to = "TYPE_WALLPAPER"),
+ @ViewDebug.IntToString(from = TYPE_STATUS_BAR_PANEL, to = "TYPE_STATUS_BAR_PANEL"),
@ViewDebug.IntToString(from = TYPE_SECURE_SYSTEM_OVERLAY, to = "TYPE_SECURE_SYSTEM_OVERLAY"),
+ @ViewDebug.IntToString(from = TYPE_DRAG, to = "TYPE_DRAG"),
+ @ViewDebug.IntToString(from = TYPE_STATUS_BAR_SUB_PANEL, to = "TYPE_STATUS_BAR_SUB_PANEL"),
+ @ViewDebug.IntToString(from = TYPE_POINTER, to = "TYPE_POINTER"),
+ @ViewDebug.IntToString(from = TYPE_NAVIGATION_BAR, to = "TYPE_NAVIGATION_BAR"),
+ @ViewDebug.IntToString(from = TYPE_VOLUME_OVERLAY, to = "TYPE_VOLUME_OVERLAY"),
@ViewDebug.IntToString(from = TYPE_BOOT_PROGRESS, to = "TYPE_BOOT_PROGRESS")
})
public int type;
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index dc1bbd7..980e454 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -478,14 +478,14 @@
* decorations that can never be removed. That is, system bar or
* button bar.
*/
- public int getNonDecorDisplayWidth(int rotation, int fullWidth);
+ public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation);
/**
* Return the display height available after excluding any screen
* decorations that can never be removed. That is, system bar or
* button bar.
*/
- public int getNonDecorDisplayHeight(int rotation, int fullHeight);
+ public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation);
/**
* Return the available screen width that we should report for the
@@ -493,7 +493,7 @@
* {@link #getNonDecorDisplayWidth(int, int)}; it may be smaller than
* that to account for more transient decoration like a status bar.
*/
- public int getConfigDisplayWidth(int rotation, int fullWidth);
+ public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation);
/**
* Return the available screen height that we should report for the
@@ -501,7 +501,7 @@
* {@link #getNonDecorDisplayHeight(int, int)}; it may be smaller than
* that to account for more transient decoration like a status bar.
*/
- public int getConfigDisplayHeight(int rotation, int fullHeight);
+ public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation);
/**
* Return whether the given window should forcibly hide everything
@@ -671,8 +671,10 @@
*
* @param displayWidth The current full width of the screen.
* @param displayHeight The current full height of the screen.
+ * @param displayRotation The current rotation being applied to the base
+ * window.
*/
- public void beginLayoutLw(int displayWidth, int displayHeight);
+ public void beginLayoutLw(int displayWidth, int displayHeight, int displayRotation);
/**
* Called for each window attached to the window manager as layout is
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index 071701e..25b980b 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -104,6 +104,7 @@
public void setSameThreadMessage(Message message) {
synchronized (mInstanceLock) {
mSameThreadMessage = message;
+ mInstanceLock.notifyAll();
}
}
@@ -125,7 +126,6 @@
Thread.currentThread().getId());
// If the scale is zero the call has failed.
if (windowScale > 0) {
- handleSameThreadMessageIfNeeded();
AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear(
interactionId);
finalizeAccessibilityNodeInfo(info, connection, windowScale);
@@ -142,7 +142,7 @@
* in the currently active window and starts from the root View in the window.
*
* @param connection A connection for interacting with the system.
- * @param id The id of the node.
+ * @param viewId The id of the view.
* @return An {@link AccessibilityNodeInfo} if found, null otherwise.
*/
public AccessibilityNodeInfo findAccessibilityNodeInfoByViewIdInActiveWindow(
@@ -153,7 +153,6 @@
viewId, interactionId, this, Thread.currentThread().getId());
// If the scale is zero the call has failed.
if (windowScale > 0) {
- handleSameThreadMessageIfNeeded();
AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear(
interactionId);
finalizeAccessibilityNodeInfo(info, connection, windowScale);
@@ -182,7 +181,6 @@
text, interactionId, this, Thread.currentThread().getId());
// If the scale is zero the call has failed.
if (windowScale > 0) {
- handleSameThreadMessageIfNeeded();
List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
interactionId);
finalizeAccessibilityNodeInfos(infos, connection, windowScale);
@@ -217,7 +215,6 @@
Thread.currentThread().getId());
// If the scale is zero the call has failed.
if (windowScale > 0) {
- handleSameThreadMessageIfNeeded();
List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
interactionId);
finalizeAccessibilityNodeInfos(infos, connection, windowScale);
@@ -246,7 +243,6 @@
accessibilityWindowId, accessibilityViewId, action, interactionId, this,
Thread.currentThread().getId());
if (success) {
- handleSameThreadMessageIfNeeded();
return getPerformAccessibilityActionResult(interactionId);
}
} catch (RemoteException re) {
@@ -363,6 +359,11 @@
final long startTimeMillis = SystemClock.uptimeMillis();
while (true) {
try {
+ Message sameProcessMessage = getSameProcessMessageAndClear();
+ if (sameProcessMessage != null) {
+ sameProcessMessage.getTarget().handleMessage(sameProcessMessage);
+ }
+
if (mInteractionId == interactionId) {
return true;
}
@@ -402,17 +403,6 @@
}
/**
- * Handles the message stored if the interacted and interacting
- * threads are the same otherwise this is a NOP.
- */
- private void handleSameThreadMessageIfNeeded() {
- Message sameProcessMessage = getSameProcessMessageAndClear();
- if (sameProcessMessage != null) {
- sameProcessMessage.getTarget().handleMessage(sameProcessMessage);
- }
- }
-
- /**
* Finalize an {@link AccessibilityNodeInfo} before passing it to the client.
*
* @param info The info.
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index f0e8005..7671312 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -261,6 +261,7 @@
* Finds {@link AccessibilityNodeInfo}s by text. The match is case
* insensitive containment. The search is relative to this info i.e.
* this info is the root of the traversed tree.
+ *
* <p>
* <strong>Note:</strong> It is a client responsibility to recycle the
* received info by calling {@link AccessibilityNodeInfo#recycle()}
diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java
index c1eec6f..0d57c9b 100644
--- a/core/java/android/view/animation/Animation.java
+++ b/core/java/android/view/animation/Animation.java
@@ -232,11 +232,6 @@
setFillBefore(a.getBoolean(com.android.internal.R.styleable.Animation_fillBefore, mFillBefore));
setFillAfter(a.getBoolean(com.android.internal.R.styleable.Animation_fillAfter, mFillAfter));
- final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0);
- if (resID > 0) {
- setInterpolator(context, resID);
- }
-
setRepeatCount(a.getInt(com.android.internal.R.styleable.Animation_repeatCount, mRepeatCount));
setRepeatMode(a.getInt(com.android.internal.R.styleable.Animation_repeatMode, RESTART));
@@ -245,10 +240,16 @@
setBackgroundColor(a.getInt(com.android.internal.R.styleable.Animation_background, 0));
setDetachWallpaper(a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false));
-
- ensureInterpolator();
+
+ final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0);
a.recycle();
+
+ if (resID > 0) {
+ setInterpolator(context, resID);
+ }
+
+ ensureInterpolator();
}
@Override
diff --git a/core/java/android/view/animation/AnimationSet.java b/core/java/android/view/animation/AnimationSet.java
index 58373bc..2cf8ea8 100644
--- a/core/java/android/view/animation/AnimationSet.java
+++ b/core/java/android/view/animation/AnimationSet.java
@@ -89,19 +89,19 @@
if (context.getApplicationInfo().targetSdkVersion >=
Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
- if (a.hasValue(com.android.internal.R.styleable.Animation_duration)) {
+ if (a.hasValue(com.android.internal.R.styleable.AnimationSet_duration)) {
mFlags |= PROPERTY_DURATION_MASK;
}
- if (a.hasValue(com.android.internal.R.styleable.Animation_fillBefore)) {
+ if (a.hasValue(com.android.internal.R.styleable.AnimationSet_fillBefore)) {
mFlags |= PROPERTY_FILL_BEFORE_MASK;
}
- if (a.hasValue(com.android.internal.R.styleable.Animation_fillAfter)) {
+ if (a.hasValue(com.android.internal.R.styleable.AnimationSet_fillAfter)) {
mFlags |= PROPERTY_FILL_AFTER_MASK;
}
- if (a.hasValue(com.android.internal.R.styleable.Animation_repeatMode)) {
+ if (a.hasValue(com.android.internal.R.styleable.AnimationSet_repeatMode)) {
mFlags |= PROPERTY_REPEAT_MODE_MASK;
}
- if (a.hasValue(com.android.internal.R.styleable.Animation_startOffset)) {
+ if (a.hasValue(com.android.internal.R.styleable.AnimationSet_startOffset)) {
mFlags |= PROPERTY_START_OFFSET_MASK;
}
}
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 49b4f66..309857d 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -422,9 +422,9 @@
final WebHistoryItem h = mCallbackProxy.getBackForwardList()
.getCurrentItem();
if (h != null) {
- String currentUrl = h.getUrl();
- if (currentUrl != null) {
- mDatabase.setFormData(currentUrl, data);
+ String url = WebTextView.urlForAutoCompleteData(h.getUrl());
+ if (url != null) {
+ mDatabase.setFormData(url, data);
}
}
}
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 77f6776..9c44138 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -643,10 +643,10 @@
/**
* Set whether the WebView will enable smooth transition while panning or
- * zooming. If it is true, WebView will choose a solution to maximize the
- * performance. e.g. the WebView's content may not be updated during the
- * transition. If it is false, WebView will keep its fidelity. The default
- * value is false.
+ * zooming or while the window hosting the WebView does not have focus.
+ * If it is true, WebView will choose a solution to maximize the performance.
+ * e.g. the WebView's content may not be updated during the transition.
+ * If it is false, WebView will keep its fidelity. The default value is false.
*/
public void setEnableSmoothTransition(boolean enable) {
mEnableSmoothTransition = enable;
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index 2a79caa..217ad7c 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -60,6 +60,8 @@
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.ArrayList;
import junit.framework.Assert;
@@ -1044,6 +1046,7 @@
break;
}
setHint(null);
+ setThreshold(1);
if (single) {
mWebView.requestLabel(mWebView.nativeFocusCandidateFramePointer(),
mNodePointer);
@@ -1077,4 +1080,16 @@
/* package */ void setAutoFillProfileIsSet(boolean autoFillProfileIsSet) {
mAutoFillProfileIsSet = autoFillProfileIsSet;
}
+
+ static String urlForAutoCompleteData(String urlString) {
+ // Remove any fragment or query string.
+ URL url = null;
+ try {
+ url = new URL(urlString);
+ } catch (MalformedURLException e) {
+ Log.e(LOGTAG, "Unable to parse URL "+url);
+ }
+
+ return url != null ? url.getProtocol() + "://" + url.getHost() + url.getPath() : null;
+ }
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 7ba93da0..fae2c6f 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -62,6 +62,7 @@
import android.util.EventLog;
import android.util.Log;
import android.view.Gravity;
+import android.view.HapticFeedbackConstants;
import android.view.HardwareCanvas;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
@@ -908,6 +909,9 @@
// used for serializing asynchronously handled touch events.
private final TouchEventQueue mTouchEventQueue = new TouchEventQueue();
+ // Used to track whether picture updating was paused due to a window focus change.
+ private boolean mPictureUpdatePausedForFocusChange = false;
+
// Used to notify listeners of a new picture.
private PictureListener mPictureListener;
/**
@@ -4018,7 +4022,14 @@
@Override
protected void finalize() throws Throwable {
try {
- destroyImpl();
+ if (mNativeClass != 0) {
+ mPrivateHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ destroy();
+ }
+ });
+ }
} finally {
super.finalize();
}
@@ -4242,7 +4253,11 @@
* click action, look for a word under the click. If one is found,
* animate the text selection into view.
* FIXME: no animation code yet */
- return selectText();
+ final boolean isSelecting = selectText();
+ if (isSelecting) {
+ performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
+ }
+ return isSelecting;
}
/**
@@ -4826,7 +4841,7 @@
public RequestFormData(String name, String url, Message msg,
boolean autoFillable, boolean autoComplete) {
mName = name;
- mUrl = url;
+ mUrl = WebTextView.urlForAutoCompleteData(url);
mUpdateMessage = msg;
mAutoFillable = autoFillable;
mAutoComplete = autoComplete;
@@ -5570,8 +5585,18 @@
setActive(hasWindowFocus);
if (hasWindowFocus) {
JWebCoreJavaBridge.setActiveWebView(this);
+ if (mPictureUpdatePausedForFocusChange) {
+ WebViewCore.resumeUpdatePicture(mWebViewCore);
+ mPictureUpdatePausedForFocusChange = false;
+ }
} else {
JWebCoreJavaBridge.removeActiveWebView(this);
+ final WebSettings settings = getSettings();
+ if (settings != null && settings.enableSmoothTransition() &&
+ mWebViewCore != null && !WebViewCore.isUpdatePicturePaused(mWebViewCore)) {
+ WebViewCore.pauseUpdatePicture(mWebViewCore);
+ mPictureUpdatePausedForFocusChange = true;
+ }
}
super.onWindowFocusChanged(hasWindowFocus);
}
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index c61bd48..48359d44 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -2085,6 +2085,10 @@
if (!core.getSettings().enableSmoothTransition()) return;
synchronized (core) {
+ if (core.mNativeClass == 0) {
+ Log.w(LOGTAG, "Cannot pauseUpdatePicture, core destroyed or not initialized!");
+ return;
+ }
core.nativeSetIsPaused(true);
core.mDrawIsPaused = true;
}
@@ -2099,6 +2103,10 @@
return;
synchronized (core) {
+ if (core.mNativeClass == 0) {
+ Log.w(LOGTAG, "Cannot resumeUpdatePicture, core destroyed!");
+ return;
+ }
core.nativeSetIsPaused(false);
core.mDrawIsPaused = false;
// always redraw on resume to reenable gif animations
@@ -2107,6 +2115,10 @@
}
}
+ static boolean isUpdatePicturePaused(WebViewCore core) {
+ return core != null ? core.mDrawIsPaused : false;
+ }
+
//////////////////////////////////////////////////////////////////////////
private void restoreState(int index) {
diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java
index 0bfb668..7ca6aeb 100644
--- a/core/java/android/webkit/ZoomManager.java
+++ b/core/java/android/webkit/ZoomManager.java
@@ -651,6 +651,11 @@
mTextWrapScale = newTextWrapScale;
refreshZoomScale(true);
} else if (!mInZoomOverview && willScaleTriggerZoom(getZoomOverviewScale())) {
+ // Reflow, if necessary.
+ if (mTextWrapScale > getReadingLevelScale()) {
+ mTextWrapScale = getReadingLevelScale();
+ refreshZoomScale(true);
+ }
zoomToOverview();
} else {
zoomToReadingLevelOrMore();
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 05d4f05..cfe4cb7 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -635,7 +635,7 @@
/**
* Track if we are currently attached to a window.
*/
- private boolean mIsAttached;
+ boolean mIsAttached;
/**
* Track the item count from the last time we handled a data change.
@@ -2576,13 +2576,11 @@
final int longPressPosition, final long longPressId) {
// CHOICE_MODE_MULTIPLE_MODAL takes over long press.
if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) {
- if (mChoiceActionMode == null) {
- mChoiceActionMode = startActionMode(mMultiChoiceModeCallback);
+ if (mChoiceActionMode == null &&
+ (mChoiceActionMode = startActionMode(mMultiChoiceModeCallback)) != null) {
setItemChecked(longPressPosition, true);
+ performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
}
- // TODO Should we select the long pressed item if we were already in
- // selection mode? (i.e. treat it like an item click?)
- performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
}
@@ -2771,15 +2769,21 @@
}
}
- private boolean startScrollIfNeeded(int deltaY) {
+ private boolean startScrollIfNeeded(int y) {
// Check if we have moved far enough that it looks more like a
// scroll than a tap
+ final int deltaY = y - mMotionY;
final int distance = Math.abs(deltaY);
final boolean overscroll = mScrollY != 0;
if (overscroll || distance > mTouchSlop) {
createScrollingCache();
- mTouchMode = overscroll ? TOUCH_MODE_OVERSCROLL : TOUCH_MODE_SCROLL;
- mMotionCorrection = deltaY;
+ if (overscroll) {
+ mTouchMode = TOUCH_MODE_OVERSCROLL;
+ mMotionCorrection = 0;
+ } else {
+ mTouchMode = TOUCH_MODE_SCROLL;
+ mMotionCorrection = deltaY > 0 ? mTouchSlop : -mTouchSlop;
+ }
final Handler handler = getHandler();
// Handler should not be null unless the AbsListView is not attached to a
// window, which would make it very hard to scroll it... but the monkeys
@@ -2799,12 +2803,176 @@
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
+ scrollIfNeeded(y);
return true;
}
return false;
}
+ private void scrollIfNeeded(int y) {
+ final int rawDeltaY = y - mMotionY;
+ final int deltaY = rawDeltaY - mMotionCorrection;
+ int incrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY : deltaY;
+
+ if (mTouchMode == TOUCH_MODE_SCROLL) {
+ if (PROFILE_SCROLLING) {
+ if (!mScrollProfilingStarted) {
+ Debug.startMethodTracing("AbsListViewScroll");
+ mScrollProfilingStarted = true;
+ }
+ }
+
+ if (mScrollStrictSpan == null) {
+ // If it's non-null, we're already in a scroll.
+ mScrollStrictSpan = StrictMode.enterCriticalSpan("AbsListView-scroll");
+ }
+
+ if (y != mLastY) {
+ // We may be here after stopping a fling and continuing to scroll.
+ // If so, we haven't disallowed intercepting touch events yet.
+ // Make sure that we do so in case we're in a parent that can intercept.
+ if ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) == 0 &&
+ Math.abs(rawDeltaY) > mTouchSlop) {
+ final ViewParent parent = getParent();
+ if (parent != null) {
+ parent.requestDisallowInterceptTouchEvent(true);
+ }
+ }
+
+ final int motionIndex;
+ if (mMotionPosition >= 0) {
+ motionIndex = mMotionPosition - mFirstPosition;
+ } else {
+ // If we don't have a motion position that we can reliably track,
+ // pick something in the middle to make a best guess at things below.
+ motionIndex = getChildCount() / 2;
+ }
+
+ int motionViewPrevTop = 0;
+ View motionView = this.getChildAt(motionIndex);
+ if (motionView != null) {
+ motionViewPrevTop = motionView.getTop();
+ }
+
+ // No need to do all this work if we're not going to move anyway
+ boolean atEdge = false;
+ if (incrementalDeltaY != 0) {
+ atEdge = trackMotionScroll(deltaY, incrementalDeltaY);
+ }
+
+ // Check to see if we have bumped into the scroll limit
+ motionView = this.getChildAt(motionIndex);
+ if (motionView != null) {
+ // Check if the top of the motion view is where it is
+ // supposed to be
+ final int motionViewRealTop = motionView.getTop();
+ if (atEdge) {
+ // Apply overscroll
+
+ int overscroll = -incrementalDeltaY -
+ (motionViewRealTop - motionViewPrevTop);
+ overScrollBy(0, overscroll, 0, mScrollY, 0, 0,
+ 0, mOverscrollDistance, true);
+ if (Math.abs(mOverscrollDistance) == Math.abs(mScrollY)) {
+ // Don't allow overfling if we're at the edge.
+ if (mVelocityTracker != null) {
+ mVelocityTracker.clear();
+ }
+ }
+
+ final int overscrollMode = getOverScrollMode();
+ if (overscrollMode == OVER_SCROLL_ALWAYS ||
+ (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS &&
+ !contentFits())) {
+ mDirection = 0; // Reset when entering overscroll.
+ mTouchMode = TOUCH_MODE_OVERSCROLL;
+ if (rawDeltaY > 0) {
+ mEdgeGlowTop.onPull((float) overscroll / getHeight());
+ if (!mEdgeGlowBottom.isFinished()) {
+ mEdgeGlowBottom.onRelease();
+ }
+ } else if (rawDeltaY < 0) {
+ mEdgeGlowBottom.onPull((float) overscroll / getHeight());
+ if (!mEdgeGlowTop.isFinished()) {
+ mEdgeGlowTop.onRelease();
+ }
+ }
+ }
+ }
+ mMotionY = y;
+ invalidate();
+ }
+ mLastY = y;
+ }
+ } else if (mTouchMode == TOUCH_MODE_OVERSCROLL) {
+ if (y != mLastY) {
+ final int oldScroll = mScrollY;
+ final int newScroll = oldScroll - incrementalDeltaY;
+ int newDirection = y > mLastY ? 1 : -1;
+
+ if (mDirection == 0) {
+ mDirection = newDirection;
+ }
+
+ int overScrollDistance = -incrementalDeltaY;
+ if ((newScroll < 0 && oldScroll >= 0) || (newScroll > 0 && oldScroll <= 0)) {
+ overScrollDistance = -oldScroll;
+ incrementalDeltaY += overScrollDistance;
+ } else {
+ incrementalDeltaY = 0;
+ }
+
+ if (overScrollDistance != 0) {
+ overScrollBy(0, overScrollDistance, 0, mScrollY, 0, 0,
+ 0, mOverscrollDistance, true);
+ final int overscrollMode = getOverScrollMode();
+ if (overscrollMode == OVER_SCROLL_ALWAYS ||
+ (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS &&
+ !contentFits())) {
+ if (rawDeltaY > 0) {
+ mEdgeGlowTop.onPull((float) overScrollDistance / getHeight());
+ if (!mEdgeGlowBottom.isFinished()) {
+ mEdgeGlowBottom.onRelease();
+ }
+ } else if (rawDeltaY < 0) {
+ mEdgeGlowBottom.onPull((float) overScrollDistance / getHeight());
+ if (!mEdgeGlowTop.isFinished()) {
+ mEdgeGlowTop.onRelease();
+ }
+ }
+ invalidate();
+ }
+ }
+
+ if (incrementalDeltaY != 0) {
+ // Coming back to 'real' list scrolling
+ mScrollY = 0;
+ invalidateParentIfNeeded();
+
+ // No need to do all this work if we're not going to move anyway
+ if (incrementalDeltaY != 0) {
+ trackMotionScroll(incrementalDeltaY, incrementalDeltaY);
+ }
+
+ mTouchMode = TOUCH_MODE_SCROLL;
+
+ // We did not scroll the full amount. Treat this essentially like the
+ // start of a new touch scroll
+ final int motionPosition = findClosestMotionRow(y);
+
+ mMotionCorrection = 0;
+ View motionView = getChildAt(motionPosition - mFirstPosition);
+ mMotionViewOriginalTop = motionView != null ? motionView.getTop() : 0;
+ mMotionY = y;
+ mMotionPosition = motionPosition;
+ }
+ mLastY = y;
+ mDirection = newDirection;
+ }
+ }
+ }
+
public void onTouchModeChanged(boolean isInTouchMode) {
if (isInTouchMode) {
// Get rid of the selection when we enter touch mode
@@ -2856,7 +3024,6 @@
final int action = ev.getAction();
View v;
- int deltaY;
initVelocityTrackerIfNotExists();
mVelocityTracker.addMovement(ev);
@@ -2935,183 +3102,19 @@
mActivePointerId = ev.getPointerId(pointerIndex);
}
final int y = (int) ev.getY(pointerIndex);
- deltaY = y - mMotionY;
switch (mTouchMode) {
case TOUCH_MODE_DOWN:
case TOUCH_MODE_TAP:
case TOUCH_MODE_DONE_WAITING:
// Check if we have moved far enough that it looks more like a
// scroll than a tap
- startScrollIfNeeded(deltaY);
+ startScrollIfNeeded(y);
break;
case TOUCH_MODE_SCROLL:
- if (PROFILE_SCROLLING) {
- if (!mScrollProfilingStarted) {
- Debug.startMethodTracing("AbsListViewScroll");
- mScrollProfilingStarted = true;
- }
- }
-
- if (mScrollStrictSpan == null) {
- // If it's non-null, we're already in a scroll.
- mScrollStrictSpan = StrictMode.enterCriticalSpan("AbsListView-scroll");
- }
-
- if (y != mLastY) {
- // We may be here after stopping a fling and continuing to scroll.
- // If so, we haven't disallowed intercepting touch events yet.
- // Make sure that we do so in case we're in a parent that can intercept.
- if ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) == 0 &&
- Math.abs(deltaY) > mTouchSlop) {
- final ViewParent parent = getParent();
- if (parent != null) {
- parent.requestDisallowInterceptTouchEvent(true);
- }
- }
-
- final int rawDeltaY = deltaY;
- deltaY -= mMotionCorrection;
- int incrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY : deltaY;
-
- final int motionIndex;
- if (mMotionPosition >= 0) {
- motionIndex = mMotionPosition - mFirstPosition;
- } else {
- // If we don't have a motion position that we can reliably track,
- // pick something in the middle to make a best guess at things below.
- motionIndex = getChildCount() / 2;
- }
-
- int motionViewPrevTop = 0;
- View motionView = this.getChildAt(motionIndex);
- if (motionView != null) {
- motionViewPrevTop = motionView.getTop();
- }
-
- // No need to do all this work if we're not going to move anyway
- boolean atEdge = false;
- if (incrementalDeltaY != 0) {
- atEdge = trackMotionScroll(deltaY, incrementalDeltaY);
- }
-
- // Check to see if we have bumped into the scroll limit
- motionView = this.getChildAt(motionIndex);
- if (motionView != null) {
- // Check if the top of the motion view is where it is
- // supposed to be
- final int motionViewRealTop = motionView.getTop();
- if (atEdge) {
- // Apply overscroll
-
- int overscroll = -incrementalDeltaY -
- (motionViewRealTop - motionViewPrevTop);
- overScrollBy(0, overscroll, 0, mScrollY, 0, 0,
- 0, mOverscrollDistance, true);
- if (Math.abs(mOverscrollDistance) == Math.abs(mScrollY)) {
- // Don't allow overfling if we're at the edge.
- if (mVelocityTracker != null) {
- mVelocityTracker.clear();
- }
- }
-
- final int overscrollMode = getOverScrollMode();
- if (overscrollMode == OVER_SCROLL_ALWAYS ||
- (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS &&
- !contentFits())) {
- mDirection = 0; // Reset when entering overscroll.
- mTouchMode = TOUCH_MODE_OVERSCROLL;
- if (rawDeltaY > 0) {
- mEdgeGlowTop.onPull((float) overscroll / getHeight());
- if (!mEdgeGlowBottom.isFinished()) {
- mEdgeGlowBottom.onRelease();
- }
- } else if (rawDeltaY < 0) {
- mEdgeGlowBottom.onPull((float) overscroll / getHeight());
- if (!mEdgeGlowTop.isFinished()) {
- mEdgeGlowTop.onRelease();
- }
- }
- }
- }
- mMotionY = y;
- invalidate();
- }
- mLastY = y;
- }
- break;
-
case TOUCH_MODE_OVERSCROLL:
- if (y != mLastY) {
- final int rawDeltaY = deltaY;
- deltaY -= mMotionCorrection;
- int incrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY : deltaY;
-
- final int oldScroll = mScrollY;
- final int newScroll = oldScroll - incrementalDeltaY;
- int newDirection = y > mLastY ? 1 : -1;
-
- if (mDirection == 0) {
- mDirection = newDirection;
- }
-
- int overScrollDistance = -incrementalDeltaY;
- if ((newScroll < 0 && oldScroll >= 0) || (newScroll > 0 && oldScroll <= 0)) {
- overScrollDistance = -oldScroll;
- incrementalDeltaY += overScrollDistance;
- } else {
- incrementalDeltaY = 0;
- }
-
- if (overScrollDistance != 0) {
- overScrollBy(0, overScrollDistance, 0, mScrollY, 0, 0,
- 0, mOverscrollDistance, true);
- final int overscrollMode = getOverScrollMode();
- if (overscrollMode == OVER_SCROLL_ALWAYS ||
- (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS &&
- !contentFits())) {
- if (rawDeltaY > 0) {
- mEdgeGlowTop.onPull((float) overScrollDistance / getHeight());
- if (!mEdgeGlowBottom.isFinished()) {
- mEdgeGlowBottom.onRelease();
- }
- } else if (rawDeltaY < 0) {
- mEdgeGlowBottom.onPull((float) overScrollDistance / getHeight());
- if (!mEdgeGlowTop.isFinished()) {
- mEdgeGlowTop.onRelease();
- }
- }
- invalidate();
- }
- }
-
- if (incrementalDeltaY != 0) {
- // Coming back to 'real' list scrolling
- mScrollY = 0;
- invalidateParentIfNeeded();
-
- // No need to do all this work if we're not going to move anyway
- if (incrementalDeltaY != 0) {
- trackMotionScroll(incrementalDeltaY, incrementalDeltaY);
- }
-
- mTouchMode = TOUCH_MODE_SCROLL;
-
- // We did not scroll the full amount. Treat this essentially like the
- // start of a new touch scroll
- final int motionPosition = findClosestMotionRow(y);
-
- mMotionCorrection = 0;
- View motionView = getChildAt(motionPosition - mFirstPosition);
- mMotionViewOriginalTop = motionView != null ? motionView.getTop() : 0;
- mMotionY = y;
- mMotionPosition = motionPosition;
- }
- mLastY = y;
- mDirection = newDirection;
- }
+ scrollIfNeeded(y);
break;
}
-
break;
}
@@ -3542,7 +3545,7 @@
final int y = (int) ev.getY(pointerIndex);
initVelocityTrackerIfNotExists();
mVelocityTracker.addMovement(ev);
- if (startScrollIfNeeded(y - mMotionY)) {
+ if (startScrollIfNeeded(y)) {
return true;
}
break;
@@ -3769,6 +3772,10 @@
}
// Fall through
case TOUCH_MODE_FLING: {
+ if (mDataChanged) {
+ layoutChildren();
+ }
+
if (mItemCount == 0 || getChildCount() == 0) {
endFling();
return;
diff --git a/core/java/android/widget/ActivityChooserModel.java b/core/java/android/widget/ActivityChooserModel.java
index 9fea506..bc44521 100644
--- a/core/java/android/widget/ActivityChooserModel.java
+++ b/core/java/android/widget/ActivityChooserModel.java
@@ -663,6 +663,17 @@
}
}
+ /**
+ * Gets the history size.
+ *
+ * @return The history size.
+ */
+ public int getHistorySize() {
+ synchronized (mInstanceLock) {
+ return mHistoricalRecords.size();
+ }
+ }
+
@Override
protected void finalize() throws Throwable {
super.finalize();
diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java
index fcc7938..312303d 100644
--- a/core/java/android/widget/ActivityChooserView.java
+++ b/core/java/android/widget/ActivityChooserView.java
@@ -28,6 +28,7 @@
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
@@ -76,6 +77,11 @@
private final LinearLayout mActivityChooserContent;
/**
+ * Stores the background drawable to allow hiding and latter showing.
+ */
+ private final Drawable mActivityChooserContentBackground;
+
+ /**
* The expand activities action button;
*/
private final FrameLayout mExpandActivityOverflowButton;
@@ -194,12 +200,15 @@
Drawable expandActivityOverflowButtonDrawable = attributesArray.getDrawable(
R.styleable.ActivityChooserView_expandActivityOverflowButtonDrawable);
+ attributesArray.recycle();
+
LayoutInflater inflater = LayoutInflater.from(mContext);
inflater.inflate(R.layout.activity_chooser_view, this, true);
mCallbacks = new Callbacks();
mActivityChooserContent = (LinearLayout) findViewById(R.id.activity_chooser_view_content);
+ mActivityChooserContentBackground = mActivityChooserContent.getBackground();
mDefaultActivityButton = (FrameLayout) findViewById(R.id.default_activity_button);
mDefaultActivityButton.setOnClickListener(mCallbacks);
@@ -217,7 +226,7 @@
@Override
public void onChanged() {
super.onChanged();
- updateButtons();
+ updateAppearance();
}
});
@@ -352,9 +361,16 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- mActivityChooserContent.measure(widthMeasureSpec, heightMeasureSpec);
- setMeasuredDimension(mActivityChooserContent.getMeasuredWidth(),
- mActivityChooserContent.getMeasuredHeight());
+ View child = mActivityChooserContent;
+ // If the default action is not visible we want to be as tall as the
+ // ActionBar so if this widget is used in the latter it will look as
+ // a normal action button.
+ if (mDefaultActivityButton.getVisibility() != VISIBLE) {
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec),
+ MeasureSpec.EXACTLY);
+ }
+ measureChild(child, widthMeasureSpec, heightMeasureSpec);
+ setMeasuredDimension(child.getMeasuredWidth(), child.getMeasuredHeight());
}
@Override
@@ -367,11 +383,6 @@
}
}
- @Override
- protected void onDraw(Canvas canvas) {
- mActivityChooserContent.onDraw(canvas);
- }
-
public ActivityChooserModel getDataModel() {
return mAdapter.getDataModel();
}
@@ -417,21 +428,29 @@
/**
* Updates the buttons state.
*/
- private void updateButtons() {
+ private void updateAppearance() {
+ // Expand overflow button.
+ if (mAdapter.getCount() > 0) {
+ mExpandActivityOverflowButton.setEnabled(true);
+ } else {
+ mExpandActivityOverflowButton.setEnabled(false);
+ }
+ // Default activity button.
final int activityCount = mAdapter.getActivityCount();
- if (activityCount > 0) {
+ final int historySize = mAdapter.getHistorySize();
+ if (activityCount > 0 && historySize > 0) {
mDefaultActivityButton.setVisibility(VISIBLE);
- if (mAdapter.getCount() > 0) {
- mExpandActivityOverflowButton.setEnabled(true);
- } else {
- mExpandActivityOverflowButton.setEnabled(false);
- }
ResolveInfo activity = mAdapter.getDefaultActivity();
PackageManager packageManager = mContext.getPackageManager();
mDefaultActivityButtonImage.setImageDrawable(activity.loadIcon(packageManager));
} else {
- mDefaultActivityButton.setVisibility(View.INVISIBLE);
- mExpandActivityOverflowButton.setEnabled(false);
+ mDefaultActivityButton.setVisibility(View.GONE);
+ }
+ // Activity chooser content.
+ if (mDefaultActivityButton.getVisibility() == VISIBLE) {
+ mActivityChooserContent.setBackgroundDrawable(mActivityChooserContentBackground);
+ } else {
+ mActivityChooserContent.setBackgroundDrawable(null);
}
}
@@ -678,6 +697,10 @@
return mDataModel.getActivityCount();
}
+ public int getHistorySize() {
+ return mDataModel.getHistorySize();
+ }
+
public int getMaxActivityCount() {
return mMaxActivityCount;
}
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index 2d10bbe..72db8e8 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -896,6 +896,7 @@
@Override
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEvent(event);
// We send selection events only from AdapterView to avoid
// generation of such event for each child.
getSelectedView().dispatchPopulateAccessibilityEvent(event);
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 27610b9f..07523e3 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
@@ -38,6 +36,8 @@
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
+import com.android.internal.R;
+
/**
* <p>An editable text view that shows completion suggestions automatically
@@ -744,7 +744,6 @@
if (mFilter != null) {
mPopupCanBeUpdated = true;
performFiltering(getText(), mLastKeyCode);
- buildImeCompletions();
}
} else {
// drop down is automatically dismissed when enough characters
@@ -837,10 +836,6 @@
@Override
public void onCommitCompletion(CompletionInfo completion) {
if (isPopupShowing()) {
- mBlockCompletion = true;
- replaceText(completion.getText());
- mBlockCompletion = false;
-
mPopup.performItemClick(completion.getPosition());
}
}
@@ -938,7 +933,8 @@
*/
final boolean dropDownAlwaysVisible = mPopup.isDropDownAlwaysVisible();
- if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter()) {
+ final boolean enoughToFilter = enoughToFilter();
+ if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter) {
if (hasFocus() && hasWindowFocus() && mPopupCanBeUpdated) {
showDropDown();
}
@@ -1049,6 +1045,8 @@
* <p>Displays the drop down on screen.</p>
*/
public void showDropDown() {
+ buildImeCompletions();
+
if (mPopup.getAnchorView() == null) {
if (mDropDownAnchorId != View.NO_ID) {
mPopup.setAnchorView(getRootView().findViewById(mDropDownAnchorId));
@@ -1064,7 +1062,7 @@
mPopup.show();
mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS);
}
-
+
/**
* Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is
* false, we allow outside touch to dismiss the dropdown. If this is set to true, then we
@@ -1075,7 +1073,7 @@
public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) {
mPopup.setForceIgnoreOutsideTouch(forceIgnoreOutsideTouch);
}
-
+
private void buildImeCompletions() {
final ListAdapter adapter = mAdapter;
if (adapter != null) {
@@ -1090,8 +1088,7 @@
realCount++;
Object item = adapter.getItem(i);
long id = adapter.getItemId(i);
- completions[i] = new CompletionInfo(id, i,
- convertSelectionToString(item));
+ completions[i] = new CompletionInfo(id, i, convertSelectionToString(item));
}
}
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
index 1b713c3..9cbe8db4 100644
--- a/core/java/android/widget/CalendarView.java
+++ b/core/java/android/widget/CalendarView.java
@@ -339,10 +339,8 @@
// initialization based on locale
setCurrentLocale(Locale.getDefault());
- TypedValue calendarViewStyle = new TypedValue();
- context.getTheme().resolveAttribute(R.attr.calendarViewStyle, calendarViewStyle, true);
- TypedArray attributesArray = context.obtainStyledAttributes(calendarViewStyle.resourceId,
- R.styleable.CalendarView);
+ TypedArray attributesArray = context.obtainStyledAttributes(attrs, R.styleable.CalendarView,
+ R.attr.calendarViewStyle, 0);
mShowWeekNumber = attributesArray.getBoolean(R.styleable.CalendarView_showWeekNumber,
DEFAULT_SHOW_WEEK_NUMBER);
mFirstDayOfWeek = attributesArray.getInt(R.styleable.CalendarView_firstDayOfWeek,
@@ -355,6 +353,9 @@
if (TextUtils.isEmpty(maxDate) || !parseDate(maxDate, mMaxDate)) {
parseDate(DEFAULT_MAX_DATE, mMaxDate);
}
+ if (mMaxDate.before(mMinDate)) {
+ throw new IllegalArgumentException("Max date cannot be before min date.");
+ }
mShownWeekCount = attributesArray.getInt(R.styleable.CalendarView_shownWeekCount,
DEFAULT_SHOWN_WEEK_COUNT);
mSelectedWeekBackgroundColor = attributesArray.getColor(
@@ -407,9 +408,16 @@
setUpListView();
setUpAdapter();
- // go to today now
+ // go to today or whichever is close to today min or max date
mTempDate.setTimeInMillis(System.currentTimeMillis());
- goTo(mTempDate, false, true, true);
+ if (mTempDate.before(mMinDate)) {
+ goTo(mMinDate, false, true, true);
+ } else if (mMaxDate.before(mTempDate)) {
+ goTo(mMaxDate, false, true, true);
+ } else {
+ goTo(mTempDate, false, true, true);
+ }
+
invalidate();
}
diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java
index 7598e54..0a54743 100644
--- a/core/java/android/widget/CheckedTextView.java
+++ b/core/java/android/widget/CheckedTextView.java
@@ -26,6 +26,7 @@
import android.view.Gravity;
import android.view.ViewDebug;
import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
/**
@@ -231,4 +232,10 @@
event.getText().add(mContext.getString(R.string.radiobutton_not_selected));
}
}
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ info.setChecked(mChecked);
+ }
}
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index 3b67f44..5077be6 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -31,6 +31,7 @@
import android.view.LayoutInflater;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.view.inputmethod.EditorInfo;
import android.widget.NumberPicker.OnValueChangeListener;
import com.android.internal.R;
@@ -81,10 +82,10 @@
private static final boolean DEFAULT_ENABLED_STATE = true;
- private final NumberPicker mDaySpinner;
-
private final LinearLayout mSpinners;
+ private final NumberPicker mDaySpinner;
+
private final NumberPicker mMonthSpinner;
private final NumberPicker mYearSpinner;
@@ -481,16 +482,20 @@
private void reorderSpinners() {
mSpinners.removeAllViews();
char[] order = DateFormat.getDateFormatOrder(getContext());
- for (int i = 0; i < order.length; i++) {
+ final int spinnerCount = order.length;
+ for (int i = 0; i < spinnerCount; i++) {
switch (order[i]) {
case DateFormat.DATE:
mSpinners.addView(mDaySpinner);
+ setImeOptions(mDaySpinner, spinnerCount, i);
break;
case DateFormat.MONTH:
mSpinners.addView(mMonthSpinner);
+ setImeOptions(mMonthSpinner, spinnerCount, i);
break;
case DateFormat.YEAR:
mSpinners.addView(mYearSpinner);
+ setImeOptions(mYearSpinner, spinnerCount, i);
break;
default:
throw new IllegalArgumentException();
@@ -669,6 +674,42 @@
}
/**
+ * Sets the IME options for a spinner based on its ordering.
+ *
+ * @param spinner The spinner.
+ * @param spinnerCount The total spinner count.
+ * @param spinnerIndex The index of the given spinner.
+ */
+ private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) {
+ final int imeOptions;
+ if (spinnerIndex < spinnerCount - 1) {
+ imeOptions = EditorInfo.IME_ACTION_NEXT;
+ } else {
+ imeOptions = EditorInfo.IME_ACTION_DONE;
+ }
+ TextView input = (TextView) spinner.findViewById(R.id.numberpicker_input);
+ input.setImeOptions(imeOptions);
+ }
+
+ private void setContentDescriptions() {
+ // Day
+ String text = mContext.getString(R.string.date_picker_increment_day_button);
+ mDaySpinner.findViewById(R.id.increment).setContentDescription(text);
+ text = mContext.getString(R.string.date_picker_decrement_day_button);
+ mDaySpinner.findViewById(R.id.decrement).setContentDescription(text);
+ // Month
+ text = mContext.getString(R.string.date_picker_increment_month_button);
+ mMonthSpinner.findViewById(R.id.increment).setContentDescription(text);
+ text = mContext.getString(R.string.date_picker_decrement_month_button);
+ mMonthSpinner.findViewById(R.id.decrement).setContentDescription(text);
+ // Year
+ text = mContext.getString(R.string.date_picker_increment_year_button);
+ mYearSpinner.findViewById(R.id.increment).setContentDescription(text);
+ text = mContext.getString(R.string.date_picker_decrement_year_button);
+ mYearSpinner.findViewById(R.id.decrement).setContentDescription(text);
+ }
+
+ /**
* Class for managing state storing/restoring.
*/
private static class SavedState extends BaseSavedState {
@@ -720,22 +761,4 @@
}
};
}
-
- private void setContentDescriptions() {
- // Day
- String text = mContext.getString(R.string.date_picker_increment_day_button);
- mDaySpinner.findViewById(R.id.increment).setContentDescription(text);
- text = mContext.getString(R.string.date_picker_decrement_day_button);
- mDaySpinner.findViewById(R.id.decrement).setContentDescription(text);
- // Month
- text = mContext.getString(R.string.date_picker_increment_month_button);
- mMonthSpinner.findViewById(R.id.increment).setContentDescription(text);
- text = mContext.getString(R.string.date_picker_decrement_month_button);
- mMonthSpinner.findViewById(R.id.decrement).setContentDescription(text);
- // Year
- text = mContext.getString(R.string.date_picker_increment_year_button);
- mYearSpinner.findViewById(R.id.increment).setContentDescription(text);
- text = mContext.getString(R.string.date_picker_decrement_year_button);
- mYearSpinner.findViewById(R.id.decrement).setContentDescription(text);
- }
}
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index a7a05be..9ce8fe0 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -16,14 +16,10 @@
package android.widget;
-import com.android.internal.R;
-
import android.content.Context;
-import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.FocusFinder;
import android.view.InputDevice;
@@ -569,16 +565,18 @@
final int oldX = mScrollX;
final int oldY = mScrollY;
final int range = getScrollRange();
- if (overScrollBy(deltaX, 0, mScrollX, 0, range, 0,
+ final int overscrollMode = getOverScrollMode();
+ final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
+ (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);
+
+ if (canOverscroll && overScrollBy(deltaX, 0, mScrollX, 0, range, 0,
mOverscrollDistance, 0, true)) {
// Break our velocity if we hit a scroll barrier.
mVelocityTracker.clear();
}
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
- final int overscrollMode = getOverScrollMode();
- if (overscrollMode == OVER_SCROLL_ALWAYS ||
- (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+ if (canOverscroll) {
final int pulledToX = oldX + deltaX;
if (pulledToX < 0) {
mEdgeGlowLeft.onPull((float) deltaX / getWidth());
@@ -604,11 +602,15 @@
velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getXVelocity(mActivePointerId);
- if (getChildCount() > 0) {
+ final int right = getScrollRange();
+ final int overscrollMode = getOverScrollMode();
+ final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
+ (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && right > 0);
+
+ if (getChildCount() > 0 && canOverscroll) {
if ((Math.abs(initialVelocity) > mMinimumVelocity)) {
fling(-initialVelocity);
} else {
- final int right = getScrollRange();
if (mScroller.springBack(mScrollX, mScrollY, 0, right, 0, 0)) {
invalidate();
}
@@ -1187,14 +1189,16 @@
int y = mScroller.getCurrY();
if (oldX != x || oldY != y) {
- overScrollBy(x - oldX, y - oldY, oldX, oldY, getScrollRange(), 0,
+ final int range = getScrollRange();
+ final int overscrollMode = getOverScrollMode();
+ final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
+ (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);
+
+ overScrollBy(x - oldX, y - oldY, oldX, oldY, range, 0,
mOverflingDistance, 0, false);
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
- final int range = getScrollRange();
- final int overscrollMode = getOverScrollMode();
- if (overscrollMode == OVER_SCROLL_ALWAYS ||
- (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+ if (canOverscroll) {
if (x < 0 && oldX >= 0) {
mEdgeGlowLeft.onAbsorb((int) mScroller.getCurrVelocity());
} else if (x > range && oldX <= range) {
@@ -1202,6 +1206,7 @@
}
}
}
+
awakenScrollBars();
// Keep on drawing until the animation has finished.
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index b92130d..a5d6c9a 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -212,6 +212,7 @@
@Override
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEvent(event);
CharSequence contentDescription = getContentDescription();
if (!TextUtils.isEmpty(contentDescription)) {
event.getText().add(contentDescription);
diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java
index a2910af..5c97593 100644
--- a/core/java/android/widget/ListPopupWindow.java
+++ b/core/java/android/widget/ListPopupWindow.java
@@ -988,7 +988,6 @@
mDropDownList.setSelector(mDropDownListHighlight);
}
mDropDownList.setAdapter(mAdapter);
- mDropDownList.setVerticalFadingEdgeEnabled(true);
mDropDownList.setOnItemClickListener(mItemClickListener);
mDropDownList.setFocusable(true);
mDropDownList.setFocusableInTouchMode(true);
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 5a97317..42e27b1 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -264,7 +264,7 @@
// in the case of re-adding a header view, or adding one later on,
// we need to notify the observer
- if (mDataSetObserver != null) {
+ if (mAdapter != null && mDataSetObserver != null) {
mDataSetObserver.onChanged();
}
}
@@ -299,7 +299,7 @@
public boolean removeHeaderView(View v) {
if (mHeaderViewInfos.size() > 0) {
boolean result = false;
- if (((HeaderViewListAdapter) mAdapter).removeHeader(v)) {
+ if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeHeader(v)) {
if (mDataSetObserver != null) {
mDataSetObserver.onChanged();
}
@@ -350,7 +350,7 @@
// in the case of re-adding a footer view, or adding one later on,
// we need to notify the observer
- if (mDataSetObserver != null) {
+ if (mAdapter != null && mDataSetObserver != null) {
mDataSetObserver.onChanged();
}
}
@@ -384,7 +384,7 @@
public boolean removeFooterView(View v) {
if (mFooterViewInfos.size() > 0) {
boolean result = false;
- if (((HeaderViewListAdapter) mAdapter).removeFooter(v)) {
+ if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeFooter(v)) {
if (mDataSetObserver != null) {
mDataSetObserver.onChanged();
}
@@ -2074,7 +2074,7 @@
}
private boolean commonKey(int keyCode, int count, KeyEvent event) {
- if (mAdapter == null) {
+ if (mAdapter == null || !mIsAttached) {
return false;
}
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 35e48f2..5345fa4 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -33,7 +33,6 @@
import android.graphics.Rect;
import android.graphics.Paint.Align;
import android.graphics.drawable.Drawable;
-import android.os.SystemClock;
import android.text.InputFilter;
import android.text.InputType;
import android.text.Spanned;
@@ -517,7 +516,10 @@
mInputText = (EditText) findViewById(R.id.numberpicker_input);
mInputText.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
- if (!hasFocus) {
+ if (hasFocus) {
+ mInputText.selectAll();
+ } else {
+ mInputText.setSelection(0, 0);
validateInputTextView(v);
}
}
@@ -687,7 +689,6 @@
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mInputText, 0);
- mInputText.setSelection(0, mInputText.getText().length());
return true;
}
VelocityTracker velocityTracker = mVelocityTracker;
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 6edfd59..12a93ac 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -212,6 +212,11 @@
* Describes how the child views are positioned. Defaults to
* <code>Gravity.LEFT | Gravity.TOP</code>.
*
+ * <p>Note that since RelativeLayout considers the positioning of each child
+ * relative to one another to be significant, setting gravity will affect
+ * the positioning of all children as a single unit within the parent.
+ * This happens after children have been relatively positioned.</p>
+ *
* @param gravity See {@link android.view.Gravity}
*
* @see #setHorizontalGravity(int)
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 6a6bc23..d91eeb2 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -19,11 +19,9 @@
import com.android.internal.R;
import android.content.Context;
-import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
import android.os.StrictMode;
import android.util.AttributeSet;
import android.view.FocusFinder;
@@ -581,16 +579,18 @@
final int oldX = mScrollX;
final int oldY = mScrollY;
final int range = getScrollRange();
- if (overScrollBy(0, deltaY, 0, mScrollY, 0, range,
- 0, mOverscrollDistance, true)) {
+ final int overscrollMode = getOverScrollMode();
+ final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
+ (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);
+
+ if (canOverscroll && overScrollBy(0, deltaY, 0, mScrollY,
+ 0, range, 0, mOverscrollDistance, true)) {
// Break our velocity if we hit a scroll barrier.
mVelocityTracker.clear();
}
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
- final int overscrollMode = getOverScrollMode();
- if (overscrollMode == OVER_SCROLL_ALWAYS ||
- (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+ if (canOverscroll) {
final int pulledToY = oldY + deltaY;
if (pulledToY < 0) {
mEdgeGlowTop.onPull((float) deltaY / getHeight());
@@ -616,11 +616,15 @@
velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId);
- if (getChildCount() > 0) {
+ final int bottom = getScrollRange();
+ final int overscrollMode = getOverScrollMode();
+ final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
+ (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && bottom > 0);
+
+ if (getChildCount() > 0 && canOverscroll) {
if ((Math.abs(initialVelocity) > mMinimumVelocity)) {
fling(-initialVelocity);
} else {
- final int bottom = getScrollRange();
if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, bottom)) {
invalidate();
}
@@ -1193,14 +1197,16 @@
int y = mScroller.getCurrY();
if (oldX != x || oldY != y) {
- overScrollBy(x - oldX, y - oldY, oldX, oldY, 0, getScrollRange(),
+ final int range = getScrollRange();
+ final int overscrollMode = getOverScrollMode();
+ final boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||
+ (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);
+
+ overScrollBy(x - oldX, y - oldY, oldX, oldY, 0, range,
0, mOverflingDistance, false);
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
- final int range = getScrollRange();
- final int overscrollMode = getOverScrollMode();
- if (overscrollMode == OVER_SCROLL_ALWAYS ||
- (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+ if (canOverscroll) {
if (y < 0 && oldY >= 0) {
mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity());
} else if (y > range && oldY <= range) {
@@ -1208,6 +1214,7 @@
}
}
}
+
awakenScrollBars();
// Keep on drawing until the animation has finished.
diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java
index 191c4ca..80bfe99 100644
--- a/core/java/android/widget/TabWidget.java
+++ b/core/java/android/widget/TabWidget.java
@@ -489,6 +489,7 @@
public void sendAccessibilityEventUnchecked(AccessibilityEvent event) {
// this class fires events only when tabs are focused or selected
if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED && isFocused()) {
+ event.recycle();
return;
}
super.sendAccessibilityEventUnchecked(event);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index ebe22cc..58e0edd 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -461,10 +461,6 @@
mMovement = getDefaultMovementMethod();
mTransformation = null;
- TypedArray a =
- context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.TextView, defStyle, 0);
-
int textColorHighlight = 0;
ColorStateList textColor = null;
ColorStateList textColorHint = null;
@@ -474,18 +470,23 @@
int styleIndex = -1;
boolean allCaps = false;
+ final Resources.Theme theme = context.getTheme();
+
/*
* Look the appearance up without checking first if it exists because
* almost every TextView has one and it greatly simplifies the logic
* to be able to parse the appearance first and then let specific tags
* for this View override it.
*/
+ TypedArray a = theme.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.TextViewAppearance, defStyle, 0);
TypedArray appearance = null;
- int ap = a.getResourceId(com.android.internal.R.styleable.TextView_textAppearance, -1);
+ int ap = a.getResourceId(
+ com.android.internal.R.styleable.TextViewAppearance_textAppearance, -1);
+ a.recycle();
if (ap != -1) {
- appearance = context.obtainStyledAttributes(ap,
- com.android.internal.R.styleable.
- TextAppearance);
+ appearance = theme.obtainStyledAttributes(
+ ap, com.android.internal.R.styleable.TextAppearance);
}
if (appearance != null) {
int n = appearance.getIndexCount();
@@ -552,6 +553,9 @@
boolean password = false;
int inputType = EditorInfo.TYPE_NULL;
+ a = theme.obtainStyledAttributes(
+ attrs, com.android.internal.R.styleable.TextView, defStyle, 0);
+
int n = a.getIndexCount();
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
@@ -3102,6 +3106,11 @@
text = "";
}
+ // If suggestions are not enabled, remove the suggestion spans from the text
+ if (!isSuggestionsEnabled()) {
+ text = removeSuggestionSpans(text);
+ }
+
if (!mUserSetTextScaleX) mTextPaint.setTextScaleX(1.0f);
if (text instanceof Spanned &&
@@ -3503,6 +3512,10 @@
applySingleLine(singleLine, !isPassword, true);
}
+ if (!isSuggestionsEnabled()) {
+ mText = removeSuggestionSpans(mText);
+ }
+
InputMethodManager imm = InputMethodManager.peekInstance();
if (imm != null) imm.restartInput(this);
}
@@ -3726,19 +3739,19 @@
// instead turning this into the normal enter key codes that an
// app may be expecting.
if (actionCode == EditorInfo.IME_ACTION_NEXT) {
- View v = focusSearch(FOCUS_DOWN);
+ View v = focusSearch(FOCUS_FORWARD);
if (v != null) {
- if (!v.requestFocus(FOCUS_DOWN)) {
+ if (!v.requestFocus(FOCUS_FORWARD)) {
throw new IllegalStateException("focus search returned a view " +
"that wasn't able to take focus!");
}
}
return;
-
+
} else if (actionCode == EditorInfo.IME_ACTION_PREVIOUS) {
- View v = focusSearch(FOCUS_UP);
+ View v = focusSearch(FOCUS_BACKWARD);
if (v != null) {
- if (!v.requestFocus(FOCUS_UP)) {
+ if (!v.requestFocus(FOCUS_BACKWARD)) {
throw new IllegalStateException("focus search returned a view " +
"that wasn't able to take focus!");
}
@@ -3750,10 +3763,11 @@
if (imm != null && imm.isActive(this)) {
imm.hideSoftInputFromWindow(getWindowToken(), 0);
}
+ clearFocus();
return;
}
}
-
+
Handler h = getHandler();
if (h != null) {
long eventTime = SystemClock.uptimeMillis();
@@ -8663,18 +8677,15 @@
}
@Override
- public void findViewsWithText(ArrayList<View> outViews, CharSequence searched) {
- if (TextUtils.isEmpty(searched)) {
- return;
- }
- CharSequence thisText = getText();
- if (TextUtils.isEmpty(thisText)) {
- return;
- }
- String searchedLowerCase = searched.toString().toLowerCase();
- String thisTextLowerCase = thisText.toString().toLowerCase();
- if (thisTextLowerCase.contains(searchedLowerCase)) {
- outViews.add(this);
+ public void findViewsWithText(ArrayList<View> outViews, CharSequence searched, int flags) {
+ super.findViewsWithText(outViews, searched, flags);
+ if (!outViews.contains(this) && (flags & FIND_VIEWS_WITH_TEXT) != 0
+ && !TextUtils.isEmpty(searched) && !TextUtils.isEmpty(mText)) {
+ String searchedLowerCase = searched.toString().toLowerCase();
+ String textLowerCase = mText.toString().toLowerCase();
+ if (textLowerCase.contains(searchedLowerCase)) {
+ outViews.add(this);
+ }
}
}
@@ -8928,14 +8939,8 @@
final boolean isPassword = hasPasswordTransformationMethod();
if (!isPassword) {
- CharSequence text = getText();
+ CharSequence text = getTextForAccessibility();
if (TextUtils.isEmpty(text)) {
- text = getHint();
- }
- if (TextUtils.isEmpty(text)) {
- text = getContentDescription();
- }
- if (!TextUtils.isEmpty(text)) {
event.getText().add(text);
}
}
@@ -8961,7 +8966,7 @@
final boolean isPassword = hasPasswordTransformationMethod();
if (!isPassword) {
- info.setText(getText());
+ info.setText(getTextForAccessibility());
}
info.setPassword(isPassword);
}
@@ -8977,6 +8982,20 @@
super.sendAccessibilityEvent(eventType);
}
+ /**
+ * Gets the text reported for accessibility purposes. It is the
+ * text if not empty or the hint.
+ *
+ * @return The accessibility text.
+ */
+ private CharSequence getTextForAccessibility() {
+ CharSequence text = getText();
+ if (TextUtils.isEmpty(text)) {
+ text = getHint();
+ }
+ return text;
+ }
+
void sendAccessibilityEventTypeViewTextChanged(CharSequence beforeText,
int fromIndex, int removedCount, int addedCount) {
AccessibilityEvent event =
@@ -9546,6 +9565,9 @@
private int mNumberOfSuggestions;
private boolean mCursorWasVisibleBeforeSuggestions;
private SuggestionAdapter mSuggestionsAdapter;
+ private final Comparator<SuggestionSpan> mSuggestionSpanComparator;
+ private final HashMap<SuggestionSpan, Integer> mSpansLengths;
+
private class CustomPopupWindow extends PopupWindow {
public CustomPopupWindow(Context context, int defStyle) {
@@ -9558,8 +9580,8 @@
TextView.this.getPositionListener().removeSubscriber(SuggestionsPopupWindow.this);
- if ((mText instanceof Editable) && mSuggestionRangeSpan != null) {
- ((Editable) mText).removeSpan(mSuggestionRangeSpan);
+ if ((mText instanceof Spannable)) {
+ ((Spannable) mText).removeSpan(mSuggestionRangeSpan);
}
setCursorVisible(mCursorWasVisibleBeforeSuggestions);
@@ -9571,6 +9593,8 @@
public SuggestionsPopupWindow() {
mCursorWasVisibleBeforeSuggestions = mCursorVisible;
+ mSuggestionSpanComparator = new SuggestionSpanComparator();
+ mSpansLengths = new HashMap<SuggestionSpan, Integer>();
}
@Override
@@ -9598,10 +9622,9 @@
}
private class SuggestionInfo {
- int suggestionStart, suggestionEnd; // range of suggestion item with replacement text
- int spanStart, spanEnd; // range in TextView where text should be inserted
+ int suggestionStart, suggestionEnd; // range of actual suggestion within text
SuggestionSpan suggestionSpan; // the SuggestionSpan that this TextView represents
- int suggestionIndex; // the index of the suggestion inside suggestionSpan
+ int suggestionIndex; // the index of this suggestion inside suggestionSpan
SpannableStringBuilder text = new SpannableStringBuilder();
TextAppearanceSpan highlightSpan = new TextAppearanceSpan(mContext,
android.R.style.TextAppearance_SuggestionHighlight);
@@ -9649,6 +9672,26 @@
}
}
+ private class SuggestionSpanComparator implements Comparator<SuggestionSpan> {
+ public int compare(SuggestionSpan span1, SuggestionSpan span2) {
+ final int flag1 = span1.getFlags();
+ final int flag2 = span2.getFlags();
+ if (flag1 != flag2) {
+ // The order here should match what is used in updateDrawState
+ final boolean easy1 = (flag1 & SuggestionSpan.FLAG_EASY_CORRECT) != 0;
+ final boolean easy2 = (flag2 & SuggestionSpan.FLAG_EASY_CORRECT) != 0;
+ final boolean misspelled1 = (flag1 & SuggestionSpan.FLAG_MISSPELLED) != 0;
+ final boolean misspelled2 = (flag2 & SuggestionSpan.FLAG_MISSPELLED) != 0;
+ if (easy1 && !misspelled1) return -1;
+ if (easy2 && !misspelled2) return 1;
+ if (misspelled1) return -1;
+ if (misspelled2) return 1;
+ }
+
+ return mSpansLengths.get(span1).intValue() - mSpansLengths.get(span2).intValue();
+ }
+ }
+
/**
* Returns the suggestion spans that cover the current cursor position. The suggestion
* spans are sorted according to the length of text that they are attached to.
@@ -9658,24 +9701,16 @@
Spannable spannable = (Spannable) TextView.this.mText;
SuggestionSpan[] suggestionSpans = spannable.getSpans(pos, pos, SuggestionSpan.class);
- // Cache the span length for performance reason.
- final HashMap<SuggestionSpan, Integer> spansLengths =
- new HashMap<SuggestionSpan, Integer>();
-
+ mSpansLengths.clear();
for (SuggestionSpan suggestionSpan : suggestionSpans) {
int start = spannable.getSpanStart(suggestionSpan);
int end = spannable.getSpanEnd(suggestionSpan);
- spansLengths.put(suggestionSpan, Integer.valueOf(end - start));
+ mSpansLengths.put(suggestionSpan, Integer.valueOf(end - start));
}
- // The suggestions are sorted according to the lenght of the text that they cover
- // (shorter first)
- Arrays.sort(suggestionSpans, new Comparator<SuggestionSpan>() {
- public int compare(SuggestionSpan span1, SuggestionSpan span2) {
- return spansLengths.get(span1).intValue() - spansLengths.get(span2).intValue();
- }
- });
-
+ // The suggestions are sorted according to their types (easy correction first, then
+ // misspelled) and to the length of the text that they cover (shorter first).
+ Arrays.sort(suggestionSpans, mSuggestionSpanComparator);
return suggestionSpans;
}
@@ -9743,7 +9778,7 @@
}
private boolean updateSuggestions() {
- Spannable spannable = (Spannable)TextView.this.mText;
+ Spannable spannable = (Spannable) TextView.this.mText;
SuggestionSpan[] suggestionSpans = getSuggestionSpans();
final int nbSpans = suggestionSpans.length;
@@ -9753,6 +9788,7 @@
int spanUnionEnd = 0;
SuggestionSpan misspelledSpan = null;
+ int underlineColor = 0;
for (int spanIndex = 0; spanIndex < nbSpans; spanIndex++) {
SuggestionSpan suggestionSpan = suggestionSpans[spanIndex];
@@ -9765,12 +9801,13 @@
misspelledSpan = suggestionSpan;
}
+ // The first span dictates the background color of the highlighted text
+ if (spanIndex == 0) underlineColor = suggestionSpan.getUnderlineColor();
+
String[] suggestions = suggestionSpan.getSuggestions();
int nbSuggestions = suggestions.length;
for (int suggestionIndex = 0; suggestionIndex < nbSuggestions; suggestionIndex++) {
SuggestionInfo suggestionInfo = mSuggestionInfos[mNumberOfSuggestions];
- suggestionInfo.spanStart = spanStart;
- suggestionInfo.spanEnd = spanEnd;
suggestionInfo.suggestionSpan = suggestionSpan;
suggestionInfo.suggestionIndex = suggestionIndex;
suggestionInfo.text.replace(0, suggestionInfo.text.length(),
@@ -9794,8 +9831,6 @@
final int misspelledEnd = spannable.getSpanEnd(misspelledSpan);
if (misspelledStart >= 0 && misspelledEnd > misspelledStart) {
SuggestionInfo suggestionInfo = mSuggestionInfos[mNumberOfSuggestions];
- suggestionInfo.spanStart = misspelledStart;
- suggestionInfo.spanEnd = misspelledEnd;
suggestionInfo.suggestionSpan = misspelledSpan;
suggestionInfo.suggestionIndex = -1;
suggestionInfo.text.replace(0, suggestionInfo.text.length(),
@@ -9807,9 +9842,17 @@
if (mNumberOfSuggestions == 0) return false;
- if (mSuggestionRangeSpan == null) mSuggestionRangeSpan =
- new SuggestionRangeSpan(mHighlightColor);
- ((Editable) mText).setSpan(mSuggestionRangeSpan, spanUnionStart, spanUnionEnd,
+ if (mSuggestionRangeSpan == null) mSuggestionRangeSpan = new SuggestionRangeSpan();
+ if (underlineColor == 0) {
+ // Fallback on the default highlight color when the first span does not provide one
+ mSuggestionRangeSpan.setBackgroundColor(mHighlightColor);
+ } else {
+ final float BACKGROUND_TRANSPARENCY = 0.3f;
+ final int newAlpha = (int) (Color.alpha(underlineColor) * BACKGROUND_TRANSPARENCY);
+ mSuggestionRangeSpan.setBackgroundColor(
+ (underlineColor & 0x00FFFFFF) + (newAlpha << 24));
+ }
+ spannable.setSpan(mSuggestionRangeSpan, spanUnionStart, spanUnionEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mSuggestionsAdapter.notifyDataSetChanged();
@@ -9819,8 +9862,9 @@
private void highlightTextDifferences(SuggestionInfo suggestionInfo, int unionStart,
int unionEnd) {
- final int spanStart = suggestionInfo.spanStart;
- final int spanEnd = suggestionInfo.spanEnd;
+ final Spannable text = (Spannable) mText;
+ final int spanStart = text.getSpanStart(suggestionInfo.suggestionSpan);
+ final int spanEnd = text.getSpanEnd(suggestionInfo.suggestionSpan);
// Adjust the start/end of the suggestion span
suggestionInfo.suggestionStart = spanStart - unionStart;
@@ -9840,10 +9884,11 @@
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (view instanceof TextView) {
TextView textView = (TextView) view;
+ Editable editable = (Editable) mText;
SuggestionInfo suggestionInfo = mSuggestionInfos[position];
- final int spanStart = suggestionInfo.spanStart;
- final int spanEnd = suggestionInfo.spanEnd;
+ final int spanStart = editable.getSpanStart(suggestionInfo.suggestionSpan);
+ final int spanEnd = editable.getSpanEnd(suggestionInfo.suggestionSpan);
final String originalText = mText.subSequence(spanStart, spanEnd).toString();
if (suggestionInfo.suggestionIndex < 0) {
@@ -9854,7 +9899,6 @@
suggestionInfo.removeMisspelledFlag();
} else {
// SuggestionSpans are removed by replace: save them before
- Editable editable = (Editable) mText;
SuggestionSpan[] suggestionSpans = editable.getSpans(spanStart, spanEnd,
SuggestionSpan.class);
final int length = suggestionSpans.length;
@@ -9901,15 +9945,37 @@
suggestionSpansFlags[i]);
}
}
+
+ // Move cursor at the end of the replacement word
+ Selection.setSelection(editable, spanEnd + lengthDifference);
}
}
hide();
}
}
- void showSuggestions() {
- if (!isSuggestionsEnabled() || !isTextEditable()) return;
+ /**
+ * Removes the suggestion spans.
+ */
+ CharSequence removeSuggestionSpans(CharSequence text) {
+ if (text instanceof Spanned) {
+ Spannable spannable;
+ if (text instanceof Spannable) {
+ spannable = (Spannable) text;
+ } else {
+ spannable = new SpannableString(text);
+ text = spannable;
+ }
+ SuggestionSpan[] spans = spannable.getSpans(0, text.length(), SuggestionSpan.class);
+ for (int i = 0; i < spans.length; i++) {
+ spannable.removeSpan(spans[i]);
+ }
+ }
+ return text;
+ }
+
+ void showSuggestions() {
if (mSuggestionsPopupWindow == null) {
mSuggestionsPopupWindow = new SuggestionsPopupWindow();
}
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index 2350229..7444d46 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -16,8 +16,6 @@
package android.widget;
-import com.android.internal.R;
-
import android.annotation.Widget;
import android.content.Context;
import android.content.res.Configuration;
@@ -30,8 +28,11 @@
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.view.inputmethod.EditorInfo;
import android.widget.NumberPicker.OnValueChangeListener;
+import com.android.internal.R;
+
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.Locale;
@@ -149,6 +150,8 @@
onTimeChanged();
}
});
+ EditText hourInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
+ hourInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
// divider (only for the new widget style)
mDivider = (TextView) findViewById(R.id.divider);
@@ -184,6 +187,8 @@
onTimeChanged();
}
});
+ EditText minuteInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
+ minuteInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
/* Get the localized am/pm strings and use them in the spinner */
mAmPmStrings = new DateFormatSymbols().getAmPmStrings();
@@ -213,6 +218,8 @@
updateAmPmControl();
}
});
+ EditText amPmInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
+ amPmInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
}
// update controls to initial state
@@ -512,9 +519,11 @@
text = mContext.getString(R.string.time_picker_decrement_hour_button);
mHourSpinner.findViewById(R.id.decrement).setContentDescription(text);
// AM/PM
- text = mContext.getString(R.string.time_picker_increment_set_pm_button);
- mAmPmSpinner.findViewById(R.id.increment).setContentDescription(text);
- text = mContext.getString(R.string.time_picker_decrement_set_am_button);
- mAmPmSpinner.findViewById(R.id.decrement).setContentDescription(text);
+ if (mAmPmSpinner != null) {
+ text = mContext.getString(R.string.time_picker_increment_set_pm_button);
+ mAmPmSpinner.findViewById(R.id.increment).setContentDescription(text);
+ text = mContext.getString(R.string.time_picker_decrement_set_am_button);
+ mAmPmSpinner.findViewById(R.id.decrement).setContentDescription(text);
+ }
}
}
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index ccca22e..afb5bf1 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -48,6 +48,7 @@
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.SpinnerAdapter;
import java.lang.ref.WeakReference;
@@ -397,6 +398,7 @@
// TODO animate this
mSplitView.setVisibility(View.VISIBLE);
}
+ mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
mActionMode = mode;
return mode;
}
@@ -681,6 +683,7 @@
// Clear out the context mode views after the animation finishes
mContextView.closeMode();
+ mActionView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
mActionMode = null;
diff --git a/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java b/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java
index 4773ce4..3905c88 100644
--- a/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java
+++ b/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java
@@ -152,7 +152,8 @@
Environment.getExternalStorageDirectory().toString() :
mStorageVolume.getPath();
try {
- mountService.unmountVolume(extStoragePath, true);
+ // Remove encryption mapping if this is an unmount for a factory reset.
+ mountService.unmountVolume(extStoragePath, true, mFactoryReset);
} catch (RemoteException e) {
Log.w(TAG, "Failed talking with mount service", e);
}
diff --git a/core/java/com/android/internal/view/StandaloneActionMode.java b/core/java/com/android/internal/view/StandaloneActionMode.java
index b54daba..ecda47e 100644
--- a/core/java/com/android/internal/view/StandaloneActionMode.java
+++ b/core/java/com/android/internal/view/StandaloneActionMode.java
@@ -26,6 +26,7 @@
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
import java.lang.ref.WeakReference;
@@ -86,6 +87,7 @@
}
mFinished = true;
+ mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
mCallback.onDestroyActionMode(this);
}
diff --git a/core/java/com/android/internal/view/menu/ListMenuPresenter.java b/core/java/com/android/internal/view/menu/ListMenuPresenter.java
index e6538b0..0141427 100644
--- a/core/java/com/android/internal/view/menu/ListMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/ListMenuPresenter.java
@@ -62,6 +62,7 @@
public ListMenuPresenter(Context context, int itemLayoutRes) {
this(itemLayoutRes, 0);
mContext = context;
+ mInflater = LayoutInflater.from(mContext);
}
/**
@@ -78,10 +79,13 @@
public void initForMenu(Context context, MenuBuilder menu) {
if (mThemeRes != 0) {
mContext = new ContextThemeWrapper(context, mThemeRes);
+ mInflater = LayoutInflater.from(mContext);
} else if (mContext != null) {
mContext = context;
+ if (mInflater == null) {
+ mInflater = LayoutInflater.from(mContext);
+ }
}
- mInflater = LayoutInflater.from(mContext);
mMenu = menu;
}
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index a631380..7bc33c7 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -34,6 +34,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -455,4 +456,17 @@
public boolean shouldDelayChildPressedState() {
return false;
}
+
+ @Override
+ public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
+ // Action mode started
+ event.setSource(this);
+ event.setClassName(getClass().getName());
+ event.setPackageName(getContext().getPackageName());
+ event.setContentDescription(mTitle);
+ } else {
+ super.onInitializeAccessibilityEvent(event);
+ }
+ }
}
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 7434df3a..bbecb6c 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -268,8 +268,10 @@
if (mTabScrollView != null && mIncludeTabs) {
ViewGroup.LayoutParams lp = mTabScrollView.getLayoutParams();
- lp.width = LayoutParams.WRAP_CONTENT;
- lp.height = LayoutParams.MATCH_PARENT;
+ if (lp != null) {
+ lp.width = LayoutParams.WRAP_CONTENT;
+ lp.height = LayoutParams.MATCH_PARENT;
+ }
mTabScrollView.setAllowCollapse(true);
}
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 4d828c4..76550cf 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -756,24 +756,36 @@
}
/**
- * @return Whether the lock password is enabled.
+ * @return Whether the lock password is enabled, or if it is set as a backup for biometric weak
*/
public boolean isLockPasswordEnabled() {
long mode = getLong(PASSWORD_TYPE_KEY, 0);
- return savedPasswordExists() &&
- (mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX);
+ long backupMode = getLong(PASSWORD_TYPE_ALTERNATE_KEY, 0);
+ final boolean passwordEnabled = mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
+ || mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
+ || mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
+ || mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
+ final boolean backupEnabled = backupMode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
+ || backupMode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
+ || backupMode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
+ || backupMode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
+
+ return savedPasswordExists() && (passwordEnabled ||
+ (isBiometricEnabled() && backupEnabled));
}
/**
- * @return Whether the lock pattern is enabled.
+ * @return Whether the lock pattern is enabled, or if it is set as a backup for biometric weak
*/
public boolean isLockPatternEnabled() {
+ final boolean backupEnabled =
+ getLong(PASSWORD_TYPE_ALTERNATE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING)
+ == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+
return getBoolean(Settings.Secure.LOCK_PATTERN_ENABLED)
- && getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING)
- == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+ && (getLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING)
+ == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING ||
+ (isBiometricEnabled() && backupEnabled));
}
/**
@@ -923,8 +935,7 @@
|| mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
|| mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
final boolean secure = isPattern && isLockPatternEnabled() && savedPatternExists()
- || isPassword && savedPasswordExists()
- || usingBiometricWeak() && isBiometricEnabled();
+ || isPassword && savedPasswordExists();
return secure;
}
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
index 158291b..9a0ce3a 100644
--- a/core/java/com/android/internal/widget/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -51,7 +51,10 @@
// Most recent velocity.
private float mXVelocity;
private float mYVelocity;
-
+
+ // Position estimator.
+ private VelocityTracker.Estimator mEstimator = new VelocityTracker.Estimator();
+
public void clearTrace() {
mTraceCount = 0;
}
@@ -75,6 +78,10 @@
}
}
+ private final int ESTIMATE_PAST_POINTS = 4;
+ private final int ESTIMATE_FUTURE_POINTS = 2;
+ private final float ESTIMATE_INTERVAL = 0.02f;
+
private final ViewConfiguration mVC;
private final Paint mTextPaint;
private final Paint mTextBackgroundPaint;
@@ -278,8 +285,20 @@
haveLast = true;
}
- // Draw velocity vector.
if (drawn) {
+ // Draw movement estimate curve.
+ mPaint.setARGB(128, 128, 0, 128);
+ float lx = ps.mEstimator.estimateX(-ESTIMATE_PAST_POINTS * ESTIMATE_INTERVAL);
+ float ly = ps.mEstimator.estimateY(-ESTIMATE_PAST_POINTS * ESTIMATE_INTERVAL);
+ for (int i = -ESTIMATE_PAST_POINTS + 1; i <= ESTIMATE_FUTURE_POINTS; i++) {
+ float x = ps.mEstimator.estimateX(i * ESTIMATE_INTERVAL);
+ float y = ps.mEstimator.estimateY(i * ESTIMATE_INTERVAL);
+ canvas.drawLine(lx, ly, x, y, mPaint);
+ lx = x;
+ ly = y;
+ }
+
+ // Draw velocity vector.
mPaint.setARGB(255, 255, 64, 128);
float xVel = ps.mXVelocity * (1000 / 60);
float yVel = ps.mYVelocity * (1000 / 60);
@@ -517,6 +536,7 @@
ps.addTrace(coords.x, coords.y);
ps.mXVelocity = mVelocity.getXVelocity(id);
ps.mYVelocity = mVelocity.getYVelocity(id);
+ mVelocity.getEstimator(id, -1, -1, ps.mEstimator);
ps.mToolType = event.getToolType(i);
}
}
diff --git a/core/java/com/android/server/NetworkManagementSocketTagger.java b/core/java/com/android/server/NetworkManagementSocketTagger.java
index 9f6ab31..8445ad1 100644
--- a/core/java/com/android/server/NetworkManagementSocketTagger.java
+++ b/core/java/com/android/server/NetworkManagementSocketTagger.java
@@ -75,30 +75,20 @@
Log.d(TAG, "tagSocket(" + fd.getInt$() + ") with statsTag=0x"
+ Integer.toHexString(options.statsTag) + ", statsUid=" + options.statsUid);
}
- try {
- // TODO: skip tagging when options would be no-op
- tagSocketFd(fd, options.statsTag, options.statsUid);
- } catch (IOException e) {
- throw new SocketException("Problem tagging socket", e);
- }
+ // TODO: skip tagging when options would be no-op
+ tagSocketFd(fd, options.statsTag, options.statsUid);
}
- private void tagSocketFd(FileDescriptor fd, int tag, int uid) throws IOException {
- final int fdNum = fd.getInt$();
- if (fdNum == -1 || (tag == -1 && uid == -1)) return;
+ private void tagSocketFd(FileDescriptor fd, int tag, int uid) {
+ int errno;
+ if (tag == -1 && uid == -1) return;
- String cmd = "t " + fdNum;
- if (tag == -1) {
- // Case where just the uid needs adjusting. But probably the caller
- // will want to track his own name here, just in case.
- cmd += " 0";
- } else {
- cmd += " " + tagToKernel(tag);
+ errno = native_tagSocketFd(fd, tag, uid);
+ if (errno < 0) {
+ Log.i(TAG, "tagSocketFd(" + fd.getInt$() + ", "
+ + tag + ", " +
+ + uid + ") failed with errno" + errno);
}
- if (uid != -1) {
- cmd += " " + uid;
- }
- internalModuleCtrl(cmd);
}
@Override
@@ -106,19 +96,18 @@
if (LOGD) {
Log.i(TAG, "untagSocket(" + fd.getInt$() + ")");
}
- try {
- unTagSocketFd(fd);
- } catch (IOException e) {
- throw new SocketException("Problem untagging socket", e);
- }
+ unTagSocketFd(fd);
}
- private void unTagSocketFd(FileDescriptor fd) throws IOException {
- int fdNum = fd.getInt$();
+ private void unTagSocketFd(FileDescriptor fd) {
final SocketTags options = threadSocketTags.get();
- if (fdNum == -1 || (options.statsTag == -1 && options.statsUid == -1)) return;
- String cmd = "u " + fdNum;
- internalModuleCtrl(cmd);
+ int errno;
+ if (options.statsTag == -1 && options.statsUid == -1) return;
+
+ errno = native_untagSocketFd(fd);
+ if (errno < 0) {
+ Log.w(TAG, "untagSocket(" + fd.getInt$() + ") failed with errno " + errno);
+ }
}
public static class SocketTags {
@@ -127,69 +116,20 @@
}
public static void setKernelCounterSet(int uid, int counterSet) {
- final StringBuilder command = new StringBuilder();
- command.append("s ").append(counterSet).append(" ").append(uid);
- try {
- internalModuleCtrl(command.toString());
- } catch (IOException e) {
- Slog.w(TAG, "problem changing counter set for uid " + uid + " : " + e);
+ int errno = native_setCounterSet(counterSet, uid);
+ if (errno < 0) {
+ Log.w(TAG, "setKernelCountSet(" + uid + ", " + counterSet + ") failed with errno " + errno);
}
}
public static void resetKernelUidStats(int uid) {
- final StringBuilder command = new StringBuilder();
- command.append("d 0 ").append(uid);
- try {
- internalModuleCtrl(command.toString());
- } catch (IOException e) {
- Slog.w(TAG, "problem clearing counters for uid " + uid + " : " + e);
+ int errno = native_deleteTagData(0, uid);
+ if (errno < 0) {
+ Slog.w(TAG, "problem clearing counters for uid " + uid + " : errno " + errno);
}
}
/**
- * Sends commands to the kernel netfilter module.
- *
- * @param cmd command string for the qtaguid netfilter module. May not be null.
- * <p>Supports:
- * <ul><li>tag a socket:<br>
- * <code>t <i>sock_fd</i> <i>acct_tag</i> [<i>uid_in_case_caller_is_acting_on_behalf_of</i>]</code><br>
- * <code>*_tag</code> defaults to default_policy_tag_from_uid(uid_of_caller)<br>
- * <code>acct_tag</code> is either 0 or greater that 2^32.<br>
- * <code>uid_*</code> is only settable by privileged UIDs (DownloadManager,...)
- * </li>
- * <li>untag a socket, preserving counters:<br>
- * <code>u <i>sock_fd</i></code>
- * </li></ul>
- * <p>Notes:<br>
- * <ul><li><i>sock_fd</i> is withing the callers process space.</li>
- * <li><i>*_tag</i> are 64bit values</li></ul>
- *
- */
- private static void internalModuleCtrl(String cmd) throws IOException {
- if (!SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) return;
-
- // TODO: migrate to native library for tagging commands
- FileOutputStream procOut = null;
- try {
- procOut = new FileOutputStream("/proc/net/xt_qtaguid/ctrl");
- procOut.write(cmd.getBytes(Charsets.US_ASCII));
- } finally {
- IoUtils.closeQuietly(procOut);
- }
- }
-
- /**
- * Convert {@link Integer} tag to {@code /proc/} format. Assumes unsigned
- * base-10 format like {@code 2147483647}. Currently strips signed bit to
- * avoid using {@link BigInteger}.
- */
- public static String tagToKernel(int tag) {
- // TODO: eventually write in hex, since that's what proc exports
- // TODO: migrate to direct integer instead of odd shifting
- return Long.toString((((long) tag) << 32) & 0x7FFFFFFF00000000L);
- }
-
- /**
* Convert {@code /proc/} tag format to {@link Integer}. Assumes incoming
* format like {@code 0x7fffffff00000000}.
*/
@@ -197,4 +137,9 @@
// TODO: migrate to direct integer instead of odd shifting
return (int) (Long.decode(string) >> 32);
}
+
+ private static native int native_tagSocketFd(FileDescriptor fd, int tag, int uid);
+ private static native int native_untagSocketFd(FileDescriptor fd);
+ private static native int native_setCounterSet(int uid, int counterSetNum);
+ private static native int native_deleteTagData(int tag, int uid);
}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index aece5f0..59a03e7 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -143,6 +143,7 @@
android_server_BluetoothService.cpp \
android_server_BluetoothEventLoop.cpp \
android_server_BluetoothA2dpService.cpp \
+ android_server_NetworkManagementSocketTagger.cpp \
android_server_Watchdog.cpp \
android_ddm_DdmHandleNativeHeap.cpp \
com_android_internal_os_ZygoteInit.cpp \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index dd7dd86..12ec1b6 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -155,6 +155,7 @@
extern int register_android_server_BluetoothService(JNIEnv* env);
extern int register_android_server_BluetoothEventLoop(JNIEnv *env);
extern int register_android_server_BluetoothA2dpService(JNIEnv* env);
+extern int register_android_server_NetworkManagementSocketTagger(JNIEnv* env);
extern int register_android_server_Watchdog(JNIEnv* env);
extern int register_android_ddm_DdmHandleNativeHeap(JNIEnv *env);
extern int register_com_android_internal_os_ZygoteInit(JNIEnv* env);
@@ -1178,6 +1179,7 @@
REG_JNI(register_android_server_BluetoothService),
REG_JNI(register_android_server_BluetoothEventLoop),
REG_JNI(register_android_server_BluetoothA2dpService),
+ REG_JNI(register_android_server_NetworkManagementSocketTagger),
REG_JNI(register_android_server_Watchdog),
REG_JNI(register_android_ddm_DdmHandleNativeHeap),
REG_JNI(register_android_backup_BackupDataInput),
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 423eff4..7d222f6 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -366,26 +366,22 @@
NPE_CHECK_RETURN_ZERO(env, jpaint);
NPE_CHECK_RETURN_ZERO(env, text);
+ size_t textLength = env->GetStringLength(text);
int count = end - start;
- if ((start | count) < 0) {
+ if ((start | count) < 0 || (size_t)end > textLength) {
doThrowAIOOBE(env);
return 0;
}
if (count == 0) {
return 0;
}
- size_t textLength = env->GetStringLength(text);
- if ((size_t)count > textLength) {
- doThrowAIOOBE(env);
- return 0;
- }
const jchar* textArray = env->GetStringChars(text, NULL);
SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint);
jfloat width = 0;
#if RTL_USE_HARFBUZZ
- TextLayout::getTextRunAdvances(paint, textArray, start, count, end,
+ TextLayout::getTextRunAdvances(paint, textArray, start, count, textLength,
paint->getFlags(), NULL /* dont need all advances */, width);
#else
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index 7f79277..d04e059 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -163,20 +163,20 @@
// Update timing information for statistics
value->setElapsedTime(endTime - startTime);
- LOGD("CACHE MISS: Added entry for text='%s' with start=%d, count=%d, "
+ LOGD("CACHE MISS: Added entry with start=%d, count=%d, "
"contextCount=%d, entry size %d bytes, remaining space %d bytes"
- " - Compute time in nanos: %d",
- String8(text, contextCount).string(), start, count, contextCount,
- size, mMaxSize - mSize, value->getElapsedTime());
+ " - Compute time in nanos: %d - Text='%s' ",
+ start, count, contextCount, size, mMaxSize - mSize, value->getElapsedTime(),
+ String8(text, contextCount).string());
}
} else {
if (mDebugEnabled) {
LOGD("CACHE MISS: Calculated but not storing entry because it is too big "
- "for text='%s' with start=%d, count=%d, contextCount=%d, "
+ "with start=%d, count=%d, contextCount=%d, "
"entry size %d bytes, remaining space %d bytes"
- " - Compute time in nanos: %lld",
- String8(text, contextCount).string(), start, count, contextCount,
- size, mMaxSize - mSize, endTime);
+ " - Compute time in nanos: %lld - Text='%s'",
+ start, count, contextCount, size, mMaxSize - mSize, endTime,
+ String8(text, contextCount).string());
}
value.clear();
}
@@ -190,12 +190,12 @@
if (value->getElapsedTime() > 0) {
float deltaPercent = 100 * ((value->getElapsedTime() - elapsedTimeThruCacheGet)
/ ((float)value->getElapsedTime()));
- LOGD("CACHE HIT #%d for text='%s' with start=%d, count=%d, contextCount=%d "
+ LOGD("CACHE HIT #%d with start=%d, count=%d, contextCount=%d "
"- Compute time in nanos: %d - "
- "Cache get time in nanos: %lld - Gain in percent: %2.2f",
- mCacheHitCount, String8(text, contextCount).string(), start, count,
- contextCount,
- value->getElapsedTime(), elapsedTimeThruCacheGet, deltaPercent);
+ "Cache get time in nanos: %lld - Gain in percent: %2.2f - Text='%s' ",
+ mCacheHitCount, start, count, contextCount,
+ value->getElapsedTime(), elapsedTimeThruCacheGet, deltaPercent,
+ String8(text, contextCount).string());
}
if (mCacheHitCount % DEFAULT_DUMP_STATS_CACHE_HIT_INTERVAL == 0) {
dumpCacheStats();
diff --git a/core/jni/android_bluetooth_common.h b/core/jni/android_bluetooth_common.h
index 2f5fd5a..1f4da3a 100644
--- a/core/jni/android_bluetooth_common.h
+++ b/core/jni/android_bluetooth_common.h
@@ -202,6 +202,13 @@
#define INPUT_OPERATION_GENERIC_FAILURE 5003
#define INPUT_OPERATION_SUCCESS 5004
+#define HEALTH_OPERATION_SUCCESS 6000
+#define HEALTH_OPERATION_ERROR 6001
+#define HEALTH_OPERATION_INVALID_ARGS 6002
+#define HEALTH_OPERATION_GENERIC_FAILURE 6003
+#define HEALTH_OPERATION_NOT_FOUND 6004
+#define HEALTH_OPERATION_NOT_ALLOWED 6005
+
#endif
} /* namespace android */
diff --git a/core/jni/android_server_BluetoothEventLoop.cpp b/core/jni/android_server_BluetoothEventLoop.cpp
index eee256a..e8933fe 100644
--- a/core/jni/android_server_BluetoothEventLoop.cpp
+++ b/core/jni/android_server_BluetoothEventLoop.cpp
@@ -74,6 +74,7 @@
static jmethodID method_onPanDeviceConnectionResult;
static jmethodID method_onHealthDevicePropertyChanged;
static jmethodID method_onHealthDeviceChannelChanged;
+static jmethodID method_onHealthDeviceConnectionResult;
typedef event_loop_native_data_t native_data_t;
@@ -141,6 +142,9 @@
"(Ljava/lang/String;[Ljava/lang/String;)V");
method_onPanDeviceConnectionResult = env->GetMethodID(clazz, "onPanDeviceConnectionResult",
"(Ljava/lang/String;I)V");
+ method_onHealthDeviceConnectionResult = env->GetMethodID(clazz,
+ "onHealthDeviceConnectionResult",
+ "(II)V");
method_onHealthDevicePropertyChanged = env->GetMethodID(clazz, "onHealthDevicePropertyChanged",
"(Ljava/lang/String;[Ljava/lang/String;)V");
method_onHealthDeviceChannelChanged = env->GetMethodID(clazz, "onHealthDeviceChannelChanged",
@@ -1533,6 +1537,39 @@
free(user);
}
+void onHealthDeviceConnectionResult(DBusMessage *msg, void *user, void *n) {
+ LOGV("%s", __FUNCTION__);
+
+ native_data_t *nat = (native_data_t *)n;
+ DBusError err;
+ dbus_error_init(&err);
+ JNIEnv *env;
+ nat->vm->GetEnv((void**)&env, nat->envVer);
+
+ jint result = HEALTH_OPERATION_SUCCESS;
+ if (dbus_set_error_from_message(&err, msg)) {
+ if (!strcmp(err.name, BLUEZ_ERROR_IFC ".InvalidArgs")) {
+ result = HEALTH_OPERATION_INVALID_ARGS;
+ } else if (!strcmp(err.name, BLUEZ_ERROR_IFC ".HealthError")) {
+ result = HEALTH_OPERATION_ERROR;
+ } else if (!strcmp(err.name, BLUEZ_ERROR_IFC ".NotFound")) {
+ result = HEALTH_OPERATION_NOT_FOUND;
+ } else if (!strcmp(err.name, BLUEZ_ERROR_IFC ".NotAllowed")) {
+ result = HEALTH_OPERATION_NOT_ALLOWED;
+ } else {
+ result = HEALTH_OPERATION_GENERIC_FAILURE;
+ }
+ LOG_AND_FREE_DBUS_ERROR(&err);
+ }
+
+ jint code = *(int *) user;
+ LOGV("... Health Device Code = %d, result = %d", code, result);
+ env->CallVoidMethod(nat->me,
+ method_onHealthDeviceConnectionResult,
+ code,
+ result);
+ free(user);
+}
#endif
static JNINativeMethod sMethods[] = {
diff --git a/core/jni/android_server_BluetoothService.cpp b/core/jni/android_server_BluetoothService.cpp
index 292047b..a49c918 100644
--- a/core/jni/android_server_BluetoothService.cpp
+++ b/core/jni/android_server_BluetoothService.cpp
@@ -78,8 +78,8 @@
void onDiscoverServicesResult(DBusMessage *msg, void *user, void *nat);
void onCreateDeviceResult(DBusMessage *msg, void *user, void *nat);
void onInputDeviceConnectionResult(DBusMessage *msg, void *user, void *nat);
-void onConnectPanResult(DBusMessage *msg, void *user, void *n);
void onPanDeviceConnectionResult(DBusMessage *msg, void *user, void *nat);
+void onHealthDeviceConnectionResult(DBusMessage *msg, void *user, void *nat);
/** Get native data stored in the opaque (Java code maintained) pointer mNativeData
@@ -1450,79 +1450,70 @@
}
static jboolean createChannelNative(JNIEnv *env, jobject object,
- jstring devicePath, jstring appPath, jstring config) {
+ jstring devicePath, jstring appPath, jstring config,
+ jint code) {
LOGV("%s", __FUNCTION__);
- jboolean result = JNI_FALSE;
#ifdef HAVE_BLUETOOTH
native_data_t *nat = get_native_data(env, object);
+ jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
+ struct event_loop_native_data_t *eventLoopNat =
+ get_EventLoop_native_data(env, eventLoop);
- if (nat) {
- DBusError err;
- dbus_error_init(&err);
-
+ if (nat && eventLoopNat) {
const char *c_device_path = env->GetStringUTFChars(devicePath, NULL);
const char *c_app_path = env->GetStringUTFChars(appPath, NULL);
const char *c_config = env->GetStringUTFChars(config, NULL);
+ int *data = (int *) malloc(sizeof(int));
+ if (data == NULL) return JNI_FALSE;
- DBusMessage *reply = dbus_func_args(env, nat->conn,
- c_device_path,
- DBUS_HEALTH_DEVICE_IFACE,
- "CreateChannel",
- DBUS_TYPE_OBJECT_PATH, &c_app_path,
- DBUS_TYPE_STRING, &c_config,
- DBUS_TYPE_INVALID);
+ *data = code;
+ bool ret = dbus_func_args_async(env, nat->conn, -1, onHealthDeviceConnectionResult,
+ data, eventLoopNat, c_device_path,
+ DBUS_HEALTH_DEVICE_IFACE, "CreateChannel",
+ DBUS_TYPE_OBJECT_PATH, &c_app_path,
+ DBUS_TYPE_STRING, &c_config,
+ DBUS_TYPE_INVALID);
env->ReleaseStringUTFChars(devicePath, c_device_path);
env->ReleaseStringUTFChars(appPath, c_app_path);
env->ReleaseStringUTFChars(config, c_config);
- if (!reply) {
- if (dbus_error_is_set(&err)) {
- LOG_AND_FREE_DBUS_ERROR(&err);
- }
- } else {
- result = JNI_TRUE;
- }
+ return ret ? JNI_TRUE : JNI_FALSE;
}
#endif
- return result;
+ return JNI_FALSE;
}
static jboolean destroyChannelNative(JNIEnv *env, jobject object, jstring devicePath,
- jstring channelPath) {
+ jstring channelPath, jint code) {
LOGE("%s", __FUNCTION__);
- jboolean result = JNI_FALSE;
#ifdef HAVE_BLUETOOTH
native_data_t *nat = get_native_data(env, object);
+ jobject eventLoop = env->GetObjectField(object, field_mEventLoop);
+ struct event_loop_native_data_t *eventLoopNat =
+ get_EventLoop_native_data(env, eventLoop);
- if (nat) {
- DBusError err;
- dbus_error_init(&err);
-
+ if (nat && eventLoopNat) {
const char *c_device_path = env->GetStringUTFChars(devicePath, NULL);
const char *c_channel_path = env->GetStringUTFChars(channelPath, NULL);
+ int *data = (int *) malloc(sizeof(int));
+ if (data == NULL) return JNI_FALSE;
- DBusMessage *reply = dbus_func_args(env, nat->conn,
- c_device_path,
- DBUS_HEALTH_DEVICE_IFACE,
- "DestroyChannel",
- DBUS_TYPE_OBJECT_PATH, &c_channel_path,
- DBUS_TYPE_INVALID);
+ *data = code;
+ bool ret = dbus_func_args_async(env, nat->conn, -1, onHealthDeviceConnectionResult,
+ data, eventLoopNat, c_device_path,
+ DBUS_HEALTH_DEVICE_IFACE, "DestroyChannel",
+ DBUS_TYPE_OBJECT_PATH, &c_channel_path,
+ DBUS_TYPE_INVALID);
env->ReleaseStringUTFChars(devicePath, c_device_path);
env->ReleaseStringUTFChars(channelPath, c_channel_path);
- if (!reply) {
- if (dbus_error_is_set(&err)) {
- LOG_AND_FREE_DBUS_ERROR(&err);
- }
- } else {
- result = JNI_TRUE;
- }
+ return ret ? JNI_TRUE : JNI_FALSE;
}
#endif
- return result;
+ return JNI_FALSE;
}
static jstring getMainChannelNative(JNIEnv *env, jobject object, jstring devicePath) {
@@ -1755,9 +1746,10 @@
{"unregisterHealthApplicationNative", "(Ljava/lang/String;)Z",
(void *)unregisterHealthApplicationNative},
- {"createChannelNative", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
+ {"createChannelNative", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Z",
(void *)createChannelNative},
- {"destroyChannelNative", "(Ljava/lang/String;Ljava/lang/String;)Z", (void *)destroyChannelNative},
+ {"destroyChannelNative", "(Ljava/lang/String;Ljava/lang/String;I)Z",
+ (void *)destroyChannelNative},
{"getMainChannelNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getMainChannelNative},
{"getChannelApplicationNative", "(Ljava/lang/String;)Ljava/lang/String;",
(void *)getChannelApplicationNative},
diff --git a/core/jni/android_server_NetworkManagementSocketTagger.cpp b/core/jni/android_server_NetworkManagementSocketTagger.cpp
new file mode 100644
index 0000000..c279ced
--- /dev/null
+++ b/core/jni/android_server_NetworkManagementSocketTagger.cpp
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2011, 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.
+ */
+
+#define LOG_TAG "NMST_QTagUidNative"
+#include <utils/Log.h>
+
+#include "JNIHelp.h"
+
+#include "jni.h"
+#include <utils/misc.h>
+#include <cutils/qtaguid.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+namespace android {
+
+static jint QTagUid_tagSocketFd(JNIEnv* env, jclass,
+ jobject fileDescriptor,
+ jint tagNum, jint uid) {
+ int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
+
+ if (env->ExceptionOccurred() != NULL) {
+ LOGE("Can't get FileDescriptor num");
+ return (jint)-1;
+ }
+
+ int res = qtaguid_tagSocket(userFd, tagNum, uid);
+ if (res < 0) {
+ return (jint)-errno;
+ }
+ return (jint)res;
+}
+
+static int QTagUid_untagSocketFd(JNIEnv* env, jclass,
+ jobject fileDescriptor) {
+ int userFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
+
+ if (env->ExceptionOccurred() != NULL) {
+ LOGE("Can't get FileDescriptor num");
+ return (jint)-1;
+ }
+
+ int res = qtaguid_untagSocket(userFd);
+ if (res < 0) {
+ return (jint)-errno;
+ }
+ return (jint)res;
+}
+
+static jint QTagUid_setCounterSet(JNIEnv* env, jclass,
+ jint setNum, jint uid) {
+
+ int res = qtaguid_setCounterSet(setNum, uid);
+ if (res < 0) {
+ return (jint)-errno;
+ }
+ return (jint)res;
+}
+
+static jint QTagUid_deleteTagData(JNIEnv* env, jclass,
+ jint tagNum, jint uid) {
+
+ int res = qtaguid_deleteTagData(tagNum, uid);
+ if (res < 0) {
+ return (jint)-errno;
+ }
+ return (jint)res;
+}
+
+static JNINativeMethod gQTagUidMethods[] = {
+ { "native_tagSocketFd", "(Ljava/io/FileDescriptor;II)I", (void*)QTagUid_tagSocketFd},
+ { "native_untagSocketFd", "(Ljava/io/FileDescriptor;)I", (void*)QTagUid_untagSocketFd},
+ { "native_setCounterSet", "(II)I", (void*)QTagUid_setCounterSet},
+ { "native_deleteTagData", "(II)I", (void*)QTagUid_deleteTagData},
+};
+
+int register_android_server_NetworkManagementSocketTagger(JNIEnv* env) {
+ return jniRegisterNativeMethods(env, "com/android/server/NetworkManagementSocketTagger", gQTagUidMethods, NELEM(gQTagUidMethods));
+}
+
+};
diff --git a/core/jni/android_view_Display.cpp b/core/jni/android_view_Display.cpp
index 5e668b9..366a52e 100644
--- a/core/jni/android_view_Display.cpp
+++ b/core/jni/android_view_Display.cpp
@@ -63,14 +63,14 @@
env->SetFloatField(clazz, offsets.ydpi, info.ydpi);
}
-static jint android_view_Display_getRawWidth(
+static jint android_view_Display_getRawWidthNative(
JNIEnv* env, jobject clazz)
{
DisplayID dpy = env->GetIntField(clazz, offsets.display);
return SurfaceComposerClient::getDisplayWidth(dpy);
}
-static jint android_view_Display_getRawHeight(
+static jint android_view_Display_getRawHeightNative(
JNIEnv* env, jobject clazz)
{
DisplayID dpy = env->GetIntField(clazz, offsets.display);
@@ -103,10 +103,10 @@
(void*)android_view_Display_getDisplayCount },
{ "init", "(I)V",
(void*)android_view_Display_init },
- { "getRawWidth", "()I",
- (void*)android_view_Display_getRawWidth },
- { "getRawHeight", "()I",
- (void*)android_view_Display_getRawHeight },
+ { "getRawWidthNative", "()I",
+ (void*)android_view_Display_getRawWidthNative },
+ { "getRawHeightNative", "()I",
+ (void*)android_view_Display_getRawHeightNative },
{ "getOrientation", "()I",
(void*)android_view_Display_getOrientation }
};
diff --git a/core/jni/android_view_VelocityTracker.cpp b/core/jni/android_view_VelocityTracker.cpp
index 01a4c09..516e421 100644
--- a/core/jni/android_view_VelocityTracker.cpp
+++ b/core/jni/android_view_VelocityTracker.cpp
@@ -29,6 +29,14 @@
// Special constant to request the velocity of the active pointer.
static const int ACTIVE_POINTER_ID = -1;
+static struct {
+ jfieldID xCoeff;
+ jfieldID yCoeff;
+ jfieldID degree;
+ jfieldID confidence;
+} gEstimatorClassInfo;
+
+
// --- VelocityTrackerState ---
class VelocityTrackerState {
@@ -39,6 +47,8 @@
void addMovement(const MotionEvent* event);
void computeCurrentVelocity(int32_t units, float maxVelocity);
void getVelocity(int32_t id, float* outVx, float* outVy);
+ bool getEstimator(int32_t id, uint32_t degree, nsecs_t horizon,
+ VelocityTracker::Estimator* outEstimator);
private:
struct Velocity {
@@ -118,6 +128,11 @@
}
}
+bool VelocityTrackerState::getEstimator(int32_t id, uint32_t degree, nsecs_t horizon,
+ VelocityTracker::Estimator* outEstimator) {
+ return mVelocityTracker.getEstimator(id, degree, horizon, outEstimator);
+}
+
// --- JNI Methods ---
@@ -169,6 +184,30 @@
return vy;
}
+static jboolean android_view_VelocityTracker_nativeGetEstimator(JNIEnv* env, jclass clazz,
+ jint ptr, jint id, jint degree, jint horizonMillis, jobject outEstimatorObj) {
+ VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr);
+ VelocityTracker::Estimator estimator;
+ bool result = state->getEstimator(id,
+ degree < 0 ? VelocityTracker::DEFAULT_DEGREE : uint32_t(degree),
+ horizonMillis < 0 ? VelocityTracker::DEFAULT_HORIZON :
+ nsecs_t(horizonMillis) * 1000000L,
+ &estimator);
+
+ jfloatArray xCoeffObj = jfloatArray(env->GetObjectField(outEstimatorObj,
+ gEstimatorClassInfo.xCoeff));
+ jfloatArray yCoeffObj = jfloatArray(env->GetObjectField(outEstimatorObj,
+ gEstimatorClassInfo.yCoeff));
+
+ env->SetFloatArrayRegion(xCoeffObj, 0, VelocityTracker::Estimator::MAX_DEGREE + 1,
+ estimator.xCoeff);
+ env->SetFloatArrayRegion(yCoeffObj, 0, VelocityTracker::Estimator::MAX_DEGREE + 1,
+ estimator.yCoeff);
+ env->SetIntField(outEstimatorObj, gEstimatorClassInfo.degree, estimator.degree);
+ env->SetFloatField(outEstimatorObj, gEstimatorClassInfo.confidence, estimator.confidence);
+ return result;
+}
+
// --- JNI Registration ---
@@ -195,12 +234,35 @@
{ "nativeGetYVelocity",
"(II)F",
(void*)android_view_VelocityTracker_nativeGetYVelocity },
+ { "nativeGetEstimator",
+ "(IIIILandroid/view/VelocityTracker$Estimator;)Z",
+ (void*)android_view_VelocityTracker_nativeGetEstimator },
};
+#define FIND_CLASS(var, className) \
+ var = env->FindClass(className); \
+ LOG_FATAL_IF(! var, "Unable to find class " className);
+
+#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
+ var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
+ LOG_FATAL_IF(! var, "Unable to find field " fieldName);
+
int register_android_view_VelocityTracker(JNIEnv* env) {
int res = jniRegisterNativeMethods(env, "android/view/VelocityTracker",
gVelocityTrackerMethods, NELEM(gVelocityTrackerMethods));
LOG_FATAL_IF(res < 0, "Unable to register native methods.");
+
+ jclass clazz;
+ FIND_CLASS(clazz, "android/view/VelocityTracker$Estimator");
+
+ GET_FIELD_ID(gEstimatorClassInfo.xCoeff, clazz,
+ "xCoeff", "[F");
+ GET_FIELD_ID(gEstimatorClassInfo.yCoeff, clazz,
+ "yCoeff", "[F");
+ GET_FIELD_ID(gEstimatorClassInfo.degree, clazz,
+ "degree", "I");
+ GET_FIELD_ID(gEstimatorClassInfo.confidence, clazz,
+ "confidence", "F");
return 0;
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 72863a2..80741eb 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -18,7 +18,7 @@
*/
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android" android:sharedUserId="android.uid.system"
+ package="android" coreApp="true" android:sharedUserId="android.uid.system"
android:sharedUserLabel="@string/android_system_label">
<!-- ================================================ -->
@@ -1530,6 +1530,26 @@
android:process=":ui">
</activity>
+ <activity android:name="android.accounts.ChooseTypeAndAccountActivity"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@android:style/Theme.Holo.Dialog"
+ android:label="@string/choose_account_label"
+ android:process=":ui">
+ <intent-filter>
+ <action android:name="android.intent.action.PICK" />
+ <category android:name="android.intent.category.ACCOUNT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="android.accounts.ChooseAccountTypeActivity"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@android:style/Theme.Holo.Dialog"
+ android:label="@string/choose_account_label"
+ android:process=":ui">
+ </activity>
+
<activity android:name="android.accounts.GrantCredentialsPermissionActivity"
android:excludeFromRecents="true"
android:exported="true"
diff --git a/core/res/res/drawable-hdpi/ab_share_pack_holo_dark.9.png b/core/res/res/drawable-hdpi/ab_share_pack_holo_dark.9.png
new file mode 100644
index 0000000..6c14157
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ab_share_pack_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ab_share_pack_holo_light.9.png b/core/res/res/drawable-hdpi/ab_share_pack_holo_light.9.png
new file mode 100644
index 0000000..f4ff16b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ab_share_pack_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_cab_done_default_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_cab_done_default_holo_dark.9.png
index 0d165bb..b0dc31f 100644
--- a/core/res/res/drawable-hdpi/btn_cab_done_default_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/btn_cab_done_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_cab_done_default_holo_light.9.png b/core/res/res/drawable-hdpi/btn_cab_done_default_holo_light.9.png
index 73c7e25..4bc2683 100644
--- a/core/res/res/drawable-hdpi/btn_cab_done_default_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/btn_cab_done_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_cab_done_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_cab_done_focused_holo_dark.9.png
index 1459eee..4af38fb 100644
--- a/core/res/res/drawable-hdpi/btn_cab_done_focused_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/btn_cab_done_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_cab_done_focused_holo_light.9.png b/core/res/res/drawable-hdpi/btn_cab_done_focused_holo_light.9.png
index 04de530..d32f74c 100644
--- a/core/res/res/drawable-hdpi/btn_cab_done_focused_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/btn_cab_done_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_cab_done_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_cab_done_pressed_holo_dark.9.png
index bab70fa..66adffe 100644
--- a/core/res/res/drawable-hdpi/btn_cab_done_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/btn_cab_done_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_cab_done_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/btn_cab_done_pressed_holo_light.9.png
index b46adfa..caeff9c 100644
--- a/core/res/res/drawable-hdpi/btn_cab_done_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/btn_cab_done_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_contact_picture.png b/core/res/res/drawable-hdpi/ic_contact_picture.png
index 9123c8c..2eef7b5 100644
--- a/core/res/res/drawable-hdpi/ic_contact_picture.png
+++ b/core/res/res/drawable-hdpi/ic_contact_picture.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_menu_share_holo_dark.png b/core/res/res/drawable-hdpi/ic_menu_share_holo_dark.png
index db011be..6f747c8 100644
--- a/core/res/res/drawable-hdpi/ic_menu_share_holo_dark.png
+++ b/core/res/res/drawable-hdpi/ic_menu_share_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_menu_share_holo_light.png b/core/res/res/drawable-hdpi/ic_menu_share_holo_light.png
index d9a9a73..682b2fd 100644
--- a/core/res/res/drawable-hdpi/ic_menu_share_holo_light.png
+++ b/core/res/res/drawable-hdpi/ic_menu_share_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/list_divider_holo_dark.9.png b/core/res/res/drawable-hdpi/list_divider_holo_dark.9.png
new file mode 100644
index 0000000..986ab0b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/list_divider_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/list_divider_holo_light.9.png b/core/res/res/drawable-hdpi/list_divider_holo_light.9.png
new file mode 100644
index 0000000..0279e17
--- /dev/null
+++ b/core/res/res/drawable-hdpi/list_divider_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/spinner_pressed_holo_dark.9.png
index dff47c0..a472338 100644
--- a/core/res/res/drawable-hdpi/spinner_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/spinner_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/spinner_pressed_holo_light.9.png
index 8c3d297..ed9f6f6 100644
--- a/core/res/res/drawable-hdpi/spinner_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/spinner_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/sym_def_app_icon.png b/core/res/res/drawable-hdpi/sym_def_app_icon.png
index 075d908..c8a38ed 100644
--- a/core/res/res/drawable-hdpi/sym_def_app_icon.png
+++ b/core/res/res/drawable-hdpi/sym_def_app_icon.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ab_share_pack_holo_dark.9.png b/core/res/res/drawable-mdpi/ab_share_pack_holo_dark.9.png
new file mode 100644
index 0000000..ed4ba34
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ab_share_pack_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ab_share_pack_holo_light.9.png b/core/res/res/drawable-mdpi/ab_share_pack_holo_light.9.png
new file mode 100644
index 0000000..1983c68
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ab_share_pack_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_cab_done_default_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_cab_done_default_holo_dark.9.png
index 9e936b3..5461b9c 100644
--- a/core/res/res/drawable-mdpi/btn_cab_done_default_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/btn_cab_done_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_cab_done_default_holo_light.9.png b/core/res/res/drawable-mdpi/btn_cab_done_default_holo_light.9.png
index 0360104..5dc6f80 100644
--- a/core/res/res/drawable-mdpi/btn_cab_done_default_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/btn_cab_done_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_cab_done_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_cab_done_focused_holo_dark.9.png
index dd947d2..a70b53c 100644
--- a/core/res/res/drawable-mdpi/btn_cab_done_focused_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/btn_cab_done_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_cab_done_focused_holo_light.9.png b/core/res/res/drawable-mdpi/btn_cab_done_focused_holo_light.9.png
index 51cfca2..c7a9896 100644
--- a/core/res/res/drawable-mdpi/btn_cab_done_focused_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/btn_cab_done_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_cab_done_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_cab_done_pressed_holo_dark.9.png
index fd6e6c7..85d7aad 100644
--- a/core/res/res/drawable-mdpi/btn_cab_done_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/btn_cab_done_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_cab_done_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/btn_cab_done_pressed_holo_light.9.png
index 5db212c..f7b01e0 100644
--- a/core/res/res/drawable-mdpi/btn_cab_done_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/btn_cab_done_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_contact_picture.png b/core/res/res/drawable-mdpi/ic_contact_picture.png
index 535a772..6c7cb61 100644
--- a/core/res/res/drawable-mdpi/ic_contact_picture.png
+++ b/core/res/res/drawable-mdpi/ic_contact_picture.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_menu_share_holo_dark.png b/core/res/res/drawable-mdpi/ic_menu_share_holo_dark.png
index 306cac8..6bf21e3 100644
--- a/core/res/res/drawable-mdpi/ic_menu_share_holo_dark.png
+++ b/core/res/res/drawable-mdpi/ic_menu_share_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_menu_share_holo_light.png b/core/res/res/drawable-mdpi/ic_menu_share_holo_light.png
index cc081ad..70fe31a 100644
--- a/core/res/res/drawable-mdpi/ic_menu_share_holo_light.png
+++ b/core/res/res/drawable-mdpi/ic_menu_share_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/list_divider_holo_dark.9.png b/core/res/res/drawable-mdpi/list_divider_holo_dark.9.png
new file mode 100644
index 0000000..986ab0b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/list_divider_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/list_divider_holo_light.9.png b/core/res/res/drawable-mdpi/list_divider_holo_light.9.png
new file mode 100644
index 0000000..0279e17
--- /dev/null
+++ b/core/res/res/drawable-mdpi/list_divider_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/spinner_pressed_holo_dark.9.png
index 4785df9..2f00be8 100644
--- a/core/res/res/drawable-mdpi/spinner_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/spinner_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/spinner_pressed_holo_light.9.png
index 246e0d0..9c48ced 100644
--- a/core/res/res/drawable-mdpi/spinner_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/spinner_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/sym_def_app_icon.png b/core/res/res/drawable-mdpi/sym_def_app_icon.png
index 9777d11..b3e10f6 100644
--- a/core/res/res/drawable-mdpi/sym_def_app_icon.png
+++ b/core/res/res/drawable-mdpi/sym_def_app_icon.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/unlock_default.png b/core/res/res/drawable-mdpi/unlock_default.png
deleted file mode 100644
index 0a441c0..0000000
--- a/core/res/res/drawable-mdpi/unlock_default.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/unlock_halo.png b/core/res/res/drawable-mdpi/unlock_halo.png
deleted file mode 100644
index 09b0526..0000000
--- a/core/res/res/drawable-mdpi/unlock_halo.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/unlock_ring.png b/core/res/res/drawable-mdpi/unlock_ring.png
deleted file mode 100644
index 0363a8b..0000000
--- a/core/res/res/drawable-mdpi/unlock_ring.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/unlock_wave.png b/core/res/res/drawable-mdpi/unlock_wave.png
deleted file mode 100644
index 21bfa24..0000000
--- a/core/res/res/drawable-mdpi/unlock_wave.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-nodpi/list_divider_holo_dark.9.png b/core/res/res/drawable-nodpi/list_divider_holo_dark.9.png
deleted file mode 100644
index 2e7951f..0000000
--- a/core/res/res/drawable-nodpi/list_divider_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-nodpi/list_divider_holo_light.9.png b/core/res/res/drawable-nodpi/list_divider_holo_light.9.png
deleted file mode 100644
index 17d8a54..0000000
--- a/core/res/res/drawable-nodpi/list_divider_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-hdpi/unlock_default.png b/core/res/res/drawable-sw600dp-hdpi/unlock_default.png
new file mode 100644
index 0000000..95b006d
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-hdpi/unlock_default.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-hdpi/unlock_halo.png b/core/res/res/drawable-sw600dp-hdpi/unlock_halo.png
new file mode 100644
index 0000000..acccb28
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-hdpi/unlock_halo.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-hdpi/unlock_ring.png b/core/res/res/drawable-sw600dp-hdpi/unlock_ring.png
new file mode 100644
index 0000000..27260dd
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-hdpi/unlock_ring.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-hdpi/unlock_wave.png b/core/res/res/drawable-sw600dp-hdpi/unlock_wave.png
new file mode 100644
index 0000000..e6b17db
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-hdpi/unlock_wave.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-mdpi/unlock_default.png b/core/res/res/drawable-sw600dp-mdpi/unlock_default.png
new file mode 100644
index 0000000..dd6f3c1
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-mdpi/unlock_default.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-mdpi/unlock_halo.png b/core/res/res/drawable-sw600dp-mdpi/unlock_halo.png
new file mode 100644
index 0000000..c9ed4c7
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-mdpi/unlock_halo.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-mdpi/unlock_ring.png b/core/res/res/drawable-sw600dp-mdpi/unlock_ring.png
new file mode 100644
index 0000000..d50de84
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-mdpi/unlock_ring.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-mdpi/unlock_wave.png b/core/res/res/drawable-sw600dp-mdpi/unlock_wave.png
new file mode 100644
index 0000000..9e38499
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-mdpi/unlock_wave.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-xhdpi/unlock_default.png b/core/res/res/drawable-sw600dp-xhdpi/unlock_default.png
new file mode 100644
index 0000000..8eea0f0
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-xhdpi/unlock_default.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-xhdpi/unlock_halo.png b/core/res/res/drawable-sw600dp-xhdpi/unlock_halo.png
new file mode 100644
index 0000000..5c504e8
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-xhdpi/unlock_halo.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-xhdpi/unlock_ring.png b/core/res/res/drawable-sw600dp-xhdpi/unlock_ring.png
new file mode 100644
index 0000000..7f698fd
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-xhdpi/unlock_ring.png
Binary files differ
diff --git a/core/res/res/drawable-sw600dp-xhdpi/unlock_wave.png b/core/res/res/drawable-sw600dp-xhdpi/unlock_wave.png
new file mode 100644
index 0000000..a11c956
--- /dev/null
+++ b/core/res/res/drawable-sw600dp-xhdpi/unlock_wave.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ab_share_pack_holo_dark.9.png b/core/res/res/drawable-xhdpi/ab_share_pack_holo_dark.9.png
new file mode 100644
index 0000000..55099d49
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ab_share_pack_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ab_share_pack_holo_light.9.png b/core/res/res/drawable-xhdpi/ab_share_pack_holo_light.9.png
new file mode 100644
index 0000000..3c4701f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ab_share_pack_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_cab_done_default_holo_dark.9.png b/core/res/res/drawable-xhdpi/btn_cab_done_default_holo_dark.9.png
index 01efef4..7ef2db7 100644
--- a/core/res/res/drawable-xhdpi/btn_cab_done_default_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/btn_cab_done_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_cab_done_default_holo_light.9.png b/core/res/res/drawable-xhdpi/btn_cab_done_default_holo_light.9.png
index c287605..2283b4c 100644
--- a/core/res/res/drawable-xhdpi/btn_cab_done_default_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/btn_cab_done_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_cab_done_focused_holo_dark.9.png b/core/res/res/drawable-xhdpi/btn_cab_done_focused_holo_dark.9.png
index 9a496e8..6d2039e 100644
--- a/core/res/res/drawable-xhdpi/btn_cab_done_focused_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/btn_cab_done_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_cab_done_focused_holo_light.9.png b/core/res/res/drawable-xhdpi/btn_cab_done_focused_holo_light.9.png
index e2a38b4..3c909b5 100644
--- a/core/res/res/drawable-xhdpi/btn_cab_done_focused_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/btn_cab_done_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_cab_done_pressed_holo_dark.9.png b/core/res/res/drawable-xhdpi/btn_cab_done_pressed_holo_dark.9.png
index 911722f..131d103 100644
--- a/core/res/res/drawable-xhdpi/btn_cab_done_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/btn_cab_done_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_cab_done_pressed_holo_light.9.png b/core/res/res/drawable-xhdpi/btn_cab_done_pressed_holo_light.9.png
index da169bf..3e7dcdf 100644
--- a/core/res/res/drawable-xhdpi/btn_cab_done_pressed_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/btn_cab_done_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_contact_picture.png b/core/res/res/drawable-xhdpi/ic_contact_picture.png
index 4ade625..1a2bfde 100644
--- a/core/res/res/drawable-xhdpi/ic_contact_picture.png
+++ b/core/res/res/drawable-xhdpi/ic_contact_picture.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_menu_share_holo_dark.png b/core/res/res/drawable-xhdpi/ic_menu_share_holo_dark.png
index af72732..45a0f1d 100644
--- a/core/res/res/drawable-xhdpi/ic_menu_share_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/ic_menu_share_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_menu_share_holo_light.png b/core/res/res/drawable-xhdpi/ic_menu_share_holo_light.png
index 79c162f..528e554 100644
--- a/core/res/res/drawable-xhdpi/ic_menu_share_holo_light.png
+++ b/core/res/res/drawable-xhdpi/ic_menu_share_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/list_divider_holo_dark.9.png b/core/res/res/drawable-xhdpi/list_divider_holo_dark.9.png
new file mode 100644
index 0000000..e62f011
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/list_divider_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/list_divider_holo_light.9.png b/core/res/res/drawable-xhdpi/list_divider_holo_light.9.png
new file mode 100644
index 0000000..65061c0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/list_divider_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_pressed_holo_dark.9.png b/core/res/res/drawable-xhdpi/spinner_pressed_holo_dark.9.png
index c279396..28d170f 100644
--- a/core/res/res/drawable-xhdpi/spinner_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_pressed_holo_light.9.png b/core/res/res/drawable-xhdpi/spinner_pressed_holo_light.9.png
index d75deda..d61be5d 100644
--- a/core/res/res/drawable-xhdpi/spinner_pressed_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/sym_def_app_icon.png b/core/res/res/drawable-xhdpi/sym_def_app_icon.png
index f360399..f381f86 100644
--- a/core/res/res/drawable-xhdpi/sym_def_app_icon.png
+++ b/core/res/res/drawable-xhdpi/sym_def_app_icon.png
Binary files differ
diff --git a/core/res/res/layout/activity_chooser_view.xml b/core/res/res/layout/activity_chooser_view.xml
index 82e1f83..4057441 100644
--- a/core/res/res/layout/activity_chooser_view.xml
+++ b/core/res/res/layout/activity_chooser_view.xml
@@ -19,33 +19,9 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_chooser_view_content"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="match_parent"
android:layout_gravity="center"
- android:gravity="center"
- style="?android:attr/actionButtonStyle"
- android:padding="0dip">
-
- <FrameLayout
- android:id="@+id/default_activity_button"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- android:focusable="true"
- android:addStatesFromChildren="true"
- android:background="?android:attr/actionBarItemBackground">
-
- <ImageView android:id="@+id/image"
- android:layout_width="32dip"
- android:layout_height="32dip"
- android:layout_gravity="center"
- android:layout_marginTop="4dip"
- android:layout_marginBottom="4dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- android:scaleType="fitCenter"
- android:adjustViewBounds="true" />
-
- </FrameLayout>
+ style="?android:attr/activityChooserViewStyle">
<FrameLayout
android:id="@+id/expand_activities_button"
@@ -60,10 +36,32 @@
android:layout_width="32dip"
android:layout_height="32dip"
android:layout_gravity="center"
- android:layout_marginTop="4dip"
- android:layout_marginBottom="4dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
+ android:layout_marginTop="2dip"
+ android:layout_marginBottom="2dip"
+ android:layout_marginLeft="12dip"
+ android:layout_marginRight="12dip"
+ android:scaleType="fitCenter"
+ android:adjustViewBounds="true" />
+
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/default_activity_button"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:focusable="true"
+ android:addStatesFromChildren="true"
+ android:background="?android:attr/actionBarItemBackground">
+
+ <ImageView android:id="@+id/image"
+ android:layout_width="32dip"
+ android:layout_height="32dip"
+ android:layout_gravity="center"
+ android:layout_marginTop="2dip"
+ android:layout_marginBottom="2dip"
+ android:layout_marginLeft="12dip"
+ android:layout_marginRight="12dip"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
diff --git a/core/res/res/layout/activity_list_item.xml b/core/res/res/layout/activity_list_item.xml
index 7022fe1..572caf0 100644
--- a/core/res/res/layout/activity_list_item.xml
+++ b/core/res/res/layout/activity_list_item.xml
@@ -33,6 +33,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:paddingLeft="6dip" />
+ android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" />
</LinearLayout>
diff --git a/core/res/res/layout/activity_list_item_2.xml b/core/res/res/layout/activity_list_item_2.xml
index 3b84c733..a58ebfc 100644
--- a/core/res/res/layout/activity_list_item_2.xml
+++ b/core/res/res/layout/activity_list_item_2.xml
@@ -18,7 +18,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:drawablePadding="14dip"
android:paddingLeft="16dip"
diff --git a/core/res/res/layout/alert_dialog_progress_holo.xml b/core/res/res/layout/alert_dialog_progress_holo.xml
new file mode 100644
index 0000000..94dbb2b
--- /dev/null
+++ b/core/res/res/layout/alert_dialog_progress_holo.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content" android:layout_height="match_parent">
+ <ProgressBar android:id="@+id/progress"
+ style="?android:attr/progressBarStyleHorizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="1dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
+ android:layout_centerHorizontal="true" />
+ <TextView
+ android:id="@+id/progress_percent"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="16dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
+ android:layout_alignParentLeft="true"
+ android:layout_below="@id/progress"
+ />
+ <TextView
+ android:id="@+id/progress_number"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="16dip"
+ android:layout_marginLeft="16dip"
+ android:layout_marginRight="16dip"
+ android:layout_alignParentRight="true"
+ android:layout_below="@id/progress"
+ />
+</RelativeLayout>
diff --git a/core/res/res/layout/choose_type_and_account.xml b/core/res/res/layout/choose_type_and_account.xml
new file mode 100644
index 0000000..8be01b42
--- /dev/null
+++ b/core/res/res/layout/choose_type_and_account.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/assets/res/layout/list_content.xml
+**
+** Copyright 2011, 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.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingLeft="16dip"
+ android:paddingRight="16dip">
+
+ <ListView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:drawSelectorOnTop="false"
+ android:scrollbarAlwaysDrawVerticalTrack="true" />
+
+ <Button android:id="@+id/addAccount"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="2"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="2dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold"
+ />
+</LinearLayout>
diff --git a/core/res/res/layout/list_menu_item_layout.xml b/core/res/res/layout/list_menu_item_layout.xml
index 93bd76b..680eca7 100644
--- a/core/res/res/layout/list_menu_item_layout.xml
+++ b/core/res/res/layout/list_menu_item_layout.xml
@@ -26,8 +26,8 @@
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
+ android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:layout_marginRight="?android:attr/listPreferredItemPaddingRight"
android:duplicateParentState="true">
<TextView
diff --git a/core/res/res/layout/preference_list_content_single.xml b/core/res/res/layout/preference_list_content_single.xml
index 259869d..16afe13 100644
--- a/core/res/res/layout/preference_list_content_single.xml
+++ b/core/res/res/layout/preference_list_content_single.xml
@@ -35,12 +35,11 @@
android:layout_height="match_parent">
<ListView android:id="@android:id/list"
+ style="?attr/preferenceFragmentStyle"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:drawSelectorOnTop="false"
- android:paddingLeft="@dimen/preference_fragment_padding_side"
- android:paddingRight="@dimen/preference_fragment_padding_side"
android:scrollbarStyle="@integer/preference_fragment_scrollbarStyle"
android:cacheColorHint="@android:color/transparent"
android:listPreferredItemHeight="48dp"
diff --git a/core/res/res/layout/progress_dialog_holo.xml b/core/res/res/layout/progress_dialog_holo.xml
new file mode 100644
index 0000000..9631efd
--- /dev/null
+++ b/core/res/res/layout/progress_dialog_holo.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2011, 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.
+*/
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <LinearLayout android:id="@+id/body"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:baselineAligned="false"
+ android:padding="16dip">
+
+ <ProgressBar android:id="@android:id/progress"
+ style="?android:attr/progressBarStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:max="10000"
+ android:layout_marginRight="16dip" />
+
+ <TextView android:id="@+id/message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical" />
+ </LinearLayout>
+</FrameLayout>
diff --git a/core/res/res/layout/resolve_list_item.xml b/core/res/res/layout/resolve_list_item.xml
index 66e3b8a..c0404be 100644
--- a/core/res/res/layout/resolve_list_item.xml
+++ b/core/res/res/layout/resolve_list_item.xml
@@ -23,8 +23,8 @@
android:minHeight="?android:attr/listPreferredItemHeight"
android:layout_height="wrap_content"
android:layout_width="match_parent"
- android:paddingLeft="10dip"
- android:paddingRight="15dip">
+ android:paddingLeft="16dip"
+ android:paddingRight="16dip">
<!-- Activity icon when presenting dialog -->
<ImageView android:id="@+id/icon"
@@ -39,18 +39,18 @@
android:layout_height="wrap_content" >
<!-- Activity name -->
<TextView android:id="@android:id/text1"
- android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="2"
- android:paddingLeft="10dip" />
+ android:paddingLeft="16dip" />
<!-- Extended activity info to distinguish between duplicate activity names -->
<TextView android:id="@android:id/text2"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="2"
- android:paddingLeft="10dip" />
+ android:paddingLeft="16dip" />
</LinearLayout>
</LinearLayout>
diff --git a/core/res/res/layout/simple_list_item_1.xml b/core/res/res/layout/simple_list_item_1.xml
index 252e006..c5e3efc 100644
--- a/core/res/res/layout/simple_list_item_1.xml
+++ b/core/res/res/layout/simple_list_item_1.xml
@@ -18,9 +18,9 @@
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceListItem"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
- android:paddingLeft="8dip"
- android:paddingRight="8dip"
- android:minHeight="?android:attr/listPreferredItemHeight"
+ android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:paddingRight="?android:attr/listPreferredItemPaddingRight"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>
diff --git a/core/res/res/layout/simple_list_item_2.xml b/core/res/res/layout/simple_list_item_2.xml
index 9b6c62a..9369876 100644
--- a/core/res/res/layout/simple_list_item_2.xml
+++ b/core/res/res/layout/simple_list_item_2.xml
@@ -24,8 +24,8 @@
<TextView android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="8dip"
- android:layout_marginTop="8dip"
+ android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:layout_marginTop="8dip"
android:textAppearance="?android:attr/textAppearanceListItem"
/>
@@ -33,7 +33,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@android:id/text1"
- android:layout_alignLeft="@android:id/text1"
+ android:layout_alignLeft="@android:id/text1"
android:textAppearance="?android:attr/textAppearanceSmall"
/>
diff --git a/core/res/res/layout/simple_list_item_activated_1.xml b/core/res/res/layout/simple_list_item_activated_1.xml
index d60f93b..a5fb5d1 100644
--- a/core/res/res/layout/simple_list_item_activated_1.xml
+++ b/core/res/res/layout/simple_list_item_activated_1.xml
@@ -18,8 +18,10 @@
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceListItem"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
+ android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:paddingRight="?android:attr/listPreferredItemPaddingRight"
android:background="?android:attr/activatedBackgroundIndicator"
- android:minHeight="?android:attr/listPreferredItemHeight"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>
diff --git a/core/res/res/layout/simple_list_item_activated_2.xml b/core/res/res/layout/simple_list_item_activated_2.xml
index 5be5c92..8746f6f 100644
--- a/core/res/res/layout/simple_list_item_activated_2.xml
+++ b/core/res/res/layout/simple_list_item_activated_2.xml
@@ -27,9 +27,9 @@
<TextView android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="8dip"
- android:layout_marginTop="8dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
+ android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:layout_marginTop="6dip"
+ android:textAppearance="?android:attr/textAppearanceListItem"
/>
<TextView android:id="@android:id/text2"
diff --git a/core/res/res/layout/simple_list_item_checked.xml b/core/res/res/layout/simple_list_item_checked.xml
index 79d3a18..c9153f8 100644
--- a/core/res/res/layout/simple_list_item_checked.xml
+++ b/core/res/res/layout/simple_list_item_checked.xml
@@ -17,10 +17,10 @@
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:textAppearance="?android:attr/textAppearanceListItem"
+ android:layout_height="?android:attr/listPreferredItemHeightSmall"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:checkMark="?android:attr/textCheckMark"
- android:paddingLeft="8dip"
- android:paddingRight="8dip"
+ android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:paddingRight="?android:attr/listPreferredItemPaddingRight"
/>
diff --git a/core/res/res/layout/simple_list_item_single_choice.xml b/core/res/res/layout/simple_list_item_single_choice.xml
index ac4a4a8..4a6cefa 100644
--- a/core/res/res/layout/simple_list_item_single_choice.xml
+++ b/core/res/res/layout/simple_list_item_single_choice.xml
@@ -17,10 +17,10 @@
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:textAppearance="?android:attr/textAppearanceListItem"
+ android:layout_height="?android:attr/listPreferredItemHeightSmall"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
- android:paddingLeft="8dip"
- android:paddingRight="8dip"
+ android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:paddingRight="?android:attr/listPreferredItemPaddingRight"
/>
diff --git a/core/res/res/layout/simple_spinner_item.xml b/core/res/res/layout/simple_spinner_item.xml
index 77929ee..61dc025 100644
--- a/core/res/res/layout/simple_spinner_item.xml
+++ b/core/res/res/layout/simple_spinner_item.xml
@@ -19,7 +19,7 @@
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
- style="?android:attr/spinnerItemStyle"
+ style="?android:attr/spinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/mipmap-hdpi/sym_def_app_icon.png b/core/res/res/mipmap-hdpi/sym_def_app_icon.png
index 075d908..c8a38ed 100644
--- a/core/res/res/mipmap-hdpi/sym_def_app_icon.png
+++ b/core/res/res/mipmap-hdpi/sym_def_app_icon.png
Binary files differ
diff --git a/core/res/res/mipmap-mdpi/sym_def_app_icon.png b/core/res/res/mipmap-mdpi/sym_def_app_icon.png
index 9777d11..b3e10f6 100644
--- a/core/res/res/mipmap-mdpi/sym_def_app_icon.png
+++ b/core/res/res/mipmap-mdpi/sym_def_app_icon.png
Binary files differ
diff --git a/core/res/res/mipmap-xhdpi/sym_def_app_icon.png b/core/res/res/mipmap-xhdpi/sym_def_app_icon.png
new file mode 100644
index 0000000..f381f86
--- /dev/null
+++ b/core/res/res/mipmap-xhdpi/sym_def_app_icon.png
Binary files differ
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 9a996d4..e5686bc 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -838,8 +838,7 @@
<skip />
<!-- no translation found for emergency_call_dialog_number_for_display (696192103195090970) -->
<skip />
- <!-- no translation found for lockscreen_carrier_default (8963839242565653192) -->
- <skip />
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Geen diens nie."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skerm gesluit."</string>
<!-- no translation found for lockscreen_instructions_when_pattern_enabled (46154051614126049) -->
<skip />
@@ -1122,12 +1121,12 @@
<!-- no translation found for paste (5629880836805036433) -->
<skip />
<string name="replace" msgid="5781686059063148930">"Vervang???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Vee uit"</string>
<!-- no translation found for copyUrl (2538211579596067402) -->
<skip />
<string name="selectTextMode" msgid="6738556348861347240">"Kies teks..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekskeuse"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+voeg by woordeboek"</string>
<string name="inputMethod" msgid="1653630062304567879">"Invoermetode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksaksies"</string>
<!-- no translation found for low_internal_storage_view_title (1399732408701697546) -->
@@ -1245,6 +1244,10 @@
<skip />
<!-- no translation found for wifi_p2p_pin_display_message (2834049169114922902) -->
<skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Voeg karakter in"</string>
<!-- no translation found for sms_control_default_app_name (7630529934366549163) -->
<skip />
@@ -1435,34 +1438,20 @@
<skip />
<!-- no translation found for number_picker_decrement_button (2576606679160067262) -->
<skip />
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tik en hou."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Skuif op om by te tel en af om af te trek."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Tel \'n minuut by"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Trek \'n minuut af"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Tel \'n uur by."</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Trek \'n uur af"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Stel NM."</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Stel VM."</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Tel \'n maand by"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Trek \'n maand af"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Tel \'n dag by"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Trek \'n dag af."</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Tel \'n jaar by"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Trek \'n jaar af"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"gekontroleer"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"nie gekontroleer nie"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"gekies"</string>
@@ -1478,24 +1467,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modus verander"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Invoersleutel"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Glyhandvatsel. Tik en hou."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Op na <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Af vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Links vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Regs vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Ontsluit"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Stil"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Klank aan"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Sleutel. Kopstuk nodig om sleutels te hoor, tydens tik van \'n wagwoord."</string>
<!-- no translation found for action_bar_home_description (5293600496601490216) -->
<skip />
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 7a5f031..42063c0 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -838,8 +838,7 @@
<skip />
<!-- no translation found for emergency_call_dialog_number_for_display (696192103195090970) -->
<skip />
- <!-- no translation found for lockscreen_carrier_default (8963839242565653192) -->
- <skip />
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"ከአገልግሎት መስጫ ክልል ውጪ"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"ማሳያ ተቆልፏል።"</string>
<!-- no translation found for lockscreen_instructions_when_pattern_enabled (46154051614126049) -->
<skip />
@@ -1122,12 +1121,12 @@
<!-- no translation found for paste (5629880836805036433) -->
<skip />
<string name="replace" msgid="5781686059063148930">"ተካ???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"ሰርዝ"</string>
<!-- no translation found for copyUrl (2538211579596067402) -->
<skip />
<string name="selectTextMode" msgid="6738556348861347240">"ፅሁፍ ምረጥ"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"የፅሁፍ ምርጫ"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"ወደ መዝገበ ቃላት አክል"</string>
<string name="inputMethod" msgid="1653630062304567879">"ግቤት ሜተድ"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"የፅሁፍ እርምጃዎች"</string>
<!-- no translation found for low_internal_storage_view_title (1399732408701697546) -->
@@ -1245,6 +1244,10 @@
<skip />
<!-- no translation found for wifi_p2p_pin_display_message (2834049169114922902) -->
<skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"ቁምፊ አስገባ"</string>
<!-- no translation found for sms_control_default_app_name (7630529934366549163) -->
<skip />
@@ -1435,34 +1438,20 @@
<skip />
<!-- no translation found for number_picker_decrement_button (2576606679160067262) -->
<skip />
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> አንዴ ንካ እና ያዝ"</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"ለመጨመር ወደላይ ለመቀነስ ወደታች አንሸራት"</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"ደቂቃዎች ጨምር"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"ደቂቃ ቀንስ"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"ሰዓት ጨምር።"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"ሰዓት ቀንስ"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM አዘጋጅ"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM አዘጋጅ"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"ወር ጨምር"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"ወር ቀንስ"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"ቀን ጨምር"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"ቀን ቀንስ"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"አመት ጨምር"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"አመት ቀንስ"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"ታይቷል"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"አልተፈተሸም"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"የተመረጠ"</string>
@@ -1478,24 +1467,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ሞድ ለውጥ"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ቀይር"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"አስገባ"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Sliding handle. Tap and hold."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደላይ።"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደታች።"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደግራ።"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደቀኝ።"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"ክፈት"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"ካሜራ"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ፀጥታ"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"ድምፅ አብራ"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"አዝራር፡፡ ይለፍቃል እየተየብክ አዝራሮችን ለመስማት ማዳመጫ መሳሪያ ያስፈልጋል፡፡"</string>
<!-- no translation found for action_bar_home_description (5293600496601490216) -->
<skip />
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 716c6f5..1f5940b 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"كود PIN غير صحيح!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"لإلغاء التأمين، اضغط على \"القائمة\" ثم على 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"رقم الطوارئ"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(ليس هناك خدمة)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"لا تتوفر خدمة"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"الشاشة مؤمّنة."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"اضغط على \"القائمة\" لإلغاء التأمين أو إجراء اتصال بالطوارئ."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"اضغط على \"القائمة\" لإلغاء التأمين."</string>
@@ -650,8 +650,7 @@
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"صحيح!"</string>
<string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"عذرًا، حاول مرة أخرى"</string>
<string name="lockscreen_password_wrong" msgid="6237443657358168819">"عذرًا، أعد المحاولة"</string>
- <!-- no translation found for lockscreen_plugged_in (8057762828355572315) -->
- <skip />
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"جارٍ الشحن، <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_charged" msgid="4938930459620989972">"تم الشحن."</string>
<string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"توصيل جهاز الشحن."</string>
@@ -855,12 +854,12 @@
<string name="cut" msgid="3092569408438626261">"قص"</string>
<string name="copy" msgid="2681946229533511987">"نسخ"</string>
<string name="paste" msgid="5629880836805036433">"لصق"</string>
- <!-- outdated translation 8333608224471746584 --> <string name="replace" msgid="5781686059063148930">"استبدال"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="replace" msgid="5781686059063148930">"استبدال???"</string>
+ <string name="delete" msgid="6098684844021697789">"حذف"</string>
<string name="copyUrl" msgid="2538211579596067402">"نسخ عنوان URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"تحديد نص..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"تحديد النص"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ إضافة إلى القاموس"</string>
<string name="inputMethod" msgid="1653630062304567879">"طريقة الإرسال"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"إجراءات النص"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"المساحة منخفضة"</string>
@@ -940,13 +939,17 @@
<item quantity="other" msgid="7915895323644292768">"هناك شبكات Wi-Fi مفتوحة متاحة"</item>
</plurals>
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"تعذر الاتصال بـ Wi-Fi"</string>
- <!-- outdated translation 2517058131278770509 --> <string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" تحتوي على اتصال إنترنت ضعيف."</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" تحتوي على اتصال إنترنت ضعيف."</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"اتصال Wi-Fi مباشر"</string>
<string name="wifi_p2p_turnon_message" msgid="2804722042556269129">"ابدأ تشغيل اتصال Wi-Fi المباشر. يؤدي ذلك إلى إيقاف تشغيل عميل/نقطة اتصال Wi-Fi."</string>
<string name="wifi_p2p_failed_message" msgid="1820097493844848281">"تعذر بدء اتصال Wi-Fi مباشر"</string>
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"هناك طلب إعداد اتصال Wi-Fi مباشر من <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. انقر على \"موافق\" للقبول."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"هناك طلب إعداد اتصال Wi-Fi مباشر من <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. أدخل رقم التعريف الشخصي للبدء."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"يجب إدخال رقم التعريف الشخصي لـ WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> في الجهاز النظير <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> حتى يبدأ إعداد الاتصال."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"إدراج حرف"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"تطبيق غير معروف"</string>
<string name="sms_control_title" msgid="7296612781128917719">"إرسال رسائل قصيرة SMS"</string>
@@ -1109,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"حدد حسابًا."</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"زيادة"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"تناقص"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> انقر مع الاستمرار."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"مرر لأعلى للزيادة ولأسفل للإنقاص."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"زيادة دقيقة"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"إنقاص دقيقة"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"زيادة ساعة"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"إنقاص ساعة"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"تعيين المساء"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"تعيين الصباح"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"زيادة شهر"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"إنقاص شهر"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"زيادة يوم"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"إنقاص يوم"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"زيادة عام"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"إنقاص عام"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"تم التحديد"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"لم يتم التحديد"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"محدد"</string>
@@ -1152,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"تغيير الوضع"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"العالي"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"مقبض التمرير. انقر وامسك."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"أعلى إلى <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"أسفل إلى <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"يسارًا إلى <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"يمينًا إلى <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"إلغاء تأمين"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"الكاميرا"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"صامت"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"تشغيل الصوت"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"سماعة رأس مطلوبة لسماع المفاتيح أثناء كتابة كلمة مرور."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"التنقل إلى الشاشة الرئيسية"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"التنقل إلى أعلى"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 46ff84f..49f13b3 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неправилен PIN код!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"За да отключите, натиснете „Меню“ и после 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Спешен номер"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Няма покритие)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Няма покритие."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Екранът е заключен."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Натиснете „Меню“, за да отключите или да извършите спешно обаждане."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Натиснете „Меню“, за да отключите."</string>
@@ -855,11 +855,14 @@
<string name="copy" msgid="2681946229533511987">"Копиране"</string>
<string name="paste" msgid="5629880836805036433">"Поставяне"</string>
<string name="replace" msgid="5781686059063148930">"Замяна???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Изтриване"</string>
<string name="copyUrl" msgid="2538211579596067402">"Копиране на URL адреса"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Избиране на текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Избиране на текст"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (2839899368418071843) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Метод на въвеждане"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Действия с текста"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Мястото не достига"</string>
@@ -946,6 +949,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Заявка за настройка на връзка с Wi-Fi Direct от <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Кликнете върху „OK“, за да приемете."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Заявка за настройка на връзка с Wi-Fi Direct от <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Въведете ПИН, за да продължите."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"WPS ПИН кодът <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> трябва да бъде въведен в съответното устройство <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>, за да продължи настройката за връзка"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Вмъкване на знак"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Неизвестно приложение"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Изпращане на SMS съобщения"</string>
@@ -1151,8 +1158,7 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Промяна на режима"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Плъзгаща се дръжка. Докоснете и задръжте."</string>
<!-- no translation found for description_direction_up (1983114130441878529) -->
<skip />
<!-- no translation found for description_direction_down (4294993639091088240) -->
@@ -1161,14 +1167,10 @@
<skip />
<!-- no translation found for description_direction_right (4296057241963012862) -->
<skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="description_target_unlock" msgid="2228524900439801453">"Отключване"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Тих режим"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Включване на звука"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Клавиш. Необходими са слушалки, за да чуете клавишите при въвеждането на парола."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Придвижване към „Начало“"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Придвижване нагоре"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 329d0a2..dd63638 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Codi PIN incorrecte."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Per desbloquejar-lo, premeu Menú i després 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número d\'emergència"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Sense servei)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Sense servei."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Pantalla bloquejada."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Premeu Menú per desbloquejar-lo o per fer una trucada d\'emergència."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Premeu Menú per desbloquejar."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Copia"</string>
<string name="paste" msgid="5629880836805036433">"Enganxa"</string>
<string name="replace" msgid="5781686059063148930">"Vols substituir?"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Suprimeix"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copia l\'URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Selecciona el text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selecció de text"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ afegeix al diccionari"</string>
<string name="inputMethod" msgid="1653630062304567879">"Mètode d\'entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Accions de text"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Queda poc espai"</string>
@@ -946,6 +946,8 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Sol·licitud de configuració de connexió de Wi-Fi Direct des de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Si la vols acceptar, fes clic a D\'acord."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Sol·licitud de configuració de connexió de Wi-Fi Direct des de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Introdueix el PIN per continuar."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"S\'ha d\'introduir el PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> al dispositiu de l\'altre extrem <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> per poder continuar amb la configuració de la connexió"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct està activat"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Toca per accedir a la configuració"</string>
<string name="select_character" msgid="3365550120617701745">"Insereix un caràcter"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Aplicació desconeguda"</string>
<string name="sms_control_title" msgid="7296612781128917719">"S\'estan enviant missatges SMS"</string>
@@ -1108,34 +1110,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Selecciona un compte"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Incrementa"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminueix"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> mantén premut."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Fes lliscar el dit cap amunt per incrementar i cap avall per disminuir."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Incrementa els minuts"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Disminueix els minuts"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Incrementa les hores"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Disminueix les hores"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Estableix com a p. m."</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Estableix com a a. m."</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Incrementa el mes"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Disminueix el mes"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Incrementa els dies"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Disminueix els dies"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Incrementa l\'any"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Disminueix l\'any"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"marcat"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"no marcat"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"seleccionat"</string>
@@ -1151,24 +1139,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Canvi de mode"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Retorn"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Llisca el dit. Mantén premut."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Cap amunt per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Cap avall per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Cap a la dreta per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Desbloqueja"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Càmera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Silenci"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Activa el so"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tecles. Es necessiten auriculars per escoltar les tecles en escriure una contrasenya."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Torna a la pàgina d\'inici"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Mou cap a dalt"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 729344f..ba0454e 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nesprávný kód PIN"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Chcete-li telefon odemknout, stiskněte Menu a poté 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Číslo tísňové linky"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Není signál)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Žádný signál."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Obrazovka uzamčena."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Chcete-li odemknout telefon nebo provést tísňové volání, stiskněte Menu."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Telefon odemknete stisknutím tlačítka Menu."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopírovat"</string>
<string name="paste" msgid="5629880836805036433">"Vložit"</string>
<string name="replace" msgid="5781686059063148930">"Nahradit???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Smazat"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopírovat adresu URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Vybrat text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Výběr textu"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ přidat do slovníku"</string>
<string name="inputMethod" msgid="1653630062304567879">"Metoda zadávání dat"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Operace s textem"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Málo paměti"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Žádost o nastavení přímého připojení sítě Wi-Fi z adresy <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Chcete-li žádost přijmout, klikněte na tlačítko OK."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Žádost o nastavení přímého připojení sítě Wi-Fi z adresy <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Pokračujte zadáním kódu PIN."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Chcete-li pokračovat v nastavení připojení, je potřeba zadat kód PIN <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> ve sdíleném zařízení <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Vkládání znaků"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Neznámá aplikace"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Odesílání zpráv SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Vybrat účet"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšení"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Snížení"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> – Klepněte a podržte."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Chcete-li přičítat, přejeďte prstem nahoru, chcete-li odečítat, přejeďte prstem dolů."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Přičíst minutu"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Odečíst minutu"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Přičíst hodinu"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Odečíst hodinu"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Nastavit odp."</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Nastavit dop."</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Přičíst měsíc"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Odečíst měsíc"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Přičíst den"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Odečíst den"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Přičíst rok"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Odečíst rok"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"zaškrtnuto"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"nezaškrtnuto"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"Vybráno"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Změna režimu"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Posuvník. Klepněte a podržte."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – nahoru."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – dolů."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – vlevo."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – vpravo."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Odemknout"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Fotoaparát"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Tichý"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Zapnout zvuk"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Klávesa. Při zadávání hesla je potřeba použít náhlavní soupravu."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Přejít na plochu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Přejít nahoru"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 54f6c28..1fd9de5 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Forkert PIN-kode!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Tryk på Menu og dernæst på 0 for at låse op."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nødnummer"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Ingen tjeneste)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Ingen dækning."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skærmen er låst."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryk på Menu for at låse op eller foretage et nødopkald."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryk på Menu for at låse op."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopier"</string>
<string name="paste" msgid="5629880836805036433">"Indsæt"</string>
<string name="replace" msgid="5781686059063148930">"Erstat..."</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Slet"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopier webadresse"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Marker tekst..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstmarkering"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ føj til ordbog"</string>
<string name="inputMethod" msgid="1653630062304567879">"Inputmetode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Der er ikke så meget plads tilbage"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Anmodning om konfiguration af Wi-Fi Direct-forbindelse fra <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Klik på OK for at acceptere."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Anmodning om konfiguration af Wi-Fi Direct-forbindelse fra <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Indtast pinkode for at fortsætte."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"WPS-pinkoden <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> skal angives på peer-enheden <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> for at fortsætte konfiguration af forbindelsen"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Indsæt tegn"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Ukendt applikation"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Sender sms-beskeder"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Vælg en konto"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Optælling"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Nedtælling"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tryk og hold <xliff:g id="VALUE">%s</xliff:g> nede."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Glid op for at tilføje, og glid ned for at fjerne."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Tilføj minut"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Fjern minut"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Tilføj time"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Fjern time"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Indstil PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Indstil AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Tilføj måned"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Fjern måned"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Tilføj dag"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Fjern dag"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Tilføj år"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Fjern år"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"markeret"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"ikke markeret"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"udvalgt"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ændring af tilstand"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Angiv"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Glidende håndtag. Tryk og hold nede."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Op for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Ned for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Til højre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Lås op"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Lydløs"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Lyd slået til"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tast. Du skal bruge et headset for at høre tastelyde, når du indtaster en adgangskode."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Naviger hjem"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Naviger op"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 16a9740..fb837a8 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -141,7 +141,7 @@
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon wird heruntergefahren."</string>
<string name="shutdown_confirm_question" msgid="6656441286856415014">"Möchten Sie das Gerät herunterfahren?"</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"Zuletzt verwendet"</string>
- <string name="no_recent_tasks" msgid="279702952298056674">"Keine zuletzt verwendeten Anwendungen"</string>
+ <string name="no_recent_tasks" msgid="279702952298056674">"Keine zuletzt verwendeten Apps"</string>
<string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet-Optionen"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonoptionen"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Display-Sperre"</string>
@@ -205,13 +205,13 @@
<string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Ermöglicht einer App, auf Ihrem Telefon oder Ihrer SIM-Karte gespeicherte Kurznachrichten zu bearbeiten. Schädliche Anwendungen löschen möglicherweise Ihre Nachrichten."</string>
<string name="permlab_receiveWapPush" msgid="8258226427716551388">"WAP-Nachrichten empfangen"</string>
<string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Ermöglicht der App, WAP-Mitteilungen zu empfangen und zu verarbeiten. Schädliche Apps können Ihre Nachrichten möglicherweise überwachen oder löschen, bevor sie angezeigt werden."</string>
- <string name="permlab_getTasks" msgid="5005277531132573353">"laufende Anwendungen abrufen"</string>
+ <string name="permlab_getTasks" msgid="5005277531132573353">"laufende Apps abrufen"</string>
<string name="permdesc_getTasks" msgid="7048711358713443341">"Ermöglicht der App, Informationen zu aktuellen und kürzlich ausführten Aufgaben abzurufen. Schädliche Anwendungen können so eventuell geheime Informationen zu anderen Anwendungen entdecken."</string>
- <string name="permlab_reorderTasks" msgid="5669588525059921549">"Laufende Anwendungen neu ordnen"</string>
+ <string name="permlab_reorderTasks" msgid="5669588525059921549">"Laufende Apps neu ordnen"</string>
<string name="permdesc_reorderTasks" msgid="126252774270522835">"Ermöglicht einer App, Aufgaben in den Vorder- und Hintergrund zu verschieben. Schädliche Anwendungen können so ohne Ihr Zutun eine Anzeige im Vordergrund erzwingen."</string>
<string name="permlab_removeTasks" msgid="4802740047161700683">"Aktive Apps beenden"</string>
<string name="permdesc_removeTasks" msgid="2000332928514575461">"Ermöglicht einer App das Entfernen von Aufgaben und Beenden der entsprechenden Apps. Schädliche Apps können das Verhalten anderer Apps stören."</string>
- <string name="permlab_setDebugApp" msgid="4339730312925176742">"Fehlerbeseitigung für Anwendung aktivieren"</string>
+ <string name="permlab_setDebugApp" msgid="4339730312925176742">"Fehlerbeseitigung für App aktivieren"</string>
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Ermöglicht einer App, die Fehlerbeseitigung für eine andere Anwendung zu aktivieren. Schädliche Anwendungen können so andere Anwendungen löschen."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"UI-Einstellungen ändern"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Ermöglicht einer App, die aktuelle Konfiguration zu ändern, etwa das Gebietsschema oder die Schriftgröße"</string>
@@ -221,7 +221,7 @@
<string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Ermöglicht einer App, Hintergrundprozesse anderer Anwendungen auch bei ausreichendem Speicher zu beenden."</string>
<string name="permlab_forceStopPackages" msgid="1447830113260156236">"Beenden anderer Anwendungen erzwingen"</string>
<string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Ermöglicht einer App, das Beenden anderer Anwendungen zu erzwingen"</string>
- <string name="permlab_forceBack" msgid="1804196839880393631">"Schließen von Anwendung erzwingen"</string>
+ <string name="permlab_forceBack" msgid="1804196839880393631">"Schließen der App erzwingen"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Ermöglicht einer App, alle Aktivitäten, die im Vordergrund ablaufen, zu beenden und in den Hintergrund zu schieben. Sollte nicht für normale Anwendungen benötigt werden."</string>
<string name="permlab_dump" msgid="1681799862438954752">"Systeminternen Status abrufen"</string>
<string name="permdesc_dump" msgid="2198776174276275220">"Ermöglicht einer App, den internen Status des Systems abzurufen. Schädliche Apps rufen hierbei möglicherweise eine Vielzahl an privaten und geschützten Daten ab, die Sie in der Regel nicht benötigen würden."</string>
@@ -231,7 +231,7 @@
<string name="permdesc_shutdown" msgid="7046500838746291775">"Versetzt den Aktivitätsmanager in einen heruntergefahrenen Zustand. Führt kein vollständiges Herunterfahren aus."</string>
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"Anwendungswechsel verhindern"</string>
<string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Hindert den Nutzer daran, zu einer anderen Anwendung zu wechseln"</string>
- <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"Start von Anwendungen überwachen und steuern"</string>
+ <string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"Start von Apps überwachen und steuern"</string>
<string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Ermöglicht der App, den Start von Systemaktivitäten zu überwachen und zu steuern. Schädliche Anwendungen können so das gesamte System beeinträchtigen. Diese Berechtigung wird nur zu Entwicklungszwecken und nie für die normale Nutzung benötigt."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"Broadcast ohne Paket senden"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Ermöglicht einer App, eine Benachrichtigung zur Entfernung eines Anwendungspakets zu senden. Schädliche Anwendungen können so laufende Anwendungen beenden."</string>
@@ -241,7 +241,7 @@
<string name="permdesc_broadcastWapPush" msgid="3955303669461378091">"Ermöglicht einer App, eine Benachrichtigung zu senden, dass eine WAP PUSH-Nachricht empfangen wurde. Schädliche Anwendungen könnten diese Option verwenden, um den Erhalt von MMS-Mitteilungen zu erzwingen, oder um unbemerkt den Inhalt einer beliebigen Webseite durch schädliche Inhalte zu ersetzen."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"Anzahl der laufenden Prozesse beschränken"</string>
<string name="permdesc_setProcessLimit" msgid="7824786028557379539">"Ermöglicht einer App, die maximale Anzahl an laufenden Prozessen zu steuern. Wird nicht für normale Anwendungen benötigt."</string>
- <string name="permlab_setAlwaysFinish" msgid="5342837862439543783">"alle Anwendungen im Hintergrund schließen"</string>
+ <string name="permlab_setAlwaysFinish" msgid="5342837862439543783">"alle Apps im Hintergrund schließen"</string>
<string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"Überlässt einer Anwendung die Entscheidung, ob Aktivitäten beendet werden, sobald Sie in den Hintergrund rücken. Wird nicht für normale Anwendungen benötigt."</string>
<string name="permlab_batteryStats" msgid="7863923071360031652">"Akku-Daten ändern"</string>
<string name="permdesc_batteryStats" msgid="5847319823772230560">"Ermöglicht die Änderung von gesammelten Akku-Daten. Nicht für normale Apps vorgesehen."</string>
@@ -278,21 +278,21 @@
<string name="permdesc_setOrientation" msgid="6335814461615851863">"Ermöglicht der App, die Bildschirmdrehung jederzeit zu ändern. Sollte nicht für normale Anwendungen benötigt werden."</string>
<string name="permlab_setPointerSpeed" msgid="9175371613322562934">"Zeigergeschwindigkeit ändern"</string>
<string name="permdesc_setPointerSpeed" msgid="137436038503379864">"Ermöglicht einer App, jederzeit die Geschwindigkeit des Maus- bzw. Touchpad-Zeigers zu ändern. Sollte für normale Apps nicht benötigt werden."</string>
- <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"Linux-Signale an Anwendungen senden"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"Linux-Signale an Apps senden"</string>
<string name="permdesc_signalPersistentProcesses" msgid="3565530463215015289">"Ermöglicht der App, das Senden des gelieferten Signals an alle anhaltenden Prozesse zu fordern"</string>
- <string name="permlab_persistentActivity" msgid="8659652042401085862">"Anwendungen permanent ausführen"</string>
+ <string name="permlab_persistentActivity" msgid="8659652042401085862">"Apps permanent ausführen"</string>
<string name="permdesc_persistentActivity" msgid="5037199778265006008">"Ermöglicht einer App, eigene Komponenten persistent zu machen, damit das System diese nicht für andere Anwendungen nutzen kann"</string>
- <string name="permlab_deletePackages" msgid="3343439331576348805">"Anwendungen löschen"</string>
+ <string name="permlab_deletePackages" msgid="3343439331576348805">"Apps löschen"</string>
<string name="permdesc_deletePackages" msgid="3634943677518723314">"Ermöglicht einer App, Android-Pakete zu löschen. Schädliche Anwendungen können so wichtige Anwendungen löschen."</string>
- <string name="permlab_clearAppUserData" msgid="2192134353540277878">"Daten anderer Anwendungen löschen"</string>
+ <string name="permlab_clearAppUserData" msgid="2192134353540277878">"Daten anderer Apps löschen"</string>
<string name="permdesc_clearAppUserData" msgid="7546345080434325456">"Ermöglicht einer App das Löschen von Nutzerdaten"</string>
- <string name="permlab_deleteCacheFiles" msgid="1518556602634276725">"Caches anderer Anwendungen löschen"</string>
+ <string name="permlab_deleteCacheFiles" msgid="1518556602634276725">"Caches anderer Apps löschen"</string>
<string name="permdesc_deleteCacheFiles" msgid="2283074077168165971">"Ermöglicht einer App, Cache-Dateien zu löschen"</string>
- <string name="permlab_getPackageSize" msgid="4799785352306641460">"Speicherplatz der Anwendung abrufen"</string>
+ <string name="permlab_getPackageSize" msgid="4799785352306641460">"Speicherplatz der App abrufen"</string>
<string name="permdesc_getPackageSize" msgid="5557253039670753437">"Ermöglicht einer App, ihre Code-, Daten- und Cache-Größe abzurufen"</string>
- <string name="permlab_installPackages" msgid="335800214119051089">"Anwendungen direkt installieren"</string>
+ <string name="permlab_installPackages" msgid="335800214119051089">"Apps direkt installieren"</string>
<string name="permdesc_installPackages" msgid="526669220850066132">"Ermöglicht einer App, neue oder aktualisierte Android-Pakete zu installieren. Schädliche Anwendungen können so neue Anwendungen mit beliebig umfangreichen Berechtigungen hinzufügen."</string>
- <string name="permlab_clearAppCache" msgid="4747698311163766540">"Alle Cache-Daten der Anwendung löschen"</string>
+ <string name="permlab_clearAppCache" msgid="4747698311163766540">"Alle Cache-Daten der App löschen"</string>
<string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Ermöglicht einer App, Tablet-Speicher durch das Löschen von Dateien im Cache-Verzeichnis der Anwendung freizugeben. Der Zugriff beschränkt sich in der Regel auf Systemprozesse."</string>
<string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Ermöglicht einer App, Telefonspeicher durch das Löschen von Dateien im Cache-Verzeichnis der Anwendung freizugeben. Der Zugriff beschränkt sich in der Regel auf Systemprozesse."</string>
<string name="permlab_movePackage" msgid="728454979946503926">"Anwendungsressourcen verschieben"</string>
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Falscher PIN-Code!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Drücken Sie zum Entsperren die Menütaste und dann auf \"0\"."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Notrufnummer"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(kein Dienst)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Kein Dienst"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Display gesperrt"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Drücken Sie die Menütaste, um das Telefon zu entsperren oder einen Notruf zu tätigen."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Zum Entsperren die Menütaste drücken"</string>
@@ -650,7 +650,7 @@
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Korrekt!"</string>
<string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Bitte versuchen Sie es erneut."</string>
<string name="lockscreen_password_wrong" msgid="6237443657358168819">"Bitte versuchen Sie es erneut."</string>
- <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Wird geladen (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Wird geladen... (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
<string name="lockscreen_charged" msgid="4938930459620989972">"Aufgeladen"</string>
<string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Bitte Ladegerät anschließen"</string>
@@ -854,12 +854,12 @@
<string name="cut" msgid="3092569408438626261">"Ausschneiden"</string>
<string name="copy" msgid="2681946229533511987">"Kopieren"</string>
<string name="paste" msgid="5629880836805036433">"Einfügen"</string>
- <string name="replace" msgid="5781686059063148930">"Ersetzen???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="replace" msgid="5781686059063148930">"Ersetzen..."</string>
+ <string name="delete" msgid="6098684844021697789">"Löschen"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL kopieren"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Text auswählen..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Textauswahl"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"Zum Wörterbuch hinzufügen"</string>
<string name="inputMethod" msgid="1653630062304567879">"Eingabemethode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Textaktionen"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Geringer Speicher"</string>
@@ -875,9 +875,9 @@
<string name="capital_off" msgid="6815870386972805832">"AUS"</string>
<string name="whichApplication" msgid="4533185947064773386">"Aktion durchführen mit"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Standardmäßig für diese Aktion verwenden"</string>
- <string name="clearDefaultHintMsg" msgid="4815455344600932173">"Standardeinstellung zurücksetzen unter \"Einstellungen > Anwendungen > Anwendungen verwalten\""</string>
+ <string name="clearDefaultHintMsg" msgid="4815455344600932173">"Standardeinstellung zurücksetzen unter \"Einstellungen > Apps > Apps verwalten\""</string>
<string name="chooseActivity" msgid="1009246475582238425">"Aktion auswählen"</string>
- <string name="chooseUsbActivity" msgid="7892597146032121735">"Anwendung für das USB-Gerät auswählen"</string>
+ <string name="chooseUsbActivity" msgid="7892597146032121735">"App für das USB-Gerät auswählen"</string>
<string name="noApplications" msgid="1691104391758345586">"Diese Aktion kann von keiner Anwendung ausgeführt werden."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
<string name="aerr_application" msgid="932628488013092776">"Leider wurde <xliff:g id="APPLICATION">%1$s</xliff:g> beendet."</string>
@@ -890,7 +890,7 @@
<string name="force_close" msgid="8346072094521265605">"OK"</string>
<string name="report" msgid="4060218260984795706">"Bericht"</string>
<string name="wait" msgid="7147118217226317732">"Warten"</string>
- <string name="launch_warning_title" msgid="8323761616052121936">"Anwendung umgeleitet"</string>
+ <string name="launch_warning_title" msgid="8323761616052121936">"App umgeleitet"</string>
<string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> wird jetzt ausgeführt."</string>
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> wurde ursprünglich gestartet."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"Skalieren"</string>
@@ -903,13 +903,13 @@
<string name="android_upgrading_starting_apps" msgid="7959542881906488763">"Apps werden gestartet."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Start wird abgeschlossen."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> läuft"</string>
- <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Zum Wechseln in die Anwendung auswählen"</string>
- <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Anwendung wechseln?"</string>
+ <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Zum Wechseln in die App auswählen"</string>
+ <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Apps wechseln?"</string>
<string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Es läuft gerade eine andere Anwendung, die vor dem Start einer neuen beendet werden muss."</string>
<string name="old_app_action" msgid="493129172238566282">"Zu <xliff:g id="OLD_APP">%1$s</xliff:g> zurückkehren"</string>
- <string name="old_app_description" msgid="942967900237208466">"Die neue Anwendung nicht starten"</string>
+ <string name="old_app_description" msgid="942967900237208466">"Neue App nicht starten"</string>
<string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> starten"</string>
- <string name="new_app_description" msgid="6830398339826789493">"Anwendung beenden, ohne zu speichern"</string>
+ <string name="new_app_description" msgid="6830398339826789493">"App beenden, ohne zu speichern"</string>
<string name="sendText" msgid="5132506121645618310">"Aktion für Text auswählen"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Klingeltonlautstärke"</string>
<string name="volume_music" msgid="5421651157138628171">"Medienlautstärke"</string>
@@ -946,8 +946,12 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Anfrage für Wi-Fi Direct-Verbindungseinrichtung von <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Klicken Sie auf \"OK\", um sie zu akzeptieren."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Anfrage für Wi-Fi Direct-Verbindungseinrichtung von <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Geben Sie zum Fortfahren die PIN ein."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Die WPS-PIN <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> muss auf dem Peer-Gerät <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> eingegeben werden, damit die Verbindungseinrichtung fortgesetzt werden kann."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Zeichen einfügen"</string>
- <string name="sms_control_default_app_name" msgid="7630529934366549163">"Unbekannte Anwendung"</string>
+ <string name="sms_control_default_app_name" msgid="7630529934366549163">"Unbekannte App"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Kurznachrichten werden gesendet"</string>
<string name="sms_control_message" msgid="1289331457999236205">"Es werden eine große Anzahl an Kurznachrichten versendet. Wählen Sie \"OK\", um fortzufahren, oder drücken Sie auf \"Abbrechen\", um den Sendevorgang zu beenden."</string>
<string name="sms_control_yes" msgid="2532062172402615953">"OK"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Konto auswählen"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Erhöhen"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Verringern"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tippen und halten"</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Zum Erhöhen nach oben und zum Verringern nach unten ziehen"</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minute erhöhen"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minute verringern"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Stunde erhöhen"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Stunde verringern"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Zeit festlegen"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Zeit festlegen (Vormittag)"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Monat erhöhen"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Monat verringern"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Tag erhöhen"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Tag verringern"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Jahr erhöhen"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Jahr verringern"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"Aktiviert"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"Nicht aktiviert"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"Ausgewählt"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modusänderung"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Umschalttaste"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Eingabetaste"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Schieberegler: Tippen und halten"</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Für <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach oben"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Für <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach unten"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Für <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Für <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach rechts"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Entsperren"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Lautlos"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Ton ein"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Zum Hören der Tasten bei der Eingabe eines Passworts ist ein Headset erforderlich."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Zur Startseite navigieren"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Nach oben navigieren"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 76b9c1d..bcbf8fe 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Εσφαλμένος κωδικός αριθμός PIN!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Για ξεκλείδωμα, πατήστε το πλήκτρο Menu και, στη συνέχεια, το πλήκτρο 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Αριθμός έκτακτης ανάγκης"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Καμία υπηρεσία)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Καμία υπηρεσία."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Η οθόνη κλειδώθηκε."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Πατήστε \"Menu\" για ξεκλείδωμα ή για κλήση έκτακτης ανάγκης."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Πατήστε \"Μενού\" για ξεκλείδωμα."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Αντιγραφή"</string>
<string name="paste" msgid="5629880836805036433">"Επικόλληση"</string>
<string name="replace" msgid="5781686059063148930">"Αντικατάσταση???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Διαγραφή"</string>
<string name="copyUrl" msgid="2538211579596067402">"Αντιγραφή διεύθυνσης URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Επιλογή κειμένου..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Επιλογή κειμένου"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ προσθήκη στο λεξικό"</string>
<string name="inputMethod" msgid="1653630062304567879">"Μέθοδος εισόδου"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Ενέργειες κειμένου"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Απομένει λίγος ελεύθερος χώρος"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Αίτημα για ρύθμιση σύνδεσης Wi-Fi Direct από το <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Κάντε κλικ στο κουμπί OK για αποδοχή."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Αίτημα ρύθμισης σύνδεσης Wi-Fi Direct από τη διεύθυνση <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Καταχωρίστε το pin για να συνεχίσετε."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Το pin WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> πρέπει να καταχωριστεί στην ομότιμη συσκευή <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> για να συνεχιστεί η ρύθμιση της σύνδεσης"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Εισαγωγή χαρακτήρα"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Άγνωστη εφαρμογή"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Αποστολή μηνυμάτων SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Επιλογή λογαριασμού"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Αύξηση"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Μείωση"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Πατήστε και κρατήστε πατημένο το <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Πραγματοποιήστε κύλιση προς τα πάνω για αύξηση και προς τα κάτω για μείωση."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Αύξηση λεπτού"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Μείωση λεπτού"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Αύξηση ώρας"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Μείωση ώρας"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Ορισμός ΜΜ"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Ορισμός ΠΜ"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Επόμενος μήνας"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Προηγούμενος μήνας"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Επόμενη ημέρα"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Προηγούμενη μέρα"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Αύξηση έτους"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Προηγούμενο έτος"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"ελέγχθηκε"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"δεν επιλέχθηκε"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"επιλεγμένο"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Αλλαγή τρόπου"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Στοιχείο χειρισμού με δυνατότητα ολίσθησης. Πατήστε παρατεταμένα."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Κύλιση πάνω <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Κύλιση κάτω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Κύλιση αριστερά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Κύλιση δεξιά <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Ξεκλείδωμα"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Φωτογραφική μηχανή"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Αθόρυβο"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Ενεργοποίηση ήχου"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Πλήκτρο. Για να ακούσετε τον ήχο του πατήματος των πλήκτρων απαιτούνται ακουστικά."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Πλοήγηση στην αρχική σελίδα"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Πλοήγηση προς τα επάνω"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 27f31cf..261983e 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -859,6 +859,7 @@
<string name="copyUrl" msgid="2538211579596067402">"Copy URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Select text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Text selection"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ add to dictionary"</string>
<string name="inputMethod" msgid="1653630062304567879">"Input method"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Text actions"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Low on space"</string>
@@ -945,6 +946,8 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Wi-Fi Direct connection setup request from <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Click OK to accept."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Wi-Fi Direct connection setup request from <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Enter PIN to proceed."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"WPS pin <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> needs to be entered on the peer device <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> for connection setup to proceed"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct is on"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Touch for settings"</string>
<string name="select_character" msgid="3365550120617701745">"Insert character"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Unknown application"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Sending SMS messages"</string>
@@ -1038,8 +1041,8 @@
<string name="ime_action_done" msgid="8971516117910934605">"Done"</string>
<string name="ime_action_previous" msgid="1443550039250105948">"Prev"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Execute"</string>
- <string name="dial_number_using" msgid="5789176425167573586">"Dial number"\n", using <xliff:g id="NUMBER">%s</xliff:g>"</string>
- <string name="create_contact_using" msgid="4947405226788104538">"Create contact"\n", using <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"Dial number"\n" using <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"Create contact"\n" using <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"The following one or more applications request permission to access your account, now and in the future."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Do you want to allow this request?"</string>
<string name="grant_permissions_header_text" msgid="2722567482180797717">"Access Request"</string>
@@ -1107,34 +1110,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Select an account"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Increment"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrement"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tap and hold."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Slide up to increment and down to decrease."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Increment minute"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Decrement minute"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Increment hour"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Decrement hour"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Set p.m."</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Set a.m."</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Increment month"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Decrement month"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Increment day"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Decrement day"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Increment year"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Decrement year"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"ticked"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"not ticked"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"selected"</string>
@@ -1151,14 +1140,10 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="content_description_sliding_handle" msgid="7311938669217173870">"Sliding handle. Tap and hold."</string>
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
+ <string name="description_direction_up" msgid="1983114130441878529">"Up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_target_unlock" msgid="2228524900439801453">"Unlock"</string>
<string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silent"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index f718d33..76cde96 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"¡Código de PIN incorrecto!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, presiona el menú y luego 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número de emergencia"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Sin servicio)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Sin servicio"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Pantalla bloqueada."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Presiona el Menú para desbloquear o realizar una llamada de emergencia."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Presionar Menú para desbloquear."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Copiar"</string>
<string name="paste" msgid="5629880836805036433">"Pegar"</string>
<string name="replace" msgid="5781686059063148930">"¿Reemplazar?"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Eliminar"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ agregar al diccionario"</string>
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Poco espacio de almacenamiento"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Solicitud de configuración de conexión de Wi-Fi Direct desde <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Haz clic en Aceptar."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Solicitud de configuración de conexión de Wi-Fi Direct desde <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Ingresa el PIN para continuar."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Debes introducir el PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> en el otro dispositivo <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> para continuar con la configuración de conexión."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Insertar caracteres"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Aplicación desconocida"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Enviando mensajes SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Seleccionar una cuenta"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Decremento"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Mantenga presionado <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Deslízate hacia arriba para aumentar y hacia abajo para disminuir."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumentar minutos"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Disminuir minutos"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Aumentar horas"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Disminuir horas"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Establecer p.m."</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Establecer a.m."</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Aumentar mes"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Disminuir mes"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Aumentar día"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Disminuir día"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Aumentar año"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Disminuir año"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"marcado"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"no marcado"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"seleccionado"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Cambio de modo"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Mayúscula"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ingresar"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Asidero deslizante (tocar y mantener la presión)"</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Hacia abajo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Hacia la derecha para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Cámara"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Sonido activado"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tecla. Se requieren auriculares para escuchar el sonido de las teclas al ingresar una contraseña."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Desplazarse hasta la página principal"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Desplazarse hacia arriba"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 3842329b..8c88cca 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -196,7 +196,7 @@
<string name="permlab_sendSms" msgid="5600830612147671529">"enviar mensajes SMS"</string>
<string name="permdesc_sendSms" msgid="1946540351763502120">"Permite que la aplicación envíe mensajes SMS. Es posible que tengas que pagar si las aplicaciones malintencionadas envían mensajes sin tu confirmación."</string>
<string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"enviar mensajes SMS sin confirmación"</string>
- <string name="permdesc_sendSmsNoConfirmation" msgid="4477752891276276168">"Permite que la aplicación envíe mensajes SMS. Es posible que tengas que pagar por lo mensajes que las aplicaciones malintencionadas envíen sin tu confirmación."</string>
+ <string name="permdesc_sendSmsNoConfirmation" msgid="4477752891276276168">"Permite que la aplicación envíe mensajes SMS. Es posible que tengas que pagar por los mensajes que las aplicaciones malintencionadas envíen sin tu confirmación."</string>
<string name="permlab_readSms" msgid="4085333708122372256">"leer SMS o MMS"</string>
<string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Permite que la aplicación lea mensajes SMS almacenados en el tablet o en la tarjeta SIM. Las aplicaciones malintencionadas pueden leer los mensajes confidenciales."</string>
<string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Permite que la aplicación lea mensajes SMS almacenados en el teléfono o en la tarjeta SIM. Las aplicaciones malintencionadas pueden leer los mensajes confidenciales."</string>
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"El código PIN es incorrecto."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear el teléfono, pulsa la tecla de menú y, a continuación, pulsa 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número de emergencia"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Sin cobertura)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Sin servicio"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Pantalla bloqueada"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Pulsa la tecla de menú para desbloquear el teléfono o realizar una llamada de emergencia."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pulsa la tecla de menú para desbloquear la pantalla."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Copiar"</string>
<string name="paste" msgid="5629880836805036433">"Pegar"</string>
<string name="replace" msgid="5781686059063148930">"Sustituir???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Eliminar"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ añadir al diccionario"</string>
<string name="inputMethod" msgid="1653630062304567879">"Método de introducción de texto"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acciones de texto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Poco espacio"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Solicitud de configuración de conexión de Wi-Fi Direct procedente de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Haz clic en Aceptar para continuar."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Solicitud de configuración de conexión de Wi-Fi Direct procedente de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Introduce el PIN para continuar."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Debes introducir el PIN WPS (<xliff:g id="P2P_WPS_PIN">%1$s</xliff:g>) en el otro dispositivo (<xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>) para continuar con la configuración de conexión."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Insertar carácter"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Aplicación desconocida"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Enviando mensajes SMS..."</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Seleccionar una cuenta"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminuir"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Mantén pulsado <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Desliza el dedo hacia arriba para aumentar y hacia abajo para disminuir."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumentar minuto"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Disminuir minuto"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Aumentar hora"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Disminuir hora"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Establecer p.m."</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Establecer a.m."</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Aumentar mes"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Disminuir mes"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Aumentar día"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Disminuir día"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Aumentar año"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Disminuir año"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"seleccionado"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"no seleccionado"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"seleccionado"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Cambio de modo"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Mayús"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Intro"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Tirador deslizante (mantener pulsado)"</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Hacia abajo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Hacia la derecha para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Cámara"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Silencio"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Sonido activado"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Se necesitan auriculares para escuchar las teclas mientras se escribe una contraseña."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Ir al escritorio"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Desplazarse hacia arriba"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 26ffbd2..49dab56 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"پین کد اشتباه است!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"برای بازگشایی قفل، منو را فشار دهید و سپس 0 را فشار دهید."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"شماره اضطراری"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(فاقد سرویس)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"سرویسی وجود ندارد."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"صفحه قفل شد."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"برای بازگشایی قفل یا انجام تماس اضطراری روی منو فشار دهید."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"برای بازگشایی قفل روی منو فشار دهید."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"کپی"</string>
<string name="paste" msgid="5629880836805036433">"جای گذاری"</string>
<string name="replace" msgid="5781686059063148930">"جایگزین شود؟؟؟"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"حذف"</string>
<string name="copyUrl" msgid="2538211579596067402">"کپی URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"انتخاب متن..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"انتخاب متن"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ افزودن به فرهنگ لغت"</string>
<string name="inputMethod" msgid="1653630062304567879">"روش ورودی"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"عملکردهای متنی"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"فضا کم است"</string>
@@ -939,13 +939,17 @@
<item quantity="other" msgid="7915895323644292768">"شبکه های Wi-Fi موجود را باز کنید"</item>
</plurals>
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"اتصال به Wi-Fi ممکن نیست"</string>
- <string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" اتصال اینترنتی ضعیف است."</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" اتصال اینترنتی ضعیفی دارد."</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi Direct"</string>
<string name="wifi_p2p_turnon_message" msgid="2804722042556269129">"عملکرد Wi-Fi Direct شروع میشود. این کار عملکرد مشتری/نقطه دسترسی Wi-Fi را خاموش میکند."</string>
<string name="wifi_p2p_failed_message" msgid="1820097493844848281">"نمیتوانید Wi-Fi Direct را شروع کنید"</string>
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"درخواست راهاندازی Wi-Fi Direct از طرف <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> دریافت شد. برای قبول کردن، تأیید را کلیک کنید."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"درخواست راهاندازی Wi-Fi Direct از طرف <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> دریافت شد. برای ادامه پین را وارد کنید."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"پین WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> باید در دستگاه مرتبط شده <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> نیز وارد شود تا راهاندازی اتصال ادامه یابد."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"درج نویسه"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"برنامه ناشناس"</string>
<string name="sms_control_title" msgid="7296612781128917719">"ارسال پیامک ها"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"انتخاب یک حساب"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"افزایش"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"کاهش"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ضربه بزنید و نگه دارید."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"برای افزایش به بالا و برای کاهش به پایین بلغزانید."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"دقیقه افزایشی"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"دقیقه کاهشی"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"ساعت افزایشی"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"ساعت کاهشی"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"تنظیم ب.ظ"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"تنظیم ق.ظ"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"ماه افزایشی"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"ماه کاهشی"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"روز افزایشی"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"روز کاهشی"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"سال افزایشی"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"سال کاهشی"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"علامت زده"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"بدون علامت"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"انتخاب شد"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"تغییر حالت"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"کنترل کننده کشویی. ضربه زده و نگه دارید."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"بالا برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"پایین برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"چپ برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"راست برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"بازکردن قفل"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"دوربین"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ساکت"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"صدا روشن"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"کلید. برای شنیدن کلیدها هنگام تایپ یک گذرواژه به گوشی نیاز است."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"رفتن به صفحه اصلی"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"حرکت به بالا"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index fbb5d47..9d8c0a8 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Virheellinen PIN-koodi!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Poista lukitus painamalla Valikko-painiketta ja 0-näppäintä."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Hätänumero"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Katvealueella)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Ei yhteyttä."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Näyttö lukittu."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Poista lukitus tai soita hätäpuhelu painamalla Valikko-painiketta."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Poista lukitus painamalla Valikko-painiketta."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopioi"</string>
<string name="paste" msgid="5629880836805036433">"Liitä"</string>
<string name="replace" msgid="5781686059063148930">"Korvaa..."</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Poista"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopioi URL-osoite"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Tekstin valinta..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstin valinta"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ lisää sanakirjaan"</string>
<string name="inputMethod" msgid="1653630062304567879">"Syöttötapa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstitoiminnot"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Tila vähissä"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Suoran wifi-yhteyden muodostuspyyntö osoitteesta <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Hyväksy valitsemalla OK."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Suoran wifi-yhteyden muodostuspyyntö osoitteesta <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Jatka antamalla PIN-koodi."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"WPS-PIN-koodi <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> tulee merkitä vertaislaitteeseen <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>, jotta yhteyden muodostamista voidaan jatkaa"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Lisää merkki"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Tuntematon sovellus"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Tekstiviestien lähettäminen"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Valitse tili"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Lisää"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Vähennä"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> kosketa pitkään."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Kasvata tai pienennä arvoa liu\'uttamalla ylös tai alas."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Kasvata minuuttia"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Pienennä minuuttia"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Kasvata tuntia"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Pienennä tuntia"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Aseta ip"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Aseta ap"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Kasvata kuukautta"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Vähennä kuukautta"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Kasvata päivää"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Pienennä päivää"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Kasvata vuotta"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Pienennä vuotta"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"valittu"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"ei valittu"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"valittu"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Tilan muutos"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Liukuva valitsin. Kosketa pitkään."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Ylös: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Alas: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Vasemmalle: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Oikealle: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Poista lukitus"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Äänetön"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Ääni käytössä"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Näppäin. Tarvitset kuulokkeet kuullaksesi näppäimenpainallukset kirjoittaessasi salasanaa."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Siirry etusivulle"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Siirry ylös"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 32c884e..96b2a7a 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Le code PIN est incorrect !"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Pour déverrouiller le clavier, appuyez sur \"Menu\" puis sur 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Numéro d\'urgence"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Aucun service)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Aucun service"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Écran verrouillé"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Appuyez sur \"Menu\" pour déverrouiller le téléphone ou appeler un numéro d\'urgence"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Appuyez sur \"Menu\" pour déverrouiller le téléphone."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Copier"</string>
<string name="paste" msgid="5629880836805036433">"Coller"</string>
<string name="replace" msgid="5781686059063148930">"Remplacer..."</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Supprimer"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copier l\'URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Sélect. le texte..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Sélection de texte"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ ajouter au dictionnaire"</string>
<string name="inputMethod" msgid="1653630062304567879">"Mode de saisie"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Actions sur le texte"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Espace disponible faible"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Demande de configuration du Wi-Fi Direct de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Cliquez sur \"OK\" pour accepter."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Demande de configuration du Wi-Fi Direct de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Saisissez le code PIN pour continuer."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Afin de poursuivre la configuration de la connexion, vous devez saisir le code WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> sur l\'appareil associé <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Insérer un caractère"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Application inconnue"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Envoi de messages SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Sélectionner un compte"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Augmenter"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuer"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> appuyez de manière prolongée."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Faire glisser vers le haut pour augmenter et vers le bas pour diminuer"</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minute suivante"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minute précédente"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Heure suivante"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Heure précédente"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Définir la valeur PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Définir la valeur AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Mois suivant"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Mois précédent"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Jour suivant"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Jour précédent"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Année suivante"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Année précédente"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"coché"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"non coché"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"sélectionné"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Changement de mode"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Entrée"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Poignée coulissante. Appuyez de manière prolongée."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Vers le bas pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Vers la droite pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Déverrouiller"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Appareil photo"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Mode silencieux"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Son activé"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Touche : casque nécessaire pour entendre le son des touches lorsque vous saisissez un mot de passe."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Retour à l\'accueil"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Parcourir vers le haut"</string>
@@ -1186,7 +1167,7 @@
<string name="data_usage_limit_body" msgid="4313857592916426843">"Appuyez ici pour réactiver."</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Quota de données 2G-3G dépassé"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Quota de données 4G dépassé"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Quota données mobiles dépassé"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Quota utilisation données dépassé"</string>
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Quota de données Wi-Fi dépassé"</string>
<string name="data_usage_limit_snoozed_body" msgid="2932736326652880660">"<xliff:g id="SIZE">%s</xliff:g> au-delà de la limite spécifiée"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Données en arrière-plan limitées"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 6d43153..69c77f4 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Netočan PIN kôd!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Za otključavanje pritisnite Izbornik pa 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Broj hitne službe"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Nema usluge)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Nema usluge."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Zaslon zaključan."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Pritisnite Izbornik za otključavanje ili pozivanje hitnih službi."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pritisnite Izbornik za otključavanje."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopiraj"</string>
<string name="paste" msgid="5629880836805036433">"Zalijepi"</string>
<string name="replace" msgid="5781686059063148930">"Zamijeni…"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Izbriši"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopiraj URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Odabir teksta..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Odabir teksta"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ dodaj u rječnik"</string>
<string name="inputMethod" msgid="1653630062304567879">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Radnje s tekstom"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Prostora ima sve manje"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Zahtjev za postavljanje izravne Wi-Fi veze od <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Kliknite \"U redu\" za potvrdu."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Zahtjev za postavljanje izravne Wi-Fi veze s <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Unesite PIN da biste nastavili."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"WPS pin <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> treba unijeti na paralelni uređaj <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> da bi se uspostavljanje veze nastavilo"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Umetni znak"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Nepoznata aplikacija"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Slanje SMS poruka"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Odaberite račun"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Povećaj"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Smanji"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> dotaknite i držite."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Klizite prema gore za pomak unaprijed, a prema dolje za pomak unatrag."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Pomak unaprijed za jednu minutu"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Pomak unatrag za jednu minutu"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Pomak unaprijed za jedan sat"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Pomak unatrag za jedan sat"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Postavi PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Postavi AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Pomak unaprijed za jedan mjesec"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Pomak unatrag za jedan mjesec"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Pomak unaprijed za jedan dan"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Pomak unatrag za jedan dan"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Pomak unaprijed za jednu godinu"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Pomak unatrag za jednu godinu"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"označeno"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"nije označeno"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"odabran"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Promjena načina"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Klizna ručka. Dotaknite i držite."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Dolje za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Desno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Otključaj"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Fotoaparat"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Bešumno"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Zvuk je uključen"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tipka. Da bi se pri upisivanju zaporke čule tipke, potrebne su slušalice."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Kreni na početnu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Kreni gore"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 8db670d..b377f66 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Helytelen PIN-kód."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"A feloldáshoz nyomja meg a Menü, majd a 0 gombot."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Segélyhívó szám"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Nincs szolgáltatás)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Nincs szolgáltatás."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"A képernyő le van zárva."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"A feloldáshoz vagy segélyhívás kezdeményezéséhez nyomja meg a Menü gombot."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"A feloldáshoz nyomja meg a Menü gombot."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Másolás"</string>
<string name="paste" msgid="5629880836805036433">"Beillesztés"</string>
<string name="replace" msgid="5781686059063148930">"Csere???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Törlés"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL másolása"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Szöveg kijelölése..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Szöveg kijelölése"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ hozzáadás a szótárhoz"</string>
<string name="inputMethod" msgid="1653630062304567879">"Beviteli mód"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Műveletek szöveggel"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Kevés a hely"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Wi-Fi Direct kapcsolódási kérés a következőtől: <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Az elfogadáshoz kattintson az OK gombra."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Wi-Fi Direct csatlakoztatási kérés a következőtől: <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Adja meg a PIN-kódot a folytatáshoz."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"A csatlakoztatás folytatásához be kell írni a(z) <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> WPS PIN-kódot a partnereszközön (<xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>)"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Karakter beszúrása"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Ismeretlen alkalmazás"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS-ek küldése"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Fiók kiválasztása"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Növelés"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Csökkentés"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> érintse meg és tartsa"</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Csúsztassa fel a növeléshez és le a csökkentéshez."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Percek növelése"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Percek csökkentése"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Órák növelése"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Órák csökkentése"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Állítsa du. értékre"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Állítsa de. értékre"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Hónapok növelése"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Hónapok csökkentése"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Napok növelése"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Napok csökkentése"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Évek növelése"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Évek csökkentése"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"bejelölve"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"nincs bejelölve"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"bejelölve"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mód váltása"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Csúsztatható fogantyú. Érintse meg és tartsa."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Fel: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Le: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Balra: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Jobbra: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Feloldás"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Némítás"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Hang bekapcsolása"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Billentyű. Fülhallgató szükséges, ha hallani szeretné a billentyűket a jelszó megadása közben."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Ugrás a főoldalra"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Felfele mozgás"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index e67ef16..bcf14d3 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Kode PIN salah!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Untuk membuka, tekan Menu lalu 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nomor darurat"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Tidak ada layanan)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Tidak ada layanan."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Layar terkunci."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tekan Menu untuk membuka atau melakukan panggilan darurat."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tekan Menu untuk membuka."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Salin"</string>
<string name="paste" msgid="5629880836805036433">"Tempel"</string>
<string name="replace" msgid="5781686059063148930">"Ganti???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Hapus"</string>
<string name="copyUrl" msgid="2538211579596067402">"Salin URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Pilih teks..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Pemilihan teks"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ tambahkan ke kamus"</string>
<string name="inputMethod" msgid="1653630062304567879">"Metode masukan"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tindakan teks"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Ruang penyimpanan tinggal sedikit"</string>
@@ -895,7 +895,7 @@
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah diluncurkan aslinya."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"Skala"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"Selalu tampilkan"</string>
- <string name="screen_compat_mode_hint" msgid="2953716574198046484">"Aktifkan kembali ini dengan aplikasi Setelan > Aplikasi > Kelola"</string>
+ <string name="screen_compat_mode_hint" msgid="2953716574198046484">"Aktifkan kembali ini melalui Setelan > Aplikasi > Kelola aplikasi."</string>
<string name="smv_application" msgid="295583804361236288">"Aplikasi <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) telah melanggar kebijakan StrictMode yang diberlakukan secara otomatis."</string>
<string name="smv_process" msgid="5120397012047462446">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> telah melanggar kebijakan StrictMode yang diberlakukan secara otomatis."</string>
<string name="android_upgrading_title" msgid="378740715658358071">"Android sedang meningkatkan versi..."</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Permintaan penyiapan sambungan WiFI Langsung dari <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Klik OK untuk menerima."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Permintaan penyiapan sambungan WiFi Langsung dari <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Masukkan pin untuk melanjutkan."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Pin WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> harus dimasukkan pada perangkat rekan <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> agar penyiapan sambungan dapat dilanjutkan"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Sisipkan huruf"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Aplikasi tidak dikenal"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Mengirim pesan SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Pilih akun"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Penambahan"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Pengurangan"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ketuk dan tahan."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Geser ke atas untuk menambah dan ke bawah untuk mengurangi."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Menit penambahan"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Menit pengurangan"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Jam penambahan"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Jam pengurangan"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Menyetel PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Setel AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Bulan penambahan"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Bulan pengurangan"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Hari penambahan"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Hari pengurangan"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Tahun penambahan"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Tahun pengurangan"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"dicentang"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"tidak diperiksa"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"dipilih"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Pengubahan mode"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Gagang geser. Ketuk dan tahan."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Ke bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Ke kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Membuka gembok"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Senyap"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Suara hidup"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tombol. Perlu headset untuk mendengarkan suara tombol saat mengetik sandi."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigasi ke beranda"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigasi naik"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index a98d1d9..d7c9237 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -859,6 +859,7 @@
<string name="copyUrl" msgid="2538211579596067402">"Copia URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Seleziona testo..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selezione testo"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ aggiungi al dizionario"</string>
<string name="inputMethod" msgid="1653630062304567879">"Metodo inserimento"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Azioni testo"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Spazio in esaurimento"</string>
@@ -945,6 +946,8 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Richiesta di configurazione della connessione Wi-Fi Direct da <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Fai clic su OK per accettare."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Richiesta di configurazione della connessione Wi-Fi Direct da <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Inserisci il PIN per continuare."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Per la continuazione della configurazione della connessione è necessario inserire un codice PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> sul dispositivo peer <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct è attivo"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Tocca per le impostazioni"</string>
<string name="select_character" msgid="3365550120617701745">"Inserisci carattere"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Applicazione sconosciuta"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Invio SMS"</string>
@@ -1107,34 +1110,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Seleziona un account"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Aumenta"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuisci"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tocca e tieni premuto il numero <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Scorri verso l\'alto per aumentare il valore e verso il basso per diminuirlo."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumenta minuto"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Diminuisci minuto"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Aumenta ora"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Diminuisci ora"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Imposta PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Imposta AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Aumenta mese"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Diminuisci mese"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Aumenta giorno"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Diminuisci giorno"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Aumenta anno"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Diminuisci anno"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"selezionata"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"non selezionato"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"selezionato"</string>
@@ -1151,14 +1140,10 @@
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maiuscolo"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Invio"</string>
<string name="content_description_sliding_handle" msgid="7311938669217173870">"Maniglia scorrevole. Tocca e tieni premuto."</string>
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
+ <string name="description_direction_up" msgid="1983114130441878529">"Su per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Giù per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"A sinistra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"A destra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_target_unlock" msgid="2228524900439801453">"Sblocca"</string>
<string name="description_target_camera" msgid="969071997552486814">"Fotocamera"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silenzioso"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 342e0ea..08f84c0 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -126,7 +126,7 @@
<string name="contentServiceSync" msgid="8353523060269335667">"סינכרון"</string>
<string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"סינכרון"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"יש מחיקות רבות מדי של <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
- <string name="low_memory" product="tablet" msgid="2292820184396262278">"שטח האחסון בטבלט מלא! מחק קבצים כדי לפנות שטח."</string>
+ <string name="low_memory" product="tablet" msgid="2292820184396262278">"שטח האחסון בטבלט מלא! מחק קבצים כדי לפנות מקום."</string>
<string name="low_memory" product="default" msgid="6632412458436461203">"שטח האחסון בטלפון מלא! מחק חלק מהקבצים כדי לפנות שטח."</string>
<string name="me" msgid="6545696007631404292">"אני"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"אפשרויות טבלט"</string>
@@ -298,7 +298,7 @@
<string name="permlab_movePackage" msgid="728454979946503926">"העבר משאבי יישומים"</string>
<string name="permdesc_movePackage" msgid="6323049291923925277">"מאפשר ליישום להעביר משאבי יישומים ממדיה פנימית לחיצונית ולהיפך."</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"קרא נתונים רגישים של יומן רישום"</string>
- <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"מאפשר ליישום לקרוא מקובצי היומן השונים של המערכת. כך מתאפשר לו לגלות מידע כללי על הפעולות שלך בטבלט, שעשוי לכלול מידע אישי או פרטי."</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"מאפשר ליישום לקרוא מקובצי היומן השונים של המערכת. כך הוא יכול לגלות מידע כללי על הפעולות שלך בטבלט, שעשוי לכלול מידע אישי או פרטי."</string>
<string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"מאפשר ליישום לקרוא מקובצי יומני הרישום השונים של המערכת. כך הוא יכול לגלות מידע כללי על הפעולות שלך בטלפון, מידע שעשוי לכלול מידע אישי או פרטי."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"קרא/כתוב במשאבים בבעלות diag"</string>
<string name="permdesc_diagnostic" msgid="3121238373951637049">"מאפשר ליישום לקרוא ולכתוב בכל משאב שבבעלות קבוצת diag; לדוגמה, קבצים ב-/dev. פעולה זו עשויה להשפיע על היציבות והאבטחה של המערכת. היצרן או המפעיל בלבד יכולים להשתמש באפשרות זו לצורך אבחונים ספציפיים לחומרה."</string>
@@ -385,7 +385,7 @@
<string name="permlab_manageUsb" msgid="1113453430645402723">"נהל העדפות ואישורים עבור מכשירי USB"</string>
<string name="permdesc_manageUsb" msgid="6148489202092166164">"מאפשר ליישום לנהל העדפות ואישורים עבור מכשירי USB."</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"יישם פרוטוקול MTP"</string>
- <string name="permdesc_accessMtp" msgid="6532961200486791570">"מאפשר גישה למנהל התקן MTP של הליבה כדי ליישם פרוטוקול ה-USB של ה-MTP."</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"מאפשר גישה למנהל התקן MTP של הליבה כדי ליישם את פרוטוקול ה-USB של ה-MTP."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"בדוק חומרה"</string>
<string name="permdesc_hardware_test" msgid="3668894686500081699">"מאפשר ליישום לשלוט בציוד היקפי מסוגים שונים לצורך בדיקת חומרה."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"התקשר ישירות למספרי טלפון"</string>
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"קוד PIN שגוי!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"כדי לבטל את הנעילה, לחץ על \'תפריט\' ולאחר מכן על 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"מספר חירום"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(אין שירות)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"אין שירות"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"המסך נעול."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"לחץ על \'תפריט\' כדי לבטל את הנעילה או כדי לבצע שיחת חירום."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"לחץ על \'תפריט\' כדי לבטל את הנעילה."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"העתק"</string>
<string name="paste" msgid="5629880836805036433">"הדבק"</string>
<string name="replace" msgid="5781686059063148930">"להחליף???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"מחק"</string>
<string name="copyUrl" msgid="2538211579596067402">"העתק כתובת אתר"</string>
<string name="selectTextMode" msgid="6738556348861347240">"בחר טקסט..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"בחירת טקסט"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ הוסף למילון"</string>
<string name="inputMethod" msgid="1653630062304567879">"שיטת קלט"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"פעולות טקסט"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"חסר שטח"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"בקשה להגדרת חיבור Wi-Fi ישיר מאת <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. לחץ על \'אישור\' כדי לקבל."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"בקשה להתקנת חיבור Wi-Fi ישיר מאת <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. הזן PIN כדי להמשיך."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"יש להזין את ה-PIN של WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> במכשיר העמית <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> כדי להמשיך בהגדרת החיבור"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"הוסף תו"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"יישום לא ידוע"</string>
<string name="sms_control_title" msgid="7296612781128917719">"שולח הודעות SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"בחר חשבון"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"הגדל"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"הפחת"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> הקש והחזק."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"הסט מעלה כדי להוסיף ומטה כדי להפחית."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"הוסף דקה"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"הפחת דקה"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"הוסף שעה"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"הפחת שעה"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"הגדר PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"הגדר AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"הוסף חודש"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"הפחת חודש"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"הוסף יום"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"הפחת יום."</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"הוסף שנה"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"הפחת שנה"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"מסומן"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"לא מסומן"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"נבחר"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"שינוי מצב"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"ידית להחלקה. הקש והחזק."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"\'למעלה\' עבור <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"\'למטה\' עבור <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"\'שמאל\' עבור <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"\'ימין\' עבור <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"בטל נעילה"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"מצלמה"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"שקט"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"הקול פועל"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"מקש. נדרשות אוזניות כדי לשמוע את המקשים בעת הקלדת סיסמה."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"נווט לדף הבית"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"נווט למעלה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 116664d..f5a30e8 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PINコードが正しくありません。"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"MENU、0キーでロック解除"</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"緊急通報番号"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(通信サービスなし)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"通信サービスはありません。"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"画面ロック中"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"MENUキーでロック解除(または緊急通報)"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"MENUキーでロック解除"</string>
@@ -855,11 +855,14 @@
<string name="copy" msgid="2681946229533511987">"コピー"</string>
<string name="paste" msgid="5629880836805036433">"貼り付け"</string>
<string name="replace" msgid="5781686059063148930">"置換..."</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"削除"</string>
<string name="copyUrl" msgid="2538211579596067402">"URLをコピー"</string>
<string name="selectTextMode" msgid="6738556348861347240">"テキストを選択..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"テキスト選択"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (2839899368418071843) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"入力方法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"テキスト操作"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"空き容量低下"</string>
@@ -946,6 +949,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"<xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>からのWi-Fi Direct接続設定リクエスト。受け入れるには[OK]をクリックします。"</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"<xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>からのWi-Fi Direct接続設定リクエスト。続行するにはPINを入力します。"</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"接続設定を続けるには、ピアデバイス<xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>でWPS PIN <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g>を入力する必要があります"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"文字を挿入"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"不明なアプリケーション"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMSメッセージの送信中"</string>
@@ -1151,8 +1158,7 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"モードを変更"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"スライダーハンドルです。タップして押し続けます。"</string>
<!-- no translation found for description_direction_up (1983114130441878529) -->
<skip />
<!-- no translation found for description_direction_down (4294993639091088240) -->
@@ -1161,14 +1167,10 @@
<skip />
<!-- no translation found for description_direction_right (4296057241963012862) -->
<skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="description_target_unlock" msgid="2228524900439801453">"ロックを解除"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"カメラ"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"マナーモード"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"サウンドON"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"キー。パスワードの入力中にキーの音を聞くにはヘッドセットが必要です。"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"ホームへ移動"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"上へ移動"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index cd011ba..73ddd03 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 코드가 잘못되었습니다."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"잠금해제하려면 메뉴를 누른 다음 0을 누릅니다."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"비상 전화번호"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(서비스 안됨)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"서비스 불가"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"화면 잠김"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"비상 전화를 걸거나 잠금해제하려면 메뉴를 누르세요."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"잠금해제하려면 메뉴를 누르세요."</string>
@@ -854,12 +854,12 @@
<string name="cut" msgid="3092569408438626261">"잘라내기"</string>
<string name="copy" msgid="2681946229533511987">"복사"</string>
<string name="paste" msgid="5629880836805036433">"붙여넣기"</string>
- <string name="replace" msgid="5781686059063148930">"\'바꾸기\'"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="replace" msgid="5781686059063148930">"바꾸기..."</string>
+ <string name="delete" msgid="6098684844021697789">"삭제"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL 복사"</string>
<string name="selectTextMode" msgid="6738556348861347240">"텍스트 선택..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"텍스트 선택"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"사전에 추가"</string>
<string name="inputMethod" msgid="1653630062304567879">"입력 방법"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"텍스트 작업"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"저장공간 부족"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"<xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>에서 Wi-Fi Direct 연결 설정을 요청합니다. 수락하려면 확인을 클릭하세요."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"<xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>에서 Wi-Fi Direct 연결 설정을 요청합니다. 계속 진행하려면 PIN을 입력하세요."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"연결 설정을 계속하려면 WPS 핀(<xliff:g id="P2P_WPS_PIN">%1$s</xliff:g>)을 피어 기기(<xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>)에 입력해야 합니다."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"문자 삽입"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"알 수 없는 애플리케이션"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS 메시지를 보내는 중"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"계정 선택"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"올리기"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"줄이기"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> 길게 탭하세요."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"올리려면 위로 슬라이드하고 줄이려면 아래로 슬라이드합니다."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"\'분\'을 올립니다."</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"\'분\'을 줄입니다."</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"\'시\'를 올립니다."</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"\'시\'를 줄입니다."</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM 설정"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM 설정"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"\'월\'을 올립니다."</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"\'월\'을 줄입니다."</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"\'날짜\'를 올립니다."</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"\'날짜\'를 줄입니다."</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"\'연도\'를 올립니다."</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"\'연도\'를 줄입니다."</string>
<string name="checkbox_checked" msgid="7222044992652711167">"확인"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"선택 안함"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"선택됨"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"모드 변경"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift 키"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 키"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"슬라이딩 핸들을 길게 탭하세요."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> 방향으로 위"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> 방향으로 아래"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> 방향으로 왼쪽"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> 방향으로 오른쪽"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"잠금 해제"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"카메라"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"무음"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"사운드 켜기"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"키. 비밀번호를 입력할 때 키 소리를 들으려면 헤드셋이 필요합니다."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"홈 탐색"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"위로 탐색"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 412babb..a366b60 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Neteisingas PIN kodas!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Jei norite atrakinti, paspauskite „Meniu“ ir 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Pagalbos numeris"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(nėra paslaugos)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Nėra paslaugos."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ekranas užrakintas."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Paspauskite „Meniu“, kad atrakintumėte ar skambintumėte pagalbos numeriu."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Paspauskite „Meniu“, jei norite atrakinti."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopijuoti"</string>
<string name="paste" msgid="5629880836805036433">"Įklijuoti"</string>
<string name="replace" msgid="5781686059063148930">"Pakeisti???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Ištrinti"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopijuoti URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Pasirinkti tekstą..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Teksto pasirinkimas"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ pridėti prie žodyno"</string>
<string name="inputMethod" msgid="1653630062304567879">"Įvesties būdas"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksto veiksmai"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mažai vietos"</string>
@@ -946,6 +946,8 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"„Wi-Fi“ tiesioginio ryšio užklausa iš <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Jei norite sutikti, spustelėkite „Gerai“."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Tiesioginio „Wi-Fi“ ryšio sąrankos užklausa iš <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Jei norite tęsti, įveskite PIN kodą."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"WPS PIN kodą <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> reikia įvesti lygiaverčiame įrenginyje <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>, kad būtų toliau atliekama ryšio sąranka"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"„Wi-Fi Direct“ įjungta"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Jei norite peržiūrėti nustatymus, palieskite"</string>
<string name="select_character" msgid="3365550120617701745">"Įterpti simbolį"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Nežinoma programa"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS pranešimų siuntimas"</string>
@@ -1108,34 +1110,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Pasirinkti paskyrą"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Padidinti"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Sumažinti"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Palieskite <xliff:g id="VALUE">%s</xliff:g> ir laikykite palietę."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Slinkite aukštyn, kad būtų parodytas padidėjimas, ir žemyn, kad būtų parodytas sumažėjimas."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Padidėjimo minutė"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Sumažėjimo minutė"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Padidėjimo valanda"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Sumažėjimo valanda"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Nustatyti po pusiaudienio"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Nustatyti prieš pusiaudienį"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Padidėjimo mėnuo"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Sumažėjimo mėnuo"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Padidėjimo diena"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Sumažėjimo diena"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Padidėjimo metai"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Sumažėjimo metai"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"pažymėtas"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"nepatikrinta"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"pasirinkta"</string>
@@ -1151,24 +1139,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Režimo keitimas"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Įvesti"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Slydimo valdymas. Palieskite ir laikykite."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Aukštyn į <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Žemyn į <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Kairėn į <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Dešinėn į <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Atrakinti"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Vaizdo kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Begarsis"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Garsas įjungtas"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Klavišai. Jei norite įvesdami slaptažodį girdėti klavišų garsus, reikia ausinių."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Naršyti pagrindinį puslapį"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Naršyti į viršų"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 267425c..efedb86 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN kods nav pareizs."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Lai atbloķētu, nospiediet Izvēlne, pēc tam 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Ārkārtas numurs"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Nav pakalpojuma)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Nav pakalpojuma."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ekrāns ir bloķēts."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Nospiediet Izvēlne, lai atbloķētu, vai veiciet ārkārtas zvanu."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Lai atbloķētu, nospiediet vienumu Izvēlne."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopēt"</string>
<string name="paste" msgid="5629880836805036433">"Ielīmēt"</string>
<string name="replace" msgid="5781686059063148930">"Aizstāt"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Dzēst"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopēt URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Atlasīt tekstu..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Teksta atlase"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ pievienot vārdnīcai"</string>
<string name="inputMethod" msgid="1653630062304567879">"Ievades metode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksta darbības"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Maz brīvas vietas"</string>
@@ -946,6 +946,8 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Wi-Fi Direct savienojuma iestatīšanas pieprasījums no adreses <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Noklikšķiniet uz Labi, lai apstiprinātu."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Wi-Fi Direct savienojuma iestatīšanas pieprasījums no adreses <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Lai turpinātu, ievadiet PIN."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Lai turpinātu savienojuma iestatīšanu, vienādranga ierīcē <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> ir jāievada WPS PIN <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g>."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct ir ieslēgts"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Pieskarieties, lai piekļūtu iestatījumiem."</string>
<string name="select_character" msgid="3365550120617701745">"Ievietojiet rakstzīmi"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Nezināma lietojumprogramma"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Īsziņu sūtīšana"</string>
@@ -1039,8 +1041,8 @@
<string name="ime_action_done" msgid="8971516117910934605">"Gatavs"</string>
<string name="ime_action_previous" msgid="1443550039250105948">"Iepr."</string>
<string name="ime_action_default" msgid="2840921885558045721">"Izpildīt"</string>
- <string name="dial_number_using" msgid="5789176425167573586">"Sastādiet numuru,"\n"izmantojot <xliff:g id="NUMBER">%s</xliff:g>"</string>
- <string name="create_contact_using" msgid="4947405226788104538">"Izveidot kontaktpersonu,"\n"izmantojot šo numuru: <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"Sastādiet numuru"\n"izmantojot <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"Izveidot kontaktpersonu"\n"izmantojot šo numuru: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Viena vai vairākas no tālāk minētajām lietojumprogrammām pieprasīja atļauju piekļūt jūsu kontam tagad un nākotnē."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Vai vēlaties atļaut šo pieprasījumu?"</string>
<string name="grant_permissions_header_text" msgid="2722567482180797717">"Piekļuves pieprasījums"</string>
@@ -1108,34 +1110,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Atlasīt kontu"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Palielināt"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Samazināt"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g>: pieskarieties un turiet nospiestu."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Bīdiet uz augšu, lai palielinātu vērtību, un uz leju, lai to samazinātu."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Palielināt minūtes vērtību"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Samazināt minūtes vērtību"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Palielināt stundas vērtību"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Samazināt stundas vērtību"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Iestatīt pēcpusdienas laiku"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Iestatīt priekšpusdienas laiku"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Palielināt mēneša vērtību"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Samazināt mēneša vērtību"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Palielināt datuma vērtību"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Samazināt datuma vērtību"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Palielināt gada vērtību"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Samazināt gada vērtību"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"atzīmēta"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"nav atzīmēta"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"atlasīta"</string>
@@ -1151,24 +1139,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Režīma maiņa"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Pārslēgšanas taustiņš"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ievadīšanas taustiņš"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Bīdāms rokturis. Pieskarieties tam un turiet to nospiestu."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Bīdiet uz augšu, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Bīdiet uz leju, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Bīdiet pa kreisi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Bīdiet pa labi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Atbloķēt"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Klusums"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Skaņa ieslēgta"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Taustiņš. Lai, rakstot paroli, dzirdētu taustiņu signālus, nepieciešamas austiņas."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Pārvietoties uz sākuma ekrānu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Pārvietoties augšup"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 41cf2e6..281363f 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -444,7 +444,7 @@
<string name="permlab_createNetworkSockets" msgid="9121633680349549585">"akses penuh Internet"</string>
<string name="permdesc_createNetworkSockets" msgid="4593339106921772192">"Membenarkan aplikasi membuat soket rangkaian."</string>
<string name="permlab_writeApnSettings" msgid="505660159675751896">"mengubah/memintas tetapan dan lalu lintas rangkaian"</string>
- <string name="permdesc_writeApnSettings" msgid="2369786339323021771">"Membenarkan sesuatu aplikasi untuk menukar tetapan rangkaian dan untuk memintas dan memeriksa semua trafik rangkaian, contohnya untuk menukar proksi dan port mana-mana APN. Aplikasi berniat jahat boleh mengawasi, mengubah hala, atau mengubah suai paket rangkaian tanpa pengetahuan anda."</string>
+ <string name="permdesc_writeApnSettings" msgid="2369786339323021771">"Membenarkan sesuatu aplikasi untuk menukar tetapan rangkaian dan untuk memintas dan memeriksa semua lalu lintas rangkaian, contohnya untuk menukar proksi dan port mana-mana APN. Aplikasi berniat jahat boleh mengawasi, mengubah hala atau mengubah suai paket rangkaian tanpa pengetahuan anda."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"tukar kesambungan rangkaian"</string>
<string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Membenarkan aplikasi menukar keadaan kesambungan rangkaian."</string>
<string name="permlab_changeTetherState" msgid="2702121155761140799">"Tukar kesambungan bertambat"</string>
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Kod PIN salah!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Untuk membuka kunci, tekan Menu, kemudian 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nombor kecemasan"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Tiada perkhidmatan)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Tiada perkhidmatan."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skrin dikunci."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tekan Menu untuk menyahsekat atau membuat panggilan kecemasan."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tekan Menu untuk membuka kunci."</string>
@@ -674,7 +674,7 @@
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Anda telah mencuba untuk membuka kunci tablet dengan salah sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, tablet akan ditetapkan semula kepada tetapan lalai kilang dan semua data pengguna akan hilang."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Anda telah mencuba untuk membuka kunci telefon dengan salah sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, telefon akan ditetapkan semula kepada tetapan lalai kilang dan semua data pengguna akan hilang."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Anda telah mencuba untuk membuka kunci tablet secara salah sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Tablet kini akan ditetapkan semula ke tetapan lalai kilang."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Anda telah mencuba untuk membuka kunci telefon secara salah sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Telefon kini akan ditetapkan semula ke tetapan lalai kilang."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Anda telah mencuba untuk membuka kunci telefon secara salah sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Telefon kini akan ditetapkan semula kepada tetapan lalai kilang."</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Cuba lagi dalam <xliff:g id="NUMBER">%d</xliff:g> saat."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Lupa corak?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Buka kunci akaun"</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Salin"</string>
<string name="paste" msgid="5629880836805036433">"Tampal"</string>
<string name="replace" msgid="5781686059063148930">"Ganti???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Padam"</string>
<string name="copyUrl" msgid="2538211579596067402">"Salin URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Pilih teks..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Pemilihan teks"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ tambah ke kamus"</string>
<string name="inputMethod" msgid="1653630062304567879">"Kaedah input"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tindakan teks"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Kekurangan ruang"</string>
@@ -899,8 +899,8 @@
<string name="smv_application" msgid="295583804361236288">"Aplikasi <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) telah melanggar dasar Mod Tegasnya sendiri."</string>
<string name="smv_process" msgid="5120397012047462446">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> telah melanggar dasar Mod Tegasnya sendiri."</string>
<string name="android_upgrading_title" msgid="378740715658358071">"Android sedang menaik taraf..."</string>
- <string name="android_upgrading_apk" msgid="274409861603566003">"Mengoptimumkan aplikasi <xliff:g id="NUMBER_0">%1$d</xliff:g> <xliff:g id="NUMBER_1">%2$d</xliff:g> ."</string>
- <string name="android_upgrading_starting_apps" msgid="7959542881906488763">"Memulakan aplikasi"</string>
+ <string name="android_upgrading_apk" msgid="274409861603566003">"Mengoptimumkan aplikasi <xliff:g id="NUMBER_0">%1$d</xliff:g> daripada <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="android_upgrading_starting_apps" msgid="7959542881906488763">"Memulakan aplikasi."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"But akhir."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> dijalankan"</string>
<string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Pilih untuk bertukar kepada aplikasi"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Permintaan persediaan sambungan Wi-Fi Langsung dari <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Klik OK untuk menerima."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Permintaan persediaan sambungan Wi-Fi Langsung dari <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Masukkan pin untuk meneruskan."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Pin WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> perlu dimasukkan pada peranti rakan <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> untuk penyediaan sambungan untuk meneruskan"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Masukkan aksara"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Aplikasi tidak dikenali"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Menghantar mesej SMS"</string>
@@ -1083,8 +1087,8 @@
<string name="progress_unmounting" product="default" msgid="5556813978958789471">"Menyahlekap kad SD..."</string>
<string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Memadamkan storan USB..."</string>
<string name="progress_erasing" product="default" msgid="2115214724367534095">"Memadamkan kad SD..."</string>
- <string name="format_error" product="nosdcard" msgid="6299769563624776948">"Tidak dapat memadam storan USB."</string>
- <string name="format_error" product="default" msgid="7315248696644510935">"Tidak dapat memadam kad SD."</string>
+ <string name="format_error" product="nosdcard" msgid="6299769563624776948">"Tidak dapat memadamkan storan USB."</string>
+ <string name="format_error" product="default" msgid="7315248696644510935">"Tidak dapat memadamkan kad SD."</string>
<string name="media_bad_removal" msgid="7960864061016603281">"Kad SD telah dikeluarkan sebelum dinyahlekap."</string>
<string name="media_checking" product="nosdcard" msgid="418188720009569693">"Storan USB sedang disemak buat masa ini."</string>
<string name="media_checking" product="default" msgid="7334762503904827481">"Kad SD sedang disemak buat masa ini."</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Pilih akaun"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Kenaikan"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Penyusutan"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> ketik dan tahan."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Luncurkan ke atas untuk kenaikan dan ke bawah untuk penyusutan."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minit kenaikan"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minit penyusutan"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Jam kenaikan"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Jam penyusutan"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Tetapkan PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Tetapkan AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Bulan kenaikan"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Bulan penyusutan"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Hari kenaikan"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Hari penyusutan"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Tahun kenaikan"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Tahun penyusutan"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"ditandakan"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"tidak ditandakan"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"dipilih"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Perubahan mod"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Masuk"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Pemegang gelongsor. Ketik dan tahan."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Buka kunci"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Senyap"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Bunyi dihidupkan"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Kekunci. Set kepala diperlukan untuk mendengar kekunci semasa menaip kata laluan."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigasi laman utama"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigasi ke atas"</string>
@@ -1182,7 +1163,7 @@
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Data 2G-3G dilumpuhkan"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Data 4G dilumpuhkan"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Data mudah alih dilumpuhkan"</string>
- <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Data Wi-Fi dinyahdayakan"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Data Wi-Fi dilumpuhkan"</string>
<string name="data_usage_limit_body" msgid="4313857592916426843">"Sentuh untuk mendayakan"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Melebihi had data 2G-3G"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Melebihi had data 4G"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 23f69e3..8f04350 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -216,11 +216,11 @@
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"endre innstillingene for brukergrensesnitt"</string>
<string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillater applikasjonen å endre gjeldende innstillinger, slik som språk eller skriftstørrelse."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"aktiver bilmodus"</string>
- <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Tillater et program å aktivere bilmodus."</string>
+ <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Tillater applikasjoner å aktivere bilmodus."</string>
<string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"avslutt bakgrunnsprosesser"</string>
- <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Tillater et program å avslutte bakgrunnsprosesser for andre programmer, selv om det er nok minne."</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Tillater applikasjoner å avslutte bakgrunnsprosesser for andre applikasjoner, selv om det er nok minne."</string>
<string name="permlab_forceStopPackages" msgid="1447830113260156236">"fremtving stopp av andre programmer"</string>
- <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Tillater et program å framtvinge stopp av andre programmer."</string>
+ <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Tillater applikasjoner å tvinge andre applikasjoner til å stoppe."</string>
<string name="permlab_forceBack" msgid="1804196839880393631">"tvinge applikasjoner til å lukkes"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Lar applikasjonen tvinge enhver aktivitet som er i forgrunnen til å lukkes og gå tilbake. Vanlige applikasjoner bør aldri trenge dette."</string>
<string name="permlab_dump" msgid="1681799862438954752">"hente intern systemtilstand"</string>
@@ -261,7 +261,7 @@
<string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Lar programmet levere sine egne inndatahendelser (tastetrykk osv.) til andre programmer. Skadelige programmer kan bruke dette til å ta over nettbrettet."</string>
<string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Lar applikasjonen levere sine egne inndatahendelser (tastetrykk osv.) til andre applikasjoner. Ondsinnede applikasjoner kan bruke dette til å ta over telefonen."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"ta opp hva som skrives og gjøres"</string>
- <string name="permdesc_readInputState" msgid="5132879321450325445">"Lar applikasjonen overvåke tastetrykk selv når interaksjonen er med et annet program (som å skrive inn et passord). Vanlige applikasjoner bør aldri trenge dette."</string>
+ <string name="permdesc_readInputState" msgid="5132879321450325445">"Lar applikasjoner overvåke tastetrykk selv når interaksjonen er med andre applikasjoner (som å skrive inn et passord). Vanlige applikasjoner bør aldri trenge dette."</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"binde til en inndatametode"</string>
<string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Lar applikasjonen binde til toppnivågrensesnittet for en inndatametode. Vanlige applikasjoner bør aldri trenge dette."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"binde til en teksttjeneste"</string>
@@ -296,15 +296,15 @@
<string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Lar programmet frigjøre lagringsplass på nettbrettet ved å slette filer fra programmets buffermappe. Tilgangen er svært begrenset, vanligvis til systemprosessen."</string>
<string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Lar applikasjonen frigjøre lagringsplass ved å slette filer i applikasjoners hurtigbufferkatalog. Tilgangen er vanligvis sterkt begrenset, til systemprosesser."</string>
<string name="permlab_movePackage" msgid="728454979946503926">"Flytter programressurser"</string>
- <string name="permdesc_movePackage" msgid="6323049291923925277">"Gir et program tillatelse til å flytte programressurser fra interne til eksterne medier og omvendt."</string>
+ <string name="permdesc_movePackage" msgid="6323049291923925277">"Gir applikasjoner tillatelse til å flytte applikasjonsressurser fra interne til eksterne medier og omvendt."</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"les sensitive loggdata"</string>
<string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Lar programmet lese fra diverse loggfiler på systemet. Disse inneholder generell informasjon om hva som gjøres med nettbrettet, og kan inneholde personlig eller privat informasjon."</string>
<string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Lar programmet lese fra diverse loggfiler på systemet. Disse inneholder generell informasjon om hva som gjøres med telefonen, og kan inneholde personlig eller privat informasjon."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"lese/skrive ressurser eid av diag"</string>
<string name="permdesc_diagnostic" msgid="3121238373951637049">"Lar applikasjonen lese og skrive enhver ressurs eid av gruppen diag; for eksempel, filer i /dev. Dette kan potensielt påvirke systemets sikkerhet og stabilitet. Dette bør KUN brukes for maskinvarespesifikke diagnoseverktøy laget av operatøren eller produsenten."</string>
<string name="permlab_changeComponentState" msgid="79425198834329406">"aktivere eller deaktigere applikasjonskomponenter"</string>
- <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Lar programmet endre på hvorvidt en komponent i et annet program er aktivert eller ikke. Skadelige programmer kan bruke dette til å deaktivere viktige nettbrettfunksjoner. Denne rettigheten må brukes med forsiktighet, ettersom det er mulig å få programkomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string>
- <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Lar programmet endre på hvorvidt en komponent i et annet program er aktivert eller ikke. Skadelige programmer kan bruke dette til å deaktivere viktige nettbrettfunksjoner. Denne rettigheten må brukes med forsiktighet, ettersom det er mulig å få programkomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Lar applikasjoner endre på hvorvidt komponenter i andre applikasjoner er aktivert eller ikke. Skadelige applikasjoner kan bruke dette til å deaktivere viktige nettbrettfunksjoner. Denne rettigheten må brukes med forsiktighet, ettersom det er mulig å få applikasjonskomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Lar applikasjoner endre på hvorvidt en komponent i andre applikasjoner er aktivert eller ikke. Skadelige applikasjoner kan bruke dette til å deaktivere viktige nettbrettfunksjoner. Denne rettigheten må brukes med forsiktighet, ettersom det er mulig å få applikasjonskomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string>
<string name="permlab_setPreferredApplications" msgid="3393305202145172005">"velge foretrukne applikasjoner"</string>
<string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Lar applikasjonen endre valgene for foretrukne applikasjoner. Dette kan gi ondsinnede applikasjoner tilgang til i det stille å endre hvilke applikasjoner som kjøres, og slik gi seg ut til å være en eksisterende applikasjon og samle private data."</string>
<string name="permlab_writeSettings" msgid="1365523497395143704">"endre globale systeminnstillinger"</string>
@@ -331,7 +331,7 @@
<string name="permdesc_writeProfile" product="default" msgid="6431297330378229453">"Gir applikasjonen tillatelse til å endre eller legge til personlig profilinformasjon lagret på enheten, for eksempel navn og kontaktinformasjon. Dette betyr at andre applikasjoner kan identifisere deg og sende din profilinformasjon til andre."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"les kalenderhendelser og konfidensiell informasjon"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="5665520896961671949">"Lar en applikasjon lese alle kalenderhendelser lagret på nettbrettet, herunder de som tilhører venner eller kollegaer. En skadelig applikasjon med denne tillatelsen kan trekke ut personlige opplysninger fra disse kalenderne uten eiernes viten."</string>
- <string name="permdesc_readCalendar" product="default" msgid="2915879965326930312">"Lar et program lese alle kalenderhendelser lagret på telefonen, herunder de som tilhører venner eller kollegaer. Et skadelig program med denne tillatelsen kan trekke ut personlige opplysninger fra disse kalenderne uten eiernes viten."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="2915879965326930312">"Lar applikasjoner lese alle kalenderhendelser lagret på telefonen, herunder de som tilhører venner eller kollegaer. Skadelige applikasjon med denne tillatelsen kan trekke ut personlige opplysninger fra disse kalenderne uten eiernes viten."</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"legge til eller endre kalenderhendelser og sende e-post til gjester uten eiernes viten"</string>
<string name="permdesc_writeCalendar" msgid="5368129321997977226">"Lar en applikasjon sende hendelsesinvitasjoner som kalendereier, og legge til, fjerne og endre hendelser som du kan endre på enheten, herunder de som tilhører venner eller kollegaer. En skadelig applikasjon med denne tillatelsen kan sende nettsøppel-e-post som synes å komme fra kalendereieren, endre hendelser uten eiernes viten, eller legge til falske hendelser."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"lage simulerte posisjonskilder for testing"</string>
@@ -424,21 +424,21 @@
<string name="permdesc_masterClear" msgid="5033465107545174514">"Lar applikasjonen tilbakestille systemet til fabrikkinnstillinger, noe som vil fjerne alle data, alt oppsett, og alle installerte applikasjoner."</string>
<string name="permlab_setTime" msgid="2021614829591775646">"stille klokken"</string>
<string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Lar programmet stille klokken på nettbrettet."</string>
- <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Tillater et program å stille klokken på telefonen."</string>
+ <string name="permdesc_setTime" product="default" msgid="667294309287080045">"Tillater applikasjoner å stille klokken på telefonen."</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"endre tidssone"</string>
<string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Lar programmet endre nettbrettets tidssone."</string>
<string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Lar applikasjonen endre telefonens tidssone."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"fungere som kontoadministrasjonstjenesten"</string>
- <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Lar et program foreta anrop til kontogodkjennere"</string>
+ <string name="permdesc_accountManagerService" msgid="6056903274106394752">"Lar applikasjoner foreta anrop til kontogodkjennere"</string>
<string name="permlab_getAccounts" msgid="4549918644233460103">"oppdage kjente kontoer"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Lar programmet få tilgang til listen over kontoer nettbrettet kjenner til."</string>
<string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Lar applikasjonen hente listen over kontoer telefonen kjenner til."</string>
<string name="permlab_authenticateAccounts" msgid="3940505577982882450">"fungere som en kontogodkjenner"</string>
- <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Lar et program bruke kontogodkjenningsfunksjonaliteten til kontoadministratoren, herunder opprette kontoer og få og angi passord."</string>
+ <string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Lar applikasjoner bruke kontoadministratorens rettigheter til kontoautentisering, herunder opprette kontoer og få og angi passord."</string>
<string name="permlab_manageAccounts" msgid="4440380488312204365">"administrere kontolisten"</string>
- <string name="permdesc_manageAccounts" msgid="8804114016661104517">"Lar et program utføre handlinger som å legge til og fjerne kontoer samt slette passord."</string>
+ <string name="permdesc_manageAccounts" msgid="8804114016661104517">"Lar applikasjoner utføre handlinger som å legge til og fjerne kontoer samt slette passord."</string>
<string name="permlab_useCredentials" msgid="6401886092818819856">"bruke godkjenningsopplysningene for en konto"</string>
- <string name="permdesc_useCredentials" msgid="7416570544619546974">"Lar et program be om godkjenningsinformasjon"</string>
+ <string name="permdesc_useCredentials" msgid="7416570544619546974">"Lar applikasjoner be om godkjenningsinformasjon"</string>
<string name="permlab_accessNetworkState" msgid="6865575199464405769">"se nettverkstilstand"</string>
<string name="permdesc_accessNetworkState" msgid="558721128707712766">"Lar applikasjonen se tilstanden til alle nettverk."</string>
<string name="permlab_createNetworkSockets" msgid="9121633680349549585">"full internett-tilgang"</string>
@@ -446,9 +446,9 @@
<string name="permlab_writeApnSettings" msgid="505660159675751896">"endre eller avskjær nettverksinnstillinger og -trafikk"</string>
<string name="permdesc_writeApnSettings" msgid="2369786339323021771">"Tillater en applikasjon å endre nettverksinnstillingene og fange opp og inspisere all nettverkstrafikk, for eksempel for å endre mellomtjeneren og porten for en APN. Skadelige applikasjoner kan overvåke, omdirigere, eller endre nettverkspakker uten din viten."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"endre nettverkskonnektivitet"</string>
- <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Tillater et program å endre innstillingene for nettverkstilkoblingen."</string>
+ <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Tillater applikasjoner å endre innstillingene for nettverkstilkoblingen."</string>
<string name="permlab_changeTetherState" msgid="2702121155761140799">"Endre tilknytningsoppsett"</string>
- <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Tillater et program å endre innstillingene for nettverkstilknytningen."</string>
+ <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Tillater applikasjoner å endre innstillingene for nettverkstilknytningen."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"endre innstilling for bakgrunnsdata"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Lar applikasjonen endre innstillingen for bakgrunnsdata."</string>
<string name="permlab_accessWifiState" msgid="8100926650211034400">"se tilstand for trådløse nettverk"</string>
@@ -486,11 +486,11 @@
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Prog. skriver til USB-lagr."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Lar applikasjonen skrive til minnekortet."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"endre eller slette innhold på interne medier"</string>
- <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Tillater et program til å endre innholdet i interne medier."</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Tillater applikasjoner å endre innholdet i interne medier."</string>
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"tilgang til bufrede filer"</string>
- <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Tillater et program å lese og skrive til bufrede filer."</string>
+ <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Tillater applikasjoner å lese og skrive til bufrede filer."</string>
<string name="permlab_use_sip" msgid="5986952362795870502">"foreta/motta Internett-anrop"</string>
- <string name="permdesc_use_sip" msgid="6320376185606661843">"Tillater et program å bruke SIP-tjenesten til å foreta og motta Internett-anrop."</string>
+ <string name="permdesc_use_sip" msgid="6320376185606661843">"Tillater applikasjon å bruke SIP-tjenesten til å foreta og motta Internett-anrop."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"les tidligere nettverksbruk"</string>
<string name="permdesc_readNetworkUsageHistory" msgid="6040738474779135653">"Gir applikasjoner tillatelse til å lese tidligere nettverksbruk for bestemte nettverk og applikasjoner."</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"administrer retningslinjene for nettverk"</string>
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Gal PIN-kode!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"For å låse opp, trykk på menyknappen og deretter 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nødnummer"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Ingen operatør)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Ingen tjeneste."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skjermen er låst"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Trykk på menyknappen for å låse opp eller ringe et nødnummer."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Trykk på menyknappen for å låse opp."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopier"</string>
<string name="paste" msgid="5629880836805036433">"Lim inn"</string>
<string name="replace" msgid="5781686059063148930">"Erstatt"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Slett"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopier URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Marker tekst"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Merket tekst"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ legg til i ordlisten"</string>
<string name="inputMethod" msgid="1653630062304567879">"Inndatametode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Teksthandlinger"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Lite plass"</string>
@@ -877,7 +877,7 @@
<string name="alwaysUse" msgid="4583018368000610438">"Bruk som standardvalg."</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"Fjern standardvalg i Innstillinger > Applikasjoner > Installerte applikasjoner."</string>
<string name="chooseActivity" msgid="1009246475582238425">"Velg en aktivitet"</string>
- <string name="chooseUsbActivity" msgid="7892597146032121735">"Velg et program for USB-enheten"</string>
+ <string name="chooseUsbActivity" msgid="7892597146032121735">"Velg applikasjon for USB-enheten"</string>
<string name="noApplications" msgid="1691104391758345586">"Ingen applikasjoner kan gjøre dette."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
<string name="aerr_application" msgid="932628488013092776">"<xliff:g id="APPLICATION">%1$s</xliff:g> har dessverre stoppet."</string>
@@ -905,7 +905,7 @@
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> kjører"</string>
<string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Velg for å bytte til programmet"</string>
<string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Bytt programmer?"</string>
- <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"Et annet program kjører og må stoppes før du kan starte et nytt program."</string>
+ <string name="heavy_weight_switcher_text" msgid="4592075610079319667">"En annen applikasjon kjører og må stoppes før du kan starte en ny applikasjon."</string>
<string name="old_app_action" msgid="493129172238566282">"Gå tilbake til <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
<string name="old_app_description" msgid="942967900237208466">"Ikke start det nye programmet."</string>
<string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Forespørsel om tilkoblingskonfigurasjon for Wi-Fi Direct fra <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Klikk på OK for å godta."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Forespørsel om tilkoblingskonfigurasjon for Wi-Fi Direct fra <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Oppgi personlig kode for å fortsette."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Personlig WPS-kode <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> må oppgis på mottakerenheten <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> for å fortsette tilkoblingskonfigurasjonen"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Sett inn tegn"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Ukjent applikasjon"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Sender SMS-meldinger"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Velg en konto"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Øke"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Senke"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> trykk og hold inne."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Skyv opp for å øke og ned for å redusere."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Endre minutter (fremover)"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Endre minutter (bakover)"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Endre timer (fremover)"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Endre time (bakover)"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Angi p.m."</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Angi a.m."</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Endre måned (fremover)"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Endre måned (bakover)"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Endre dag (fremover)"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Endre dag (bakover)"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Endre år (fremover)"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Endre år (bakover)"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"valgt"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"ikke valgt"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"valgt"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modusendring"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Glidebryter. Trykk og hold inne."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Opp for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Ned for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Venstre for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Høyre for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Lås opp"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Stille"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Lyd på"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tast. Hodetelefoner kreves for å høre tastene mens du skriver inn et passord."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Gå til startsiden"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Gå opp"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 5d7900e..2711f0b 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Onjuiste PIN-code!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Druk op \'Menu\' en vervolgens op 0 om te ontgrendelen."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Alarmnummer"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Geen service)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Geen service"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Scherm vergrendeld."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Druk op \'Menu\' om te ontgrendelen of noodoproep te plaatsen."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Druk op \'Menu\' om te ontgrendelen."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopiëren"</string>
<string name="paste" msgid="5629880836805036433">"Plakken"</string>
<string name="replace" msgid="5781686059063148930">"Vervangen..."</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Verwijderen"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL kopiëren"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Tekst selecteren..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstselectie"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ toev. aan woordenboek"</string>
<string name="inputMethod" msgid="1653630062304567879">"Invoermethode"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tekstacties"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Weinig ruimte"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Configuratieverzoek voor verbinding met Wi-Fi Direct van <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Klik op \'OK\' om te accepteren."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Configuratieverzoek van <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> voor verbinding met Wi-Fi Direct. Geef de pincode op om door te gaan."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"WPS-pincode <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> moet worden ingevoerd op peerapparaat <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>, zodat het instellen van de verbinding kan worden voortgezet"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Teken invoegen"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Onbekende app"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS-berichten verzenden"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Selecteer een account"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Hoger"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Lager"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tik <xliff:g id="VALUE">%s</xliff:g> keer en blijf aanraken."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Schuif omhoog om te verhogen en omlaag om te verlagen."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minuten verhogen"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minuten verlagen"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Uren verhogen"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Uren verlagen"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"PM instellen"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"AM instellen"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Maand verhogen"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Maand verlagen"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Dag verhogen"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Dag verlagen"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Jaar verhogen"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Jaar verlagen"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"aangevinkt"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"niet aangevinkt"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"geselecteerd"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modus wijzigen"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Schuifgreep. Tikken en blijven aanraken."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Omhoog voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Omlaag voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Links voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Rechts voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Ontgrendelen"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Stil"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Geluid aan"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Toetsaanslag. Headset vereist om toetsaanslagen te kunnen horen bij het typen van een wachtwoord."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigeren naar startpositie"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Omhoog navigeren"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 08f7cb9..702cba6 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Błędny kod PIN!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Aby odblokować, naciśnij Menu, a następnie 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Numer alarmowy"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Brak usługi)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Brak usługi"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ekran zablokowany."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Naciśnij Menu, aby odblokować lub wykonać połączenie alarmowe."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Naciśnij Menu, aby odblokować."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopiuj"</string>
<string name="paste" msgid="5629880836805036433">"Wklej"</string>
<string name="replace" msgid="5781686059063148930">"Zastąp"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Usuń"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopiuj adres URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Zaznacz tekst"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Zaznaczanie tekstu"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ dodaj do słownika"</string>
<string name="inputMethod" msgid="1653630062304567879">"Sposób wprowadzania tekstu"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Działania na tekście"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mało miejsca"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Otrzymano żądanie konfiguracji połączenia Wi-Fi Direct z urządzenia <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Kliknij OK, aby zaakceptować."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Otrzymano żądanie konfiguracji połączenia Wi-Fi Direct z urządzenia <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Wpisz kod PIN, aby kontynuować."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Aby kontynuować konfigurowanie połączenia, na drugim urządzeniu <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> wpisz kod PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g>."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Wstaw znak"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Nieznana aplikacja"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Wysyłanie wiadomości SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Wybierz konto"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Zwiększ"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmniejsz"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> dotknij i przytrzymaj."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Przesuń w górę, aby zwiększyć wartość, lub w dół, aby ją zmniejszyć."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Następna minuta"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Poprzednia minuta"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Następna godzina"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Poprzednia godzina"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Ustaw PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Ustaw AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Następny miesiąc"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Poprzedni miesiąc"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Następny dzień"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Poprzedni dzień"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Następny rok"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Poprzedni rok"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"zaznaczono"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"nie zaznaczono"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"wybrano"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Zmiana trybu"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Uchwyt przesuwny. Dotknij i przytrzymaj."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>: w górę"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>: w dół"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>: w lewo"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>: w prawo"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Odblokuj"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Aparat"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Wyciszenie"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Włącz dźwięk"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Klawisz. Wymagany jest zestaw słuchawkowy, aby słyszeć klawisze podczas wpisywania hasła."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Przejdź do strony głównej"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Przejdź wyżej"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 56218e7..8e1386a 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Código PIN incorrecto!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, prima Menu e, em seguida, 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número de emergência"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Nenhum serviço)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Nenhum serviço"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ecrã bloqueado."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Prima Menu para desbloquear ou efectuar uma chamada de emergência."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Prima Menu para desbloquear."</string>
@@ -854,12 +854,12 @@
<string name="cut" msgid="3092569408438626261">"Cortar"</string>
<string name="copy" msgid="2681946229533511987">"Copiar"</string>
<string name="paste" msgid="5629880836805036433">"Colar"</string>
- <string name="replace" msgid="5781686059063148930">"Substituir???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="replace" msgid="5781686059063148930">"Substituir..."</string>
+ <string name="delete" msgid="6098684844021697789">"Eliminar"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selecção de texto"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ adicionar ao dicionário"</string>
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acções de texto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Pouco espaço livre"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Pedido de configuração de Wi-Fi Direct de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Clique em OK para aceitar."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Pedido de configuração de ligação Wi-Fi Direct de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Introduza o PIN para prosseguir."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"É preciso introduzir o PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> no aparelho de pares <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> para que possa prosseguir a configuração da ligação"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Introduzir carácter"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Aplicação desconhecida"</string>
<string name="sms_control_title" msgid="7296612781128917719">"A enviar mensagens SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Seleccionar conta"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuir"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Toque sem soltar em <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Deslize lentamente para cima para aumentar e para baixo para diminuir."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumentar minuto"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Diminuir minuto"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Aumentar hora"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Diminuir hora"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Definir PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Definir AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Aumentar mês"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Diminuir mês"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Aumentar dia"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Diminuir dia"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Aumentar ano"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Diminuir ano"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"marcado"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"desmarcado"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"selecionado"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Alteração do modo"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Faixa deslizante. Mantenha premida."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Para cima para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Para baixo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Para a direita para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Câmara"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Som ativado"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tecla. São necessários auscultadores com microfone integrado para ouvir as teclas ao escrever uma palavra-passe."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navegar para página inicial"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navegar para cima"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index af52b1a..f578463 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Código PIN incorreto!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, pressione Menu e, em seguida, 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número de emergência"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Sem serviço)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Sem serviço."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Tela bloqueada."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Pressione Menu para desbloquear ou fazer uma chamada de emergência."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pressione Menu para desbloquear."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Copiar"</string>
<string name="paste" msgid="5629880836805036433">"Colar"</string>
<string name="replace" msgid="5781686059063148930">"Substituir???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Excluir"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Selecionar texto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Seleção de texto"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ adicionar ao dicionário"</string>
<string name="inputMethod" msgid="1653630062304567879">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Ações de texto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Pouco espaço"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Solicitação de configuração da conexão do Wi-Fi Direct de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Clique em OK para aceitar."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Solicitação de configuração da conexão do Wi-Fi Direct de <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Digite o PIN para prosseguir."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"É necessário inserir o PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> no dispositivo pareado <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> para prosseguir com a configuração da conexão"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Inserir caractere"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Aplicativo desconhecido"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Enviando mensagens SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Selecione uma conta"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Redução"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> toque e mantenha pressionado."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Deslize para cima para aumentar e para baixo para diminuir."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumentar minuto"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Diminuir minuto"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Aumentar hora"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Diminuir hora"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Configurar valor PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Configurar valor AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Aumentar mês"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Diminuir mês"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Aumentar dia"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Reduzir dia"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Aumentar ano"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Diminuir ano"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"verificado"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"não selecionado"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"selecionado"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Alteração do modo"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Alça deslizante. Toque e segure."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Deslize para cima para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Deslize para baixo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Deslize para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Deslize para a direita para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Câmera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Som ativado"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tecla. É necessário um fone de ouvido para ouvir as teclas durante a digitação de uma senha."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navegar na página inicial"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navegar para cima"</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 1b71241..2dc5ce8 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -975,6 +975,10 @@
<string name="copyUrl" msgid="2538211579596067402">"Copiar l\'URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Selecziunar text…"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selecziun da text"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (2839899368418071843) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Metoda d\'endataziun"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acziuns da text"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Pauca capacitad da memorisar"</string>
@@ -1091,6 +1095,10 @@
<skip />
<!-- no translation found for wifi_p2p_pin_display_message (2834049169114922902) -->
<skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Inserir in caracter"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Applicaziun nunenconuschenta"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Trametter messadis SMS"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index faf6f6a..2a069f3 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Cod PIN incorect!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Pentru a debloca, apăsaţi Meniu, apoi 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Număr de urgenţă"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Niciun serviciu)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Fără serviciu."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ecranul este blocat."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Apăsaţi Meniu pentru a debloca sau pentru a efectua apeluri de urgenţă."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Apăsaţi Meniu pentru deblocare."</string>
@@ -855,11 +855,14 @@
<string name="copy" msgid="2681946229533511987">"Copiaţi"</string>
<string name="paste" msgid="5629880836805036433">"Inseraţi"</string>
<string name="replace" msgid="5781686059063148930">"Înlocuiţi???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Ştergeţi"</string>
<string name="copyUrl" msgid="2538211579596067402">"Copiaţi adresa URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Selectaţi text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Selectare text"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (2839899368418071843) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Metodă de intrare"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Acţiuni pentru text"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Spaţiu de stocare redus"</string>
@@ -946,6 +949,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Solicitare de configurare a conexiunii pentru Wi-Fi Direct de la <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Faceţi clic pe OK pentru a accepta."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Solicitare de configurare a conexiunii Wi-Fi Direct de la <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Introduceţi codul PIN pentru a continua."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Pentru a continua configurarea conexiunii, este necesar să introduceţi codul PIN WPS pentru <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> pe dispozitivul pereche <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Introduceţi caracterul"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Aplicaţie necunoscută"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Se trimit mesaje SMS"</string>
@@ -1151,8 +1158,7 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Schimbarea modului"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Mâner glisant. Apăsaţi şi ţineţi apăsat."</string>
<!-- no translation found for description_direction_up (1983114130441878529) -->
<skip />
<!-- no translation found for description_direction_down (4294993639091088240) -->
@@ -1161,14 +1167,10 @@
<skip />
<!-- no translation found for description_direction_right (4296057241963012862) -->
<skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="description_target_unlock" msgid="2228524900439801453">"Deblocaţi"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Cameră foto"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Silenţios"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Sunet activat"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tastă. Setul căşti-microfon este necesar pentru ascultarea tastelor când introduceţi o parolă."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigaţi la ecranul de pornire"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigaţi în sus"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 8efeb74..2a47531 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неверный PIN-код!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Для разблокировки нажмите \"Меню\", а затем 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Экстренная служба"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Сеть не найдена)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Сеть не найдена."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Экран заблокирован."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Нажмите \"Меню\", чтобы разблокировать экран или вызвать службу экстренной помощи."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Для разблокировки нажмите \"Меню\"."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Копировать"</string>
<string name="paste" msgid="5629880836805036433">"Вставить"</string>
<string name="replace" msgid="5781686059063148930">"Заменить"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Удалить"</string>
<string name="copyUrl" msgid="2538211579596067402">"Копировать URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Выбрать текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Выбор текста"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"Добавить в словарь"</string>
<string name="inputMethod" msgid="1653630062304567879">"Способ ввода"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Операции с текстом"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Недостаточно места"</string>
@@ -946,6 +946,8 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Чтобы принять запрос от устройства <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> на соединение Wi-Fi Direct, нажмите кнопку \"ОК\"."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Чтобы продолжить настройку соединения с устройством <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> через Wi-Fi Direct, введите PIN-код."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Чтобы продолжить настройку подключения, введите PIN-код WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> на обнаруженном устройстве <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi Direct включен"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Нажмите, чтобы открыть настройки"</string>
<string name="select_character" msgid="3365550120617701745">"Введите символ"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Неизвестное приложение"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Отправка SMS-сообщений"</string>
@@ -1108,34 +1110,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Выберите аккаунт"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Увеличить"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Уменьшить"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Нажмите и удерживайте <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Проведите вверх, чтобы увеличить значение, и вниз, чтобы уменьшить его."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"На минуту вперед"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"На минуту назад"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"На час вперед"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"На час назад"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Установить время после полудня"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Установить время до полудня"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"На месяц вперед"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"На месяц назад"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"На день вперед"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"На день назад"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"На год вперед"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"На год назад"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"установлено"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"не установлено"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"выбрано"</string>
@@ -1151,24 +1139,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Клавиша смены режима"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Клавиша смены регистра"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Клавиша ввода"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Сенсорное управление. Нажмите и удерживайте."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Проведите вверх, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Проведите вниз, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Проведите влево, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Проведите вправо, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Разблокировать"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Без звука"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Включить звук"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Необходима гарнитура, чтобы услышать нажатие клавиш при вводе пароля."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Перейти на главную"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Перейти вверх"</string>
@@ -1182,7 +1161,7 @@
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"Передача данных 2G/3G отключена"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"Передача данных 4G отключена"</string>
<string name="data_usage_mobile_limit_title" msgid="7869402519391631884">"Мобильный Интернет отключен"</string>
- <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Передача данных Wi-Fi отключена"</string>
+ <string name="data_usage_wifi_limit_title" msgid="8992154736441284865">"Передача данных через Wi-Fi отключена"</string>
<string name="data_usage_limit_body" msgid="4313857592916426843">"Нажмите, чтобы включить"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Превышен лимита трафика 2G и 3G"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Превышен лимит на трафик 4G"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 38c8a1c..21348796 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nesprávny kód PIN"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Ak chcete telefón odomknúť, stlačte Menu a následne 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Číslo tiesňového volania"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Nie je signál)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Žiadny signál"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Obrazovka je uzamknutá."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Ak chcete odomknúť telefón alebo uskutočniť tiesňové volanie, stlačte Menu."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Telefón odomknete stlačením tlačidla Menu."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopírovať"</string>
<string name="paste" msgid="5629880836805036433">"Prilepiť"</string>
<string name="replace" msgid="5781686059063148930">"Nahradiť???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Odstrániť"</string>
<string name="copyUrl" msgid="2538211579596067402">"Skopírovať adresu URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Vybrať text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Výber textu"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ pridať do slovníka"</string>
<string name="inputMethod" msgid="1653630062304567879">"Metóda vstupu"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Operácie s textom"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Nedostatok pamäte"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Žiadosť o nastavenie priameho pripojenia siete Wi-Fi zo zariadenia <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Prijmete kliknutím na tlačidlo OK."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Žiadosť o nastavenie priameho pripojenia siete Wi-Fi z adresy <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Pokračujte zadaním kódu PIN."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Aby mohlo nastavenie pripojenia pokračovať, je potrebné zadať kód PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> v zdieľanom zariadení <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Vkladanie znakov"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Neznáma aplikácia"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Odosielanie správ SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Vybrať účet"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšenie"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Zníženie"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Klepnite a podržte <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Ak chcete pripočítať, potiahnite prst nahor. Ak chcete odpočítať, potiahnite prst nadol."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Pripočítať minútu"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Odpočítať minútu"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Pripočítať hodinu"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Odpočítať hodinu"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Nastaviť čas popoludní"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Nastaviť čas dopoludnia"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Pripočítať mesiac"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Odpočítať mesiac"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Pripočítať deň"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Odpočítať deň"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Pripočítať rok"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Odpočítať rok"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"začiarknuté"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"nezačiarknuté"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"vybratý"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Zmena režimu"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Posuvné tlačidlo. Klepnite a podržte."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Nahor na <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Nadol na <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Doľava na <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Doprava na <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Odomknúť"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Fotoaparát"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Tichý"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Zapnúť zvuk"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Kláves. Pri zadávaní hesla je potrebné použiť náhlavnú súpravu."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Prejsť na plochu"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Prejsť na"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index feae5be..994ff7b 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nepravilna koda PIN."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Če želite telefon odkleniti, pritisnite meni in nato 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Številka za klic v sili"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Ni storitve)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Ni storitve."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Zaslon je zaklenjen."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Če želite odkleniti napravo ali opraviti klic v sili, pritisnite meni."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Če želite odkleniti, pritisnite meni."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopiraj"</string>
<string name="paste" msgid="5629880836805036433">"Prilepi"</string>
<string name="replace" msgid="5781686059063148930">"Zamenjaj???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Izbriši"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopiraj URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Izbiranje besedila ..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Izbrano besedilo"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"in dodaj v slovar"</string>
<string name="inputMethod" msgid="1653630062304567879">"Način vnosa"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Besedilna dejanja"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Zmanjkuje pomnilnika"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Zahteva za nastavitev povezave Wi-Fi Direct z naslova <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Če želite sprejeti, kliknite V redu."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Zahteva za nastavitev povezave Wi-Fi Direct z naslova <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Če želite nadaljevati, vnesite PIN."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Pred začetkom nastavitve povezave morate PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> vnesti v enakovredno napravo <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Vstavljanje znaka"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Neznan program"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Pošiljanje sporočil SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Izberite račun"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Povečaj"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmanjšaj"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Tapnite in pridržite <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Povlecite gor za povečanje in dol za zmanjšanje."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Povečaj minute"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Zmanjšaj minute"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Povečaj uro"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Zmanjšaj uro"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Nastavi PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Nastavi AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Naslednji mesec"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Prejšnji mesec"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Naslednji dan"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Prejšnji dan"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Naslednje leto"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Prejšnje leto"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"potrjeno"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"ni odkljukano"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"izbrano"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Sprememba načina"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Tipka Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Tipka Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Drsna ročica. Tapnite in pridržite."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Gor za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Dol za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Levo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Desno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Odkleni"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Fotoaparat"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Tiho"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Vklopljen zvok"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Če želite med vnašanjem gesla slišati tipke, potrebujete slušalke."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Krmarjenje domov"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Krmarjenje navzgor"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index ab8f25e..eedd93b 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN кôд је нетачан!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Да бисте откључали, притисните „Мени“, а затим 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Број за хитне случајеве"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Нема услуге)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Нема услуге."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Екран је закључан."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Притисните „Мени“ да бисте откључали телефон или упутите хитни позив."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Притисните „Мени“ за откључавање."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Копирај"</string>
<string name="paste" msgid="5629880836805036433">"Налепи"</string>
<string name="replace" msgid="5781686059063148930">"Замени..."</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Избриши"</string>
<string name="copyUrl" msgid="2538211579596067402">"Копирај URL адресу"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Изабери текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Избор текста"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ додај у речник"</string>
<string name="inputMethod" msgid="1653630062304567879">"Метод уноса"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Радње у вези са текстом"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Мало простора"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Захтев за подешавање Wi-Fi Direct везе са адресе <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Кликните на Потврди да бисте прихватили."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Захтев за подешавање Wi-Fi Direct везе са адресе <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Унесите PIN да бисте наставили."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Потребно је да унесете WPS PIN <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> на равноправном уређају <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> да би се наставило подешавање везе"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Уметање знака"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Непозната апликација"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Слање SMS порука"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Избор налога"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Повећање"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Смањење"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> додирните и задржите."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Превуците нагоре за повећање, а надоле за смањење."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Повећај минуте"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Смањи минуте"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Повећај сате"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Смањи сате"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Подеси по подне"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Подеси пре подне"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Повећај месеце"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Смањи месеце"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Повећај дане"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Смањи дане"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Повећај године"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Смањи године"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"изабрано"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"није потврђено"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"изабрано"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Промена режима"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Клизна ручица. Додирните и задржите."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Надоле за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Улево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Удесно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Откључај"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Нечујно"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Укључи звук"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Тастер. Потребне су слушалице да бисте чули тастере док куцате лозинку."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Кретање до Почетне"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Кретање нагоре"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 0fbde02..34b08b1 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Fel PIN-kod!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Tryck på Menu och sedan på 0 om du vill låsa upp."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nödsamtalsnummer"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Ingen tjänst)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Ingen tjänst."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skärmen har låsts."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryck på Menu om du vill låsa upp eller ringa nödsamtal."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryck på Menu om du vill låsa upp."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopiera"</string>
<string name="paste" msgid="5629880836805036433">"Klistra in"</string>
<string name="replace" msgid="5781686059063148930">"Ersätt???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Ta bort"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopiera webbadress"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Markera text..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Textmarkering"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ lägg till i ordlista"</string>
<string name="inputMethod" msgid="1653630062304567879">"Indatametod"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Textåtgärder"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Dåligt med utrymme"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Begäran om direkt Wi-Fi-anslutning från <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Klicka på OK om du vill acceptera."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Begäran om direkt Wi-Fi-anslutning från <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Ange PIN-kod om du vill fortsätta."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"WPS PIN-kod <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> måste anges i enheten <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> för att anslutningsprocessen ska kunna fortsätta"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Infoga tecken"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Okänd app"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Skickar SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Välj ett konto"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Öka"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Minska"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> knacka lätt och håll kvar."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Skjut uppåt för att öka och nedåt för att minska."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Öka minuter"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minska minuter"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Öka timmar"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Minska timmar"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Ange em"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Ange fm"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Öka månad"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Minska månad"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Öka dagar"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Minska dag"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Öka år"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Minska år"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"markerat"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"inte markerat"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"markerade"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Funktionsändring"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Skift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Retur"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Skärmlåsfunktion. Tryck och dra."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Upp för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Ned för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Vänster för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Höger för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Lås upp"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Tyst"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Ljud på"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Du behöver ett headset för att höra tangenterna när du skriver in ett lösenord."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Visa startsidan"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigera uppåt"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index a0dee20..e32e851 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -838,8 +838,7 @@
<skip />
<!-- no translation found for emergency_call_dialog_number_for_display (696192103195090970) -->
<skip />
- <!-- no translation found for lockscreen_carrier_default (8963839242565653192) -->
- <skip />
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Hakuna huduma"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"skrini imefungwa."</string>
<!-- no translation found for lockscreen_instructions_when_pattern_enabled (46154051614126049) -->
<skip />
@@ -853,8 +852,7 @@
<skip />
<string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Samahani, jaribu tena"</string>
<string name="lockscreen_password_wrong" msgid="6237443657358168819">"Samahani, jaribu tena"</string>
- <!-- no translation found for lockscreen_plugged_in (8057762828355572315) -->
- <skip />
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Inachaji <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_charged" msgid="4938930459620989972">"Imechajiwa."</string>
<string name="lockscreen_battery_short" msgid="3617549178603354656">"Kishika nafasi<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
<!-- no translation found for lockscreen_low_battery (1482873981919249740) -->
@@ -1122,13 +1120,13 @@
<skip />
<!-- no translation found for paste (5629880836805036433) -->
<skip />
- <!-- outdated translation 8333608224471746584 --> <string name="replace" msgid="5781686059063148930">"Badilisha"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="replace" msgid="5781686059063148930">"Badilisha???"</string>
+ <string name="delete" msgid="6098684844021697789">"Futa"</string>
<!-- no translation found for copyUrl (2538211579596067402) -->
<skip />
<string name="selectTextMode" msgid="6738556348861347240">"Chagua maandishi"</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Uchaguzi wa maandishi?"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"Ongeza kwenye kamusi"</string>
<string name="inputMethod" msgid="1653630062304567879">"Mbinu ya uingizaji"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Vitendo vya maandishi"</string>
<!-- no translation found for low_internal_storage_view_title (1399732408701697546) -->
@@ -1234,7 +1232,7 @@
<item quantity="other" msgid="7915895323644292768">"Fungua mitandao ya Wi-Fi inayopatikana"</item>
</plurals>
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Haikuweza kuunganisha kwa Mtandao-Hewa"</string>
- <!-- outdated translation 2517058131278770509 --> <string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" ina muunganisho duni wa tovuti."</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" inao muunganisho duni wa wavuti."</string>
<!-- no translation found for wifi_p2p_dialog_title (97611782659324517) -->
<skip />
<!-- no translation found for wifi_p2p_turnon_message (2804722042556269129) -->
@@ -1246,6 +1244,10 @@
<skip />
<!-- no translation found for wifi_p2p_pin_display_message (2834049169114922902) -->
<skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Ingiza kibambo"</string>
<!-- no translation found for sms_control_default_app_name (7630529934366549163) -->
<skip />
@@ -1436,34 +1438,20 @@
<skip />
<!-- no translation found for number_picker_decrement_button (2576606679160067262) -->
<skip />
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> gonga na shikilia"</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Nyiririsha juu kuongeza na chini kupunguza."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Dakika ya nyongeza"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Dakika pungufu"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Saa ya nyongeza"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Saa pungufu."</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Seti PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Seti AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Mwezi wa nyongeza"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Mwezi pungufu"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Siku ya nyongeza"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Siku pungufu"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Mwaka wa nyongeza"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Mwaka pungufu"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"imeangaliwa"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"haijakaguliwa"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"Iliyochaguliwa"</string>
@@ -1479,24 +1467,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modi ya mabadiliko"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Songa"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ingiza"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Kishikilio cha Kuslaidi. Wahi na shikilia."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Juu ajili ya<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Chini kwa ajili ya<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Kushoto kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Kulia kwa ajili ya <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Fungua"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Kimya"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Sauti imewashwa"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Muhimu. Kifaa cha kuskiza kilihitaji kusikiliza vichupo wakati wa kucharaza nenosiri."</string>
<!-- no translation found for action_bar_home_description (5293600496601490216) -->
<skip />
diff --git a/core/res/res/values-w1024dp/dimens.xml b/core/res/res/values-sw600dp-w1024dp/dimens.xml
similarity index 100%
rename from core/res/res/values-w1024dp/dimens.xml
rename to core/res/res/values-sw600dp-w1024dp/dimens.xml
diff --git a/core/res/res/values-w1280dp/dimens.xml b/core/res/res/values-sw600dp-w1280dp/dimens.xml
similarity index 100%
rename from core/res/res/values-w1280dp/dimens.xml
rename to core/res/res/values-sw600dp-w1280dp/dimens.xml
diff --git a/core/res/res/values-sw600dp/dimens.xml b/core/res/res/values-sw600dp/dimens.xml
index 2daaaa2..5dacb44 100644
--- a/core/res/res/values-sw600dp/dimens.xml
+++ b/core/res/res/values-sw600dp/dimens.xml
@@ -50,6 +50,9 @@
<!-- Preference activity, vertical padding for the header list -->
<dimen name="preference_screen_header_vertical_padding">32dp</dimen>
+ <dimen name="preference_screen_side_margin">0dp</dimen>
+ <!-- Compensate for double margin : preference_screen_side_margin + 4 (frame background shadow) = -preference_screen_side_margin_negative -->
+ <dimen name="preference_screen_side_margin_negative">-4dp</dimen>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 7729dbf..c63eaf7 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"รหัส PIN ไม่ถูกต้อง!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"หากต้องการปลดล็อก กด เมนู ตามด้วย 0"</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"หมายเลขฉุกเฉิน"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(ไม่มีบริการ)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"ไม่มีบริการ"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"หน้าจอถูกล็อก"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"กด เมนู เพื่อปลดล็อกหรือโทรฉุกเฉิน"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"กด เมนู เพื่อปลดล็อก"</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"คัดลอก"</string>
<string name="paste" msgid="5629880836805036433">"วาง"</string>
<string name="replace" msgid="5781686059063148930">"แทนที่???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"ลบ"</string>
<string name="copyUrl" msgid="2538211579596067402">"คัดลอก URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"เลือกข้อความ..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"การเลือกข้อความ"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+เพิ่มลงในพจนานุกรม"</string>
<string name="inputMethod" msgid="1653630062304567879">"วิธีป้อนข้อมูล"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"การทำงานของข้อความ"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"เหลือที่ว่างน้อย"</string>
@@ -946,6 +946,8 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"คำขอการตั้งค่าการเชื่อมต่อ Wi-Fi Direct จาก <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> คลิก \"ตกลง\" เพื่อยอมรับ"</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"คำขอการตั้งค่าการเชื่อมต่อ Wi-Fi Direct จาก <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> ป้อน PIN เพื่อดำเนินการต่อ"</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"ต้องป้อน PIN WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> บนอุปกรณ์เพียร์ <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> เพื่อให้การตั้งค่าการเชื่อมต่อดำเนินการต่อ"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"เปิด Wi-Fi Direct อยู่"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"แตะเพื่อตั้งค่า"</string>
<string name="select_character" msgid="3365550120617701745">"ใส่อักขระ"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"ไม่ทราบแอปพลิเคชัน"</string>
<string name="sms_control_title" msgid="7296612781128917719">"กำลังส่งข้อความ SMS"</string>
@@ -1108,34 +1110,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"เลือกบัญชี"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"การเพิ่ม"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"การลด"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"แตะ <xliff:g id="VALUE">%s</xliff:g> ค้างไว้"</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"เลื่อนขึ้นเพื่อเพิ่มและเลื่อนลงเพื่อลด"</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"เพิ่มนาที"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"ลดนาที"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"เพิ่มชั่วโมง"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"ลดชั่วโมง"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"ตั้งค่า PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"ตั้งค่า AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"เพิ่มเดือน"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"ลดเดือน"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"เพิ่มวัน"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"ลดวัน"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"เพิ่มปี"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"ลดปี"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"เลือกไว้"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"ไม่ได้ตรวจสอบ"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"เลือกแล้ว"</string>
@@ -1151,24 +1139,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"เปลี่ยนโหมด"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ป้อน"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"ที่จับสำหรับเลื่อน แตะค้างไว้"</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"เลื่อนขึ้นเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"เลื่อนลงเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"เลื่อนไปทางซ้ายเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"เลื่อนไปทางขวาเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"ปลดล็อก"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"กล้องถ่ายรูป"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"ปิดเสียง"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"เปิดเสียง"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"แป้นพิมพ์ จำเป็นต้องใช้ชุดหูฟังในการฟังเสียงแป้นพิมพ์ขณะพิมพ์รหัสผ่าน"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"นำทางไปหน้าแรก"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"นำทางขึ้น"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index be50d31..68ae9dd 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Maling PIN code!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Upang i-unlock, pindutin ang Menu pagkatapos ay 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Pang-emergency na numero"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Walang serbisyo)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Walang serbisyo."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Naka-lock ang screen."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Pindutin ang Menu upang i-unlock o magsagawa ng pang-emergency na tawag."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pindutin ang Menu upang i-unlock."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Kopyahin"</string>
<string name="paste" msgid="5629880836805036433">"I-paste"</string>
<string name="replace" msgid="5781686059063148930">"Palitan???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Tanggalin"</string>
<string name="copyUrl" msgid="2538211579596067402">"Kopyahin ang URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Pumili ng teksto..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Pagpili ng teksto"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ idagdag sa diksyunaryo"</string>
<string name="inputMethod" msgid="1653630062304567879">"Pamamaraan ng pag-input"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Pagkilos ng teksto"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Mababa sa espasyo"</string>
@@ -946,6 +946,8 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Kahilingan sa pag-setup ng koneksyon ng Wi-Fi Direct mula sa <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. I-click ang OK upang tanggapin."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Kahilingan sa pag-setup ng koneksyon ng Wi-Fi Direct mula sa <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Ilagay ang pin upang magpatuloy."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Kailangang mailagay ang pin ng WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> sa device ng kaibigan <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> para magpatuloy ang pag-setup ng koneksyon"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Ang Wi-Fi Direct ay naka-on"</string>
+ <string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"Pindutin para sa mga setting"</string>
<string name="select_character" msgid="3365550120617701745">"Magpasok ng character"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Hindi kilalang application"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Nagpapadala ng mga SMS na mensahe"</string>
@@ -1108,34 +1110,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Pumili ng account"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Taasan"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Babaan"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> tapikin at pindutin nang matagal."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"I-slide pataas upang magdagdag at pababa upang magbawas."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minuto ng pagdaragdag"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minuto ng pagbawas"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Oras ng pagdaragdag"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Oras ng pagbawas"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Itakda ang PM"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Itakda ang AM"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Buwan ng pagdagdag"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Buwan ng pagbawas"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Araw ng pagdaragdag"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Araw ng pagbawas"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Taon ng pagdaragdag"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Taon ng pagbawas"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"nilagyan ng check"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"hindi nilagyan ng check"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"pinili"</string>
@@ -1151,24 +1139,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Pagbabago ng Mode"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Hawakan sa pag-slide. Tapikin at i-hold."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Nakataas para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Nakababa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Pakanan para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"I-unlock"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Tahimik"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"I-on ang tunog"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Key. Kinakailangan ng headset upang marinig ang mga key habang nata-type ng password."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Magnabiga sa home"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Magnabiga pataas"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 1a92a15..b58b02d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Yanlış PIN kodu!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Kilidi açmak için önce Menü\'ye, sonra 0\'a basın."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Acil durum numarası"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Hizmet yok)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Hizmet yok."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Ekran kilitli."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Kilidi açmak veya acil çağrı yapmak için Menü\'ye basın."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Kilidi açmak için Menü\'ye basın."</string>
@@ -650,8 +650,7 @@
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Doğru!"</string>
<string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Üzgünüz, lütfen yeniden deneyin"</string>
<string name="lockscreen_password_wrong" msgid="6237443657358168819">"Maalesef, tekrar deneyin"</string>
- <!-- no translation found for lockscreen_plugged_in (8057762828355572315) -->
- <skip />
+ <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Şarj oluyor (<xliff:g id="PERCENT">%%</xliff:g><xliff:g id="NUMBER">%d</xliff:g>)"</string>
<string name="lockscreen_charged" msgid="4938930459620989972">"Şarj oldu."</string>
<string name="lockscreen_battery_short" msgid="3617549178603354656">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
<string name="lockscreen_low_battery" msgid="1482873981919249740">"Şarj cihazınızı bağlayın."</string>
@@ -855,12 +854,15 @@
<string name="cut" msgid="3092569408438626261">"Kes"</string>
<string name="copy" msgid="2681946229533511987">"Kopyala"</string>
<string name="paste" msgid="5629880836805036433">"Yapıştır"</string>
- <!-- outdated translation 8333608224471746584 --> <string name="replace" msgid="5781686059063148930">"Değiştir"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="replace" msgid="5781686059063148930">"Değiştir???"</string>
+ <string name="delete" msgid="6098684844021697789">"Sil"</string>
<string name="copyUrl" msgid="2538211579596067402">"URL\'yi kopyala"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Metin seç..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Metin seçimi"</string>
+ <!-- unknown placeholder WORD in addToDictionary -->
+ <skip />
+ <!-- no translation found for addToDictionary (2839899368418071843) -->
+ <skip />
<string name="inputMethod" msgid="1653630062304567879">"Giriş yöntemi"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Metin eylemleri"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Yer az"</string>
@@ -940,13 +942,17 @@
<item quantity="other" msgid="7915895323644292768">"Kullanılabilir kablosuz ağları aç"</item>
</plurals>
<string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kablosuz bağlantısı kurulamadı"</string>
- <!-- outdated translation 2517058131278770509 --> <string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" internet bağlantısı zayıf."</string>
+ <string name="wifi_watchdog_network_disabled_detailed" msgid="4917472096696322767">" internet bağlantısı zayıf."</string>
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Kablosuz Doğrudan Bağlantı"</string>
<string name="wifi_p2p_turnon_message" msgid="2804722042556269129">"Kablosuz Doğrudan Bağlantı işlemini başlat. Bu durumda Kablosuz istemci/hotspot işlemi kapatılacak."</string>
<string name="wifi_p2p_failed_message" msgid="1820097493844848281">"Kablosuz Doğrudan bağlantı başlatılamadı"</string>
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"<xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> tarafından gelen Kablosuz Doğrudan bağlantı kurulumu isteği. Kabul etmek için TAMAM\'ı tıklayın."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"<xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> tarafından gelen Kablosuz Doğrudan bağlantı kurulumu isteği. Devam etmek için pin girin."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Bağlantı kurulum işleminin devamı için <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> eş cihazında WPS pin <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> girilmelidir."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Karakter ekle"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Bilinmeyen uygulama"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS mesajları gönderiliyor"</string>
@@ -1152,8 +1158,7 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mod değiştirme"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ÜstKrkt"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Giriş"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Kayar tutma yeri. Hafifçe vurun ve basılı tutun."</string>
<!-- no translation found for description_direction_up (1983114130441878529) -->
<skip />
<!-- no translation found for description_direction_down (4294993639091088240) -->
@@ -1162,14 +1167,10 @@
<skip />
<!-- no translation found for description_direction_right (4296057241963012862) -->
<skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="description_target_unlock" msgid="2228524900439801453">"Kilidi aç"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Sessiz"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Ses açık"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Tuş. Şifre yazarken tuşları duyabilmek için kulaklık gerekir."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Ana sayfaya git"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Yukarı git"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 2da037b..6364990 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неправильний PIN-код!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Щоб розбл., натисн. меню та 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Аварійний номер"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Немає служби)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Зв’язку немає."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Екран заблоков."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Натис. меню, щоб розбл. чи зробити авар. виклик."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Натисн. меню, щоб розбл."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Копіюв."</string>
<string name="paste" msgid="5629880836805036433">"Вставити"</string>
<string name="replace" msgid="5781686059063148930">"Замінити..."</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Видалити"</string>
<string name="copyUrl" msgid="2538211579596067402">"Копіюв. URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Вибрати текст..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Вибір тексту"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ додати в словник"</string>
<string name="inputMethod" msgid="1653630062304567879">"Метод введення"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Дії з текстом"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Недост. місця"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Запит на налаштування з’єднання Wi-Fi Direct від пристрою <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Натисніть ОК, щоб прийняти."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Запит на налаштування з’єднання Wi-Fi Direct від пристрою <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Введіть PIN-код, щоб продовжити."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Щоб продовжити процес налаштування з’єднання, потрібно ввести PIN-код WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> на пристрої однорангової мережі <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g>."</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Вставл-ня символу"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Невідома програма"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Надсил. SMS повідомлень"</string>
@@ -1039,8 +1043,8 @@
<string name="ime_action_done" msgid="8971516117910934605">"Готово"</string>
<string name="ime_action_previous" msgid="1443550039250105948">"Назад"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Запустити"</string>
- <string name="dial_number_using" msgid="5789176425167573586">"Набр. номер"\n", викор. <xliff:g id="NUMBER">%s</xliff:g>"</string>
- <string name="create_contact_using" msgid="4947405226788104538">"Створ. контакт"\n", викор. <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"Набр. номер"\n" викор. <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">"Створ. контакт"\n" викор. <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Ця чи більше програм запитують дозвіл на отримання доступу до вашого облік. запису зараз і в майбутньому."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Дозволити цей запит?"</string>
<string name="grant_permissions_header_text" msgid="2722567482180797717">"Запит на доступ"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Вибрати обліковий запис"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Додати"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Відняти"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> – торкніться й утримуйте."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Перемістіть угору, щоб додати, і вниз, щоб відняти."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Додати хвилину"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Відняти хвилину"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Додати годину"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Відняти годину"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Установити час \"пп\""</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Установити час \"дп\""</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Додати місяць"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Відняти місяць"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Додати день"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Відняти день"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Додати рік"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Відняти рік"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"перевірено"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"не перевірено"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"вибрано"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Зміна режиму"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Ручка-повзунок. Торкніться й утримуйте її."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Угору, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Униз, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Ліворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Праворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Розблокувати"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Без звуку"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Увімкнути звук"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Клавіша. Гарнітура має чути звук клавіш під час введення пароля."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Перейти на головну"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Перейти вгору"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 1f358f8..f40f145 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Mã PIN không chính xác!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"Để mở khoá, hãy nhấn vào Trình đơn sau đó nhấn 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Số khẩn cấp"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(Không có dịch vụ nào)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Không có dịch vụ nào."</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Màn hình đã khoá."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Nhấn vào Trình đơn để mở khoá hoặc thực hiện cuộc gọi khẩn cấp."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Nhấn vào Trình đơn để mở khoá."</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"Sao chép"</string>
<string name="paste" msgid="5629880836805036433">"Dán"</string>
<string name="replace" msgid="5781686059063148930">"Thay thế???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Xóa"</string>
<string name="copyUrl" msgid="2538211579596067402">"Sao chép URL"</string>
<string name="selectTextMode" msgid="6738556348861347240">"Chọn văn bản..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Lựa chọn văn bản"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ thêm vào từ điển"</string>
<string name="inputMethod" msgid="1653630062304567879">"Phương thức nhập"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Tác vụ văn bản"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"Còn ít dung lượng"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"Yêu cầu thiết lập kết nối Wi-Fi Direct từ <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Nhấp vào OK để chấp nhận."</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"Yêu cầu thiết lập Wi-Fi Direct từ <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g>. Nhập pin để tiếp tục."</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"Cần nhập pin WPS <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g> vào thiết bị ngang hàng <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> để tiếp tục thiết lập kết nối"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Chèn ký tự"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"Ứng dụng không xác định"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Đang gửi tin nhắn SMS"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"Chọn tài khoản"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"Tăng dần"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"Giảm dần"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"Bấm và giữ <xliff:g id="VALUE">%s</xliff:g>."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Trượt lên để tăng và trượt xuống để giảm."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Phút tăng dần"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Phút giảm dần"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Giờ tăng dần"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Giờ giảm dần."</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Đặt CH"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Đặt SA"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Tháng tăng dần"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Tháng giảm dần"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Ngày tăng dần"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Ngày giảm dần"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Năm tăng dần"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Năm giảm dần."</string>
<string name="checkbox_checked" msgid="7222044992652711167">"đã kiểm tra"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"chưa chọn"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"đã chọn"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Thay đổi chế độ"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Tay trượt. Bấm và giữ."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Lên để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Xuống để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Sang trái để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Sang phải để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Mở khóa"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Máy ảnh"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Im lặng"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Bật âm thanh"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Phím. Yêu cầu phải có tai nghe để nghe phím khi nhập mật khẩu."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Điều hướng về trang chủ"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Điều hướng lên trên"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 7f06bb9..b729bb5 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -449,8 +449,8 @@
<string name="permdesc_changeNetworkState" msgid="4199958910396387075">"允许应用程序更改网络连接的状态。"</string>
<string name="permlab_changeTetherState" msgid="2702121155761140799">"更改绑定的连接"</string>
<string name="permdesc_changeTetherState" msgid="8905815579146349568">"允许应用程序更改绑定网络连接的状态。"</string>
- <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"更改背景数据使用设置"</string>
- <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"允许应用程序更改背景数据使用设置。"</string>
+ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"更改后台数据使用设置"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"允许应用程序更改后台数据使用设置。"</string>
<string name="permlab_accessWifiState" msgid="8100926650211034400">"查看 Wi-Fi 状态"</string>
<string name="permdesc_accessWifiState" msgid="485796529139236346">"允许应用程序查看有关 Wi-Fi 状态的信息。"</string>
<string name="permlab_changeWifiState" msgid="7280632711057112137">"更改 Wi-Fi 状态"</string>
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 码不正确!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"要解锁,请先按 MENU 再按 0。"</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"急救或报警电话"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(无服务)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"无服务。"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"屏幕已锁定。"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"按 Menu 解锁或进行紧急呼救。"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"按 MENU 解锁。"</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"复制"</string>
<string name="paste" msgid="5629880836805036433">"粘贴"</string>
<string name="replace" msgid="5781686059063148930">"替换???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"删除"</string>
<string name="copyUrl" msgid="2538211579596067402">"复制网址"</string>
<string name="selectTextMode" msgid="6738556348861347240">"选择文字..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"文字选择"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"+ 添加到词典"</string>
<string name="inputMethod" msgid="1653630062304567879">"输入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字操作"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"存储空间不足"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"收到来自 <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> 的 Wi-Fi Direct 连接设置请求。点击“确定”即可接受。"</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"收到来自 <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> 的 Wi-Fi Direct 连接设置请求。输入 PIN 即可继续操作。"</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"必须在对端设备 <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> 上输入 WPS PIN“<xliff:g id="P2P_WPS_PIN">%1$s</xliff:g>”,才能继续进行连接设置"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"插入字符"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"未知的应用程序"</string>
<string name="sms_control_title" msgid="7296612781128917719">"正在发送短信"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"选择帐户"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"减少"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"点按 <xliff:g id="VALUE">%s</xliff:g> 次并按住。"</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"向上滑动可增加值,向下滑动可减少值。"</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"增加分钟数"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"减少分钟数"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"增加小时数"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"减少小时数"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"设置下午时间"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"设置上午时间"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"增加月数"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"减少月数"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"增加天数"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"减少天数"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"增加年数"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"减少年数"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"已选中"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"未选中"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"已选择"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"模式更改"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"滑动手柄。点按并按住。"</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"向上滑动<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"向下滑动<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"向左滑动<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"向右滑动<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"解锁"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"相机"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"静音"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"打开声音"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"按键声。需要插入耳机才能在键入密码时听到按键声。"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"导航首页"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"向上导航"</string>
@@ -1189,7 +1170,7 @@
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"已超出移动数据流量上限"</string>
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"超出了 Wi-Fi 数据流量上限"</string>
<string name="data_usage_limit_snoozed_body" msgid="2932736326652880660">"超出规定上限 <xliff:g id="SIZE">%s</xliff:g>"</string>
- <string name="data_usage_restricted_title" msgid="5965157361036321914">"背景数据受限制"</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"后台数据受限制"</string>
<string name="data_usage_restricted_body" msgid="5087354814839059798">"触摸以删除限制"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"安全证书"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"该证书有效。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index cc69d81..a27f904 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -640,7 +640,7 @@
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 碼錯誤!"</string>
<string name="keyguard_label_text" msgid="861796461028298424">"如要解鎖,請按 Menu 鍵,然後按 0。"</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"緊急電話號碼"</string>
- <!-- outdated translation 8812714795156374435 --> <string name="lockscreen_carrier_default" msgid="8963839242565653192">"(沒有服務)"</string>
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"沒有服務。"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"螢幕已鎖定。"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"按下 [Menu] 解鎖或撥打緊急電話。"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"按下 Menu 鍵解鎖。"</string>
@@ -855,11 +855,11 @@
<string name="copy" msgid="2681946229533511987">"複製"</string>
<string name="paste" msgid="5629880836805036433">"貼上"</string>
<string name="replace" msgid="5781686059063148930">"取代???"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"刪除"</string>
<string name="copyUrl" msgid="2538211579596067402">"複製網址"</string>
<string name="selectTextMode" msgid="6738556348861347240">"選取文字..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"選取文字"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">" + 新增至字典"</string>
<string name="inputMethod" msgid="1653630062304567879">"輸入方式"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字動作"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"儲存空間即將不足"</string>
@@ -946,6 +946,10 @@
<string name="wifi_p2p_pbc_go_negotiation_request_message" msgid="3170321684621420428">"收到來自 <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> 的 Wi-Fi Direct 連線設定要求,按一下 [確定] 即可接受。"</string>
<string name="wifi_p2p_pin_go_negotiation_request_message" msgid="5177412094633377308">"收到來自 <xliff:g id="P2P_DEVICE_ADDRESS">%1$s</xliff:g> 的 Wi-Fi Direct 連線設定要求。輸入 PIN 即可繼續進行。"</string>
<string name="wifi_p2p_pin_display_message" msgid="2834049169114922902">"必須在對端裝置 <xliff:g id="P2P_CLIENT_ADDRESS">%2$s</xliff:g> 上輸入 WPS PIN <xliff:g id="P2P_WPS_PIN">%1$s</xliff:g>,才能繼續進行連線設定"</string>
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"插入字元"</string>
<string name="sms_control_default_app_name" msgid="7630529934366549163">"未知的應用程式"</string>
<string name="sms_control_title" msgid="7296612781128917719">"傳送 SMS 簡訊"</string>
@@ -1108,34 +1112,20 @@
<string name="choose_account_label" msgid="4191313562041125787">"選取帳戶"</string>
<string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string>
<string name="number_picker_decrement_button" msgid="2576606679160067262">"減少"</string>
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> 輕按並按住。"</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"向上滑動即可增加,向下滑動即可減少。"</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"增加分鐘數"</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"減少分鐘數"</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"增加時數"</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"減少時數"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"設定 PM 值"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"設定 AM 值"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"增加月份"</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"減少月份"</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"增加天數"</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"減少天數"</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"增加年份"</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"減少年份"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"已勾選"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"尚未勾選"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"已選取"</string>
@@ -1151,24 +1141,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"模式變更"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift 鍵"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 鍵"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"滑動控制。持續輕按。"</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"向下滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"向右滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"解除鎖定"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"相機"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"靜音"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"開啟音效"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"提醒您,輸入密碼時需要使用耳機才能聽到按鍵名稱。"</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"瀏覽首頁"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"向上瀏覽"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 0e4690e..d1bdeae 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -838,8 +838,7 @@
<skip />
<!-- no translation found for emergency_call_dialog_number_for_display (696192103195090970) -->
<skip />
- <!-- no translation found for lockscreen_carrier_default (8963839242565653192) -->
- <skip />
+ <string name="lockscreen_carrier_default" msgid="8963839242565653192">"Ayikho isevisi"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Isikrini sivaliwe."</string>
<!-- no translation found for lockscreen_instructions_when_pattern_enabled (46154051614126049) -->
<skip />
@@ -1122,12 +1121,12 @@
<!-- no translation found for paste (5629880836805036433) -->
<skip />
<string name="replace" msgid="5781686059063148930">"Buyisela"</string>
- <!-- no translation found for delete (6098684844021697789) -->
- <skip />
+ <string name="delete" msgid="6098684844021697789">"Susa"</string>
<!-- no translation found for copyUrl (2538211579596067402) -->
<skip />
<string name="selectTextMode" msgid="6738556348861347240">"Khetha umbhalo..."</string>
<string name="textSelectionCABTitle" msgid="5236850394370820357">"Inketho yombhalo"</string>
+ <string name="addToDictionary" msgid="2839899368418071843">"Faka esichazinimazwi"</string>
<string name="inputMethod" msgid="1653630062304567879">"Indlela yokufakwayo"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"Izenzo zombhalo"</string>
<!-- no translation found for low_internal_storage_view_title (1399732408701697546) -->
@@ -1245,6 +1244,10 @@
<skip />
<!-- no translation found for wifi_p2p_pin_display_message (2834049169114922902) -->
<skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
<string name="select_character" msgid="3365550120617701745">"Faka uhlamvu"</string>
<!-- no translation found for sms_control_default_app_name (7630529934366549163) -->
<skip />
@@ -1435,34 +1438,20 @@
<skip />
<!-- no translation found for number_picker_decrement_button (2576606679160067262) -->
<skip />
- <!-- no translation found for number_picker_increment_scroll_mode (1343063395404990189) -->
- <skip />
- <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) -->
- <skip />
- <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) -->
- <skip />
- <!-- no translation found for time_picker_decrement_minute_button (4357907223628449595) -->
- <skip />
- <!-- no translation found for time_picker_increment_hour_button (2484204991937119057) -->
- <skip />
- <!-- no translation found for time_picker_decrement_hour_button (4659353501775842780) -->
- <skip />
- <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
- <skip />
- <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
- <skip />
- <!-- no translation found for date_picker_increment_month_button (6324978841467899081) -->
- <skip />
- <!-- no translation found for date_picker_decrement_month_button (7304349355000398077) -->
- <skip />
- <!-- no translation found for date_picker_increment_day_button (4397040141921413183) -->
- <skip />
- <!-- no translation found for date_picker_decrement_day_button (2427816793443629131) -->
- <skip />
- <!-- no translation found for date_picker_increment_year_button (3058553394722295105) -->
- <skip />
- <!-- no translation found for date_picker_decrement_year_button (5193062846559743823) -->
- <skip />
+ <string name="number_picker_increment_scroll_mode" msgid="1343063395404990189">"<xliff:g id="VALUE">%s</xliff:g> chofoza bese ucindezela."</string>
+ <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Shishilizisa kwenyuke kuye ekwenyusweni kwehle kuye ekwehlisweni."</string>
+ <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Umzuzu wokwenyusa."</string>
+ <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Umzuzu wokwehlisa."</string>
+ <string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Ihora lokwenyusa."</string>
+ <string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Ihora lokwehlisa"</string>
+ <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Setha Ntambama"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Setha Ekuseni"</string>
+ <string name="date_picker_increment_month_button" msgid="6324978841467899081">"Inyanga yokwenyusa."</string>
+ <string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Inyanga yokwehlisa."</string>
+ <string name="date_picker_increment_day_button" msgid="4397040141921413183">"Usuku lokwenyusa."</string>
+ <string name="date_picker_decrement_day_button" msgid="2427816793443629131">"Usuku lokwehlisa."</string>
+ <string name="date_picker_increment_year_button" msgid="3058553394722295105">"Unyaka wokwenyusa."</string>
+ <string name="date_picker_decrement_year_button" msgid="5193062846559743823">"Unyaka wokwehlisa"</string>
<string name="checkbox_checked" msgid="7222044992652711167">"kuhloliwe"</string>
<string name="checkbox_not_checked" msgid="5174639551134444056">"akuhloliwe"</string>
<string name="radiobutton_selected" msgid="8603599808486581511">"Okukhethiwe"</string>
@@ -1478,24 +1467,15 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ukushintsha kwendlela esetshenziswayo"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Beka kwenye indawo"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Faka"</string>
- <!-- no translation found for content_description_sliding_handle (7311938669217173870) -->
- <skip />
- <!-- no translation found for description_direction_up (1983114130441878529) -->
- <skip />
- <!-- no translation found for description_direction_down (4294993639091088240) -->
- <skip />
- <!-- no translation found for description_direction_left (6814008463839915747) -->
- <skip />
- <!-- no translation found for description_direction_right (4296057241963012862) -->
- <skip />
- <!-- no translation found for description_target_unlock (2228524900439801453) -->
- <skip />
- <!-- no translation found for description_target_camera (969071997552486814) -->
- <skip />
- <!-- no translation found for description_target_silent (893551287746522182) -->
- <skip />
- <!-- no translation found for description_target_soundon (30052466675500172) -->
- <skip />
+ <string name="content_description_sliding_handle" msgid="7311938669217173870">"Isibambo esishelelayo. Thepha bese uyabamba."</string>
+ <string name="description_direction_up" msgid="1983114130441878529">"Phezulu kwe <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4294993639091088240">"Ngaphansi kwe <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6814008463839915747">"Kwesokunxeleee kwe <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="4296057241963012862">"Ngakwesokudla kwe for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_target_unlock" msgid="2228524900439801453">"Vula"</string>
+ <string name="description_target_camera" msgid="969071997552486814">"Ikhamera"</string>
+ <string name="description_target_silent" msgid="893551287746522182">"Thulile"</string>
+ <string name="description_target_soundon" msgid="30052466675500172">"Umsindo uvuliwe"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="4407722573911224960">"Izinkinobho. I-Headset edingeka ukuze kuzwakale izinkinobho ngesikhathi uthayipha i-password."</string>
<!-- no translation found for action_bar_home_description (5293600496601490216) -->
<skip />
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 0bf5b0a..c990125 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -235,6 +235,11 @@
<!-- The list item height for search results. @hide -->
<attr name="searchResultListItemHeight" format="dimension" />
+ <!-- The preferred padding along the left edge of list items. -->
+ <attr name="listPreferredItemPaddingLeft" format="dimension" />
+ <!-- The preferred padding along the right edge of list items. -->
+ <attr name="listPreferredItemPaddingRight" format="dimension" />
+
<!-- The preferred TextAppearance for the primary text of list items. -->
<attr name="textAppearanceListItem" format="reference" />
<!-- The preferred TextAppearance for the primary text of small list items. -->
@@ -597,6 +602,9 @@
<!-- The DatePicker style. -->
<attr name="datePickerStyle" format="reference" />
+ <!-- Default ActivityChooserView style. -->
+ <attr name="activityChooserViewStyle" format="reference" />
+
<!-- Fast scroller styles -->
<eat-comment />
@@ -697,6 +705,8 @@
<!-- Default style for PreferenceScreen. -->
<attr name="preferenceScreenStyle" format="reference" />
+ <!-- Default style for Headers pane in PreferenceActivity. -->
+ <attr name="preferenceFragmentStyle" format="reference" />
<!-- Default style for PreferenceCategory. -->
<attr name="preferenceCategoryStyle" format="reference" />
<!-- Default style for Preference. -->
@@ -1543,6 +1553,8 @@
<attr name="multiChoiceItemLayout" format="reference" />
<attr name="singleChoiceItemLayout" format="reference" />
<attr name="listItemLayout" format="reference" />
+ <attr name="progressLayout" format="reference" />
+ <attr name="horizontalProgressLayout" format="reference" />
</declare-styleable>
<!-- Fragment animation class attributes. -->
@@ -1796,7 +1808,13 @@
<!-- Defines whether the vertical scrollbar track should always be drawn. -->
<attr name="scrollbarAlwaysDrawVerticalTrack" format="boolean" />
- <!-- Defines which edges should be fadeded on scrolling. -->
+ <!-- {@deprecated This attribute is deprecated and will be ignored as of
+ API level {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}.
+ Using fading edges may introduce noticeable performance
+ degradations and should be used only when required by the application's
+ visual design. To request fading edges with API level
+ {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH} and above,
+ use the <code>requiresFadingEdge</code> attribute instead.} -->
<attr name="fadingEdge">
<!-- No edge is faded. -->
<flag name="none" value="0x00000000" />
@@ -1805,6 +1823,15 @@
<!-- Fades vertical edges only. -->
<flag name="vertical" value="0x00002000" />
</attr>
+ <!-- Defines which edges should be faded on scrolling. -->
+ <attr name="requiresFadingEdge">
+ <!-- No edge is faded. -->
+ <flag name="none" value="0x00000000" />
+ <!-- Fades horizontal edges only. -->
+ <flag name="horizontal" value="0x00001000" />
+ <!-- Fades vertical edges only. -->
+ <flag name="vertical" value="0x00002000" />
+ </attr>
<!-- Defines the length of the fading edges. -->
<attr name="fadingEdgeLength" format="dimension" />
@@ -3150,6 +3177,10 @@
<!-- Present the text in ALL CAPS. This may use a small-caps form when available. -->
<attr name="textAllCaps" />
</declare-styleable>
+ <declare-styleable name="TextViewAppearance">
+ <!-- Base text color, typeface, size, and style. -->
+ <attr name="textAppearance" />
+ </declare-styleable>
<declare-styleable name="SuggestionSpan">
<attr name="textUnderlineColor" />
<attr name="textUnderlineThickness" />
@@ -3924,10 +3955,6 @@
<!-- ========================== -->
<eat-comment />
- <declare-styleable name="AnimationSet">
- <attr name="shareInterpolator" format="boolean" />
- </declare-styleable>
-
<declare-styleable name="Animation">
<!-- Defines the interpolator used to smooth the animation movement in time. -->
<attr name="interpolator" />
@@ -3977,6 +4004,15 @@
<attr name="detachWallpaper" format="boolean" />
</declare-styleable>
+ <declare-styleable name="AnimationSet">
+ <attr name="shareInterpolator" format="boolean" />
+ <attr name="fillBefore" />
+ <attr name="fillAfter" />
+ <attr name="duration" />
+ <attr name="startOffset" />
+ <attr name="repeatMode" />
+ </declare-styleable>
+
<declare-styleable name="RotateAnimation">
<attr name="fromDegrees" />
<attr name="toDegrees" />
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 051ed14..1e5358e 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -385,6 +385,9 @@
<!-- Default value for LED on time when the battery is low on charge in miliseconds -->
<integer name="config_notificationsBatteryLedOn">125</integer>
+ <!-- Is the notification LED intrusive? Used to decide if there should be a disable option -->
+ <bool name="config_intrusiveNotificationLed">false</bool>
+
<!-- Default value for LED off time when the battery is low on charge in miliseconds -->
<integer name="config_notificationsBatteryLedOff">2875</integer>
@@ -423,6 +426,10 @@
<integer-array name="config_autoBrightnessLevels">
</integer-array>
+
+ <!-- Minimum screen brightness allowed by the power manager. -->
+ <integer name="config_screenBrightnessDim">20</integer>
+
<!-- Array of output values for LCD backlight corresponding to the LUX values
in the config_autoBrightnessLevels array. This array should have size one greater
than the size of the config_autoBrightnessLevels array.
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 4f162f2..f1fc42c 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -78,7 +78,7 @@
<!-- Preference activity side margins -->
<dimen name="preference_screen_side_margin">0dp</dimen>
<!-- Preference activity side margins negative-->
- <dimen name="preference_screen_side_margin_negative">-4dp</dimen>
+ <dimen name="preference_screen_side_margin_negative">0dp</dimen>
<!-- Preference activity top margin -->
<dimen name="preference_screen_top_margin">0dp</dimen>
<!-- Preference activity bottom margin -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index bc2b907..848fb8b 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1702,313 +1702,276 @@
<public type="style" name="TextAppearance.Holo.DialogWindowTitle" id="0x01030117" />
<!-- ===============================================================
- Resources added in version 14 of the platform (Ice Cream Sandwich)
+ Resources added in version 14 of the platform (Ice Cream Sandwich / 4.0)
=============================================================== -->
<eat-comment />
- <public type="attr" name="state_hovered" />
- <public type="attr" name="state_drag_can_accept" />
- <public type="attr" name="state_drag_hovered" />
- <public type="attr" name="stopWithTask" />
+ <public type="attr" name="state_hovered" id="0x01010367" />
+ <public type="attr" name="state_drag_can_accept" id="0x01010368" />
+ <public type="attr" name="state_drag_hovered" id="0x01010369" />
+ <public type="attr" name="stopWithTask" id="0x0101036a" />
+ <public type="attr" name="switchTextOn" id="0x0101036b" />
+ <public type="attr" name="switchTextOff" id="0x0101036c" />
+ <public type="attr" name="switchPreferenceStyle" id="0x0101036d" />
+ <public type="attr" name="switchTextAppearance" id="0x0101036e" />
+ <public type="attr" name="track" id="0x0101036f" />
+ <public type="attr" name="switchMinWidth" id="0x01010370" />
+ <public type="attr" name="switchPadding" id="0x01010371" />
+ <public type="attr" name="thumbTextPadding" id="0x01010372" />
+ <public type="attr" name="textSuggestionsWindowStyle" id="0x01010373" />
+ <public type="attr" name="textEditSuggestionItemLayout" id="0x01010374" />
+ <public type="attr" name="rowCount" id="0x01010375" />
+ <public type="attr" name="rowOrderPreserved" id="0x01010376" />
+ <public type="attr" name="columnCount" id="0x01010377" />
+ <public type="attr" name="columnOrderPreserved" id="0x01010378" />
+ <public type="attr" name="useDefaultMargins" id="0x01010379" />
+ <public type="attr" name="alignmentMode" id="0x0101037a" />
+ <public type="attr" name="layout_row" id="0x0101037b" />
+ <public type="attr" name="layout_rowSpan" id="0x0101037c" />
+ <public type="attr" name="layout_columnSpan" id="0x0101037d" />
+ <public type="attr" name="actionModeSelectAllDrawable" id="0x0101037e" />
+ <public type="attr" name="isAuxiliary" id="0x0101037f" />
+ <public type="attr" name="accessibilityEventTypes" id="0x01010380" />
+ <public type="attr" name="packageNames" id="0x01010381" />
+ <public type="attr" name="accessibilityFeedbackType" id="0x01010382" />
+ <public type="attr" name="notificationTimeout" id="0x01010383" />
+ <public type="attr" name="accessibilityFlags" id="0x01010384" />
+ <public type="attr" name="canRetrieveWindowContent" id="0x01010385" />
+ <public type="attr" name="listPreferredItemHeightLarge" id="0x01010386" />
+ <public type="attr" name="listPreferredItemHeightSmall" id="0x01010387" />
+ <public type="attr" name="actionBarSplitStyle" id="0x01010388" />
+ <public type="attr" name="actionProviderClass" id="0x01010389" />
+ <public type="attr" name="backgroundStacked" id="0x0101038a" />
+ <public type="attr" name="backgroundSplit" id="0x0101038b" />
+ <public type="attr" name="textAllCaps" id="0x0101038c" />
+ <public type="attr" name="colorPressedHighlight" id="0x0101038d" />
+ <public type="attr" name="colorLongPressedHighlight" id="0x0101038e" />
+ <public type="attr" name="colorFocusedHighlight" id="0x0101038f" />
+ <public type="attr" name="colorActivatedHighlight" id="0x01010390" />
+ <public type="attr" name="colorMultiSelectHighlight" id="0x01010391" />
+ <public type="attr" name="drawableStart" id="0x01010392" />
+ <public type="attr" name="drawableEnd" id="0x01010393" />
+ <public type="attr" name="actionModeStyle" id="0x01010394" />
+ <public type="attr" name="minResizeWidth" id="0x01010395" />
+ <public type="attr" name="minResizeHeight" id="0x01010396" />
+ <public type="attr" name="actionBarWidgetTheme" id="0x01010397" />
+ <public type="attr" name="uiOptions" id="0x01010398" />
+ <public type="attr" name="subtypeLocale" id="0x01010399" />
+ <public type="attr" name="subtypeExtraValue" id="0x0101039a" />
+ <public type="attr" name="actionBarDivider" id="0x0101039b" />
+ <public type="attr" name="actionBarItemBackground" id="0x0101039c" />
+ <public type="attr" name="actionModeSplitBackground" id="0x0101039d" />
+ <public type="attr" name="textAppearanceListItem" id="0x0101039e" />
+ <public type="attr" name="textAppearanceListItemSmall" id="0x0101039f" />
+ <public type="attr" name="targetDescriptions" id="0x010103a0" />
+ <public type="attr" name="directionDescriptions" id="0x010103a1" />
+ <public type="attr" name="overridesImplicitlyEnabledSubtype" id="0x010103a2" />
+ <public type="attr" name="listPreferredItemPaddingLeft" id="0x010103a3" />
+ <public type="attr" name="listPreferredItemPaddingRight" id="0x010103a4" />
+ <public type="attr" name="requiresFadingEdge" id="0x010103a5" />
- <public type="attr" name="switchTextOn" />
- <public type="attr" name="switchTextOff" />
- <public type="attr" name="switchPreferenceStyle" />
- <public type="attr" name="switchTextAppearance" />
- <public type="attr" name="track" />
- <public type="attr" name="switchMinWidth" />
- <public type="attr" name="switchPadding" />
- <public type="attr" name="thumbTextPadding" />
+ <public type="style" name="TextAppearance.SuggestionHighlight" id="0x01030118" />
+ <public type="style" name="Theme.Holo.Light.DarkActionBar" id="0x01030119" />
+ <public type="style" name="Widget.Holo.Button.Borderless.Small" id="0x0103011a" />
+ <public type="style" name="Widget.Holo.Light.Button.Borderless.Small" id="0x0103011b" />
+ <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Title.Inverse" id="0x0103011c" />
+ <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Subtitle.Inverse" id="0x0103011d" />
+ <public type="style" name="TextAppearance.Holo.Widget.ActionMode.Title.Inverse" id="0x0103011e" />
+ <public type="style" name="TextAppearance.Holo.Widget.ActionMode.Subtitle.Inverse" id="0x0103011f" />
+ <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Menu" id="0x01030120" />
+ <public type="style" name="Widget.Holo.ActionBar.Solid" id="0x01030121" />
+ <public type="style" name="Widget.Holo.Light.ActionBar.Solid" id="0x01030122" />
+ <public type="style" name="Widget.Holo.Light.ActionBar.Solid.Inverse" id="0x01030123" />
+ <public type="style" name="Widget.Holo.Light.ActionBar.TabBar.Inverse" id="0x01030124" />
+ <public type="style" name="Widget.Holo.Light.ActionBar.TabView.Inverse" id="0x01030125" />
+ <public type="style" name="Widget.Holo.Light.ActionBar.TabText.Inverse" id="0x01030126" />
+ <public type="style" name="Widget.Holo.Light.ActionMode.Inverse" id="0x01030127" />
+ <public type="style" name="Theme.DeviceDefault" id="0x01030128" />
+ <public type="style" name="Theme.DeviceDefault.NoActionBar" id="0x01030129" />
+ <public type="style" name="Theme.DeviceDefault.NoActionBar.Fullscreen" id="0x0103012a" />
+ <public type="style" name="Theme.DeviceDefault.Light" id="0x0103012b" />
+ <public type="style" name="Theme.DeviceDefault.Light.NoActionBar" id="0x0103012c" />
+ <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.Fullscreen" id="0x0103012d" />
+ <public type="style" name="Theme.DeviceDefault.Dialog" id="0x0103012e" />
+ <public type="style" name="Theme.DeviceDefault.Dialog.MinWidth" id="0x0103012f" />
+ <public type="style" name="Theme.DeviceDefault.Dialog.NoActionBar" id="0x01030130" />
+ <public type="style" name="Theme.DeviceDefault.Dialog.NoActionBar.MinWidth" id="0x01030131" />
+ <public type="style" name="Theme.DeviceDefault.Light.Dialog" id="0x01030132" />
+ <public type="style" name="Theme.DeviceDefault.Light.Dialog.MinWidth" id="0x01030133" />
+ <public type="style" name="Theme.DeviceDefault.Light.Dialog.NoActionBar" id="0x01030134" />
+ <public type="style" name="Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth" id="0x01030135" />
+ <public type="style" name="Theme.DeviceDefault.DialogWhenLarge" id="0x01030136" />
+ <public type="style" name="Theme.DeviceDefault.DialogWhenLarge.NoActionBar" id="0x01030137" />
+ <public type="style" name="Theme.DeviceDefault.Light.DialogWhenLarge" id="0x01030138" />
+ <public type="style" name="Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar" id="0x01030139" />
+ <public type="style" name="Theme.DeviceDefault.Panel" id="0x0103013a" />
+ <public type="style" name="Theme.DeviceDefault.Light.Panel" id="0x0103013b" />
+ <public type="style" name="Theme.DeviceDefault.Wallpaper" id="0x0103013c" />
+ <public type="style" name="Theme.DeviceDefault.Wallpaper.NoTitleBar" id="0x0103013d" />
+ <public type="style" name="Theme.DeviceDefault.InputMethod" id="0x0103013e" />
+ <public type="style" name="Theme.DeviceDefault.Light.DarkActionBar" id="0x0103013f" />
+ <public type="style" name="Widget.DeviceDefault" id="0x01030140" />
+ <public type="style" name="Widget.DeviceDefault.Button" id="0x01030141" />
+ <public type="style" name="Widget.DeviceDefault.Button.Small" id="0x01030142" />
+ <public type="style" name="Widget.DeviceDefault.Button.Inset" id="0x01030143" />
+ <public type="style" name="Widget.DeviceDefault.Button.Toggle" id="0x01030144" />
+ <public type="style" name="Widget.DeviceDefault.Button.Borderless.Small" id="0x01030145" />
+ <public type="style" name="Widget.DeviceDefault.TextView" id="0x01030146" />
+ <public type="style" name="Widget.DeviceDefault.AutoCompleteTextView" id="0x01030147" />
+ <public type="style" name="Widget.DeviceDefault.CompoundButton.CheckBox" id="0x01030148" />
+ <public type="style" name="Widget.DeviceDefault.ListView.DropDown" id="0x01030149" />
+ <public type="style" name="Widget.DeviceDefault.EditText" id="0x0103014a" />
+ <public type="style" name="Widget.DeviceDefault.ExpandableListView" id="0x0103014b" />
+ <public type="style" name="Widget.DeviceDefault.GridView" id="0x0103014c" />
+ <public type="style" name="Widget.DeviceDefault.ImageButton" id="0x0103014d" />
+ <public type="style" name="Widget.DeviceDefault.ListView" id="0x0103014e" />
+ <public type="style" name="Widget.DeviceDefault.PopupWindow" id="0x0103014f" />
+ <public type="style" name="Widget.DeviceDefault.ProgressBar" id="0x01030150" />
+ <public type="style" name="Widget.DeviceDefault.ProgressBar.Horizontal" id="0x01030151" />
+ <public type="style" name="Widget.DeviceDefault.ProgressBar.Small" id="0x01030152" />
+ <public type="style" name="Widget.DeviceDefault.ProgressBar.Small.Title" id="0x01030153" />
+ <public type="style" name="Widget.DeviceDefault.ProgressBar.Large" id="0x01030154" />
+ <public type="style" name="Widget.DeviceDefault.SeekBar" id="0x01030155" />
+ <public type="style" name="Widget.DeviceDefault.RatingBar" id="0x01030156" />
+ <public type="style" name="Widget.DeviceDefault.RatingBar.Indicator" id="0x01030157" />
+ <public type="style" name="Widget.DeviceDefault.RatingBar.Small" id="0x01030158" />
+ <public type="style" name="Widget.DeviceDefault.CompoundButton.RadioButton" id="0x01030159" />
+ <public type="style" name="Widget.DeviceDefault.ScrollView" id="0x0103015a" />
+ <public type="style" name="Widget.DeviceDefault.HorizontalScrollView" id="0x0103015b" />
+ <public type="style" name="Widget.DeviceDefault.Spinner" id="0x0103015c" />
+ <public type="style" name="Widget.DeviceDefault.CompoundButton.Star" id="0x0103015d" />
+ <public type="style" name="Widget.DeviceDefault.TabWidget" id="0x0103015e" />
+ <public type="style" name="Widget.DeviceDefault.WebTextView" id="0x0103015f" />
+ <public type="style" name="Widget.DeviceDefault.WebView" id="0x01030160" />
+ <public type="style" name="Widget.DeviceDefault.DropDownItem" id="0x01030161" />
+ <public type="style" name="Widget.DeviceDefault.DropDownItem.Spinner" id="0x01030162" />
+ <public type="style" name="Widget.DeviceDefault.TextView.SpinnerItem" id="0x01030163" />
+ <public type="style" name="Widget.DeviceDefault.ListPopupWindow" id="0x01030164" />
+ <public type="style" name="Widget.DeviceDefault.PopupMenu" id="0x01030165" />
+ <public type="style" name="Widget.DeviceDefault.ActionButton" id="0x01030166" />
+ <public type="style" name="Widget.DeviceDefault.ActionButton.Overflow" id="0x01030167" />
+ <public type="style" name="Widget.DeviceDefault.ActionButton.TextButton" id="0x01030168" />
+ <public type="style" name="Widget.DeviceDefault.ActionMode" id="0x01030169" />
+ <public type="style" name="Widget.DeviceDefault.ActionButton.CloseMode" id="0x0103016a" />
+ <public type="style" name="Widget.DeviceDefault.ActionBar" id="0x0103016b" />
+ <public type="style" name="Widget.DeviceDefault.Button.Borderless" id="0x0103016c" />
+ <public type="style" name="Widget.DeviceDefault.Tab" id="0x0103016d" />
+ <public type="style" name="Widget.DeviceDefault.CalendarView" id="0x0103016e" />
+ <public type="style" name="Widget.DeviceDefault.DatePicker" id="0x0103016f" />
+ <public type="style" name="Widget.DeviceDefault.ActionBar.TabView" id="0x01030170" />
+ <public type="style" name="Widget.DeviceDefault.ActionBar.TabText" id="0x01030171" />
+ <public type="style" name="Widget.DeviceDefault.ActionBar.TabBar" id="0x01030172" />
+ <public type="style" name="Widget.DeviceDefault.ActionBar.Solid" id="0x01030173" />
+ <public type="style" name="Widget.DeviceDefault.Light" id="0x01030174" />
+ <public type="style" name="Widget.DeviceDefault.Light.Button" id="0x01030175" />
+ <public type="style" name="Widget.DeviceDefault.Light.Button.Small" id="0x01030176" />
+ <public type="style" name="Widget.DeviceDefault.Light.Button.Inset" id="0x01030177" />
+ <public type="style" name="Widget.DeviceDefault.Light.Button.Toggle" id="0x01030178" />
+ <public type="style" name="Widget.DeviceDefault.Light.Button.Borderless.Small" id="0x01030179" />
+ <public type="style" name="Widget.DeviceDefault.Light.TextView" id="0x0103017a" />
+ <public type="style" name="Widget.DeviceDefault.Light.AutoCompleteTextView" id="0x0103017b" />
+ <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.CheckBox" id="0x0103017c" />
+ <public type="style" name="Widget.DeviceDefault.Light.ListView.DropDown" id="0x0103017d" />
+ <public type="style" name="Widget.DeviceDefault.Light.EditText" id="0x0103017e" />
+ <public type="style" name="Widget.DeviceDefault.Light.ExpandableListView" id="0x0103017f" />
+ <public type="style" name="Widget.DeviceDefault.Light.GridView" id="0x01030180" />
+ <public type="style" name="Widget.DeviceDefault.Light.ImageButton" id="0x01030181" />
+ <public type="style" name="Widget.DeviceDefault.Light.ListView" id="0x01030182" />
+ <public type="style" name="Widget.DeviceDefault.Light.PopupWindow" id="0x01030183" />
+ <public type="style" name="Widget.DeviceDefault.Light.ProgressBar" id="0x01030184" />
+ <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Horizontal" id="0x01030185" />
+ <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small" id="0x01030186" />
+ <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small.Title" id="0x01030187" />
+ <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Large" id="0x01030188" />
+ <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Inverse" id="0x01030189" />
+ <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small.Inverse" id="0x0103018a" />
+ <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Large.Inverse" id="0x0103018b" />
+ <public type="style" name="Widget.DeviceDefault.Light.SeekBar" id="0x0103018c" />
+ <public type="style" name="Widget.DeviceDefault.Light.RatingBar" id="0x0103018d" />
+ <public type="style" name="Widget.DeviceDefault.Light.RatingBar.Indicator" id="0x0103018e" />
+ <public type="style" name="Widget.DeviceDefault.Light.RatingBar.Small" id="0x0103018f" />
+ <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.RadioButton" id="0x01030190" />
+ <public type="style" name="Widget.DeviceDefault.Light.ScrollView" id="0x01030191" />
+ <public type="style" name="Widget.DeviceDefault.Light.HorizontalScrollView" id="0x01030192" />
+ <public type="style" name="Widget.DeviceDefault.Light.Spinner" id="0x01030193" />
+ <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.Star" id="0x01030194" />
+ <public type="style" name="Widget.DeviceDefault.Light.TabWidget" id="0x01030195" />
+ <public type="style" name="Widget.DeviceDefault.Light.WebTextView" id="0x01030196" />
+ <public type="style" name="Widget.DeviceDefault.Light.WebView" id="0x01030197" />
+ <public type="style" name="Widget.DeviceDefault.Light.DropDownItem" id="0x01030198" />
+ <public type="style" name="Widget.DeviceDefault.Light.DropDownItem.Spinner" id="0x01030199" />
+ <public type="style" name="Widget.DeviceDefault.Light.TextView.SpinnerItem" id="0x0103019a" />
+ <public type="style" name="Widget.DeviceDefault.Light.ListPopupWindow" id="0x0103019b" />
+ <public type="style" name="Widget.DeviceDefault.Light.PopupMenu" id="0x0103019c" />
+ <public type="style" name="Widget.DeviceDefault.Light.Tab" id="0x0103019d" />
+ <public type="style" name="Widget.DeviceDefault.Light.CalendarView" id="0x0103019e" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionButton" id="0x0103019f" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionButton.Overflow" id="0x010301a0" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionMode" id="0x010301a1" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionButton.CloseMode" id="0x010301a2" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar" id="0x010301a3" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabView" id="0x010301a4" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabText" id="0x010301a5" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabBar" id="0x010301a6" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar.Solid" id="0x010301a7" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar.Solid.Inverse" id="0x010301a8" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabBar.Inverse" id="0x010301a9" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabView.Inverse" id="0x010301aa" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabText.Inverse" id="0x010301ab" />
+ <public type="style" name="Widget.DeviceDefault.Light.ActionMode.Inverse" id="0x010301ac" />
+ <public type="style" name="TextAppearance.DeviceDefault" id="0x010301ad" />
+ <public type="style" name="TextAppearance.DeviceDefault.Inverse" id="0x010301ae" />
+ <public type="style" name="TextAppearance.DeviceDefault.Large" id="0x010301af" />
+ <public type="style" name="TextAppearance.DeviceDefault.Large.Inverse" id="0x010301b0" />
+ <public type="style" name="TextAppearance.DeviceDefault.Medium" id="0x010301b1" />
+ <public type="style" name="TextAppearance.DeviceDefault.Medium.Inverse" id="0x010301b2" />
+ <public type="style" name="TextAppearance.DeviceDefault.Small" id="0x010301b3" />
+ <public type="style" name="TextAppearance.DeviceDefault.Small.Inverse" id="0x010301b4" />
+ <public type="style" name="TextAppearance.DeviceDefault.SearchResult.Title" id="0x010301b5" />
+ <public type="style" name="TextAppearance.DeviceDefault.SearchResult.Subtitle" id="0x010301b6" />
+ <public type="style" name="TextAppearance.DeviceDefault.WindowTitle" id="0x010301b7" />
+ <public type="style" name="TextAppearance.DeviceDefault.DialogWindowTitle" id="0x010301b8" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget" id="0x010301b9" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.Button" id="0x010301ba" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.IconMenu.Item" id="0x010301bb" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.TabWidget" id="0x010301bc" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView" id="0x010301bd" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView.PopupMenu" id="0x010301be" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.DropDownHint" id="0x010301bf" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.DropDownItem" id="0x010301c0" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView.SpinnerItem" id="0x010301c1" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.EditText" id="0x010301c2" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu" id="0x010301c3" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu.Large" id="0x010301c4" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu.Small" id="0x010301c5" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" id="0x010301c6" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle" id="0x010301c7" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Title" id="0x010301c8" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle" id="0x010301c9" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse" id="0x010301ca" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle.Inverse" id="0x010301cb" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Title.Inverse" id="0x010301cc" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse" id="0x010301cd" />
+ <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Menu" id="0x010301ce" />
+ <public type="style" name="DeviceDefault.ButtonBar" id="0x010301cf" />
+ <public type="style" name="DeviceDefault.ButtonBar.AlertDialog" id="0x010301d0" />
+ <public type="style" name="DeviceDefault.SegmentedButton" id="0x010301d1" />
+ <public type="style" name="DeviceDefault.Light.ButtonBar" id="0x010301d2" />
+ <public type="style" name="DeviceDefault.Light.ButtonBar.AlertDialog" id="0x010301d3" />
+ <public type="style" name="DeviceDefault.Light.SegmentedButton" id="0x010301d4" />
- <public type="attr" name="textSuggestionsWindowStyle" />
- <public type="attr" name="textEditSuggestionItemLayout" />
+ <public type="integer" name="status_bar_notification_info_maxnum" id="0x010e0003" />
- <public type="attr" name="rowCount" />
- <public type="attr" name="rowOrderPreserved" />
- <public type="attr" name="columnCount" />
- <public type="attr" name="columnOrderPreserved" />
- <public type="attr" name="useDefaultMargins" />
- <public type="attr" name="alignmentMode" />
+ <public type="string" name="status_bar_notification_info_overflow" id="0x01040017" />
- <public type="attr" name="layout_row" />
- <public type="attr" name="layout_rowSpan" />
+ <public type="color" name="holo_blue_light" id="0x01060012" />
+ <public type="color" name="holo_blue_dark" id="0x01060013" />
+ <public type="color" name="holo_green_light" id="0x01060014" />
+ <public type="color" name="holo_green_dark" id="0x01060015" />
+ <public type="color" name="holo_red_light" id="0x01060016" />
+ <public type="color" name="holo_red_dark" id="0x01060017" />
+ <public type="color" name="holo_orange_light" id="0x01060018" />
+ <public type="color" name="holo_orange_dark" id="0x01060019" />
+ <public type="color" name="holo_purple" id="0x0106001a" />
+ <public type="color" name="holo_blue_bright" id="0x0106001b" />
- <public type="attr" name="layout_columnSpan" />
-
- <public type="attr" name="actionModeSelectAllDrawable" />
-
- <public type="attr" name="isAuxiliary" />
-
- <public type="attr" name="accessibilityEventTypes" />
- <public type="attr" name="packageNames" />
- <public type="attr" name="accessibilityFeedbackType" />
- <public type="attr" name="notificationTimeout" />
- <public type="attr" name="accessibilityFlags" />
- <public type="attr" name="canRetrieveWindowContent" />
-
- <public type="attr" name="targetDrawables" />
- <public type="attr" name="handleDrawable" />
- <public type="attr" name="leftChevronDrawable" />
- <public type="attr" name="rightChevronDrawable" />
- <public type="attr" name="topChevronDrawable" />
- <public type="attr" name="bottomChevronDrawable" />
- <public type="attr" name="waveDrawable" />
- <public type="attr" name="outerRadius" />
- <public type="attr" name="hitRadius" />
- <public type="attr" name="vibrationDuration" />
- <public type="attr" name="snapMargin" />
- <public type="attr" name="feedbackCount" />
- <public type="attr" name="verticalOffset" />
- <public type="attr" name="horizontalOffset" />
- <public type="attr" name="listPreferredItemHeightLarge" />
- <public type="attr" name="listPreferredItemHeightSmall" />
-
- <public type="attr" name="actionBarSplitStyle" />
-
- <public type="attr" name="actionProviderClass" />
-
- <public type="attr" name="backgroundStacked" />
- <public type="attr" name="backgroundSplit" />
-
- <public type="attr" name="textAllCaps" />
-
- <public type="attr" name="colorPressedHighlight" />
- <public type="attr" name="colorLongPressedHighlight" />
- <public type="attr" name="colorFocusedHighlight" />
- <public type="attr" name="colorActivatedHighlight" />
- <public type="attr" name="colorMultiSelectHighlight" />
-
- <public type="attr" name="drawableStart" />
- <public type="attr" name="drawableEnd" />
-
- <public type="attr" name="actionModeStyle" />
-
- <public type="attr" name="minResizeWidth" />
- <public type="attr" name="minResizeHeight" />
-
- <public type="attr" name="actionBarWidgetTheme" />
- <public type="attr" name="uiOptions" />
-
- <public type="attr" name="subtypeLocale" />
- <public type="attr" name="subtypeExtraValue" />
-
- <public type="attr" name="actionBarDivider" />
- <public type="attr" name="actionBarItemBackground" />
- <public type="attr" name="actionModeSplitBackground" />
-
- <public type="attr" name="textAppearanceListItem" />
- <public type="attr" name="textAppearanceListItemSmall" />
-
- <public type="style" name="TextAppearance.SuggestionHighlight" />
-
- <public type="style" name="Theme.Holo.Light.DarkActionBar" />
- <public type="style" name="Widget.Holo.Button.Borderless.Small" />
- <public type="style" name="Widget.Holo.Light.Button.Borderless.Small" />
- <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Title.Inverse" />
- <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Subtitle.Inverse" />
- <public type="style" name="TextAppearance.Holo.Widget.ActionMode.Title.Inverse" />
- <public type="style" name="TextAppearance.Holo.Widget.ActionMode.Subtitle.Inverse" />
- <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Menu" />
- <public type="style" name="Widget.Holo.ActionBar.Solid" />
- <public type="style" name="Widget.Holo.Light.ActionBar.Solid" />
- <public type="style" name="Widget.Holo.Light.ActionBar.Solid.Inverse" />
- <public type="style" name="Widget.Holo.Light.ActionBar.TabBar.Inverse" />
- <public type="style" name="Widget.Holo.Light.ActionBar.TabView.Inverse" />
- <public type="style" name="Widget.Holo.Light.ActionBar.TabText.Inverse" />
- <public type="style" name="Widget.Holo.Light.ActionMode.Inverse" />
-
- <public type="style" name="Theme.DeviceDefault" />
- <public type="style" name="Theme.DeviceDefault.NoActionBar" />
- <public type="style" name="Theme.DeviceDefault.NoActionBar.Fullscreen" />
- <public type="style" name="Theme.DeviceDefault.Light" />
- <public type="style" name="Theme.DeviceDefault.Light.NoActionBar" />
- <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.Fullscreen" />
- <public type="style" name="Theme.DeviceDefault.Dialog" />
- <public type="style" name="Theme.DeviceDefault.Dialog.MinWidth" />
- <public type="style" name="Theme.DeviceDefault.Dialog.NoActionBar" />
- <public type="style" name="Theme.DeviceDefault.Dialog.NoActionBar.MinWidth" />
- <public type="style" name="Theme.DeviceDefault.Light.Dialog" />
- <public type="style" name="Theme.DeviceDefault.Light.Dialog.MinWidth" />
- <public type="style" name="Theme.DeviceDefault.Light.Dialog.NoActionBar" />
- <public type="style" name="Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth" />
- <public type="style" name="Theme.DeviceDefault.DialogWhenLarge" />
- <public type="style" name="Theme.DeviceDefault.DialogWhenLarge.NoActionBar" />
- <public type="style" name="Theme.DeviceDefault.Light.DialogWhenLarge" />
- <public type="style" name="Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar" />
- <public type="style" name="Theme.DeviceDefault.Panel" />
- <public type="style" name="Theme.DeviceDefault.Light.Panel" />
- <public type="style" name="Theme.DeviceDefault.Wallpaper" />
- <public type="style" name="Theme.DeviceDefault.Wallpaper.NoTitleBar" />
- <public type="style" name="Theme.DeviceDefault.InputMethod" />
- <public type="style" name="Theme.DeviceDefault.Light.DarkActionBar" />
-
- <public type="style" name="Widget.DeviceDefault" />
- <public type="style" name="Widget.DeviceDefault.Button" />
- <public type="style" name="Widget.DeviceDefault.Button.Small" />
- <public type="style" name="Widget.DeviceDefault.Button.Inset" />
- <public type="style" name="Widget.DeviceDefault.Button.Toggle" />
- <public type="style" name="Widget.DeviceDefault.Button.Borderless.Small" />
- <public type="style" name="Widget.DeviceDefault.TextView" />
- <public type="style" name="Widget.DeviceDefault.AutoCompleteTextView" />
- <public type="style" name="Widget.DeviceDefault.CompoundButton.CheckBox" />
- <public type="style" name="Widget.DeviceDefault.ListView.DropDown" />
- <public type="style" name="Widget.DeviceDefault.EditText" />
- <public type="style" name="Widget.DeviceDefault.ExpandableListView" />
- <public type="style" name="Widget.DeviceDefault.GridView" />
- <public type="style" name="Widget.DeviceDefault.ImageButton" />
- <public type="style" name="Widget.DeviceDefault.ListView" />
- <public type="style" name="Widget.DeviceDefault.PopupWindow" />
- <public type="style" name="Widget.DeviceDefault.ProgressBar" />
- <public type="style" name="Widget.DeviceDefault.ProgressBar.Horizontal" />
- <public type="style" name="Widget.DeviceDefault.ProgressBar.Small" />
- <public type="style" name="Widget.DeviceDefault.ProgressBar.Small.Title" />
- <public type="style" name="Widget.DeviceDefault.ProgressBar.Large" />
- <public type="style" name="Widget.DeviceDefault.SeekBar" />
- <public type="style" name="Widget.DeviceDefault.RatingBar" />
- <public type="style" name="Widget.DeviceDefault.RatingBar.Indicator" />
- <public type="style" name="Widget.DeviceDefault.RatingBar.Small" />
- <public type="style" name="Widget.DeviceDefault.CompoundButton.RadioButton" />
- <public type="style" name="Widget.DeviceDefault.ScrollView" />
- <public type="style" name="Widget.DeviceDefault.HorizontalScrollView" />
- <public type="style" name="Widget.DeviceDefault.Spinner" />
- <public type="style" name="Widget.DeviceDefault.CompoundButton.Star" />
- <public type="style" name="Widget.DeviceDefault.TabWidget" />
- <public type="style" name="Widget.DeviceDefault.WebTextView" />
- <public type="style" name="Widget.DeviceDefault.WebView" />
- <public type="style" name="Widget.DeviceDefault.DropDownItem" />
- <public type="style" name="Widget.DeviceDefault.DropDownItem.Spinner" />
- <public type="style" name="Widget.DeviceDefault.TextView.SpinnerItem" />
- <public type="style" name="Widget.DeviceDefault.ListPopupWindow" />
- <public type="style" name="Widget.DeviceDefault.PopupMenu" />
- <public type="style" name="Widget.DeviceDefault.ActionButton" />
- <public type="style" name="Widget.DeviceDefault.ActionButton.Overflow" />
- <public type="style" name="Widget.DeviceDefault.ActionButton.TextButton" />
- <public type="style" name="Widget.DeviceDefault.ActionMode" />
- <public type="style" name="Widget.DeviceDefault.ActionButton.CloseMode" />
- <public type="style" name="Widget.DeviceDefault.ActionBar" />
- <public type="style" name="Widget.DeviceDefault.Button.Borderless" />
- <public type="style" name="Widget.DeviceDefault.Tab" />
- <public type="style" name="Widget.DeviceDefault.CalendarView" />
- <public type="style" name="Widget.DeviceDefault.DatePicker" />
- <public type="style" name="Widget.DeviceDefault.ActionBar.TabView" />
- <public type="style" name="Widget.DeviceDefault.ActionBar.TabText" />
- <public type="style" name="Widget.DeviceDefault.ActionBar.TabBar" />
- <public type="style" name="Widget.DeviceDefault.ActionBar.Solid" />
- <public type="style" name="Widget.DeviceDefault.Light" />
- <public type="style" name="Widget.DeviceDefault.Light.Button" />
- <public type="style" name="Widget.DeviceDefault.Light.Button.Small" />
- <public type="style" name="Widget.DeviceDefault.Light.Button.Inset" />
- <public type="style" name="Widget.DeviceDefault.Light.Button.Toggle" />
- <public type="style" name="Widget.DeviceDefault.Light.Button.Borderless.Small" />
- <public type="style" name="Widget.DeviceDefault.Light.TextView" />
- <public type="style" name="Widget.DeviceDefault.Light.AutoCompleteTextView" />
- <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.CheckBox" />
- <public type="style" name="Widget.DeviceDefault.Light.ListView.DropDown" />
- <public type="style" name="Widget.DeviceDefault.Light.EditText" />
- <public type="style" name="Widget.DeviceDefault.Light.ExpandableListView" />
- <public type="style" name="Widget.DeviceDefault.Light.GridView" />
- <public type="style" name="Widget.DeviceDefault.Light.ImageButton" />
- <public type="style" name="Widget.DeviceDefault.Light.ListView" />
- <public type="style" name="Widget.DeviceDefault.Light.PopupWindow" />
- <public type="style" name="Widget.DeviceDefault.Light.ProgressBar" />
- <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Horizontal" />
- <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small" />
- <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small.Title" />
- <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Large" />
- <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Inverse" />
- <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small.Inverse" />
- <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Large.Inverse" />
- <public type="style" name="Widget.DeviceDefault.Light.SeekBar" />
- <public type="style" name="Widget.DeviceDefault.Light.RatingBar" />
- <public type="style" name="Widget.DeviceDefault.Light.RatingBar.Indicator" />
- <public type="style" name="Widget.DeviceDefault.Light.RatingBar.Small" />
- <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.RadioButton" />
- <public type="style" name="Widget.DeviceDefault.Light.ScrollView" />
- <public type="style" name="Widget.DeviceDefault.Light.HorizontalScrollView" />
- <public type="style" name="Widget.DeviceDefault.Light.Spinner" />
- <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.Star" />
- <public type="style" name="Widget.DeviceDefault.Light.TabWidget" />
- <public type="style" name="Widget.DeviceDefault.Light.WebTextView" />
- <public type="style" name="Widget.DeviceDefault.Light.WebView" />
- <public type="style" name="Widget.DeviceDefault.Light.DropDownItem" />
- <public type="style" name="Widget.DeviceDefault.Light.DropDownItem.Spinner" />
- <public type="style" name="Widget.DeviceDefault.Light.TextView.SpinnerItem" />
- <public type="style" name="Widget.DeviceDefault.Light.ListPopupWindow" />
- <public type="style" name="Widget.DeviceDefault.Light.PopupMenu" />
- <public type="style" name="Widget.DeviceDefault.Light.Tab" />
- <public type="style" name="Widget.DeviceDefault.Light.CalendarView" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionButton" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionButton.Overflow" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionMode" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionButton.CloseMode" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabView" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabText" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabBar" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar.Solid" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar.Solid.Inverse" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabBar.Inverse" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabView.Inverse" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabText.Inverse" />
- <public type="style" name="Widget.DeviceDefault.Light.ActionMode.Inverse" />
-
- <public type="style" name="TextAppearance.DeviceDefault" />
- <public type="style" name="TextAppearance.DeviceDefault.Inverse" />
- <public type="style" name="TextAppearance.DeviceDefault.Large" />
- <public type="style" name="TextAppearance.DeviceDefault.Large.Inverse" />
- <public type="style" name="TextAppearance.DeviceDefault.Medium" />
- <public type="style" name="TextAppearance.DeviceDefault.Medium.Inverse" />
- <public type="style" name="TextAppearance.DeviceDefault.Small" />
- <public type="style" name="TextAppearance.DeviceDefault.Small.Inverse" />
- <public type="style" name="TextAppearance.DeviceDefault.SearchResult.Title" />
- <public type="style" name="TextAppearance.DeviceDefault.SearchResult.Subtitle" />
- <public type="style" name="TextAppearance.DeviceDefault.WindowTitle" />
- <public type="style" name="TextAppearance.DeviceDefault.DialogWindowTitle" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.Button" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.IconMenu.Item" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.TabWidget" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView.PopupMenu" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.DropDownHint" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.DropDownItem" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView.SpinnerItem" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.EditText" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu.Large" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu.Small" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Title" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle.Inverse" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Title.Inverse" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse" />
- <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Menu" />
-
- <public type="style" name="DeviceDefault.ButtonBar" />
- <public type="style" name="DeviceDefault.ButtonBar.AlertDialog" />
- <public type="style" name="DeviceDefault.SegmentedButton" />
- <public type="style" name="DeviceDefault.Light.ButtonBar" />
- <public type="style" name="DeviceDefault.Light.ButtonBar.AlertDialog" />
- <public type="style" name="DeviceDefault.Light.SegmentedButton" />
-
- <public type="integer" name="status_bar_notification_info_maxnum" />
- <public type="string" name="status_bar_notification_info_overflow" />
-
- <public type="color" name="holo_blue_light" />
- <public type="color" name="holo_blue_dark" />
- <public type="color" name="holo_green_light" />
- <public type="color" name="holo_green_dark" />
- <public type="color" name="holo_red_light" />
- <public type="color" name="holo_red_dark" />
- <public type="color" name="holo_orange_light" />
- <public type="color" name="holo_orange_dark" />
- <public type="color" name="holo_purple" />
- <public type="color" name="holo_blue_bright" />
-
- <public type="attr" name="targetDescriptions" />
- <public type="attr" name="directionDescriptions" />
-
- <public type="attr" name="overridesImplicitlyEnabledSubtype" />
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index eeff473..87cfa38 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2485,7 +2485,10 @@
<string name="textSelectionCABTitle">Text selection</string>
<!-- Option to add the current misspelled word to the user dictionary. [CHAR LIMIT=25] -->
- <string name="addToDictionary">+ add to dictionary</string>
+ <string name="addToDictionary">add to dictionary</string>
+
+ <!-- Option to delete the highlighted part of the text from the suggestion popup. [CHAR LIMIT=25] -->
+ <string name="deleteText">delete</string>
<!-- EditText context menu -->
<string name="inputMethod">Input method</string>
@@ -3218,7 +3221,7 @@
<!-- Notification title when data usage has exceeded warning threshold. [CHAR LIMIT=32] -->
<string name="data_usage_warning_title">Data usage warning</string>
<!-- Notification body when data usage has exceeded warning threshold. [CHAR LIMIT=32] -->
- <string name="data_usage_warning_body">usage exceeds <xliff:g id="size" example="3.8GB">%s</xliff:g></string>
+ <string name="data_usage_warning_body">Touch to view usage and settings</string>
<!-- Notification title when 2G-3G data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=32] -->
<string name="data_usage_3g_limit_title">2G-3G data disabled</string>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 1a6a523..346a3d29 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -61,6 +61,8 @@
<item name="bottomBright">@android:drawable/popup_bottom_bright</item>
<item name="bottomMedium">@android:drawable/popup_bottom_medium</item>
<item name="centerMedium">@android:drawable/popup_center_medium</item>
+ <item name="progressLayout">@android:layout/progress_dialog</item>
+ <item name="horizontalProgressLayout">@android:layout/alert_dialog_progress</item>
</style>
<style name="Widget.PreferenceFrameLayout">
@@ -890,6 +892,14 @@
<item name="android:textSize">30sp</item>
</style>
+ <style name="Widget.ActivityChooserView">
+ <item name="android:gravity">center</item>
+ <item name="android:background">@android:drawable/ab_share_pack_holo_dark</item>
+ <item name="android:divider">?android:attr/dividerVertical</item>
+ <item name="android:showDividers">middle</item>
+ <item name="android:dividerPadding">6dip</item>
+ </style>
+
<style name="TextAppearance.SuggestionHighlight">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@android:color/suggestion_highlight_text</item>
@@ -900,7 +910,12 @@
<style name="Preference">
<item name="android:layout">@android:layout/preference</item>
</style>
-
+
+ <style name="PreferenceFragment">
+ <item name="android:paddingLeft">0dp</item>
+ <item name="android:paddingRight">0dp</item>
+ </style>
+
<style name="Preference.Information">
<item name="android:layout">@android:layout/preference_information</item>
<item name="android:enabled">false</item>
@@ -951,6 +966,11 @@
<item name="android:layout">@android:layout/preference_holo</item>
</style>
+ <style name="PreferenceFragment.Holo">
+ <item name="android:paddingLeft">@dimen/preference_fragment_padding_side</item>
+ <item name="android:paddingRight">@dimen/preference_fragment_padding_side</item>
+ </style>
+
<style name="Preference.Holo.Information">
<item name="android:layout">@android:layout/preference_information_holo</item>
<item name="android:enabled">false</item>
@@ -1651,6 +1671,9 @@
<item name="android:background">@null</item>
</style>
+ <style name="Widget.Holo.ActivityChooserView" parent="Widget.ActivityChooserView">
+ </style>
+
<style name="Widget.Holo.ImageWell" parent="Widget.ImageWell">
</style>
@@ -2071,6 +2094,10 @@
<style name="Widget.Holo.Light.EditText.NumberPickerInputText" parent="Widget.Holo.EditText.NumberPickerInputText">
</style>
+ <style name="Widget.Holo.Light.ActivityChooserView" parent="Widget.Holo.ActivityChooserView">
+ <item name="android:background">@android:drawable/ab_share_pack_holo_light</item>
+ </style>
+
<style name="Widget.Holo.Light.ImageWell" parent="Widget.ImageWell">
</style>
@@ -2335,6 +2362,8 @@
<item name="centerMedium">@android:drawable/dialog_middle_holo_dark</item>
<item name="layout">@android:layout/alert_dialog_holo</item>
<item name="listLayout">@android:layout/select_dialog_holo</item>
+ <item name="progressLayout">@android:layout/progress_dialog_holo</item>
+ <item name="horizontalProgressLayout">@android:layout/alert_dialog_progress_holo</item>
<item name="listItemLayout">@android:layout/select_dialog_item_holo</item>
<item name="multiChoiceItemLayout">@android:layout/select_dialog_multichoice_holo</item>
<item name="singleChoiceItemLayout">@android:layout/select_dialog_singlechoice_holo</item>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 6f98e02..3378dc8 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -124,6 +124,8 @@
<item name="dropdownListPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
<item name="textAppearanceListItem">?android:attr/textAppearanceLarge</item>
<item name="textAppearanceListItemSmall">?android:attr/textAppearanceLarge</item>
+ <item name="listPreferredItemPaddingLeft">6dip</item>
+ <item name="listPreferredItemPaddingRight">6dip</item>
<!-- @hide -->
<item name="searchResultListItemHeight">58dip</item>
@@ -269,9 +271,11 @@
<item name="quickContactBadgeStyleSmallWindowLarge">@android:style/Widget.QuickContactBadgeSmall.WindowLarge</item>
<item name="listPopupWindowStyle">@android:style/Widget.ListPopupWindow</item>
<item name="popupMenuStyle">@android:style/Widget.PopupMenu</item>
-
+ <item name="activityChooserViewStyle">@android:style/Widget.ActivityChooserView</item>
+
<!-- Preference styles -->
<item name="preferenceScreenStyle">@android:style/Preference.PreferenceScreen</item>
+ <item name="preferenceFragmentStyle">@style/PreferenceFragment</item>
<item name="preferenceCategoryStyle">@android:style/Preference.Category</item>
<item name="preferenceStyle">@android:style/Preference</item>
<item name="preferenceInformationStyle">@android:style/Preference.Information</item>
@@ -612,6 +616,9 @@
<item name="textAppearanceLargeInverse">@android:style/TextAppearance.Large.Inverse</item>
<item name="textAppearanceMediumInverse">@android:style/TextAppearance.Medium.Inverse</item>
<item name="textAppearanceSmallInverse">@android:style/TextAppearance.Small.Inverse</item>
+
+ <item name="listPreferredItemPaddingLeft">10dip</item>
+ <item name="listPreferredItemPaddingRight">10dip</item>
</style>
<!-- Variation of Theme.Dialog that does not include a frame (or background).
@@ -636,6 +643,8 @@
<item name="windowTitleStyle">@android:style/DialogWindowTitle</item>
<item name="windowContentOverlay">@null</item>
<item name="itemTextAppearance">@android:style/TextAppearance.Large.Inverse</item>
+ <item name="textAppearanceListItem">@android:style/TextAppearance.Large.Inverse</item>
+ <item name="textAppearanceListItemSmall">@android:style/TextAppearance.Large.Inverse</item>
</style>
<!-- Default dark theme for panel windows. This removes all extraneous
@@ -923,6 +932,8 @@
<item name="listPreferredItemHeightLarge">80dip</item>
<item name="dropdownListPreferredItemHeight">?android:attr/listPreferredItemHeightSmall</item>
<item name="textAppearanceListItemSmall">?android:attr/textAppearanceMedium</item>
+ <item name="listPreferredItemPaddingLeft">8dip</item>
+ <item name="listPreferredItemPaddingRight">8dip</item>
<!-- @hide -->
<item name="searchResultListItemHeight">58dip</item>
@@ -1062,9 +1073,11 @@
<item name="listPopupWindowStyle">@android:style/Widget.Holo.ListPopupWindow</item>
<item name="popupMenuStyle">@android:style/Widget.Holo.PopupMenu</item>
<item name="stackViewStyle">@android:style/Widget.Holo.StackView</item>
+ <item name="activityChooserViewStyle">@android:style/Widget.Holo.ActivityChooserView</item>
<!-- Preference styles -->
<item name="preferenceScreenStyle">@android:style/Preference.Holo.PreferenceScreen</item>
+ <item name="preferenceFragmentStyle">@style/PreferenceFragment.Holo</item>
<item name="preferenceCategoryStyle">@android:style/Preference.Holo.Category</item>
<item name="preferenceStyle">@android:style/Preference.Holo</item>
<item name="preferenceInformationStyle">@android:style/Preference.Holo.Information</item>
@@ -1227,6 +1240,8 @@
<item name="listPreferredItemHeightLarge">80dip</item>
<item name="dropdownListPreferredItemHeight">?android:attr/listPreferredItemHeightSmall</item>
<item name="textAppearanceListItemSmall">?android:attr/textAppearanceMedium</item>
+ <item name="listPreferredItemPaddingLeft">8dip</item>
+ <item name="listPreferredItemPaddingRight">8dip</item>
<!-- @hide -->
<item name="searchResultListItemHeight">58dip</item>
@@ -1366,9 +1381,11 @@
<item name="listPopupWindowStyle">@android:style/Widget.Holo.Light.ListPopupWindow</item>
<item name="popupMenuStyle">@android:style/Widget.Holo.Light.PopupMenu</item>
<item name="stackViewStyle">@android:style/Widget.Holo.StackView</item>
+ <item name="activityChooserViewStyle">@android:style/Widget.Holo.Light.ActivityChooserView</item>
<!-- Preference styles -->
<item name="preferenceScreenStyle">@android:style/Preference.Holo.PreferenceScreen</item>
+ <item name="preferenceFragmentStyle">@style/PreferenceFragment.Holo</item>
<item name="preferenceCategoryStyle">@android:style/Preference.Holo.Category</item>
<item name="preferenceStyle">@android:style/Preference.Holo</item>
<item name="preferenceInformationStyle">@android:style/Preference.Holo.Information</item>
@@ -1531,6 +1548,9 @@
<item name="textAppearance">@android:style/TextAppearance.Holo</item>
<item name="textAppearanceInverse">@android:style/TextAppearance.Holo.Inverse</item>
+
+ <item name="listPreferredItemPaddingLeft">16dip</item>
+ <item name="listPreferredItemPaddingRight">16dip</item>
</style>
<!-- Variation of Theme.Holo.Dialog that has a nice minumum width for
@@ -1620,6 +1640,9 @@
<item name="textAppearance">@android:style/TextAppearance.Holo.Light</item>
<item name="textAppearanceInverse">@android:style/TextAppearance.Holo.Light.Inverse</item>
+
+ <item name="listPreferredItemPaddingLeft">16dip</item>
+ <item name="listPreferredItemPaddingRight">16dip</item>
</style>
<!-- Variation of Theme.Holo.Light.Dialog that has a nice minumum width for
diff --git a/core/res/res/xml/apns.xml b/core/res/res/xml/apns.xml
index 2c69b40..8c7245c 100644
--- a/core/res/res/xml/apns.xml
+++ b/core/res/res/xml/apns.xml
@@ -17,10 +17,9 @@
*/
-->
-<!-- use empty string to specify no proxy or port -->
-<!-- If you edit this version, also edit the version in the partner-supplied
+<!-- If you edit this version, also edit the version in the partner-supplied
apns-conf.xml configuration file -->
-<apns version="6">
+<apns version="7">
</apns>
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 146466f..cadc895 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -88,6 +88,7 @@
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.MOVE_PACKAGE" />
+ <uses-permission android:name="android.permission.PACKAGE_VERIFICATION_AGENT" />
<!--os storage test permissions -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
diff --git a/core/tests/coretests/res/layout/interrogation_activity.xml b/core/tests/coretests/res/layout/interrogation_activity.xml
index 44ed75c..64af321 100644
--- a/core/tests/coretests/res/layout/interrogation_activity.xml
+++ b/core/tests/coretests/res/layout/interrogation_activity.xml
@@ -70,6 +70,7 @@
android:layout_width="160px"
android:layout_height="100px"
android:text="@string/button6"
+ android:contentDescription="contentDescription"
/>
</LinearLayout>
diff --git a/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java b/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java
index a542a1b..cd8dcb9 100644
--- a/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java
+++ b/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java
@@ -148,6 +148,29 @@
}
@LargeTest
+ public void testFindAccessibilityNodeInfoByViewTextContentDescription() throws Exception {
+ beforeClassIfNeeded();
+ final long startTimeMillis = SystemClock.uptimeMillis();
+ try {
+ // bring up the activity
+ getActivity();
+
+ // find a view by text
+ List<AccessibilityNodeInfo> buttons = AccessibilityInteractionClient.getInstance()
+ .findAccessibilityNodeInfosByViewTextInActiveWindow(getConnection(),
+ "contentDescription");
+ assertEquals(1, buttons.size());
+ } finally {
+ afterClassIfNeeded();
+ if (DEBUG) {
+ final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
+ Log.i(LOG_TAG, "testFindAccessibilityNodeInfoByViewTextContentDescription: "
+ + elapsedTimeMillis + "ms");
+ }
+ }
+ }
+
+ @LargeTest
public void testTraverseAllViews() throws Exception {
beforeClassIfNeeded();
final long startTimeMillis = SystemClock.uptimeMillis();
diff --git a/core/tests/coretests/src/android/content/pm/ManifestDigestTest.java b/core/tests/coretests/src/android/content/pm/ManifestDigestTest.java
index 8922f27..cc8c4a6 100644
--- a/core/tests/coretests/src/android/content/pm/ManifestDigestTest.java
+++ b/core/tests/coretests/src/android/content/pm/ManifestDigestTest.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package android.content.pm;
import android.os.Parcel;
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
index 6c87c3b..9575ced 100755
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -42,6 +42,7 @@
import android.provider.Settings.SettingNotFoundException;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
+import android.test.suitebuilder.annotation.SmallTest;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -1057,7 +1058,7 @@
try {
// Wait on observer
synchronized(observer) {
- getMs().unmountVolume(path, true);
+ getMs().unmountVolume(path, true, false);
long waitTime = 0;
while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
observer.wait(WAIT_TIME_INCR);
@@ -3121,6 +3122,14 @@
invokeInstallPackageFail(Uri.fromFile(invalidFile), 0, retCode);
}
+ @SmallTest
+ public void testGetVerifierDeviceIdentity() {
+ PackageManager pm = getPm();
+ VerifierDeviceIdentity id = pm.getVerifierDeviceIdentity();
+
+ assertNotNull("Verifier device identity should not be null", id);
+ }
+
/*---------- Recommended install location tests ----*/
/*
* TODO's
diff --git a/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java b/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java
new file mode 100644
index 0000000..cb13eb7
--- /dev/null
+++ b/core/tests/coretests/src/android/content/pm/VerifierDeviceIdentityTest.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+import android.os.Parcel;
+
+import java.util.Random;
+
+public class VerifierDeviceIdentityTest extends android.test.AndroidTestCase {
+ private static final long TEST_1 = 0x7A5F00FF5A55AAA5L;
+
+ private static final String TEST_1_ENCODED = "HUXY-A75N-FLKV-F";
+
+ private static final String TEST_1_ENCODED_LOWERCASE = "huxy-a75n-flkv-f";
+
+ private static final long TEST_2 = 0x5A05FF5A05F0A555L;
+
+ private static final long TEST_MAXVALUE = Long.MAX_VALUE;
+
+ private static final String TEST_MAXVALUE_ENCODED = "H777-7777-7777-7";
+
+ private static final long TEST_MINVALUE = Long.MIN_VALUE;
+
+ private static final String TEST_MINVALUE_ENCODED = "IAAA-AAAA-AAAA-A";
+
+ private static final long TEST_ZERO = 0L;
+
+ private static final String TEST_ZERO_ENCODED = "AAAA-AAAA-AAAA-A";
+
+ private static final long TEST_NEGONE = -1L;
+
+ private static final String TEST_NEGONE_ENCODED = "P777-7777-7777-7";
+
+ private static final String TEST_OVERFLOW_ENCODED = "QAAA-AAAA-AAAA-A";
+
+ private static final String TEST_SUBSTITUTION_CORRECTED = "OIIO-IIOO-IOOI-I";
+
+ private static final String TEST_SUBSTITUTION_UNCORRECTED = "0110-1100-1001-1";
+
+ public void testVerifierDeviceIdentity_Equals_Success() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_1);
+ VerifierDeviceIdentity id2 = new VerifierDeviceIdentity(TEST_1);
+
+ assertTrue("The two VerifierDeviceIdentity instances should be equal", id1.equals(id2));
+ }
+
+ public void testVerifierDeviceIdentity_Equals_Failure() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_1);
+ VerifierDeviceIdentity id2 = new VerifierDeviceIdentity(TEST_2);
+
+ assertFalse("The two VerifierDeviceIdentity instances should be unique", id1.equals(id2));
+ }
+
+ public void testVerifierDeviceIdentity_HashCode() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_1);
+
+ assertEquals("The VerifierDeviceIdentity should have the same hashcode as its identity",
+ (int) TEST_1, id1.hashCode());
+ }
+
+ public void testVerifierDeviceIdentity_ToString_Success() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_1);
+
+ assertEquals("The identity should encode correctly to the expected Base 32 string",
+ TEST_1_ENCODED, id1.toString());
+ }
+
+ public void testVerifierDeviceIdentity_ToString_Largest() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_MAXVALUE);
+
+ assertEquals("The identity should encode correctly to the expected Base 32 string",
+ TEST_MAXVALUE_ENCODED, id1.toString());
+ }
+
+ public void testVerifierDeviceIdentity_ToString_Zero() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_ZERO);
+
+ assertEquals("The identity should encode correctly to the expected Base 32 string",
+ TEST_ZERO_ENCODED, id1.toString());
+ }
+
+ public void testVerifierDeviceIdentity_ToString_NegOne() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_NEGONE);
+
+ assertEquals("The identity should encode correctly to the expected Base 32 string",
+ TEST_NEGONE_ENCODED, id1.toString());
+ }
+
+ public void testVerifierDeviceIdentity_ToString_MinValue() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_MINVALUE);
+
+ assertEquals("The identity should encode correctly to the expected Base 32 string",
+ TEST_MINVALUE_ENCODED, id1.toString());
+ }
+
+ public void testVerifierDeviceIdentity_Parcel_ReadNegative() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_MINVALUE);
+
+ Parcel parcel = Parcel.obtain();
+ parcel.writeLong(TEST_MINVALUE);
+ parcel.setDataPosition(0);
+
+ VerifierDeviceIdentity id2 = VerifierDeviceIdentity.CREATOR.createFromParcel(parcel);
+
+ assertEquals("Parcel created should match expected value", id1, id2);
+ }
+
+ public void testVerifierDeviceIdentity_Parcel_Read_Pass() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_1);
+
+ Parcel parcel = Parcel.obtain();
+ id1.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+
+ VerifierDeviceIdentity id2 = VerifierDeviceIdentity.CREATOR.createFromParcel(parcel);
+
+ assertEquals("Original identity and parceled identity should be the same", id1, id2);
+ }
+
+ @SuppressWarnings("serial")
+ private static class MockRandom extends Random {
+ private long mNextLong;
+
+ public MockRandom() {
+ }
+
+ public void setNextLong(long nextLong) {
+ mNextLong = nextLong;
+ }
+
+ @Override
+ public long nextLong() {
+ return mNextLong;
+ }
+ }
+
+ public void testVerifierDeviceIdentity_Generate_MinValue() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_MINVALUE);
+
+ MockRandom random = new MockRandom();
+ random.setNextLong(Long.MIN_VALUE);
+ VerifierDeviceIdentity id2 = VerifierDeviceIdentity.generate(random);
+
+ assertEquals("Identity created from Long.MIN_VALUE and one created from return from RNG"
+ + " should be the same", id1, id2);
+ }
+
+ public void testVerifierDeviceIdentity_Generate_Random() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_1);
+
+ MockRandom random = new MockRandom();
+ random.setNextLong(TEST_1);
+ VerifierDeviceIdentity id2 = VerifierDeviceIdentity.generate(random);
+
+ assertEquals("Identity should end up being same when coming from RNG", id1, id2);
+ }
+
+ public void testVerifierDeviceIdentity_Parse_Normal() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_1);
+
+ VerifierDeviceIdentity id2 = VerifierDeviceIdentity.parse(TEST_1_ENCODED);
+
+ assertEquals("Parsed device identity should have the same value as original identity",
+ id1, id2);
+ }
+
+ public void testVerifierDeviceIdentity_Parse_MaxValue() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_MAXVALUE);
+
+ VerifierDeviceIdentity id2 = VerifierDeviceIdentity.parse(TEST_MAXVALUE_ENCODED);
+
+ assertEquals("Original max value and parsed max value should be equal", id1, id2);
+ }
+
+ public void testVerifierDeviceIdentity_Parse_TooShort() {
+ try {
+ VerifierDeviceIdentity.parse("AAAA-AAAA-AAAA-");
+ fail("Parsing should fail when device identifier is too short");
+ } catch (IllegalArgumentException e) {
+ // success
+ }
+ }
+
+ public void testVerifierDeviceIdentity_Parse_WayTooShort() {
+ try {
+ VerifierDeviceIdentity.parse("----------------");
+ fail("Parsing should fail when device identifier is too short");
+ } catch (IllegalArgumentException e) {
+ // success
+ }
+ }
+
+ public void testVerifierDeviceIdentity_Parse_TooLong() {
+ try {
+ VerifierDeviceIdentity.parse("AAAA-AAAA-AAAA-AA");
+ fail("Parsing should fail when device identifier is too long");
+ } catch (IllegalArgumentException e) {
+ // success
+ }
+ }
+
+ public void testVerifierDeviceIdentity_Parse_Overflow() {
+ try {
+ VerifierDeviceIdentity.parse(TEST_OVERFLOW_ENCODED);
+ fail("Parsing should fail when the value will overflow");
+ } catch (IllegalArgumentException e) {
+ // success
+ }
+ }
+
+ public void testVerifierDeviceIdentity_Parse_SquashToUppercase() {
+ VerifierDeviceIdentity id1 = new VerifierDeviceIdentity(TEST_1);
+
+ VerifierDeviceIdentity id2 = VerifierDeviceIdentity.parse(TEST_1_ENCODED_LOWERCASE);
+
+ assertEquals("Lowercase should parse to be the same as uppercase", id1, id2);
+
+ assertEquals("Substituted identity should render to the same string",
+ id1.toString(), id2.toString());
+ }
+
+ public void testVerifierDeviceIdentity_Parse_1I_And_0O_Substitution() {
+ VerifierDeviceIdentity id1 = VerifierDeviceIdentity.parse(TEST_SUBSTITUTION_CORRECTED);
+
+ VerifierDeviceIdentity id2 = VerifierDeviceIdentity.parse(TEST_SUBSTITUTION_UNCORRECTED);
+
+ assertEquals("Substitution should replace 0 with O and 1 with I", id1, id2);
+
+ assertEquals("Substituted identity should render to the same string",
+ id1.toString(), id2.toString());
+ }
+}
diff --git a/core/tests/coretests/src/android/net/NetworkStatsHistoryTest.java b/core/tests/coretests/src/android/net/NetworkStatsHistoryTest.java
index b888d9a..e1db073 100644
--- a/core/tests/coretests/src/android/net/NetworkStatsHistoryTest.java
+++ b/core/tests/coretests/src/android/net/NetworkStatsHistoryTest.java
@@ -407,6 +407,54 @@
assertEquals(Long.MAX_VALUE - 40, performVarLong(Long.MAX_VALUE - 40));
}
+ public void testIndexBeforeAfter() throws Exception {
+ final long BUCKET_SIZE = HOUR_IN_MILLIS;
+ stats = new NetworkStatsHistory(BUCKET_SIZE);
+
+ final long FIRST_START = TEST_START;
+ final long FIRST_END = FIRST_START + (2 * HOUR_IN_MILLIS);
+ final long SECOND_START = TEST_START + WEEK_IN_MILLIS;
+ final long SECOND_END = SECOND_START + HOUR_IN_MILLIS;
+ final long THIRD_START = TEST_START + (2 * WEEK_IN_MILLIS);
+ final long THIRD_END = THIRD_START + (2 * HOUR_IN_MILLIS);
+
+ stats.recordData(FIRST_START, FIRST_END,
+ new NetworkStats.Entry(1024L, 10L, 2048L, 20L, 2L));
+ stats.recordData(SECOND_START, SECOND_END,
+ new NetworkStats.Entry(1024L, 10L, 2048L, 20L, 2L));
+ stats.recordData(THIRD_START, THIRD_END,
+ new NetworkStats.Entry(1024L, 10L, 2048L, 20L, 2L));
+
+ // should have buckets: 2+1+2
+ assertEquals(5, stats.size());
+
+ assertIndexBeforeAfter(stats, 0, 0, Long.MIN_VALUE);
+ assertIndexBeforeAfter(stats, 0, 1, FIRST_START);
+ assertIndexBeforeAfter(stats, 0, 1, FIRST_START + MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 0, 2, FIRST_START + HOUR_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 1, 2, FIRST_START + HOUR_IN_MILLIS + MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 1, 2, FIRST_END - MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 1, 2, FIRST_END);
+ assertIndexBeforeAfter(stats, 1, 2, FIRST_END + MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 1, 2, SECOND_START - MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 1, 3, SECOND_START);
+ assertIndexBeforeAfter(stats, 2, 3, SECOND_END);
+ assertIndexBeforeAfter(stats, 2, 3, SECOND_END + MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 2, 3, THIRD_START - MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 2, 4, THIRD_START);
+ assertIndexBeforeAfter(stats, 3, 4, THIRD_START + MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 3, 4, THIRD_START + HOUR_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 4, 4, THIRD_END);
+ assertIndexBeforeAfter(stats, 4, 4, THIRD_END + MINUTE_IN_MILLIS);
+ assertIndexBeforeAfter(stats, 4, 4, Long.MAX_VALUE);
+ }
+
+ private static void assertIndexBeforeAfter(
+ NetworkStatsHistory stats, int before, int after, long time) {
+ assertEquals("unexpected before", before, stats.getIndexBefore(time));
+ assertEquals("unexpected after", after, stats.getIndexAfter(time));
+ }
+
private static long performVarLong(long before) throws Exception {
final ByteArrayOutputStream out = new ByteArrayOutputStream();
writeVarLong(new DataOutputStream(out), before);
diff --git a/core/tests/coretests/src/android/os/storage/AsecTests.java b/core/tests/coretests/src/android/os/storage/AsecTests.java
index dda3010..5efbd88 100755
--- a/core/tests/coretests/src/android/os/storage/AsecTests.java
+++ b/core/tests/coretests/src/android/os/storage/AsecTests.java
@@ -421,7 +421,7 @@
try {
// Wait on observer
synchronized(observer) {
- getMs().unmountVolume(path, false);
+ getMs().unmountVolume(path, false, false);
long waitTime = 0;
while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
observer.wait(WAIT_TIME_INCR);
@@ -486,7 +486,7 @@
// Wait on observer
synchronized(observer) {
for (int i = 0; i < 5; i++) {
- getMs().unmountVolume(path, false);
+ getMs().unmountVolume(path, false, false);
}
long waitTime = 0;
while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
diff --git a/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerBaseTest.java b/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerBaseTest.java
index acd2a18..334661d 100644
--- a/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerBaseTest.java
+++ b/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerBaseTest.java
@@ -491,9 +491,10 @@
*
* @param id The download id to query on (wait for)
*/
- private void waitForDownloadOrTimeout_skipNotification(long id) throws TimeoutException,
+ protected void waitForDownloadOrTimeout_skipNotification(long id) throws TimeoutException,
InterruptedException {
- waitForDownloadOrTimeout(id, WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME);
+ doWaitForDownloadsOrTimeout(new Query().setFilterById(id),
+ WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME);
}
/**
@@ -505,8 +506,7 @@
*/
protected void waitForDownloadOrTimeout(long id) throws TimeoutException,
InterruptedException {
- waitForDownloadOrTimeout_skipNotification(id);
- waitForReceiverNotifications(1);
+ waitForDownloadOrTimeout(id, WAIT_FOR_DOWNLOAD_POLL_TIME, MAX_WAIT_FOR_DOWNLOAD_TIME);
}
/**
@@ -813,4 +813,4 @@
}
return cursor;
}
-}
\ No newline at end of file
+}
diff --git a/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerTestApp.java b/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerTestApp.java
index ba5ee2c..654f747 100644
--- a/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerTestApp.java
+++ b/core/tests/hosttests/test-apps/DownloadManagerTestApp/src/com/android/frameworks/DownloadManagerTestApp.java
@@ -208,7 +208,7 @@
// Wait until the download finishes; don't wait for a notification b/c
// the download may well have been completed before the last reboot.
- waitForDownloadOrTimeout(dlRequest);
+ waitForDownloadOrTimeout_skipNotification(dlRequest);
Log.i(LOG_TAG, "Verifying download information...");
// Verify specific info about the file (size, name, etc)...
diff --git a/data/videos/AndroidInSpace.480p.lq.mp4 b/data/videos/AndroidInSpace.480p.lq.mp4
new file mode 100755
index 0000000..f1db694
--- /dev/null
+++ b/data/videos/AndroidInSpace.480p.lq.mp4
Binary files differ
diff --git a/data/videos/AndroidInSpace.480p.mq.mp4 b/data/videos/AndroidInSpace.480p.mq.mp4
new file mode 100755
index 0000000..5f4cfb3
--- /dev/null
+++ b/data/videos/AndroidInSpace.480p.mq.mp4
Binary files differ
diff --git a/data/videos/Sunset.480p.lq.mp4 b/data/videos/Sunset.480p.lq.mp4
new file mode 100644
index 0000000..7f9d6a1
--- /dev/null
+++ b/data/videos/Sunset.480p.lq.mp4
Binary files differ
diff --git a/data/videos/Sunset.480p.mq.mp4 b/data/videos/Sunset.480p.mq.mp4
new file mode 100644
index 0000000..7691544
--- /dev/null
+++ b/data/videos/Sunset.480p.mq.mp4
Binary files differ
diff --git a/data/videos/VideoPackage1.mk b/data/videos/VideoPackage1.mk
index daff26f..1e7096a 100644
--- a/data/videos/VideoPackage1.mk
+++ b/data/videos/VideoPackage1.mk
@@ -14,10 +14,14 @@
# limitations under the License.
#
+# Lower-quality videos for space-constrained devices
+
LOCAL_PATH := frameworks/base/data/videos
TARGET_PATH := system/media/video
PRODUCT_COPY_FILES += \
- $(LOCAL_PATH)/AndroidInSpace.240p.mp4:$(TARGET_PATH)/AndroidInSpace.240p.mp4 \
- $(LOCAL_PATH)/Sunset.240p.mp4:$(TARGET_PATH)/Sunset.240p.mp4
+ $(LOCAL_PATH)/AndroidInSpace.240p.mp4:$(TARGET_PATH)/AndroidInSpace.240p.mp4 \
+ $(LOCAL_PATH)/AndroidInSpace.480p.lq.mp4:$(TARGET_PATH)/AndroidInSpace.480p.mp4 \
+ $(LOCAL_PATH)/Sunset.240p.mp4:$(TARGET_PATH)/Sunset.240p.mp4 \
+ $(LOCAL_PATH)/Sunset.480p.lq.mp4:$(TARGET_PATH)/Sunset.480p.mp4
diff --git a/data/videos/VideoPackage2.mk b/data/videos/VideoPackage2.mk
new file mode 100644
index 0000000..cb77b3ec
--- /dev/null
+++ b/data/videos/VideoPackage2.mk
@@ -0,0 +1,27 @@
+#
+# Copyright (C) 2011 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.
+#
+
+# Good-quality videos for non-space-constrained devices
+
+LOCAL_PATH := frameworks/base/data/videos
+TARGET_PATH := system/media/video
+
+PRODUCT_COPY_FILES += \
+ $(LOCAL_PATH)/AndroidInSpace.240p.mp4:$(TARGET_PATH)/AndroidInSpace.240p.mp4 \
+ $(LOCAL_PATH)/AndroidInSpace.480p.mq.mp4:$(TARGET_PATH)/AndroidInSpace.480p.mp4 \
+ $(LOCAL_PATH)/Sunset.240p.mp4:$(TARGET_PATH)/Sunset.240p.mp4 \
+ $(LOCAL_PATH)/Sunset.480p.mq.mp4:$(TARGET_PATH)/Sunset.480p.mp4
+
diff --git a/docs/html/guide/developing/debugging/ddms.jd b/docs/html/guide/developing/debugging/ddms.jd
index 0d47ae5..4398ec9 100644
--- a/docs/html/guide/developing/debugging/ddms.jd
+++ b/docs/html/guide/developing/debugging/ddms.jd
@@ -60,9 +60,9 @@
<p>The following screenshot shows a typical DDMS screen in Eclipse. If you are starting DDMS from
the command line, the screen is slightly different, but much of the functionality is identical.
- Notice that the highlighted process, <code>com.example.android.notepad</code>, that is running in the emulator
- has the debugging port 8700 assigned to it as well as 8609. This signifies that DDMS is currently
- forwarding port 8609 to the static debugging port of 8700.</p>
+ Notice that the highlighted process, <code>com.android.email</code>, that is running in the emulator
+ has the debugging port 8700 assigned to it as well as 8606. This signifies that DDMS is currently
+ forwarding port 8606 to the static debugging port of 8700.</p>
<img src="{@docRoot}images/debug-ddms.png"
width="1024" />
@@ -76,7 +76,7 @@
<p class="note"><strong>Tip:</strong> You can set a number of DDMS preferences in
<strong>File</strong> > <strong>Preferences</strong>. Preferences are saved to
- <code>$HOME/.ddmsrc</code>.</p>
+ <code>$HOME/.android/ddms.cfg</code>.</p>
<p class="warning"><strong>Known debugging issues with Dalvik</strong><br />
Debugging an application in the Dalvik VM should work the same as it does in other VMs. However,
diff --git a/docs/html/guide/topics/manifest/provider-element.jd b/docs/html/guide/topics/manifest/provider-element.jd
index dd00224..4558800 100644
--- a/docs/html/guide/topics/manifest/provider-element.jd
+++ b/docs/html/guide/topics/manifest/provider-element.jd
@@ -27,7 +27,8 @@
<dt>can contain:</dt>
<dd><code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data></a></code>
-<br/><code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"><grant-uri-permission></a></code></dd>
+<br/><code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"><grant-uri-permission></a></code>
+<br/><code><a href="{@docRoot}guide/topics/manifest/path-permission-element.html"><path-permission></a></code></dd>
<dt>description:</dt>
<dd>Declares a content provider — a subclass of
@@ -252,7 +253,7 @@
<dt><a name="sync"></a>{@code android:syncable}</dt>
<dd>Whether or not the data under the content provider's control
is to be synchronized with data on a server — "{@code true}"
-if it is to be synchronized, and "{@ code false}" if not.</dd>
+if it is to be synchronized, and "{@code false}" if not.</dd>
<dt><a name="wprmsn"></a>{@code android:writePermission}</dt>
<dd>A permission that clients must have to make changes to the data
diff --git a/docs/html/sdk/win-usb.jd b/docs/html/sdk/win-usb.jd
index ffaec4c..3dfe55d 100644
--- a/docs/html/sdk/win-usb.jd
+++ b/docs/html/sdk/win-usb.jd
@@ -181,7 +181,7 @@
<li>Expand the <em>Third party Add-ons</em> and <em>Google Inc. add-ons</em>.</li>
<li>Check <strong>Google Usb Driver package</strong> and click <strong>Install selected</strong>.</li>
<li>Proceed to install the package. When done, the driver files are
-downloaded into the <code><sdk>\google-usb_driver\</code> directory.</li>
+downloaded into the <code><sdk>\extras\google\usb_driver\</code> directory.</li>
</ol>
@@ -229,7 +229,7 @@
<li>Select <strong>Browse my computer for driver software</strong> and click
<strong>Next</strong>.</li>
<li>Click <strong>Browse</strong> and locate the USB driver folder. (The Google USB
-Driver is located in {@code <sdk>\google-usb_driver\}.)</li>
+Driver is located in {@code <sdk>\extras\google\usb_driver\}.)</li>
<li>Click <strong>Next</strong> to install the driver.</li>
</ol>
@@ -252,7 +252,7 @@
<strong>Search removable media</strong>; and check <strong>Include this location in the
search</strong>.</li>
<li>Click <strong>Browse</strong> and locate the USB driver folder. (The Google USB
-Driver is located in {@code <sdk>\google-usb_driver\}.)</li>
+Driver is located in {@code <sdk>\extras\google\usb_driver\}.)</li>
<li>Click <strong>Next</strong> to upgrade the driver.</li>
</ol>
@@ -274,7 +274,7 @@
removable media</strong>; and check <strong>Include
this location in the search</strong>.</li>
<li>Click <strong>Browse</strong> and locate the USB driver folder. (The Google USB
-Driver is located in {@code <sdk>\google-usb_driver\}.)</li>
+Driver is located in {@code <sdk>\extras\google\usb_driver\}.)</li>
<li>Click <strong>Next</strong> to install the driver.</li>
</ol>
@@ -296,7 +296,7 @@
removable media</strong>; and check <strong>Include
this location in the search</strong>.</li>
<li>Click <strong>Browse</strong> and locate the USB driver folder. (The Google USB
-Driver is located in {@code <sdk>\google-usb_driver\}.)</li>
+Driver is located in {@code <sdk>\extras\google\usb_driver\}.)</li>
<li>Click <strong>Next</strong> to upgrade the driver.</li>
</ol>
@@ -314,8 +314,8 @@
<li>Select <strong>I don't have the disk. Show me other options</strong>.</li>
<li>Select <strong>Browse my computer for driver software</strong>.</li>
<li>Click <strong>Browse</strong> and locate the USB driver folder. (The Google USB
-Driver is located in {@code <sdk>\google-usb_driver\}.) As long as you specified the exact
-location of the
+Driver is located in {@code <sdk>\extras\google\usb_driver\}.) As long as you specified the
+exact location of the
installation package, you may leave <strong>Include subfolders</strong> checked or
unchecked—it doesn't matter.</li>
<li>Click <strong>Next</strong>. Vista may prompt you to confirm the privilege elevation
@@ -339,7 +339,7 @@
search for the driver
software. Select <strong>Browse my computer for driver software</strong>.</li>
<li>Click <strong>Browse</strong> and locate the USB driver folder. (The Google USB
-Driver is located in {@code <sdk>\google-usb_driver\}.) As long as you specified the
+Driver is located in {@code <sdk>\extras\google\usb_driver\}.) As long as you specified the
exact location of the
installation package, you may leave <strong>Include subfolders</strong> checked or
unchecked—it doesn't matter.</li>
diff --git a/graphics/java/android/graphics/Matrix.java b/graphics/java/android/graphics/Matrix.java
index 66ed104a..a837294 100644
--- a/graphics/java/android/graphics/Matrix.java
+++ b/graphics/java/android/graphics/Matrix.java
@@ -37,6 +37,188 @@
public static final int MPERSP_1 = 7; //!< use with getValues/setValues
public static final int MPERSP_2 = 8; //!< use with getValues/setValues
+ /** @hide */
+ public static Matrix IDENTITY_MATRIX = new Matrix() {
+ void oops() {
+ throw new IllegalStateException("Matrix can not be modified");
+ }
+
+ @Override
+ public void set(Matrix src) {
+ oops();
+ }
+
+ @Override
+ public void reset() {
+ oops();
+ }
+
+ @Override
+ public void setTranslate(float dx, float dy) {
+ oops();
+ }
+
+ @Override
+ public void setScale(float sx, float sy, float px, float py) {
+ oops();
+ }
+
+ @Override
+ public void setScale(float sx, float sy) {
+ oops();
+ }
+
+ @Override
+ public void setRotate(float degrees, float px, float py) {
+ oops();
+ }
+
+ @Override
+ public void setRotate(float degrees) {
+ oops();
+ }
+
+ @Override
+ public void setSinCos(float sinValue, float cosValue, float px, float py) {
+ oops();
+ }
+
+ @Override
+ public void setSinCos(float sinValue, float cosValue) {
+ oops();
+ }
+
+ @Override
+ public void setSkew(float kx, float ky, float px, float py) {
+ oops();
+ }
+
+ @Override
+ public void setSkew(float kx, float ky) {
+ oops();
+ }
+
+ @Override
+ public boolean setConcat(Matrix a, Matrix b) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean preTranslate(float dx, float dy) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean preScale(float sx, float sy, float px, float py) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean preScale(float sx, float sy) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean preRotate(float degrees, float px, float py) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean preRotate(float degrees) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean preSkew(float kx, float ky, float px, float py) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean preSkew(float kx, float ky) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean preConcat(Matrix other) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean postTranslate(float dx, float dy) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean postScale(float sx, float sy, float px, float py) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean postScale(float sx, float sy) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean postRotate(float degrees, float px, float py) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean postRotate(float degrees) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean postSkew(float kx, float ky, float px, float py) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean postSkew(float kx, float ky) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean postConcat(Matrix other) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean setRectToRect(RectF src, RectF dst, ScaleToFit stf) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public boolean setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex,
+ int pointCount) {
+ oops();
+ return false;
+ }
+
+ @Override
+ public void setValues(float[] values) {
+ oops();
+ }
+ };
+
/**
* @hide
*/
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index ee65223..ce42612 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -20,7 +20,6 @@
import android.text.SpannableString;
import android.text.SpannedString;
import android.text.TextUtils;
-import android.util.DisplayMetrics;
/**
* The Paint class holds the style and color information about how to draw
@@ -344,8 +343,10 @@
public Paint(int flags) {
mNativePaint = native_init();
setFlags(flags | DEFAULT_PAINT_FLAGS);
- setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV
- ? HINTING_OFF : HINTING_ON);
+ // TODO: Turning off hinting has undesirable side effects, we need to
+ // revisit hinting once we add support for subpixel positioning
+ // setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV
+ // ? HINTING_OFF : HINTING_ON);
mCompatScaling = mInvCompatScaling = 1;
}
@@ -365,8 +366,10 @@
public void reset() {
native_reset(mNativePaint);
setFlags(DEFAULT_PAINT_FLAGS);
- setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV
- ? HINTING_OFF : HINTING_ON);
+ // TODO: Turning off hinting has undesirable side effects, we need to
+ // revisit hinting once we add support for subpixel positioning
+ // setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV
+ // ? HINTING_OFF : HINTING_ON);
mHasCompatScaling = false;
mCompatScaling = mInvCompatScaling = 1;
mBidiFlags = BIDI_DEFAULT_LTR;
diff --git a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
index 7c4e147..34f9070 100644
--- a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
@@ -79,7 +79,7 @@
float px = st.mPivotXRel ? (w * st.mPivotX) : st.mPivotX;
float py = st.mPivotYRel ? (h * st.mPivotY) : st.mPivotY;
- canvas.rotate(mCurrentDegrees, px, py);
+ canvas.rotate(mCurrentDegrees, px + bounds.left, py + bounds.top);
drawable.draw(canvas);
diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h
index 923518d..d1a8105 100644
--- a/include/media/AudioTrack.h
+++ b/include/media/AudioTrack.h
@@ -486,6 +486,7 @@
int mSessionId;
int mAuxEffectId;
Mutex mLock;
+ status_t mRestoreStatus;
};
diff --git a/include/media/mediascanner.h b/include/media/mediascanner.h
index 803bffb..a73403b 100644
--- a/include/media/mediascanner.h
+++ b/include/media/mediascanner.h
@@ -62,12 +62,17 @@
private:
// current locale (like "ja_JP"), created/destroyed with strdup()/free()
char *mLocale;
+ char *mSkipList;
+ int *mSkipIndex;
MediaScanResult doProcessDirectory(
char *path, int pathRemaining, MediaScannerClient &client, bool noMedia);
MediaScanResult doProcessDirectoryEntry(
char *path, int pathRemaining, MediaScannerClient &client, bool noMedia,
struct dirent* entry, char* fileSpot);
+ void loadSkipList();
+ bool shouldSkipDirectory(char *path);
+
MediaScanner(const MediaScanner &);
MediaScanner &operator=(const MediaScanner &);
@@ -103,4 +108,3 @@
}; // namespace android
#endif // MEDIASCANNER_H
-
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h
index e965f14..b7286e5 100644
--- a/include/media/stagefright/ACodec.h
+++ b/include/media/stagefright/ACodec.h
@@ -164,6 +164,8 @@
void sendFormatChange();
+ void signalError(OMX_ERRORTYPE error = OMX_ErrorUndefined);
+
DISALLOW_EVIL_CONSTRUCTORS(ACodec);
};
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 2932744..8baf5ec 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -303,7 +303,7 @@
bool flushPortAsync(OMX_U32 portIndex);
void disablePortAsync(OMX_U32 portIndex);
- void enablePortAsync(OMX_U32 portIndex);
+ status_t enablePortAsync(OMX_U32 portIndex);
static size_t countBuffersWeOwn(const Vector<BufferInfo> &buffers);
static bool isIntermediateState(State state);
diff --git a/include/storage/IMountService.h b/include/storage/IMountService.h
index 472d8e5..43df7f0 100644
--- a/include/storage/IMountService.h
+++ b/include/storage/IMountService.h
@@ -37,8 +37,8 @@
virtual void setUsbMassStorageEnabled(const bool enable) = 0;
virtual bool isUsbMassStorageEnabled() = 0;
virtual int32_t mountVolume(const String16& mountPoint) = 0;
- virtual int32_t
- unmountVolume(const String16& mountPoint, const bool force) = 0;
+ virtual int32_t unmountVolume(
+ const String16& mountPoint, const bool force, const bool removeEncryption) = 0;
virtual int32_t formatVolume(const String16& mountPoint) = 0;
virtual int32_t
getStorageUsers(const String16& mountPoint, int32_t** users) = 0;
diff --git a/include/ui/Input.h b/include/ui/Input.h
index f1385a0..438a1a0 100644
--- a/include/ui/Input.h
+++ b/include/ui/Input.h
@@ -620,10 +620,41 @@
*/
class VelocityTracker {
public:
+ // Default polynomial degree. (used by getVelocity)
+ static const uint32_t DEFAULT_DEGREE = 2;
+
+ // Default sample horizon. (used by getVelocity)
+ // We don't use too much history by default since we want to react to quick
+ // changes in direction.
+ static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms
+
struct Position {
float x, y;
};
+ struct Estimator {
+ static const size_t MAX_DEGREE = 2;
+
+ // Polynomial coefficients describing motion in X and Y.
+ float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1];
+
+ // Polynomial degree (number of coefficients), or zero if no information is
+ // available.
+ uint32_t degree;
+
+ // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit).
+ float confidence;
+
+ inline void clear() {
+ degree = 0;
+ confidence = 0;
+ for (size_t i = 0; i <= MAX_DEGREE; i++) {
+ xCoeff[i] = 0;
+ yCoeff[i] = 0;
+ }
+ }
+ };
+
VelocityTracker();
// Resets the velocity tracker state.
@@ -645,10 +676,16 @@
void addMovement(const MotionEvent* event);
// Gets the velocity of the specified pointer id in position units per second.
- // Returns false and sets the velocity components to zero if there is no movement
- // information for the pointer.
+ // Returns false and sets the velocity components to zero if there is
+ // insufficient movement information for the pointer.
bool getVelocity(uint32_t id, float* outVx, float* outVy) const;
+ // Gets a quadratic estimator for the movements of the specified pointer id.
+ // Returns false and clears the estimator if there is no information available
+ // about the pointer.
+ bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon,
+ Estimator* outEstimator) const;
+
// Gets the active pointer id, or -1 if none.
inline int32_t getActivePointerId() const { return mActivePointerId; }
@@ -657,18 +694,16 @@
private:
// Number of samples to keep.
- static const uint32_t HISTORY_SIZE = 10;
-
- // Oldest sample to consider when calculating the velocity.
- static const nsecs_t MAX_AGE = 200 * 1000000; // 200 ms
-
- // The minimum duration between samples when estimating velocity.
- static const nsecs_t MIN_DURATION = 10 * 1000000; // 10 ms
+ static const uint32_t HISTORY_SIZE = 20;
struct Movement {
nsecs_t eventTime;
BitSet32 idBits;
Position positions[MAX_POINTERS];
+
+ inline const Position& getPosition(uint32_t id) const {
+ return positions[idBits.getIndexOfBit(id)];
+ }
};
uint32_t mIndex;
diff --git a/libs/rs/driver/rsdAllocation.cpp b/libs/rs/driver/rsdAllocation.cpp
index 17dd931..2ebfe0a 100644
--- a/libs/rs/driver/rsdAllocation.cpp
+++ b/libs/rs/driver/rsdAllocation.cpp
@@ -73,27 +73,27 @@
}
-static void Update2DTexture(const Allocation *alloc, const void *ptr, uint32_t xoff, uint32_t yoff,
- uint32_t lod, RsAllocationCubemapFace face,
- uint32_t w, uint32_t h) {
+static void Update2DTexture(const Context *rsc, const Allocation *alloc, const void *ptr,
+ uint32_t xoff, uint32_t yoff, uint32_t lod,
+ RsAllocationCubemapFace face, uint32_t w, uint32_t h) {
DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
rsAssert(drv->textureID);
- glBindTexture(drv->glTarget, drv->textureID);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ RSD_CALL_GL(glBindTexture, drv->glTarget, drv->textureID);
+ RSD_CALL_GL(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
GLenum t = GL_TEXTURE_2D;
if (alloc->mHal.state.hasFaces) {
t = gFaceOrder[face];
}
- glTexSubImage2D(t, lod, xoff, yoff, w, h, drv->glFormat, drv->glType, ptr);
+ RSD_CALL_GL(glTexSubImage2D, t, lod, xoff, yoff, w, h, drv->glFormat, drv->glType, ptr);
}
static void Upload2DTexture(const Context *rsc, const Allocation *alloc, bool isFirstUpload) {
DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
- glBindTexture(drv->glTarget, drv->textureID);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ RSD_CALL_GL(glBindTexture, drv->glTarget, drv->textureID);
+ RSD_CALL_GL(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
uint32_t faceCount = 1;
if (alloc->mHal.state.hasFaces) {
@@ -112,12 +112,12 @@
}
if (isFirstUpload) {
- glTexImage2D(t, lod, drv->glFormat,
+ RSD_CALL_GL(glTexImage2D, t, lod, drv->glFormat,
alloc->mHal.state.type->getLODDimX(lod),
alloc->mHal.state.type->getLODDimY(lod),
0, drv->glFormat, drv->glType, p);
} else {
- glTexSubImage2D(t, lod, 0, 0,
+ RSD_CALL_GL(glTexSubImage2D, t, lod, 0, 0,
alloc->mHal.state.type->getLODDimX(lod),
alloc->mHal.state.type->getLODDimY(lod),
drv->glFormat, drv->glType, p);
@@ -126,7 +126,7 @@
}
if (alloc->mHal.state.mipmapControl == RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE) {
- glGenerateMipmap(drv->glTarget);
+ RSD_CALL_GL(glGenerateMipmap, drv->glTarget);
}
rsdGLCheckError(rsc, "Upload2DTexture");
}
@@ -145,7 +145,7 @@
bool isFirstUpload = false;
if (!drv->textureID) {
- glGenTextures(1, &drv->textureID);
+ RSD_CALL_GL(glGenTextures, 1, &drv->textureID);
isFirstUpload = true;
}
@@ -168,7 +168,7 @@
}
if (!drv->renderTargetID) {
- glGenRenderbuffers(1, &drv->renderTargetID);
+ RSD_CALL_GL(glGenRenderbuffers, 1, &drv->renderTargetID);
if (!drv->renderTargetID) {
// This should generally not happen
@@ -176,8 +176,8 @@
rsc->dumpDebug();
return;
}
- glBindRenderbuffer(GL_RENDERBUFFER, drv->renderTargetID);
- glRenderbufferStorage(GL_RENDERBUFFER, drv->glFormat,
+ RSD_CALL_GL(glBindRenderbuffer, GL_RENDERBUFFER, drv->renderTargetID);
+ RSD_CALL_GL(glRenderbufferStorage, GL_RENDERBUFFER, drv->glFormat,
alloc->mHal.state.dimensionX, alloc->mHal.state.dimensionY);
}
rsdGLCheckError(rsc, "AllocateRenderTarget");
@@ -192,17 +192,17 @@
//alloc->mHal.state.usageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX;
if (!drv->bufferID) {
- glGenBuffers(1, &drv->bufferID);
+ RSD_CALL_GL(glGenBuffers, 1, &drv->bufferID);
}
if (!drv->bufferID) {
LOGE("Upload to buffer object failed");
drv->uploadDeferred = true;
return;
}
- glBindBuffer(drv->glTarget, drv->bufferID);
- glBufferData(drv->glTarget, alloc->mHal.state.type->getSizeBytes(),
+ RSD_CALL_GL(glBindBuffer, drv->glTarget, drv->bufferID);
+ RSD_CALL_GL(glBufferData, drv->glTarget, alloc->mHal.state.type->getSizeBytes(),
drv->mallocPtr, GL_DYNAMIC_DRAW);
- glBindBuffer(drv->glTarget, 0);
+ RSD_CALL_GL(glBindBuffer, drv->glTarget, 0);
rsdGLCheckError(rsc, "UploadToBufferObject");
}
@@ -261,11 +261,11 @@
//mBufferID = 0;
}
if (drv->textureID) {
- glDeleteTextures(1, &drv->textureID);
+ RSD_CALL_GL(glDeleteTextures, 1, &drv->textureID);
drv->textureID = 0;
}
if (drv->renderTargetID) {
- glDeleteRenderbuffers(1, &drv->renderTargetID);
+ RSD_CALL_GL(glDeleteRenderbuffers, 1, &drv->renderTargetID);
drv->renderTargetID = 0;
}
@@ -323,7 +323,7 @@
drv->readBackFBO->setActive(rsc);
// Do the readback
- glReadPixels(0, 0, alloc->getType()->getDimX(), alloc->getType()->getDimY(),
+ RSD_CALL_GL(glReadPixels, 0, 0, alloc->getType()->getDimX(), alloc->getType()->getDimY(),
drv->glFormat, drv->glType, alloc->getPtr());
// Revert framebuffer to its original
@@ -414,7 +414,7 @@
}
drv->uploadDeferred = true;
} else {
- Update2DTexture(alloc, data, xoff, yoff, lod, face, w, h);
+ Update2DTexture(rsc, alloc, data, xoff, yoff, lod, face, w, h);
}
}
diff --git a/libs/rs/driver/rsdFrameBufferObj.cpp b/libs/rs/driver/rsdFrameBufferObj.cpp
index 145bf34..91452b0 100644
--- a/libs/rs/driver/rsdFrameBufferObj.cpp
+++ b/libs/rs/driver/rsdFrameBufferObj.cpp
@@ -17,6 +17,7 @@
#include "rsdFrameBufferObj.h"
#include "rsdAllocation.h"
+#include "rsdGL.h"
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
@@ -124,9 +125,9 @@
bool framebuffer = renderToFramebuffer();
if (!framebuffer) {
if(mFBOId == 0) {
- glGenFramebuffers(1, &mFBOId);
+ RSD_CALL_GL(glGenFramebuffers, 1, &mFBOId);
}
- glBindFramebuffer(GL_FRAMEBUFFER, mFBOId);
+ RSD_CALL_GL(glBindFramebuffer, GL_FRAMEBUFFER, mFBOId);
if (mDirty) {
setDepthAttachment();
@@ -134,10 +135,10 @@
mDirty = false;
}
- glViewport(0, 0, mWidth, mHeight);
+ RSD_CALL_GL(glViewport, 0, 0, mWidth, mHeight);
checkError(rsc);
} else {
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glViewport(0, 0, rsc->getWidth(), rsc->getHeight());
+ RSD_CALL_GL(glBindFramebuffer, GL_FRAMEBUFFER, 0);
+ RSD_CALL_GL(glViewport, 0, 0, rsc->getWidth(), rsc->getHeight());
}
}
diff --git a/libs/rs/driver/rsdGL.cpp b/libs/rs/driver/rsdGL.cpp
index 04446ad..c5b81db 100644
--- a/libs/rs/driver/rsdGL.cpp
+++ b/libs/rs/driver/rsdGL.cpp
@@ -135,18 +135,19 @@
LOGV("%p, deinitEGL", rsc);
if (dc->gl.egl.context != EGL_NO_CONTEXT) {
- eglMakeCurrent(dc->gl.egl.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
- eglDestroySurface(dc->gl.egl.display, dc->gl.egl.surfaceDefault);
+ RSD_CALL_GL(eglMakeCurrent, dc->gl.egl.display,
+ EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surfaceDefault);
if (dc->gl.egl.surface != EGL_NO_SURFACE) {
- eglDestroySurface(dc->gl.egl.display, dc->gl.egl.surface);
+ RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surface);
}
- eglDestroyContext(dc->gl.egl.display, dc->gl.egl.context);
+ RSD_CALL_GL(eglDestroyContext, dc->gl.egl.display, dc->gl.egl.context);
checkEglError("eglDestroyContext");
}
gGLContextCount--;
if (!gGLContextCount) {
- eglTerminate(dc->gl.egl.display);
+ RSD_CALL_GL(eglTerminate, dc->gl.egl.display);
}
}
@@ -202,21 +203,25 @@
rsAssert(configAttribsPtr < (configAttribs + (sizeof(configAttribs) / sizeof(EGLint))));
LOGV("%p initEGL start", rsc);
+ rsc->setWatchdogGL("eglGetDisplay", __LINE__, __FILE__);
dc->gl.egl.display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
checkEglError("eglGetDisplay");
- eglInitialize(dc->gl.egl.display, &dc->gl.egl.majorVersion, &dc->gl.egl.minorVersion);
+ RSD_CALL_GL(eglInitialize, dc->gl.egl.display,
+ &dc->gl.egl.majorVersion, &dc->gl.egl.minorVersion);
checkEglError("eglInitialize");
EGLBoolean ret;
EGLint numConfigs = -1, n = 0;
+ rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
ret = eglChooseConfig(dc->gl.egl.display, configAttribs, 0, 0, &numConfigs);
checkEglError("eglGetConfigs", ret);
if (numConfigs) {
EGLConfig* const configs = new EGLConfig[numConfigs];
+ rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
ret = eglChooseConfig(dc->gl.egl.display,
configAttribs, configs, numConfigs, &n);
if (!ret || !n) {
@@ -261,32 +266,38 @@
}
//}
+ rsc->setWatchdogGL("eglCreateContext", __LINE__, __FILE__);
dc->gl.egl.context = eglCreateContext(dc->gl.egl.display, dc->gl.egl.config,
EGL_NO_CONTEXT, context_attribs2);
checkEglError("eglCreateContext");
if (dc->gl.egl.context == EGL_NO_CONTEXT) {
LOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", rsc);
+ rsc->setWatchdogGL(NULL, 0, NULL);
return false;
}
gGLContextCount++;
EGLint pbuffer_attribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE };
+ rsc->setWatchdogGL("eglCreatePbufferSurface", __LINE__, __FILE__);
dc->gl.egl.surfaceDefault = eglCreatePbufferSurface(dc->gl.egl.display, dc->gl.egl.config,
pbuffer_attribs);
checkEglError("eglCreatePbufferSurface");
if (dc->gl.egl.surfaceDefault == EGL_NO_SURFACE) {
LOGE("eglCreatePbufferSurface returned EGL_NO_SURFACE");
rsdGLShutdown(rsc);
+ rsc->setWatchdogGL(NULL, 0, NULL);
return false;
}
+ rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
dc->gl.egl.surfaceDefault, dc->gl.egl.context);
if (ret == EGL_FALSE) {
LOGE("eglMakeCurrent returned EGL_FALSE");
checkEglError("eglMakeCurrent", ret);
rsdGLShutdown(rsc);
+ rsc->setWatchdogGL(NULL, 0, NULL);
return false;
}
@@ -314,6 +325,7 @@
if (!verptr) {
LOGE("Error, OpenGL ES Lite not supported");
rsdGLShutdown(rsc);
+ rsc->setWatchdogGL(NULL, 0, NULL);
return false;
} else {
sscanf(verptr, " %i.%i", &dc->gl.gl.majorVersion, &dc->gl.gl.minorVersion);
@@ -352,6 +364,7 @@
dc->gl.currentFrameBuffer = NULL;
LOGV("initGLThread end %p", rsc);
+ rsc->setWatchdogGL(NULL, 0, NULL);
return true;
}
@@ -363,10 +376,12 @@
// WAR: Some drivers fail to handle 0 size surfaces correcntly.
// Use the pbuffer to avoid this pitfall.
if ((dc->gl.egl.surface != NULL) || (w == 0) || (h == 0)) {
+ rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
dc->gl.egl.surfaceDefault, dc->gl.egl.context);
checkEglError("eglMakeCurrent", ret);
+ rsc->setWatchdogGL("eglDestroySurface", __LINE__, __FILE__);
ret = eglDestroySurface(dc->gl.egl.display, dc->gl.egl.surface);
checkEglError("eglDestroySurface", ret);
@@ -385,6 +400,7 @@
dc->gl.width = w;
dc->gl.height = h;
+ rsc->setWatchdogGL("eglCreateWindowSurface", __LINE__, __FILE__);
dc->gl.egl.surface = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config,
dc->gl.wndSurface, NULL);
checkEglError("eglCreateWindowSurface");
@@ -392,16 +408,18 @@
LOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
}
+ rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surface,
dc->gl.egl.surface, dc->gl.egl.context);
checkEglError("eglMakeCurrent", ret);
}
+ rsc->setWatchdogGL(NULL, 0, NULL);
return true;
}
void rsdGLSwap(const android::renderscript::Context *rsc) {
RsdHal *dc = (RsdHal *)rsc->mHal.drv;
- eglSwapBuffers(dc->gl.egl.display, dc->gl.egl.surface);
+ RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface);
}
void rsdGLCheckError(const android::renderscript::Context *rsc,
diff --git a/libs/rs/driver/rsdGL.h b/libs/rs/driver/rsdGL.h
index 0d5b7e7..fc33885 100644
--- a/libs/rs/driver/rsdGL.h
+++ b/libs/rs/driver/rsdGL.h
@@ -20,6 +20,8 @@
#include <rs_hal.h>
#include <EGL/egl.h>
+#define RSD_CALL_GL(x, ...) rsc->setWatchdogGL(#x, __LINE__, __FILE__); x(__VA_ARGS__); rsc->setWatchdogGL(NULL, 0, NULL)
+
class RsdShaderCache;
class RsdVertexArrayState;
class RsdFrameBufferObj;
@@ -73,7 +75,6 @@
} RsdGL;
-
bool rsdGLInit(const android::renderscript::Context *rsc);
void rsdGLShutdown(const android::renderscript::Context *rsc);
bool rsdGLSetSurface(const android::renderscript::Context *rsc,
diff --git a/libs/rs/driver/rsdMeshObj.cpp b/libs/rs/driver/rsdMeshObj.cpp
index 4315c0d..019167b 100644
--- a/libs/rs/driver/rsdMeshObj.cpp
+++ b/libs/rs/driver/rsdMeshObj.cpp
@@ -130,7 +130,8 @@
return true;
}
-void RsdMeshObj::renderPrimitiveRange(const Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const {
+void RsdMeshObj::renderPrimitiveRange(const Context *rsc, uint32_t primIndex,
+ uint32_t start, uint32_t len) const {
if (len < 1 || primIndex >= mRSMesh->mHal.state.primitivesCount || mAttribCount == 0) {
LOGE("Invalid mesh or parameters");
return;
@@ -171,14 +172,16 @@
}
if (drvAlloc->bufferID) {
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, drvAlloc->bufferID);
- glDrawElements(mGLPrimitives[primIndex], len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2));
+ RSD_CALL_GL(glBindBuffer, GL_ELEMENT_ARRAY_BUFFER, drvAlloc->bufferID);
+ RSD_CALL_GL(glDrawElements, mGLPrimitives[primIndex], len, GL_UNSIGNED_SHORT,
+ (uint16_t *)(start * 2));
} else {
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- glDrawElements(mGLPrimitives[primIndex], len, GL_UNSIGNED_SHORT, drvAlloc->mallocPtr);
+ RSD_CALL_GL(glBindBuffer, GL_ELEMENT_ARRAY_BUFFER, 0);
+ RSD_CALL_GL(glDrawElements, mGLPrimitives[primIndex], len, GL_UNSIGNED_SHORT,
+ drvAlloc->mallocPtr);
}
} else {
- glDrawArrays(mGLPrimitives[primIndex], start, len);
+ RSD_CALL_GL(glDrawArrays, mGLPrimitives[primIndex], start, len);
}
rsdGLCheckError(rsc, "Mesh::renderPrimitiveRange");
diff --git a/libs/rs/driver/rsdProgramRaster.cpp b/libs/rs/driver/rsdProgramRaster.cpp
index 65995be..b493759 100644
--- a/libs/rs/driver/rsdProgramRaster.cpp
+++ b/libs/rs/driver/rsdProgramRaster.cpp
@@ -32,18 +32,18 @@
return true;
}
-void rsdProgramRasterSetActive(const Context *, const ProgramRaster *pr) {
+void rsdProgramRasterSetActive(const Context *rsc, const ProgramRaster *pr) {
switch (pr->mHal.state.cull) {
case RS_CULL_BACK:
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
+ RSD_CALL_GL(glEnable, GL_CULL_FACE);
+ RSD_CALL_GL(glCullFace, GL_BACK);
break;
case RS_CULL_FRONT:
- glEnable(GL_CULL_FACE);
- glCullFace(GL_FRONT);
+ RSD_CALL_GL(glEnable, GL_CULL_FACE);
+ RSD_CALL_GL(glCullFace, GL_FRONT);
break;
case RS_CULL_NONE:
- glDisable(GL_CULL_FACE);
+ RSD_CALL_GL(glDisable, GL_CULL_FACE);
break;
}
diff --git a/libs/rs/driver/rsdProgramStore.cpp b/libs/rs/driver/rsdProgramStore.cpp
index e591453..af44b02 100644
--- a/libs/rs/driver/rsdProgramStore.cpp
+++ b/libs/rs/driver/rsdProgramStore.cpp
@@ -156,29 +156,29 @@
void rsdProgramStoreSetActive(const Context *rsc, const ProgramStore *ps) {
DrvProgramStore *drv = (DrvProgramStore *)ps->mHal.drv;
- glColorMask(ps->mHal.state.colorRWriteEnable,
+ RSD_CALL_GL(glColorMask, ps->mHal.state.colorRWriteEnable,
ps->mHal.state.colorGWriteEnable,
ps->mHal.state.colorBWriteEnable,
ps->mHal.state.colorAWriteEnable);
if (drv->blendEnable) {
- glEnable(GL_BLEND);
- glBlendFunc(drv->blendSrc, drv->blendDst);
+ RSD_CALL_GL(glEnable, GL_BLEND);
+ RSD_CALL_GL(glBlendFunc, drv->blendSrc, drv->blendDst);
} else {
- glDisable(GL_BLEND);
+ RSD_CALL_GL(glDisable, GL_BLEND);
}
if (rsc->mUserSurfaceConfig.depthMin > 0) {
- glDepthMask(ps->mHal.state.depthWriteEnable);
+ RSD_CALL_GL(glDepthMask, ps->mHal.state.depthWriteEnable);
if (drv->depthTestEnable || ps->mHal.state.depthWriteEnable) {
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(drv->depthFunc);
+ RSD_CALL_GL(glEnable, GL_DEPTH_TEST);
+ RSD_CALL_GL(glDepthFunc, drv->depthFunc);
} else {
- glDisable(GL_DEPTH_TEST);
+ RSD_CALL_GL(glDisable, GL_DEPTH_TEST);
}
} else {
- glDepthMask(false);
- glDisable(GL_DEPTH_TEST);
+ RSD_CALL_GL(glDepthMask, false);
+ RSD_CALL_GL(glDisable, GL_DEPTH_TEST);
}
/*
@@ -190,9 +190,9 @@
*/
if (ps->mHal.state.ditherEnable) {
- glEnable(GL_DITHER);
+ RSD_CALL_GL(glEnable, GL_DITHER);
} else {
- glDisable(GL_DITHER);
+ RSD_CALL_GL(glDisable, GL_DITHER);
}
}
diff --git a/libs/rs/driver/rsdShader.cpp b/libs/rs/driver/rsdShader.cpp
index 90fe4b2..16ff063 100644
--- a/libs/rs/driver/rsdShader.cpp
+++ b/libs/rs/driver/rsdShader.cpp
@@ -178,22 +178,22 @@
if (mShaderID) {
const char * ss = mShader.string();
- glShaderSource(mShaderID, 1, &ss, NULL);
- glCompileShader(mShaderID);
+ RSD_CALL_GL(glShaderSource, mShaderID, 1, &ss, NULL);
+ RSD_CALL_GL(glCompileShader, mShaderID);
GLint compiled = 0;
- glGetShaderiv(mShaderID, GL_COMPILE_STATUS, &compiled);
+ RSD_CALL_GL(glGetShaderiv, mShaderID, GL_COMPILE_STATUS, &compiled);
if (!compiled) {
GLint infoLen = 0;
- glGetShaderiv(mShaderID, GL_INFO_LOG_LENGTH, &infoLen);
+ RSD_CALL_GL(glGetShaderiv, mShaderID, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen) {
char* buf = (char*) malloc(infoLen);
if (buf) {
- glGetShaderInfoLog(mShaderID, infoLen, NULL, buf);
+ RSD_CALL_GL(glGetShaderInfoLog, mShaderID, infoLen, NULL, buf);
LOGE("Could not compile shader \n%s\n", buf);
free(buf);
}
- glDeleteShader(mShaderID);
+ RSD_CALL_GL(glDeleteShader, mShaderID);
mShaderID = 0;
rsc->setError(RS_ERROR_BAD_SHADER, "Error returned from GL driver loading shader text,");
return false;
@@ -297,24 +297,24 @@
int32_t slot, uint32_t arraySize ) {
RsDataType dataType = field->getType();
if (dataType == RS_TYPE_MATRIX_4X4) {
- glUniformMatrix4fv(slot, arraySize, GL_FALSE, fd);
+ RSD_CALL_GL(glUniformMatrix4fv, slot, arraySize, GL_FALSE, fd);
} else if (dataType == RS_TYPE_MATRIX_3X3) {
- glUniformMatrix3fv(slot, arraySize, GL_FALSE, fd);
+ RSD_CALL_GL(glUniformMatrix3fv, slot, arraySize, GL_FALSE, fd);
} else if (dataType == RS_TYPE_MATRIX_2X2) {
- glUniformMatrix2fv(slot, arraySize, GL_FALSE, fd);
+ RSD_CALL_GL(glUniformMatrix2fv, slot, arraySize, GL_FALSE, fd);
} else {
switch (field->getComponent().getVectorSize()) {
case 1:
- glUniform1fv(slot, arraySize, fd);
+ RSD_CALL_GL(glUniform1fv, slot, arraySize, fd);
break;
case 2:
- glUniform2fv(slot, arraySize, fd);
+ RSD_CALL_GL(glUniform2fv, slot, arraySize, fd);
break;
case 3:
- glUniform3fv(slot, arraySize, fd);
+ RSD_CALL_GL(glUniform3fv, slot, arraySize, fd);
break;
case 4:
- glUniform4fv(slot, arraySize, fd);
+ RSD_CALL_GL(glUniform4fv, slot, arraySize, fd);
break;
default:
rsAssert(0);
@@ -351,37 +351,44 @@
if (tex->getHasGraphicsMipmaps() &&
(dc->gl.gl.GL_NV_texture_npot_2D_mipmap || dc->gl.gl.GL_IMG_texture_npot)) {
if (dc->gl.gl.GL_NV_texture_npot_2D_mipmap) {
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[s->mHal.state.minFilter]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
+ trans[s->mHal.state.minFilter]);
} else {
switch (trans[s->mHal.state.minFilter]) {
case GL_LINEAR_MIPMAP_LINEAR:
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
+ GL_LINEAR_MIPMAP_NEAREST);
break;
default:
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[s->mHal.state.minFilter]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
+ trans[s->mHal.state.minFilter]);
break;
}
}
} else {
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, transNP[s->mHal.state.minFilter]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
+ transNP[s->mHal.state.minFilter]);
}
- glTexParameteri(target, GL_TEXTURE_MAG_FILTER, transNP[s->mHal.state.magFilter]);
- glTexParameteri(target, GL_TEXTURE_WRAP_S, transNP[s->mHal.state.wrapS]);
- glTexParameteri(target, GL_TEXTURE_WRAP_T, transNP[s->mHal.state.wrapT]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MAG_FILTER,
+ transNP[s->mHal.state.magFilter]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_S, transNP[s->mHal.state.wrapS]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_T, transNP[s->mHal.state.wrapT]);
} else {
if (tex->getHasGraphicsMipmaps()) {
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, trans[s->mHal.state.minFilter]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
+ trans[s->mHal.state.minFilter]);
} else {
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, transNP[s->mHal.state.minFilter]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
+ transNP[s->mHal.state.minFilter]);
}
- glTexParameteri(target, GL_TEXTURE_MAG_FILTER, trans[s->mHal.state.magFilter]);
- glTexParameteri(target, GL_TEXTURE_WRAP_S, trans[s->mHal.state.wrapS]);
- glTexParameteri(target, GL_TEXTURE_WRAP_T, trans[s->mHal.state.wrapT]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MAG_FILTER, trans[s->mHal.state.magFilter]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_S, trans[s->mHal.state.wrapS]);
+ RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_T, trans[s->mHal.state.wrapT]);
}
float anisoValue = rsMin(dc->gl.gl.EXT_texture_max_aniso, s->mHal.state.aniso);
if (dc->gl.gl.EXT_texture_max_aniso > 1.0f) {
- glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoValue);
+ RSD_CALL_GL(glTexParameterf, target, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoValue);
}
rsdGLCheckError(rsc, "Sampler::setup tex env");
@@ -404,12 +411,12 @@
}
for (uint32_t ct=0; ct < numTexturesToBind; ct++) {
- glActiveTexture(GL_TEXTURE0 + ct);
- glUniform1i(sc->fragUniformSlot(mTextureUniformIndexStart + ct), ct);
+ RSD_CALL_GL(glActiveTexture, GL_TEXTURE0 + ct);
+ RSD_CALL_GL(glUniform1i, sc->fragUniformSlot(mTextureUniformIndexStart + ct), ct);
if (!mRSProgram->mHal.state.textures[ct].get()) {
// if nothing is bound, reset to default GL texture
- glBindTexture(mTextureTargets[ct], 0);
+ RSD_CALL_GL(glBindTexture, mTextureTargets[ct], 0);
continue;
}
@@ -418,21 +425,22 @@
LOGE("Attempting to bind unknown texture to shader id %u, texture unit %u", (uint)this, ct);
rsc->setError(RS_ERROR_BAD_SHADER, "Non-texture allocation bound to a shader");
}
- glBindTexture(drvTex->glTarget, drvTex->textureID);
+ RSD_CALL_GL(glBindTexture, drvTex->glTarget, drvTex->textureID);
rsdGLCheckError(rsc, "ProgramFragment::setup tex bind");
if (mRSProgram->mHal.state.samplers[ct].get()) {
- setupSampler(rsc, mRSProgram->mHal.state.samplers[ct].get(), mRSProgram->mHal.state.textures[ct].get());
+ setupSampler(rsc, mRSProgram->mHal.state.samplers[ct].get(),
+ mRSProgram->mHal.state.textures[ct].get());
} else {
- glTexParameteri(drvTex->glTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(drvTex->glTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(drvTex->glTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(drvTex->glTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
rsdGLCheckError(rsc, "ProgramFragment::setup tex env");
}
rsdGLCheckError(rsc, "ProgramFragment::setup uniforms");
}
- glActiveTexture(GL_TEXTURE0);
+ RSD_CALL_GL(glActiveTexture, GL_TEXTURE0);
mDirty = false;
rsdGLCheckError(rsc, "ProgramFragment::setup");
}
@@ -442,7 +450,8 @@
for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) {
Allocation *alloc = mRSProgram->mHal.state.constants[ct].get();
if (!alloc) {
- LOGE("Attempting to set constants on shader id %u, but alloc at slot %u is not set", (uint32_t)this, ct);
+ LOGE("Attempting to set constants on shader id %u, but alloc at slot %u is not set",
+ (uint32_t)this, ct);
rsc->setError(RS_ERROR_BAD_SHADER, "No constant allocation bound");
continue;
}
@@ -470,7 +479,8 @@
arraySize = sc->fragUniformSize(uidx);
}
if (rsc->props.mLogShadersUniforms) {
- LOGV("Uniform slot=%i, offset=%i, constant=%i, field=%i, uidx=%i, name=%s", slot, offset, ct, field, uidx, fieldName);
+ LOGV("Uniform slot=%i, offset=%i, constant=%i, field=%i, uidx=%i, name=%s",
+ slot, offset, ct, field, uidx, fieldName);
}
uidx ++;
if (slot < 0) {
@@ -528,7 +538,8 @@
}
}
-void RsdShader::initAddUserElement(const Element *e, String8 *names, uint32_t *arrayLengths, uint32_t *count, const char *prefix) {
+void RsdShader::initAddUserElement(const Element *e, String8 *names, uint32_t *arrayLengths,
+ uint32_t *count, const char *prefix) {
rsAssert(e->getFieldCount());
for (uint32_t ct=0; ct < e->getFieldCount(); ct++) {
const Element *ce = e->getField(ct);
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index e3a9cf8..948d51c 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -86,7 +86,9 @@
uint32_t Context::runRootScript() {
timerSet(RS_TIMER_SCRIPT);
mStateFragmentStore.mLast.clear();
+ watchdog.inRoot = true;
uint32_t ret = runScript(mRootScript.get());
+ watchdog.inRoot = false;
return ret;
}
@@ -317,6 +319,13 @@
mExit = true;
}
+void Context::printWatchdogInfo(void *ctx) {
+ Context *rsc = (Context *)ctx;
+ LOGE("RS watchdog timeout: %i %s line %i %s", rsc->watchdog.inRoot,
+ rsc->watchdog.command, rsc->watchdog.line, rsc->watchdog.file);
+}
+
+
void Context::setPriority(int32_t p) {
// Note: If we put this in the proper "background" policy
// the wallpapers can become completly unresponsive at times.
@@ -368,6 +377,7 @@
pthread_mutex_lock(&gInitMutex);
mIO.init();
+ mIO.setTimoutCallback(printWatchdogInfo, this, 2e9);
dev->addContext(this);
mDev = dev;
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 3c7a3d2..199cc5a 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -191,6 +191,19 @@
bool mLogVisual;
} props;
+ mutable struct {
+ bool inRoot;
+ const char *command;
+ const char *file;
+ uint32_t line;
+ } watchdog;
+ static void printWatchdogInfo(void *ctx);
+ void setWatchdogGL(const char *cmd, uint32_t line, const char *file) const {
+ watchdog.command = cmd;
+ watchdog.file = file;
+ watchdog.line = line;
+ }
+
void dumpDebug() const;
void setError(RsError e, const char *msg = NULL) const;
diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp
index 4d02269..8879805 100644
--- a/libs/rs/rsLocklessFifo.cpp
+++ b/libs/rs/rsLocklessFifo.cpp
@@ -22,6 +22,9 @@
using namespace android::renderscript;
LocklessCommandFifo::LocklessCommandFifo() : mBuffer(0), mInitialized(false) {
+ mTimeoutCallback = NULL;
+ mTimeoutCallbackData = NULL;
+ mTimeoutWait = 0;
}
LocklessCommandFifo::~LocklessCommandFifo() {
@@ -125,11 +128,21 @@
void LocklessCommandFifo::flush() {
//dumpState("flush 1");
while (mPut != mGet) {
- mSignalToControl.wait();
+ while (!mSignalToControl.wait(mTimeoutWait)) {
+ if (mTimeoutCallback) {
+ mTimeoutCallback(mTimeoutCallbackData);
+ }
+ }
}
//dumpState("flush 2");
}
+void LocklessCommandFifo::setTimoutCallback(void (*cbk)(void *), void *data, uint64_t timeout) {
+ mTimeoutCallback = cbk;
+ mTimeoutCallbackData = data;
+ mTimeoutWait = timeout;
+}
+
bool LocklessCommandFifo::wait(uint64_t timeout) {
while (isEmpty() && !mInShutdown) {
mSignalToControl.set();
diff --git a/libs/rs/rsLocklessFifo.h b/libs/rs/rsLocklessFifo.h
index fa53d40..dafc512 100644
--- a/libs/rs/rsLocklessFifo.h
+++ b/libs/rs/rsLocklessFifo.h
@@ -34,6 +34,7 @@
public:
bool init(uint32_t size);
void shutdown();
+ void setTimoutCallback(void (*)(void *), void *, uint64_t timeout);
void printDebugData() const;
@@ -71,6 +72,10 @@
private:
void dumpState(const char *) const;
+
+ void (*mTimeoutCallback)(void *);
+ void * mTimeoutCallbackData;
+ uint64_t mTimeoutWait;
};
diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp
index 3259cb4..7862f3c 100644
--- a/libs/rs/rsScriptC_LibGL.cpp
+++ b/libs/rs/rsScriptC_LibGL.cpp
@@ -158,7 +158,7 @@
RsdVertexArray va(attribs, 2);
va.setup(rsc);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
}
void rsrDrawQuad(Context *rsc, Script *sc,
@@ -245,7 +245,7 @@
}
void rsrFinish(Context *rsc, Script *sc) {
- glFinish();
+ RSD_CALL_GL(glFinish);
}
@@ -253,16 +253,16 @@
rsc->mFBOCache.setup(rsc);
rsc->setupProgramStore();
- glClearColor(r, g, b, a);
- glClear(GL_COLOR_BUFFER_BIT);
+ RSD_CALL_GL(glClearColor, r, g, b, a);
+ RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
}
void rsrClearDepth(Context *rsc, Script *sc, float v) {
rsc->mFBOCache.setup(rsc);
rsc->setupProgramStore();
- glClearDepthf(v);
- glClear(GL_DEPTH_BUFFER_BIT);
+ RSD_CALL_GL(glClearDepthf, v);
+ RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
}
uint32_t rsrGetWidth(Context *rsc, Script *sc) {
diff --git a/libs/rs/rsThreadIO.cpp b/libs/rs/rsThreadIO.cpp
index fe2c52e..b1a579a 100644
--- a/libs/rs/rsThreadIO.cpp
+++ b/libs/rs/rsThreadIO.cpp
@@ -112,6 +112,10 @@
memcpy(data, &mToCoreRet, dataLen);
}
+void ThreadIO::setTimoutCallback(void (*cb)(void *), void *dat, uint64_t timeout) {
+ mToCore.setTimoutCallback(cb, dat, timeout);
+}
+
bool ThreadIO::playCoreCommands(Context *con, bool waitForCommand, uint64_t timeToWait) {
bool ret = false;
diff --git a/libs/rs/rsThreadIO.h b/libs/rs/rsThreadIO.h
index 9036118..ebce0ab 100644
--- a/libs/rs/rsThreadIO.h
+++ b/libs/rs/rsThreadIO.h
@@ -39,6 +39,7 @@
// Returns true if any commands were processed.
bool playCoreCommands(Context *con, bool waitForCommand, uint64_t timeToWait);
+ void setTimoutCallback(void (*)(void *), void *, uint64_t timeout);
//LocklessCommandFifo mToCore;
diff --git a/libs/storage/IMountService.cpp b/libs/storage/IMountService.cpp
index 7fbf67a..8ddbeae 100644
--- a/libs/storage/IMountService.cpp
+++ b/libs/storage/IMountService.cpp
@@ -157,12 +157,13 @@
return reply.readInt32();
}
- int32_t unmountVolume(const String16& mountPoint, const bool force)
+ int32_t unmountVolume(const String16& mountPoint, const bool force, const bool removeEncryption)
{
Parcel data, reply;
data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
data.writeString16(mountPoint);
data.writeInt32(force ? 1 : 0);
+ data.writeInt32(removeEncryption ? 1 : 0);
if (remote()->transact(TRANSACTION_unmountVolume, data, &reply) != NO_ERROR) {
LOGD("unmountVolume could not contact remote\n");
return -1;
diff --git a/libs/ui/Input.cpp b/libs/ui/Input.cpp
index 688b998..a5ba57d 100644
--- a/libs/ui/Input.cpp
+++ b/libs/ui/Input.cpp
@@ -13,6 +13,9 @@
// Log debug messages about velocity tracking.
#define DEBUG_VELOCITY 0
+// Log debug messages about least squares fitting.
+#define DEBUG_LEAST_SQUARES 0
+
// Log debug messages about acceleration.
#define DEBUG_ACCELERATION 0
@@ -682,9 +685,61 @@
// --- VelocityTracker ---
+const uint32_t VelocityTracker::DEFAULT_DEGREE;
+const nsecs_t VelocityTracker::DEFAULT_HORIZON;
const uint32_t VelocityTracker::HISTORY_SIZE;
-const nsecs_t VelocityTracker::MAX_AGE;
-const nsecs_t VelocityTracker::MIN_DURATION;
+
+static inline float vectorDot(const float* a, const float* b, uint32_t m) {
+ float r = 0;
+ while (m--) {
+ r += *(a++) * *(b++);
+ }
+ return r;
+}
+
+static inline float vectorNorm(const float* a, uint32_t m) {
+ float r = 0;
+ while (m--) {
+ float t = *(a++);
+ r += t * t;
+ }
+ return sqrtf(r);
+}
+
+#if DEBUG_LEAST_SQUARES || DEBUG_VELOCITY
+static String8 vectorToString(const float* a, uint32_t m) {
+ String8 str;
+ str.append("[");
+ while (m--) {
+ str.appendFormat(" %f", *(a++));
+ if (m) {
+ str.append(",");
+ }
+ }
+ str.append(" ]");
+ return str;
+}
+
+static String8 matrixToString(const float* a, uint32_t m, uint32_t n, bool rowMajor) {
+ String8 str;
+ str.append("[");
+ for (size_t i = 0; i < m; i++) {
+ if (i) {
+ str.append(",");
+ }
+ str.append(" [");
+ for (size_t j = 0; j < n; j++) {
+ if (j) {
+ str.append(",");
+ }
+ str.appendFormat(" %f", a[rowMajor ? i * n + j : j * m + i]);
+ }
+ str.append(" ]");
+ }
+ str.append(" ]");
+ return str;
+}
+#endif
VelocityTracker::VelocityTracker() {
clear();
@@ -733,16 +788,15 @@
uint32_t id = iterBits.firstMarkedBit();
uint32_t index = idBits.getIndexOfBit(id);
iterBits.clearBit(id);
- float vx, vy;
- bool available = getVelocity(id, &vx, &vy);
- if (available) {
- LOGD(" %d: position (%0.3f, %0.3f), vx=%0.3f, vy=%0.3f, speed=%0.3f",
- id, positions[index].x, positions[index].y, vx, vy, sqrtf(vx * vx + vy * vy));
- } else {
- LOG_ASSERT(vx == 0 && vy == 0);
- LOGD(" %d: position (%0.3f, %0.3f), velocity not available",
- id, positions[index].x, positions[index].y);
- }
+ Estimator estimator;
+ getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator);
+ LOGD(" %d: position (%0.3f, %0.3f), "
+ "estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)",
+ id, positions[index].x, positions[index].y,
+ int(estimator.degree),
+ vectorToString(estimator.xCoeff, estimator.degree).string(),
+ vectorToString(estimator.yCoeff, estimator.degree).string(),
+ estimator.confidence);
}
#endif
}
@@ -752,6 +806,7 @@
switch (actionMasked) {
case AMOTION_EVENT_ACTION_DOWN:
+ case AMOTION_EVENT_ACTION_HOVER_ENTER:
// Clear all pointers on down before adding the new movement.
clear();
break;
@@ -764,12 +819,11 @@
clearPointers(downIdBits);
break;
}
- case AMOTION_EVENT_ACTION_OUTSIDE:
- case AMOTION_EVENT_ACTION_CANCEL:
- case AMOTION_EVENT_ACTION_SCROLL:
- case AMOTION_EVENT_ACTION_UP:
- case AMOTION_EVENT_ACTION_POINTER_UP:
- // Ignore these actions because they do not convey any new information about
+ case AMOTION_EVENT_ACTION_MOVE:
+ case AMOTION_EVENT_ACTION_HOVER_MOVE:
+ break;
+ default:
+ // Ignore all other actions because they do not convey any new information about
// pointer movement. We also want to preserve the last known velocity of the pointers.
// Note that ACTION_UP and ACTION_POINTER_UP always report the last known position
// of the pointers that went up. ACTION_POINTER_UP does include the new position of
@@ -811,79 +865,228 @@
addMovement(eventTime, idBits, positions);
}
-bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const {
- const Movement& newestMovement = mMovements[mIndex];
- if (newestMovement.idBits.hasBit(id)) {
- // Find the oldest sample that contains the pointer and that is not older than MAX_AGE.
- nsecs_t minTime = newestMovement.eventTime - MAX_AGE;
- uint32_t oldestIndex = mIndex;
- uint32_t numTouches = 1;
- do {
- uint32_t nextOldestIndex = (oldestIndex == 0 ? HISTORY_SIZE : oldestIndex) - 1;
- const Movement& nextOldestMovement = mMovements[nextOldestIndex];
- if (!nextOldestMovement.idBits.hasBit(id)
- || nextOldestMovement.eventTime < minTime) {
- break;
- }
- oldestIndex = nextOldestIndex;
- } while (++numTouches < HISTORY_SIZE);
+/**
+ * Solves a linear least squares problem to obtain a N degree polynomial that fits
+ * the specified input data as nearly as possible.
+ *
+ * Returns true if a solution is found, false otherwise.
+ *
+ * The input consists of two vectors of data points X and Y with indices 0..m-1.
+ * The output is a vector B with indices 0..n-1 that describes a polynomial
+ * that fits the data, such the sum of abs(Y[i] - (B[0] + B[1] X[i] + B[2] X[i]^2 ... B[n] X[i]^n))
+ * for all i between 0 and m-1 is minimized.
+ *
+ * That is to say, the function that generated the input data can be approximated
+ * by y(x) ~= B[0] + B[1] x + B[2] x^2 + ... + B[n] x^n.
+ *
+ * The coefficient of determination (R^2) is also returned to describe the goodness
+ * of fit of the model for the given data. It is a value between 0 and 1, where 1
+ * indicates perfect correspondence.
+ *
+ * This function first expands the X vector to a m by n matrix A such that
+ * A[i][0] = 1, A[i][1] = X[i], A[i][2] = X[i]^2, ..., A[i][n] = X[i]^n.
+ *
+ * Then it calculates the QR decomposition of A yielding an m by m orthonormal matrix Q
+ * and an m by n upper triangular matrix R. Because R is upper triangular (lower
+ * part is all zeroes), we can simplify the decomposition into an m by n matrix
+ * Q1 and a n by n matrix R1 such that A = Q1 R1.
+ *
+ * Finally we solve the system of linear equations given by R1 B = (Qtranspose Y)
+ * to find B.
+ *
+ * For efficiency, we lay out A and Q column-wise in memory because we frequently
+ * operate on the column vectors. Conversely, we lay out R row-wise.
+ *
+ * http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares
+ * http://en.wikipedia.org/wiki/Gram-Schmidt
+ */
+static bool solveLeastSquares(const float* x, const float* y, uint32_t m, uint32_t n,
+ float* outB, float* outDet) {
+#if DEBUG_LEAST_SQUARES
+ LOGD("solveLeastSquares: m=%d, n=%d, x=%s, y=%s", int(m), int(n),
+ vectorToString(x, m).string(), vectorToString(y, m).string());
+#endif
- // Calculate an exponentially weighted moving average of the velocity estimate
- // at different points in time measured relative to the oldest sample.
- // This is essentially an IIR filter. Newer samples are weighted more heavily
- // than older samples. Samples at equal time points are weighted more or less
- // equally.
- //
- // One tricky problem is that the sample data may be poorly conditioned.
- // Sometimes samples arrive very close together in time which can cause us to
- // overestimate the velocity at that time point. Most samples might be measured
- // 16ms apart but some consecutive samples could be only 0.5sm apart because
- // the hardware or driver reports them irregularly or in bursts.
- float accumVx = 0;
- float accumVy = 0;
- uint32_t index = oldestIndex;
- uint32_t samplesUsed = 0;
- const Movement& oldestMovement = mMovements[oldestIndex];
- const Position& oldestPosition =
- oldestMovement.positions[oldestMovement.idBits.getIndexOfBit(id)];
- nsecs_t lastDuration = 0;
+ // Expand the X vector to a matrix A.
+ float a[n][m]; // column-major order
+ for (uint32_t h = 0; h < m; h++) {
+ a[0][h] = 1;
+ for (uint32_t i = 1; i < n; i++) {
+ a[i][h] = a[i - 1][h] * x[h];
+ }
+ }
+#if DEBUG_LEAST_SQUARES
+ LOGD(" - a=%s", matrixToString(&a[0][0], m, n, false /*rowMajor*/).string());
+#endif
- while (numTouches-- > 1) {
- if (++index == HISTORY_SIZE) {
- index = 0;
- }
- const Movement& movement = mMovements[index];
- nsecs_t duration = movement.eventTime - oldestMovement.eventTime;
-
- // If the duration between samples is small, we may significantly overestimate
- // the velocity. Consequently, we impose a minimum duration constraint on the
- // samples that we include in the calculation.
- if (duration >= MIN_DURATION) {
- const Position& position = movement.positions[movement.idBits.getIndexOfBit(id)];
- float scale = 1000000000.0f / duration; // one over time delta in seconds
- float vx = (position.x - oldestPosition.x) * scale;
- float vy = (position.y - oldestPosition.y) * scale;
-
- accumVx = (accumVx * lastDuration + vx * duration) / (duration + lastDuration);
- accumVy = (accumVy * lastDuration + vy * duration) / (duration + lastDuration);
-
- lastDuration = duration;
- samplesUsed += 1;
+ // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
+ float q[n][m]; // orthonormal basis, column-major order
+ float r[n][n]; // upper triangular matrix, row-major order
+ for (uint32_t j = 0; j < n; j++) {
+ for (uint32_t h = 0; h < m; h++) {
+ q[j][h] = a[j][h];
+ }
+ for (uint32_t i = 0; i < j; i++) {
+ float dot = vectorDot(&q[j][0], &q[i][0], m);
+ for (uint32_t h = 0; h < m; h++) {
+ q[j][h] -= dot * q[i][h];
}
}
- // Make sure we used at least one sample.
- if (samplesUsed != 0) {
- *outVx = accumVx;
- *outVy = accumVy;
+ float norm = vectorNorm(&q[j][0], m);
+ if (norm < 0.000001f) {
+ // vectors are linearly dependent or zero so no solution
+#if DEBUG_LEAST_SQUARES
+ LOGD(" - no solution, norm=%f", norm);
+#endif
+ return false;
+ }
+
+ float invNorm = 1.0f / norm;
+ for (uint32_t h = 0; h < m; h++) {
+ q[j][h] *= invNorm;
+ }
+ for (uint32_t i = 0; i < n; i++) {
+ r[j][i] = i < j ? 0 : vectorDot(&q[j][0], &a[i][0], m);
+ }
+ }
+#if DEBUG_LEAST_SQUARES
+ LOGD(" - q=%s", matrixToString(&q[0][0], m, n, false /*rowMajor*/).string());
+ LOGD(" - r=%s", matrixToString(&r[0][0], n, n, true /*rowMajor*/).string());
+
+ // calculate QR, if we factored A correctly then QR should equal A
+ float qr[n][m];
+ for (uint32_t h = 0; h < m; h++) {
+ for (uint32_t i = 0; i < n; i++) {
+ qr[i][h] = 0;
+ for (uint32_t j = 0; j < n; j++) {
+ qr[i][h] += q[j][h] * r[j][i];
+ }
+ }
+ }
+ LOGD(" - qr=%s", matrixToString(&qr[0][0], m, n, false /*rowMajor*/).string());
+#endif
+
+ // Solve R B = Qt Y to find B. This is easy because R is upper triangular.
+ // We just work from bottom-right to top-left calculating B's coefficients.
+ for (uint32_t i = n; i-- != 0; ) {
+ outB[i] = vectorDot(&q[i][0], y, m);
+ for (uint32_t j = n - 1; j > i; j--) {
+ outB[i] -= r[i][j] * outB[j];
+ }
+ outB[i] /= r[i][i];
+ }
+#if DEBUG_LEAST_SQUARES
+ LOGD(" - b=%s", vectorToString(outB, n).string());
+#endif
+
+ // Calculate the coefficient of determination as 1 - (SSerr / SStot) where
+ // SSerr is the residual sum of squares (squared variance of the error),
+ // and SStot is the total sum of squares (squared variance of the data).
+ float ymean = 0;
+ for (uint32_t h = 0; h < m; h++) {
+ ymean += y[h];
+ }
+ ymean /= m;
+
+ float sserr = 0;
+ float sstot = 0;
+ for (uint32_t h = 0; h < m; h++) {
+ float err = y[h] - outB[0];
+ float term = 1;
+ for (uint32_t i = 1; i < n; i++) {
+ term *= x[h];
+ err -= term * outB[i];
+ }
+ sserr += err * err;
+ float var = y[h] - ymean;
+ sstot += var * var;
+ }
+ *outDet = sstot > 0.000001f ? 1.0f - (sserr / sstot) : 1;
+#if DEBUG_LEAST_SQUARES
+ LOGD(" - sserr=%f", sserr);
+ LOGD(" - sstot=%f", sstot);
+ LOGD(" - det=%f", *outDet);
+#endif
+ return true;
+}
+
+bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const {
+ Estimator estimator;
+ if (getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator)) {
+ if (estimator.degree >= 1) {
+ *outVx = estimator.xCoeff[1];
+ *outVy = estimator.yCoeff[1];
+ return true;
+ }
+ }
+ return false;
+}
+
+bool VelocityTracker::getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon,
+ Estimator* outEstimator) const {
+ outEstimator->clear();
+
+ // Iterate over movement samples in reverse time order and collect samples.
+ float x[HISTORY_SIZE];
+ float y[HISTORY_SIZE];
+ float time[HISTORY_SIZE];
+ uint32_t m = 0;
+ uint32_t index = mIndex;
+ const Movement& newestMovement = mMovements[mIndex];
+ do {
+ const Movement& movement = mMovements[index];
+ if (!movement.idBits.hasBit(id)) {
+ break;
+ }
+
+ nsecs_t age = newestMovement.eventTime - movement.eventTime;
+ if (age > horizon) {
+ break;
+ }
+
+ const Position& position = movement.getPosition(id);
+ x[m] = position.x;
+ y[m] = position.y;
+ time[m] = -age * 0.000000001f;
+ index = (index == 0 ? HISTORY_SIZE : index) - 1;
+ } while (++m < HISTORY_SIZE);
+
+ if (m == 0) {
+ return false; // no data
+ }
+
+ // Calculate a least squares polynomial fit.
+ if (degree > Estimator::MAX_DEGREE) {
+ degree = Estimator::MAX_DEGREE;
+ }
+ if (degree > m - 1) {
+ degree = m - 1;
+ }
+ if (degree >= 1) {
+ float xdet, ydet;
+ uint32_t n = degree + 1;
+ if (solveLeastSquares(time, x, m, n, outEstimator->xCoeff, &xdet)
+ && solveLeastSquares(time, y, m, n, outEstimator->yCoeff, &ydet)) {
+ outEstimator->degree = degree;
+ outEstimator->confidence = xdet * ydet;
+#if DEBUG_LEAST_SQUARES
+ LOGD("estimate: degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f",
+ int(outEstimator->degree),
+ vectorToString(outEstimator->xCoeff, n).string(),
+ vectorToString(outEstimator->yCoeff, n).string(),
+ outEstimator->confidence);
+#endif
return true;
}
}
- // No data available for this pointer.
- *outVx = 0;
- *outVy = 0;
- return false;
+ // No velocity data available for this pointer, but we do have its current position.
+ outEstimator->xCoeff[0] = x[0];
+ outEstimator->yCoeff[0] = y[0];
+ outEstimator->degree = 0;
+ outEstimator->confidence = 1;
+ return true;
}
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index f5e1416..db27cfd 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -773,20 +773,20 @@
}
public void binderDied() {
- IBinder newModeOwner = null;
+ int newModeOwnerPid = 0;
synchronized(mSetModeDeathHandlers) {
Log.w(TAG, "setMode() client died");
int index = mSetModeDeathHandlers.indexOf(this);
if (index < 0) {
Log.w(TAG, "unregistered setMode() client died");
} else {
- newModeOwner = setModeInt(AudioSystem.MODE_NORMAL, mCb, mPid);
+ newModeOwnerPid = setModeInt(AudioSystem.MODE_NORMAL, mCb, mPid);
}
}
// when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all
// SCO connections not started by the application changing the mode
- if (newModeOwner != null) {
- disconnectBluetoothSco(newModeOwner);
+ if (newModeOwnerPid != 0) {
+ disconnectBluetoothSco(newModeOwnerPid);
}
}
@@ -817,28 +817,28 @@
return;
}
- IBinder newModeOwner = null;
+ int newModeOwnerPid = 0;
synchronized(mSetModeDeathHandlers) {
if (mode == AudioSystem.MODE_CURRENT) {
mode = mMode;
}
- newModeOwner = setModeInt(mode, cb, Binder.getCallingPid());
+ newModeOwnerPid = setModeInt(mode, cb, Binder.getCallingPid());
}
// when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all
// SCO connections not started by the application changing the mode
- if (newModeOwner != null) {
- disconnectBluetoothSco(newModeOwner);
+ if (newModeOwnerPid != 0) {
+ disconnectBluetoothSco(newModeOwnerPid);
}
}
// must be called synchronized on mSetModeDeathHandlers
- // setModeInt() returns a non null IBInder if the audio mode was successfully set to
+ // setModeInt() returns a valid PID if the audio mode was successfully set to
// any mode other than NORMAL.
- IBinder setModeInt(int mode, IBinder cb, int pid) {
- IBinder newModeOwner = null;
+ int setModeInt(int mode, IBinder cb, int pid) {
+ int newModeOwnerPid = 0;
if (cb == null) {
Log.e(TAG, "setModeInt() called with null binder");
- return newModeOwner;
+ return newModeOwnerPid;
}
SetModeDeathHandler hdlr = null;
@@ -901,13 +901,17 @@
if (status == AudioSystem.AUDIO_STATUS_OK) {
if (mode != AudioSystem.MODE_NORMAL) {
- newModeOwner = cb;
+ if (mSetModeDeathHandlers.isEmpty()) {
+ Log.e(TAG, "setMode() different from MODE_NORMAL with empty mode client stack");
+ } else {
+ newModeOwnerPid = mSetModeDeathHandlers.get(0).getPid();
+ }
}
int streamType = getActiveStreamType(AudioManager.USE_DEFAULT_STREAM_TYPE);
int index = mStreamStates[STREAM_VOLUME_ALIAS[streamType]].mIndex;
setStreamVolumeInt(STREAM_VOLUME_ALIAS[streamType], index, true, false);
}
- return newModeOwner;
+ return newModeOwnerPid;
}
/** pre-condition: oldMode != newMode */
@@ -1351,6 +1355,10 @@
return mCb;
}
+ public int getPid() {
+ return mCreatorPid;
+ }
+
public int totalCount() {
synchronized(mScoClients) {
int count = 0;
@@ -1445,13 +1453,13 @@
}
}
- public void clearAllScoClients(IBinder exceptBinder, boolean stopSco) {
+ public void clearAllScoClients(int exceptPid, boolean stopSco) {
synchronized(mScoClients) {
ScoClient savedClient = null;
int size = mScoClients.size();
for (int i = 0; i < size; i++) {
ScoClient cl = mScoClients.get(i);
- if (cl.getBinder() != exceptBinder) {
+ if (cl.getPid() != exceptPid) {
cl.clearCount(stopSco);
} else {
savedClient = cl;
@@ -1480,7 +1488,7 @@
return result;
}
- private void disconnectBluetoothSco(IBinder exceptBinder) {
+ private void disconnectBluetoothSco(int exceptPid) {
synchronized(mScoClients) {
checkScoAudioState();
if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL ||
@@ -1498,14 +1506,14 @@
}
}
} else {
- clearAllScoClients(exceptBinder, true);
+ clearAllScoClients(exceptPid, true);
}
}
}
private void resetBluetoothSco() {
synchronized(mScoClients) {
- clearAllScoClients(null, false);
+ clearAllScoClients(0, false);
mScoAudioState = SCO_STATE_INACTIVE;
broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
}
@@ -2509,7 +2517,7 @@
case BluetoothHeadset.STATE_AUDIO_DISCONNECTED:
state = AudioManager.SCO_AUDIO_STATE_DISCONNECTED;
mScoAudioState = SCO_STATE_INACTIVE;
- clearAllScoClients(null, false);
+ clearAllScoClients(0, false);
break;
case BluetoothHeadset.STATE_AUDIO_CONNECTING:
if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL &&
diff --git a/media/java/android/media/Metadata.java b/media/java/android/media/Metadata.java
index 591a8b9..b566653 100644
--- a/media/java/android/media/Metadata.java
+++ b/media/java/android/media/Metadata.java
@@ -39,6 +39,8 @@
The caller is expected to know the type of the metadata and call
the right get* method to fetch its value.
+
+ @hide
*/
public class Metadata
{
diff --git a/media/java/android/media/RemoteControlClient.java b/media/java/android/media/RemoteControlClient.java
index daa25e0..f66f1b0 100644
--- a/media/java/android/media/RemoteControlClient.java
+++ b/media/java/android/media/RemoteControlClient.java
@@ -16,7 +16,9 @@
package android.media;
+import android.app.PendingIntent;
import android.content.ComponentName;
+import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
@@ -203,6 +205,8 @@
public final static int FLAG_INFORMATION_REQUEST_ALBUM_ART = 1 << 3;
/**
+ * @hide
+ * TODO remove after modifying known (internal) media apps using this API
* Class constructor.
* @param mediaButtonEventReceiver The receiver for the media button events. It needs to have
* been registered with {@link AudioManager#registerMediaButtonEventReceiver(ComponentName)}
@@ -226,6 +230,8 @@
}
/**
+ * @hide
+ * TODO remove after modifying known (internal) media apps using this API
* Class constructor for a remote control client whose internal event handling
* happens on a user-provided Looper.
* @param mediaButtonEventReceiver The receiver for the media button events. It needs to have
@@ -242,6 +248,56 @@
mEventHandler = new EventHandler(this, looper);
}
+ /**
+ * Class constructor.
+ * @param mediaButtonIntent The intent that will be sent for the media button events sent
+ * by remote controls.
+ * This intent needs to have been constructed with the {@link Intent#ACTION_MEDIA_BUTTON}
+ * action, and have a component that will handle the intent (set with
+ * {@link Intent#setComponent(ComponentName)}) registered with
+ * {@link AudioManager#registerMediaButtonEventReceiver(ComponentName)}
+ * before this new RemoteControlClient can itself be registered with
+ * {@link AudioManager#registerRemoteControlClient(RemoteControlClient)}.
+ * @see AudioManager#registerMediaButtonEventReceiver(ComponentName)
+ * @see AudioManager#registerRemoteControlClient(RemoteControlClient)
+ */
+ public RemoteControlClient(PendingIntent mediaButtonIntent) {
+ // TODO implement using PendingIntent instead of ComponentName
+ mRcEventReceiver = null;
+
+ Looper looper;
+ if ((looper = Looper.myLooper()) != null) {
+ mEventHandler = new EventHandler(this, looper);
+ } else if ((looper = Looper.getMainLooper()) != null) {
+ mEventHandler = new EventHandler(this, looper);
+ } else {
+ mEventHandler = null;
+ Log.e(TAG, "RemoteControlClient() couldn't find main application thread");
+ }
+ }
+
+ /**
+ * Class constructor for a remote control client whose internal event handling
+ * happens on a user-provided Looper.
+ * @param mediaButtonIntent The intent that will be sent for the media button events sent
+ * by remote controls.
+ * This intent needs to have been constructed with the {@link Intent#ACTION_MEDIA_BUTTON}
+ * action, and have a component that will handle the intent (set with
+ * {@link Intent#setComponent(ComponentName)}) registered with
+ * {@link AudioManager#registerMediaButtonEventReceiver(ComponentName)}
+ * before this new RemoteControlClient can itself be registered with
+ * {@link AudioManager#registerRemoteControlClient(RemoteControlClient)}.
+ * @param looper The Looper running the event loop.
+ * @see AudioManager#registerMediaButtonEventReceiver(ComponentName)
+ * @see AudioManager#registerRemoteControlClient(RemoteControlClient)
+ */
+ public RemoteControlClient(PendingIntent mediaButtonIntent, Looper looper) {
+ // TODO implement using PendingIntent instead of ComponentName
+ mRcEventReceiver = null;
+
+ mEventHandler = new EventHandler(this, looper);
+ }
+
private static final int[] METADATA_KEYS_TYPE_STRING = {
MediaMetadataRetriever.METADATA_KEY_ALBUM,
MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST,
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index c2c6715..8ebb652 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -262,7 +262,7 @@
mFlushed = false;
mFlags = flags;
AudioSystem::acquireAudioSessionId(mSessionId);
-
+ mRestoreStatus = NO_ERROR;
return NO_ERROR;
}
@@ -1161,8 +1161,8 @@
status_t result;
if (!(android_atomic_or(CBLK_RESTORING_ON, &cblk->flags) & CBLK_RESTORING_MSK)) {
- LOGW("dead IAudioTrack, creating a new one from %s",
- fromStart ? "start()" : "obtainBuffer()");
+ LOGW("dead IAudioTrack, creating a new one from %s TID %d",
+ fromStart ? "start()" : "obtainBuffer()", gettid());
// signal old cblk condition so that other threads waiting for available buffers stop
// waiting now
@@ -1217,33 +1217,35 @@
}
if (mActive) {
result = mAudioTrack->start();
+ LOGW_IF(result != NO_ERROR, "restoreTrack_l() start() failed status %d", result);
}
if (fromStart && result == NO_ERROR) {
mNewPosition = mCblk->server + mUpdatePeriod;
}
}
if (result != NO_ERROR) {
- mActive = false;
+ android_atomic_and(~CBLK_RESTORING_ON, &cblk->flags);
+ LOGW_IF(result != NO_ERROR, "restoreTrack_l() failed status %d", result);
}
-
+ mRestoreStatus = result;
// signal old cblk condition for other threads waiting for restore completion
android_atomic_or(CBLK_RESTORED_ON, &cblk->flags);
cblk->cv.broadcast();
} else {
if (!(cblk->flags & CBLK_RESTORED_MSK)) {
- LOGW("dead IAudioTrack, waiting for a new one");
+ LOGW("dead IAudioTrack, waiting for a new one TID %d", gettid());
mLock.unlock();
result = cblk->cv.waitRelative(cblk->lock, milliseconds(RESTORE_TIMEOUT_MS));
+ if (result == NO_ERROR) {
+ result = mRestoreStatus;
+ }
cblk->lock.unlock();
mLock.lock();
} else {
- LOGW("dead IAudioTrack, already restored");
- result = NO_ERROR;
+ LOGW("dead IAudioTrack, already restored TID %d", gettid());
+ result = mRestoreStatus;
cblk->lock.unlock();
}
- if (result != NO_ERROR || mActive == 0) {
- result = status_t(STOPPED);
- }
}
LOGV("restoreTrack_l() status %d mActive %d cblk %p, old cblk %p flags %08x old flags %08x",
result, mActive, mCblk, cblk, mCblk->flags, cblk->flags);
@@ -1254,7 +1256,7 @@
}
cblk->lock.lock();
- LOGW_IF(result != NO_ERROR, "restoreTrack_l() error %d", result);
+ LOGW_IF(result != NO_ERROR, "restoreTrack_l() error %d TID %d", result, gettid());
return result;
}
diff --git a/media/libmedia/MediaScanner.cpp b/media/libmedia/MediaScanner.cpp
index 41f8593..19dedfc 100644
--- a/media/libmedia/MediaScanner.cpp
+++ b/media/libmedia/MediaScanner.cpp
@@ -16,6 +16,7 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "MediaScanner"
+#include <cutils/properties.h>
#include <utils/Log.h>
#include <media/mediascanner.h>
@@ -26,11 +27,14 @@
namespace android {
MediaScanner::MediaScanner()
- : mLocale(NULL) {
+ : mLocale(NULL), mSkipList(NULL), mSkipIndex(NULL) {
+ loadSkipList();
}
MediaScanner::~MediaScanner() {
setLocale(NULL);
+ free(mSkipList);
+ free(mSkipIndex);
}
void MediaScanner::setLocale(const char *locale) {
@@ -47,6 +51,33 @@
return mLocale;
}
+void MediaScanner::loadSkipList() {
+ mSkipList = (char *)malloc(PROPERTY_VALUE_MAX * sizeof(char));
+ if (mSkipList) {
+ property_get("testing.mediascanner.skiplist", mSkipList, "");
+ }
+ if (!mSkipList || (strlen(mSkipList) == 0)) {
+ free(mSkipList);
+ mSkipList = NULL;
+ return;
+ }
+ mSkipIndex = (int *)malloc(PROPERTY_VALUE_MAX * sizeof(int));
+ if (mSkipIndex) {
+ // dup it because strtok will modify the string
+ char *skipList = strdup(mSkipList);
+ if (skipList) {
+ char * path = strtok(skipList, ",");
+ int i = 0;
+ while (path) {
+ mSkipIndex[i++] = strlen(path);
+ path = strtok(NULL, ",");
+ }
+ mSkipIndex[i] = -1;
+ free(skipList);
+ }
+ }
+}
+
MediaScanResult MediaScanner::processDirectory(
const char *path, MediaScannerClient &client) {
int pathLength = strlen(path);
@@ -75,12 +106,39 @@
return result;
}
+bool MediaScanner::shouldSkipDirectory(char *path) {
+ if (path && mSkipList && mSkipIndex) {
+ int len = strlen(path);
+ int idx = 0;
+ // track the start position of next path in the comma
+ // separated list obtained from getprop
+ int startPos = 0;
+ while (mSkipIndex[idx] != -1) {
+ // no point to match path name if strlen mismatch
+ if ((len == mSkipIndex[idx])
+ // pick out the path segment from comma separated list
+ // to compare against current path parameter
+ && (strncmp(path, &mSkipList[startPos], len) == 0)) {
+ return true;
+ }
+ startPos += mSkipIndex[idx] + 1; // extra char for the delimiter
+ idx++;
+ }
+ }
+ return false;
+}
+
MediaScanResult MediaScanner::doProcessDirectory(
char *path, int pathRemaining, MediaScannerClient &client, bool noMedia) {
// place to copy file or directory name
char* fileSpot = path + strlen(path);
struct dirent* entry;
+ if (shouldSkipDirectory(path)) {
+ LOGD("Skipping: %s", path);
+ return MEDIA_SCAN_RESULT_OK;
+ }
+
// Treat all files as non-media in directories that contain a ".nomedia" file
if (pathRemaining >= 8 /* strlen(".nomedia") */ ) {
strcpy(fileSpot, ".nomedia");
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 8f213da..bf83849 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -26,6 +26,9 @@
namespace android {
+// static
+const int64_t NuPlayer::Renderer::kMinPositionUpdateDelayUs = 100000ll;
+
NuPlayer::Renderer::Renderer(
const sp<MediaPlayerBase::AudioSink> &sink,
const sp<AMessage> ¬ify)
@@ -43,7 +46,8 @@
mHasAudio(false),
mHasVideo(false),
mSyncQueues(false),
- mPaused(false) {
+ mPaused(false),
+ mLastPositionUpdateUs(-1ll) {
}
NuPlayer::Renderer::~Renderer() {
@@ -190,7 +194,7 @@
mDrainAudioQueuePending = true;
sp<AMessage> msg = new AMessage(kWhatDrainAudioQueue, id());
msg->setInt32("generation", mAudioQueueGeneration);
- msg->post(10000);
+ msg->post();
}
void NuPlayer::Renderer::signalAudioSinkChanged() {
@@ -198,7 +202,6 @@
}
void NuPlayer::Renderer::onDrainAudioQueue() {
-
for (;;) {
if (mAudioQueue.empty()) {
break;
@@ -562,6 +565,13 @@
}
int64_t nowUs = ALooper::GetNowUs();
+
+ if (mLastPositionUpdateUs >= 0
+ && nowUs < mLastPositionUpdateUs + kMinPositionUpdateDelayUs) {
+ return;
+ }
+ mLastPositionUpdateUs = nowUs;
+
int64_t positionUs = (nowUs - mAnchorTimeRealUs) + mAnchorTimeMediaUs;
sp<AMessage> notify = mNotify->dup();
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
index 2713031..3a641a2 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
@@ -74,6 +74,8 @@
status_t mFinalResult;
};
+ static const int64_t kMinPositionUpdateDelayUs;
+
sp<MediaPlayerBase::AudioSink> mAudioSink;
sp<AMessage> mNotify;
List<QueueEntry> mAudioQueue;
@@ -98,6 +100,8 @@
bool mPaused;
+ int64_t mLastPositionUpdateUs;
+
void onDrainAudioQueue();
void postDrainAudioQueue();
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index e9dc61c..2ba2273 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -1131,6 +1131,13 @@
mSentFormat = true;
}
+void ACodec::signalError(OMX_ERRORTYPE error) {
+ sp<AMessage> notify = mNotify->dup();
+ notify->setInt32("what", ACodec::kWhatError);
+ notify->setInt32("omx-error", error);
+ notify->post();
+}
+
////////////////////////////////////////////////////////////////////////////////
ACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState)
@@ -1252,10 +1259,7 @@
LOGE("[%s] ERROR(0x%08lx)", mCodec->mComponentName.c_str(), data1);
- sp<AMessage> notify = mCodec->mNotify->dup();
- notify->setInt32("what", ACodec::kWhatError);
- notify->setInt32("omx-error", data1);
- notify->post();
+ mCodec->signalError((OMX_ERRORTYPE)data1);
return true;
}
@@ -1548,12 +1552,14 @@
&& msg->findInt32("render", &render) && render != 0) {
// The client wants this buffer to be rendered.
- CHECK_EQ(mCodec->mNativeWindow->queueBuffer(
+ if (mCodec->mNativeWindow->queueBuffer(
mCodec->mNativeWindow.get(),
- info->mGraphicBuffer.get()),
- 0);
-
- info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW;
+ info->mGraphicBuffer.get()) == OK) {
+ info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW;
+ } else {
+ mCodec->signalError();
+ info->mStatus = BufferInfo::OWNED_BY_US;
+ }
} else {
info->mStatus = BufferInfo::OWNED_BY_US;
}
@@ -1692,11 +1698,7 @@
if (node == NULL) {
LOGE("Unable to instantiate a decoder for type '%s'.", mime.c_str());
- sp<AMessage> notify = mCodec->mNotify->dup();
- notify->setInt32("what", ACodec::kWhatError);
- notify->setInt32("omx-error", OMX_ErrorComponentNotFound);
- notify->post();
-
+ mCodec->signalError(OMX_ErrorComponentNotFound);
return;
}
@@ -1744,10 +1746,7 @@
"(error 0x%08x)",
err);
- sp<AMessage> notify = mCodec->mNotify->dup();
- notify->setInt32("what", ACodec::kWhatError);
- notify->setInt32("omx-error", OMX_ErrorUndefined);
- notify->post();
+ mCodec->signalError();
}
}
@@ -2063,10 +2062,7 @@
"port reconfiguration (error 0x%08x)",
err);
- sp<AMessage> notify = mCodec->mNotify->dup();
- notify->setInt32("what", ACodec::kWhatError);
- notify->setInt32("omx-error", OMX_ErrorUndefined);
- notify->post();
+ mCodec->signalError();
}
return true;
diff --git a/media/libstagefright/AVIExtractor.cpp b/media/libstagefright/AVIExtractor.cpp
index 6313ca3..4e46414 100644
--- a/media/libstagefright/AVIExtractor.cpp
+++ b/media/libstagefright/AVIExtractor.cpp
@@ -117,14 +117,12 @@
}
}
- int64_t timeUs =
- (mSampleIndex * 1000000ll * mTrack.mRate) / mTrack.mScale;
-
off64_t offset;
size_t size;
bool isKey;
+ int64_t timeUs;
status_t err = mExtractor->getSampleInfo(
- mTrackIndex, mSampleIndex, &offset, &size, &isKey);
+ mTrackIndex, mSampleIndex, &offset, &size, &isKey, &timeUs);
++mSampleIndex;
@@ -396,6 +394,8 @@
uint32_t rate = U32LE_AT(&data[20]);
uint32_t scale = U32LE_AT(&data[24]);
+ uint32_t sampleSize = U32LE_AT(&data[44]);
+
const char *mime = NULL;
Track::Kind kind = Track::OTHER;
@@ -427,6 +427,7 @@
track->mMeta = meta;
track->mRate = rate;
track->mScale = scale;
+ track->mBytesPerSample = sampleSize;
track->mKind = kind;
track->mNumSyncSamples = 0;
track->mThumbnailSampleSize = 0;
@@ -612,11 +613,12 @@
off64_t offset;
size_t size;
bool isKey;
- status_t err = getSampleInfo(0, 0, &offset, &size, &isKey);
+ int64_t timeUs;
+ status_t err = getSampleInfo(0, 0, &offset, &size, &isKey, &timeUs);
if (err != OK) {
mOffsetsAreAbsolute = !mOffsetsAreAbsolute;
- err = getSampleInfo(0, 0, &offset, &size, &isKey);
+ err = getSampleInfo(0, 0, &offset, &size, &isKey, &timeUs);
if (err != OK) {
return err;
@@ -630,8 +632,9 @@
for (size_t i = 0; i < mTracks.size(); ++i) {
Track *track = &mTracks.editItemAt(i);
- int64_t durationUs =
- (track->mSamples.size() * 1000000ll * track->mRate) / track->mScale;
+ int64_t durationUs;
+ CHECK_EQ((status_t)OK,
+ getSampleTime(i, track->mSamples.size() - 1, &durationUs));
LOGV("track %d duration = %.2f secs", i, durationUs / 1E6);
@@ -645,9 +648,10 @@
if (!strncasecmp("video/", mime.c_str(), 6)
&& track->mThumbnailSampleIndex >= 0) {
- int64_t thumbnailTimeUs =
- (track->mThumbnailSampleIndex * 1000000ll * track->mRate)
- / track->mScale;
+ int64_t thumbnailTimeUs;
+ CHECK_EQ((status_t)OK,
+ getSampleTime(i, track->mThumbnailSampleIndex,
+ &thumbnailTimeUs));
track->mMeta->setInt64(kKeyThumbnailTime, thumbnailTimeUs);
@@ -659,6 +663,21 @@
}
}
}
+
+ if (track->mBytesPerSample != 0) {
+ // Assume all chunks are the same size for now.
+
+ off64_t offset;
+ size_t size;
+ bool isKey;
+ int64_t sampleTimeUs;
+ CHECK_EQ((status_t)OK,
+ getSampleInfo(
+ i, 0,
+ &offset, &size, &isKey, &sampleTimeUs));
+
+ track->mRate *= size / track->mBytesPerSample;
+ }
}
mFoundIndex = true;
@@ -720,7 +739,9 @@
off64_t offset;
size_t size;
bool isKey;
- status_t err = getSampleInfo(trackIndex, 0, &offset, &size, &isKey);
+ int64_t timeUs;
+ status_t err =
+ getSampleInfo(trackIndex, 0, &offset, &size, &isKey, &timeUs);
if (err != OK) {
return err;
@@ -762,7 +783,8 @@
status_t AVIExtractor::getSampleInfo(
size_t trackIndex, size_t sampleIndex,
- off64_t *offset, size_t *size, bool *isKey) {
+ off64_t *offset, size_t *size, bool *isKey,
+ int64_t *sampleTimeUs) {
if (trackIndex >= mTracks.size()) {
return -ERANGE;
}
@@ -801,9 +823,20 @@
*isKey = info.mIsKey;
+ *sampleTimeUs = (sampleIndex * 1000000ll * track.mRate) / track.mScale;
+
return OK;
}
+status_t AVIExtractor::getSampleTime(
+ size_t trackIndex, size_t sampleIndex, int64_t *sampleTimeUs) {
+ off64_t offset;
+ size_t size;
+ bool isKey;
+ return getSampleInfo(
+ trackIndex, sampleIndex, &offset, &size, &isKey, sampleTimeUs);
+}
+
status_t AVIExtractor::getSampleIndexAtTime(
size_t trackIndex,
int64_t timeUs, MediaSource::ReadOptions::SeekMode mode,
@@ -911,7 +944,11 @@
if (!memcmp(tmp, "RIFF", 4) && !memcmp(&tmp[8], "AVI ", 4)) {
mimeType->setTo(MEDIA_MIMETYPE_CONTAINER_AVI);
- *confidence = 0.2;
+
+ // Just a tad over the mp3 extractor's confidence, since
+ // these .avi files may contain .mp3 content that otherwise would
+ // mistakenly lead to us identifying the entire file as a .mp3 file.
+ *confidence = 0.21;
return true;
}
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index fb49d7b..6280f51 100755
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -50,7 +50,7 @@
// Treat time out as an error if we have not received any output
// buffers after 3 seconds.
-const static int64_t kBufferFilledEventTimeOutUs = 3000000000LL;
+const static int64_t kBufferFilledEventTimeOutNs = 3000000000LL;
struct CodecInfo {
const char *mime;
@@ -2325,9 +2325,14 @@
{
CODEC_LOGV("OMX_EventPortSettingsChanged(port=%ld, data2=0x%08lx)",
data1, data2);
- CHECK(mFilledBuffers.empty());
if (data2 == 0 || data2 == OMX_IndexParamPortDefinition) {
+ // There is no need to check whether mFilledBuffers is empty or not
+ // when the OMX_EventPortSettingsChanged is not meant for reallocating
+ // the output buffers.
+ if (data1 == kPortIndexOutput) {
+ CHECK(mFilledBuffers.empty());
+ }
onPortSettingsChanged(data1);
} else if (data1 == kPortIndexOutput &&
(data2 == OMX_IndexConfigCommonOutputCrop ||
@@ -2447,13 +2452,16 @@
mOutputPortSettingsHaveChanged = formatChanged;
}
- enablePortAsync(portIndex);
-
- status_t err = allocateBuffersOnPort(portIndex);
-
+ status_t err = enablePortAsync(portIndex);
if (err != OK) {
- CODEC_LOGE("allocateBuffersOnPort failed (err = %d)", err);
+ CODEC_LOGE("enablePortAsync(%ld) failed (err = %d)", portIndex, err);
setState(ERROR);
+ } else {
+ err = allocateBuffersOnPort(portIndex);
+ if (err != OK) {
+ CODEC_LOGE("allocateBuffersOnPort failed (err = %d)", err);
+ setState(ERROR);
+ }
}
}
break;
@@ -2768,16 +2776,14 @@
freeBuffersOnPort(portIndex, true);
}
-void OMXCodec::enablePortAsync(OMX_U32 portIndex) {
+status_t OMXCodec::enablePortAsync(OMX_U32 portIndex) {
CHECK(mState == EXECUTING || mState == RECONFIGURING);
CHECK_EQ((int)mPortStatus[portIndex], (int)DISABLED);
mPortStatus[portIndex] = ENABLING;
CODEC_LOGV("sending OMX_CommandPortEnable(%ld)", portIndex);
- status_t err =
- mOMX->sendCommand(mNode, OMX_CommandPortEnable, portIndex);
- CHECK_EQ(err, (status_t)OK);
+ return mOMX->sendCommand(mNode, OMX_CommandPortEnable, portIndex);
}
void OMXCodec::fillOutputBuffers() {
@@ -3220,7 +3226,7 @@
// for video encoding.
return mBufferFilled.wait(mLock);
}
- status_t err = mBufferFilled.waitRelative(mLock, kBufferFilledEventTimeOutUs);
+ status_t err = mBufferFilled.waitRelative(mLock, kBufferFilledEventTimeOutNs);
if (err != OK) {
CODEC_LOGE("Timed out waiting for output buffers: %d/%d",
countBuffersWeOwn(mPortBuffers[kPortIndexInput]),
diff --git a/media/libstagefright/include/AVIExtractor.h b/media/libstagefright/include/AVIExtractor.h
index 375a94d..b575347 100644
--- a/media/libstagefright/include/AVIExtractor.h
+++ b/media/libstagefright/include/AVIExtractor.h
@@ -54,6 +54,11 @@
uint32_t mRate;
uint32_t mScale;
+ // If bytes per sample == 0, each chunk represents a single sample,
+ // otherwise each chunk should me a multiple of bytes-per-sample in
+ // size.
+ uint32_t mBytesPerSample;
+
enum Kind {
AUDIO,
VIDEO,
@@ -84,7 +89,11 @@
status_t getSampleInfo(
size_t trackIndex, size_t sampleIndex,
- off64_t *offset, size_t *size, bool *isKey);
+ off64_t *offset, size_t *size, bool *isKey,
+ int64_t *sampleTimeUs);
+
+ status_t getSampleTime(
+ size_t trackIndex, size_t sampleIndex, int64_t *sampleTimeUs);
status_t getSampleIndexAtTime(
size_t trackIndex,
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaProfileReader.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaProfileReader.java
index b1ad315..b1d049e 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaProfileReader.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaProfileReader.java
@@ -95,6 +95,25 @@
return audioEncoderMap.get(audioEncoder);
}
+ public static int getMinFrameRateForCodec(int codec) {
+ return getMinOrMaxFrameRateForCodec(codec, false);
+ }
+
+ public static int getMaxFrameRateForCodec(int codec) {
+ return getMinOrMaxFrameRateForCodec(codec, true);
+ }
+
+ private static int getMinOrMaxFrameRateForCodec(int codec, boolean max) {
+ for (VideoEncoderCap cap: videoEncoders) {
+ if (cap.mCodec == codec) {
+ if (max) return cap.mMaxFrameRate;
+ else return cap.mMinFrameRate;
+ }
+ }
+ // Should never reach here
+ throw new IllegalArgumentException("Unsupported video codec " + codec);
+ }
+
private MediaProfileReader() {} // Don't call me
private static void initVideoEncoderMap() {
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java
index 82df6690..796b52c 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java
@@ -247,7 +247,9 @@
mCamera.unlock();
mRecorder.setCamera(mCamera);
Thread.sleep(1000);
- recordVideo(15, 352, 288, MediaRecorder.VideoEncoder.H263,
+ int codec = MediaRecorder.VideoEncoder.H263;
+ int frameRate = MediaProfileReader.getMaxFrameRateForCodec(codec);
+ recordVideo(frameRate, 352, 288, codec,
MediaRecorder.OutputFormat.THREE_GPP,
MediaNames.RECORDED_PORTRAIT_H263, true);
mCamera.lock();
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorAPITest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorAPITest.java
index afe2001..2a02b58 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorAPITest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorAPITest.java
@@ -2590,12 +2590,15 @@
+ "H264_BP_1920x1080_30fps_1200Kbps_1_10.mp4";
final int renderingMode = MediaItem.RENDERING_MODE_BLACK_BORDER;
final MediaVideoItem mediaVideoItem1;
- boolean flagForException = false;
+ // 1080p resolution is supported on some devices
+ // but not on other devices.
+ // So this test case is not generic and
+ // hence we always assert true
+ boolean flagForException = true;
try {
mediaVideoItem1 = mVideoEditorHelper.createMediaItem(mVideoEditor,
"m1", videoItemFileName1, renderingMode);
} catch (IllegalArgumentException e) {
- flagForException = true;
}
assertTrue("VideoContent 1920x1080", flagForException);
}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
index 0f79515..0b887b9 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
@@ -365,16 +365,6 @@
assertTrue("H264 playback memory test", memoryResult);
}
- private int getMaxFrameRateForVideoEncoder(int codec) {
- int frameRate = -1;
- for (VideoEncoderCap cap: videoEncoders) {
- if (cap.mCodec == MediaRecorder.VideoEncoder.H263) {
- frameRate = cap.mMaxFrameRate;
- }
- }
- return frameRate;
- }
-
// Test case 4: Capture the memory usage after every 20 video only recorded
@LargeTest
public void testH263RecordVideoOnlyMemoryUsage() throws Exception {
@@ -384,7 +374,7 @@
File videoH263RecordOnlyMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(videoH263RecordOnlyMemoryOut, true));
output.write("H263 video record only\n");
- int frameRate = getMaxFrameRateForVideoEncoder(MediaRecorder.VideoEncoder.H263);
+ int frameRate = MediaProfileReader.getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263);
assertTrue("H263 video recording frame rate", frameRate != -1);
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
assertTrue(stressVideoRecord(frameRate, 352, 288, MediaRecorder.VideoEncoder.H263,
@@ -406,7 +396,7 @@
File videoMp4RecordOnlyMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(videoMp4RecordOnlyMemoryOut, true));
output.write("MPEG4 video record only\n");
- int frameRate = getMaxFrameRateForVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
+ int frameRate = MediaProfileReader.getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.MPEG_4_SP);
assertTrue("MPEG4 video recording frame rate", frameRate != -1);
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
assertTrue(stressVideoRecord(frameRate, 352, 288, MediaRecorder.VideoEncoder.MPEG_4_SP,
@@ -428,7 +418,7 @@
File videoRecordAudioMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(videoRecordAudioMemoryOut, true));
- int frameRate = getMaxFrameRateForVideoEncoder(MediaRecorder.VideoEncoder.H263);
+ int frameRate = MediaProfileReader.getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H263);
assertTrue("H263 video recording frame rate", frameRate != -1);
output.write("Audio and h263 video record\n");
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
index ae0589c..e6177ba 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
@@ -205,7 +205,7 @@
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(filename);
- mRecorder.setVideoFrameRate(20);
+ mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate);
mRecorder.setVideoSize(176,144);
Log.v(TAG, "setEncoder");
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
@@ -269,7 +269,7 @@
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(filename);
- mRecorder.setVideoFrameRate(20);
+ mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate);
mRecorder.setVideoSize(176,144);
Log.v(TAG, "Media recorder setEncoder");
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
diff --git a/opengl/include/EGL/eglext.h b/opengl/include/EGL/eglext.h
index 6a199db..a08932a 100644
--- a/opengl/include/EGL/eglext.h
+++ b/opengl/include/EGL/eglext.h
@@ -242,6 +242,20 @@
#define EGL_RECORDABLE_ANDROID 0x3142 /* EGLConfig attribute */
#endif
+/* EGL_NV_system_time
+ */
+#ifndef EGL_NV_system_time
+#define EGL_NV_system_time 1
+typedef khronos_int64_t EGLint64NV;
+typedef khronos_uint64_t EGLuint64NV;
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV(void);
+EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV(void);
+#endif
+typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC)(void);
+typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC)(void);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp
index 7e85230..23f67d5 100644
--- a/opengl/libs/EGL/eglApi.cpp
+++ b/opengl/libs/EGL/eglApi.cpp
@@ -62,6 +62,7 @@
"EGL_KHR_fence_sync "
"EGL_ANDROID_image_native_buffer "
"EGL_ANDROID_swap_rectangle "
+ "EGL_NV_system_time "
;
struct extention_map_t {
@@ -80,6 +81,10 @@
(__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
{ "eglSetSwapRectangleANDROID",
(__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
+ { "eglGetSystemTimeFrequencyNV",
+ (__eglMustCastToProperFunctionPointerType)&eglGetSystemTimeFrequencyNV },
+ { "eglGetSystemTimeNV",
+ (__eglMustCastToProperFunctionPointerType)&eglGetSystemTimeNV },
};
// accesses protected by sExtensionMapMutex
@@ -1454,3 +1459,46 @@
}
return setError(EGL_BAD_DISPLAY, NULL);
}
+
+// ----------------------------------------------------------------------------
+// NVIDIA extensions
+// ----------------------------------------------------------------------------
+EGLuint64NV eglGetSystemTimeFrequencyNV()
+{
+ clearError();
+
+ if (egl_init_drivers() == EGL_FALSE) {
+ return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+ }
+
+ EGLuint64NV ret = 0;
+ egl_connection_t* const cnx = &gEGLImpl[IMPL_HARDWARE];
+
+ if (cnx->dso) {
+ if (cnx->egl.eglGetSystemTimeFrequencyNV) {
+ return cnx->egl.eglGetSystemTimeFrequencyNV();
+ }
+ }
+
+ return setError(EGL_BAD_DISPLAY, 0);;
+}
+
+EGLuint64NV eglGetSystemTimeNV()
+{
+ clearError();
+
+ if (egl_init_drivers() == EGL_FALSE) {
+ return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+ }
+
+ EGLuint64NV ret = 0;
+ egl_connection_t* const cnx = &gEGLImpl[IMPL_HARDWARE];
+
+ if (cnx->dso) {
+ if (cnx->egl.eglGetSystemTimeNV) {
+ return cnx->egl.eglGetSystemTimeNV();
+ }
+ }
+
+ return setError(EGL_BAD_DISPLAY, 0);;
+}
diff --git a/opengl/libs/EGL/egl_entries.in b/opengl/libs/EGL/egl_entries.in
index 63c3c19..bdd2a7e 100644
--- a/opengl/libs/EGL/egl_entries.in
+++ b/opengl/libs/EGL/egl_entries.in
@@ -62,3 +62,8 @@
EGL_ENTRY(EGLBoolean, eglSetSwapRectangleANDROID, EGLDisplay, EGLSurface, EGLint, EGLint, EGLint, EGLint)
EGL_ENTRY(EGLClientBuffer, eglGetRenderBufferANDROID, EGLDisplay, EGLSurface)
+
+/* NVIDIA extensions */
+
+EGL_ENTRY(EGLuint64NV, eglGetSystemTimeFrequencyNV, void)
+EGL_ENTRY(EGLuint64NV, eglGetSystemTimeNV, void)
diff --git a/packages/BackupRestoreConfirmation/AndroidManifest.xml b/packages/BackupRestoreConfirmation/AndroidManifest.xml
index 19848f6..f3feee8 100644
--- a/packages/BackupRestoreConfirmation/AndroidManifest.xml
+++ b/packages/BackupRestoreConfirmation/AndroidManifest.xml
@@ -25,6 +25,7 @@
android:permission="android.permission.CONFIRM_FULL_BACKUP" >
<activity android:name=".BackupRestoreConfirmation"
+ android:title=""
android:windowSoftInputMode="stateAlwaysHidden"
android:excludeFromRecents="true"
android:exported="true" >
diff --git a/packages/BackupRestoreConfirmation/res/layout/confirm_restore.xml b/packages/BackupRestoreConfirmation/res/layout/confirm_restore.xml
index 3522e7c..2ee74fe 100644
--- a/packages/BackupRestoreConfirmation/res/layout/confirm_restore.xml
+++ b/packages/BackupRestoreConfirmation/res/layout/confirm_restore.xml
@@ -21,10 +21,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="16dp" >
+ android:orientation="vertical">
<ScrollView
+ android:padding="16dp"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_width="match_parent">
diff --git a/packages/BackupRestoreConfirmation/res/values-ms/strings.xml b/packages/BackupRestoreConfirmation/res/values-ms/strings.xml
index de849e3..24a98f3 100644
--- a/packages/BackupRestoreConfirmation/res/values-ms/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ms/strings.xml
@@ -16,14 +16,14 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="backup_confirm_text" msgid="1878021282758896593">"Sandaran lengkap bagi semua data ke komputer meja yang bersambung telah diminta. Adakah anda mahu membenarkan ini berlaku? "\n" "\n" Jika anda tidak meminta sandaran ini sendiri, jangan benarkan operasi diteruskan."</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"Sandaran lengkap bagi semua data ke komputer meja yang bersambung telah diminta. Adakah anda mahu membenarkan ini berlaku?"\n\n"Jika anda tidak meminta sandaran ini sendiri, jangan benarkan operasi diteruskan."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Sandarkan data saya"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Jangan buat sandaran"</string>
- <string name="restore_confirm_text" msgid="7499866728030461776">"Pemulihan penuh semua data dari komputer meja yang bersambung telah diminta. Adakah anda mahu membenarkan ini berlaku? "\n" "\n" Jika anda tidak meminta pemulihan ini sendiri, jangan benarkan operasi ini diteruskan. Ini akan menggantikan sebarang data semasa di peranti!"</string>
- <string name="allow_restore_button_label" msgid="3081286752277127827">"Kembalikan data saya"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Pemulihan penuh semua data dari komputer meja yang bersambung telah diminta. Adakah anda mahu membenarkan ini berlaku?"\n\n"Jika anda tidak meminta pemulihan ini sendiri, jangan benarkan operasi ini diteruskan. Ini akan menggantikan sebarang data semasa pada peranti!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"Pulihkan data saya"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Jangan kembalikan"</string>
<string name="current_password_text" msgid="8268189555578298067">"Sila masukkan kata laluan sandaran semasa anda di bawah:"</string>
- <string name="backup_enc_password_text" msgid="4981585714795233099">"Sila masukkan kata laluan untuk digunakan untuk menyulitkan data sandaran lengkap. Jika ini dibiarkan kosong, kata laluan sandaran semasa anda akan digunakan:"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Sila masukkan kata laluan yang hendak digunakan untuk menyulitkan data sandaran lengkap. Jika dibiarkan kosong, kata laluan sandaran semasa anda akan digunakan:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Jika anda ingin menyulitkan data sandaran lengkap, masukkan kata laluan di bawah:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Jika pemulihan data disulitkan, sila masukkan kata laluan di bawah:"</string>
</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values/strings.xml b/packages/BackupRestoreConfirmation/res/values/strings.xml
index f022e57..e91c6e2 100644
--- a/packages/BackupRestoreConfirmation/res/values/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values/strings.xml
@@ -14,6 +14,10 @@
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Title of the activity when a full backup has been requested and must be confirmed -->
+ <string name="backup_confirm_title">Full backup</string>
+ <!-- Title of the activity when a full restore has been requested and must be confirmed -->
+ <string name="restore_confirm_title">Full restore</string>
<!-- Text for message to user that a full backup has been requested, and must be confirmed. -->
<string name="backup_confirm_text">A full backup of all data to a connected desktop computer has been requested. Do you want to allow this to happen\?\n\nIf you did not request the backup yourself, do not allow the operation to proceed.</string>
@@ -39,4 +43,15 @@
<!-- Text for message to user when performing a full restore operation, explaining that they must enter the password originally used to encrypt the full backup data. -->
<string name="restore_enc_password_text">If the restore data is encrypted, please enter the password below:</string>
+
+ <!-- Text of a toast telling the user that a full backup operation has begun -->
+ <string name="toast_backup_started">Backup starting...</string>
+ <!-- Text of a toast telling the user that a full backup operation has ended -->
+ <string name="toast_backup_ended">Backup finished</string>
+ <!-- Text of a toast telling the user that a full restore operation has begun -->
+ <string name="toast_restore_started">Restore starting...</string>
+ <!-- Text of a toast telling the user that a full restore operation has ended -->
+ <string name="toast_restore_ended">Restore ended</string>
+ <!-- Text of a toast telling the user that the operation has timed out -->
+ <string name="toast_timeout">Operation timed out</string>
</resources>
diff --git a/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java b/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java
index 5448e0b..fbdf3cc 100644
--- a/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java
+++ b/packages/BackupRestoreConfirmation/src/com/android/backupconfirm/BackupRestoreConfirmation.java
@@ -82,7 +82,7 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_START_BACKUP: {
- Toast.makeText(mContext, "!!! Backup starting !!!", Toast.LENGTH_LONG).show();
+ Toast.makeText(mContext, R.string.toast_backup_started, Toast.LENGTH_LONG).show();
}
break;
@@ -93,13 +93,13 @@
break;
case MSG_END_BACKUP: {
- Toast.makeText(mContext, "!!! Backup ended !!!", Toast.LENGTH_SHORT).show();
+ Toast.makeText(mContext, R.string.toast_backup_ended, Toast.LENGTH_LONG).show();
finish();
}
break;
case MSG_START_RESTORE: {
- Toast.makeText(mContext, "!!! Restore starting !!!", Toast.LENGTH_LONG).show();
+ Toast.makeText(mContext, R.string.toast_restore_started, Toast.LENGTH_LONG).show();
}
break;
@@ -110,13 +110,13 @@
break;
case MSG_END_RESTORE: {
- Toast.makeText(mContext, "!!! Restore ended !!!", Toast.LENGTH_SHORT).show();
+ Toast.makeText(mContext, R.string.toast_restore_ended, Toast.LENGTH_SHORT).show();
finish();
}
break;
case MSG_TIMEOUT: {
- Toast.makeText(mContext, "!!! TIMED OUT !!!", Toast.LENGTH_LONG).show();
+ Toast.makeText(mContext, R.string.toast_timeout, Toast.LENGTH_LONG).show();
}
break;
}
@@ -131,10 +131,13 @@
final String action = intent.getAction();
final int layoutId;
+ final int titleId;
if (action.equals(FullBackup.FULL_BACKUP_INTENT_ACTION)) {
layoutId = R.layout.confirm_backup;
+ titleId = R.string.backup_confirm_title;
} else if (action.equals(FullBackup.FULL_RESTORE_INTENT_ACTION)) {
layoutId = R.layout.confirm_restore;
+ titleId = R.string.restore_confirm_title;
} else {
Slog.w(TAG, "Backup/restore confirmation activity launched with invalid action!");
finish();
@@ -159,6 +162,7 @@
mObserver.setHandler(mHandler);
}
+ setTitle(titleId);
setContentView(layoutId);
// Same resource IDs for each layout variant (backup / restore)
diff --git a/packages/DefaultContainerService/AndroidManifest.xml b/packages/DefaultContainerService/AndroidManifest.xml
index 0f47482..319eb8d 100755
--- a/packages/DefaultContainerService/AndroidManifest.xml
+++ b/packages/DefaultContainerService/AndroidManifest.xml
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.defcontainer">
+ package="com.android.defcontainer" coreApp="true">
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<uses-permission android:name="android.permission.ACCESS_ALL_DOWNLOADS"/>
<uses-permission android:name="android.permission.ASEC_ACCESS"/>
diff --git a/packages/SettingsProvider/AndroidManifest.xml b/packages/SettingsProvider/AndroidManifest.xml
index dd0d064..0719426 100644
--- a/packages/SettingsProvider/AndroidManifest.xml
+++ b/packages/SettingsProvider/AndroidManifest.xml
@@ -1,5 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.providers.settings"
+ coreApp="true"
android:sharedUserId="android.uid.system">
<application android:allowClearUserData="false"
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index d10911f..a2452c4 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -1,5 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.systemui"
+ coreApp="true"
android:sharedUserId="android.uid.system"
android:process="system"
>
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
index 35d0a06..69f3543 100644
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png
index 374873c..4650417 100644
--- a/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/title_bar_shadow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
index 79da092..fb30982 100644
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png
index 75a020c..f334023 100644
--- a/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/title_bar_shadow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png
new file mode 100644
index 0000000..fe2c642
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/status_bar_hr.9.png b/packages/SystemUI/res/drawable-xhdpi/status_bar_hr.9.png
index f5e6031..748b9f7 100644
--- a/packages/SystemUI/res/drawable-xhdpi/status_bar_hr.9.png
+++ b/packages/SystemUI/res/drawable-xhdpi/status_bar_hr.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/title_bar_shadow.9.png b/packages/SystemUI/res/drawable-xhdpi/title_bar_shadow.9.png
new file mode 100644
index 0000000..89f14db
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/title_bar_shadow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/notification_list_shadow.xml b/packages/SystemUI/res/drawable/notification_list_shadow.xml
new file mode 100644
index 0000000..7f33153
--- /dev/null
+++ b/packages/SystemUI/res/drawable/notification_list_shadow.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ >
+ <gradient
+ android:angle="90"
+ android:endColor="@color/notification_list_shadow_top"
+ android:startColor="#00000000"
+ android:type="linear"
+ />
+</shape>
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
index eae3e52..167d362 100644
--- a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
@@ -42,6 +42,7 @@
<ImageView android:id="@+id/app_thumbnail_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:visibility="invisible"
/>
</FrameLayout>
@@ -71,6 +72,7 @@
android:singleLine="true"
android:ellipsize="marquee"
android:visibility="invisible"
+ android:textColor="@color/status_bar_recents_app_label_color"
/>
<TextView android:id="@+id/app_description"
diff --git a/packages/SystemUI/res/layout-port/status_bar_recent_item.xml b/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
index b14ef595..de80a51 100644
--- a/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
@@ -40,6 +40,7 @@
<ImageView android:id="@+id/app_thumbnail_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:visibility="invisible"
/>
</FrameLayout>
@@ -67,6 +68,7 @@
android:layout_marginLeft="@dimen/status_bar_recents_app_label_left_margin"
android:singleLine="true"
android:ellipsize="marquee"
+ android:textColor="@color/status_bar_recents_app_label_color"
/>
<View android:id="@+id/recents_callout_line"
diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
index f4be651..07088d5 100644
--- a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
@@ -35,6 +35,7 @@
<ImageView android:id="@+id/app_thumbnail_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:visibility="invisible"
/>
</FrameLayout>
@@ -63,6 +64,7 @@
android:layout_marginTop="32dip"
android:singleLine="true"
android:ellipsize="marquee"
+ android:textColor="@color/status_bar_recents_app_label_color"
/>
<View android:id="@+id/recents_callout_line"
diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml
index fbca299..25bc2ea 100644
--- a/packages/SystemUI/res/layout/navigation_bar.xml
+++ b/packages/SystemUI/res/layout/navigation_bar.xml
@@ -38,6 +38,7 @@
android:clipChildren="false"
android:clipToPadding="false"
android:id="@+id/nav_buttons"
+ android:animateLayoutChanges="true"
>
<!-- navigation controls -->
@@ -165,6 +166,7 @@
android:clipChildren="false"
android:clipToPadding="false"
android:id="@+id/nav_buttons"
+ android:animateLayoutChanges="true"
>
<!-- navigation controls -->
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
index 41a30c7..eb644b3 100644
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ b/packages/SystemUI/res/layout/signal_cluster_view.xml
@@ -45,6 +45,12 @@
android:layout_gravity="center|bottom"
/>
</FrameLayout>
+ <View
+ android:layout_height="6dp"
+ android:layout_width="6dp"
+ android:visibility="gone"
+ android:id="@+id/spacer"
+ />
<FrameLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index 0b3fb98..38ac8a7 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -32,6 +32,7 @@
android:paddingTop="3dp"
android:paddingBottom="5dp"
android:paddingRight="3dp"
+ android:background="@drawable/notification_header_bg"
>
<com.android.systemui.statusbar.policy.DateView android:id="@+id/date"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
@@ -104,12 +105,19 @@
android:fadingEdge="none"
android:overScrollMode="ifContentScrolls"
>
- <com.android.systemui.statusbar.policy.NotificationRowLayout
- android:id="@+id/latestItems"
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- systemui:rowHeight="@dimen/notification_height"
- />
+ android:orientation="vertical"
+ >
+ <com.android.systemui.statusbar.policy.NotificationRowLayout
+ android:id="@+id/latestItems"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ systemui:rowHeight="@dimen/notification_height"
+ />
+
+ </LinearLayout>
</ScrollView>
<ImageView
diff --git a/packages/SystemUI/res/layout/status_bar_tracking.xml b/packages/SystemUI/res/layout/status_bar_tracking.xml
index 894248e..25c0237 100644
--- a/packages/SystemUI/res/layout/status_bar_tracking.xml
+++ b/packages/SystemUI/res/layout/status_bar_tracking.xml
@@ -30,7 +30,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:background="@drawable/status_bar_bg"
+ android:background="@drawable/notification_tracking_bg"
/>
<com.android.systemui.statusbar.phone.CloseDragHandle android:id="@+id/close"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 446ff55..e1318e4 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -23,10 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Maak skoon"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Moenie steur nie"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Wys kennisgewings"</string>
- <!-- no translation found for status_bar_recent_remove_item_title (6026395868129852968) -->
- <skip />
- <!-- no translation found for status_bar_recent_inspect_item_title (7793624864528818569) -->
- <skip />
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Verwyder uit lys"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Program Info"</string>
<!-- no translation found for status_bar_no_notifications_title (4755261167193833213) -->
<skip />
<!-- no translation found for status_bar_ongoing_events_title (1682504513316879202) -->
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 23e3a4e..47cb166 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -23,10 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"አጥራ"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"አይረብሹ"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"ማሳወቂያዎች አሳይ"</string>
- <!-- no translation found for status_bar_recent_remove_item_title (6026395868129852968) -->
- <skip />
- <!-- no translation found for status_bar_recent_inspect_item_title (7793624864528818569) -->
- <skip />
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ከዝርዝር አስወግድ"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"የትግበራ መረጃ"</string>
<!-- no translation found for status_bar_no_notifications_title (4755261167193833213) -->
<skip />
<!-- no translation found for status_bar_ongoing_events_title (1682504513316879202) -->
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 5c50b02..9b80519 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"محو"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"عدم الإزعاج"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"إظهار التنبيهات"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"إزالة"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"فحص"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"إزالة من القائمة"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"معلومات التطبيق"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي تنبيهات"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"التنبيهات"</string>
@@ -59,7 +59,7 @@
<string name="compat_mode_off" msgid="4434467572461327898">"توسيع بملء الشاشة"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"تكبير/تصغير التوافق"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"عند تصميم تطبيق لشاشة أصغر، سيظهر عنصر تحكم في التكبير/التصغير بجوار الساعة."</string>
- <string name="screenshot_saving_toast" msgid="8592630119048713208">"تم حفظ لقطة الشاشة إلى المعرض."</string>
+ <string name="screenshot_saving_toast" msgid="8592630119048713208">"تم حفظ لقطة الشاشة في معرض الصور."</string>
<string name="screenshot_failed_toast" msgid="1990979819772906912">"تعذر حفظ لقطة الشاشة. قد يكون التخزين الخارجي قيد الاستخدام."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"خيارات نقل الملفات عبر USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"تحميل كمشغل وسائط (MTP)"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 75f08aa..fe2e3e6 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Esborra"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"No molesteu"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostra notificacions"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Elimina"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspecciona"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Elimina de la llista"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informació de l\'aplicació"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Cap notificació"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacions"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 004ecb3..a2902a5 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazat"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Nerušit"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Zobrazit upozornění"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odebrat"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Zkontrolovat"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odebrat ze seznamu"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informace o aplikaci"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žádná oznámení"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Probíhající"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Oznámení"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index b3bb5c8..3cb0471 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Forstyr ikke"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Vis meddelelser"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspicer"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern fra listen"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Oplysninger om appen"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen meddelelser"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"I gang"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelelser"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 79d811e..66535f7 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Löschen"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Bitte nicht stören"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Benachrichtigungen zeigen"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Entfernen"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Prüfen"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Aus Liste entfernen"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App-Info"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Keine Benachrichtigungen"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktuell"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Benachrichtigungen"</string>
@@ -46,8 +46,8 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth-Tethering aktiv"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="737483394044014246">"Eingabemethoden konfigurieren"</string>
<string name="status_bar_use_physical_keyboard" msgid="3695516942412442936">"Physische Tastatur"</string>
- <string name="usb_device_permission_prompt" msgid="3816016361969816903">"Anwendung <xliff:g id="APPLICATION">%1$s</xliff:g> Zugriff auf USB-Gerät gewähren?"</string>
- <string name="usb_accessory_permission_prompt" msgid="6888598803988889959">"Anwendung <xliff:g id="APPLICATION">%1$s</xliff:g> Zugriff auf USB-Zubehör gewähren?"</string>
+ <string name="usb_device_permission_prompt" msgid="3816016361969816903">"App <xliff:g id="APPLICATION">%1$s</xliff:g> Zugriff auf USB-Gerät gewähren?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="6888598803988889959">"App <xliff:g id="APPLICATION">%1$s</xliff:g> Zugriff auf USB-Zubehör gewähren?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"<xliff:g id="ACTIVITY">%1$s</xliff:g> öffnen, wenn dieses USB-Gerät verbunden ist?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"<xliff:g id="ACTIVITY">%1$s</xliff:g> öffnen, wenn dieses USB-Zubehör verbunden ist?"</string>
<string name="usb_accessory_uri_prompt" msgid="6332150684964235705">"Keine installierten Anwendungen für dieses USB-Zubehör. Weitere Informationen unter <xliff:g id="URL">%1$s</xliff:g>"</string>
@@ -68,7 +68,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Zurück"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Startbildschirm"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menü"</string>
- <string name="accessibility_recent" msgid="3027675523629738534">"Zuletzt verwendete Anwendungen"</string>
+ <string name="accessibility_recent" msgid="3027675523629738534">"Zuletzt verwendete Apps"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Schaltfläche zum Ändern der Eingabemethode"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Schaltfläche für Kompatibilitätszoom"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom auf einen größeren Bildschirm"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 93f96bc..b01866b 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Εκκαθάριση"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Μην ενοχλείτε"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Εμφάνιση ειδοποιήσεων"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Κατάργηση"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Επιθεώρηση"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Κατάργηση από τη λίστα"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Πληροφορίες εφαρμογής"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Δεν υπάρχουν ειδοποιήσεις"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Εν εξελίξει"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ειδοποιήσεις"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 79f7d48..86520a7 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Clear"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Do not disturb"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Show notifications"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remove"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspect"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remove from list"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App info"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 0cb89a3..70dab5d 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"No molestar"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostrar notificaciones"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminar"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspeccionar"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminar de la lista"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información de la aplicación"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No hay notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continuo"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 7b6ad4a..4d2b16b 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"No molestar"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostrar notificaciones"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminar"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspeccionar"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminar de la lista"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información de la aplicación"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No tienes notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 9ea4b29..00c2bf6 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"پاک کردن"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"مزاحم نشوید"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"نمایش اعلان ها"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"حذف"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"بازرسی"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"حذف از لیست"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"اطلاعات برنامه"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"اعلانی موجود نیست"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"در حال انجام"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"اعلان ها"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 30d2e81..d3684df 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Tyhjennä"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Varattu"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Näytä ilmoitukset"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Poista"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Tarkasta"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Poista luettelosta"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Sovelluksen tiedot"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ei ilmoituksia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Käynnissä olevat"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ilmoitukset"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 8a9e72f..a27959f 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ne pas déranger"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Afficher les notifications"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Supprimer"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspecter"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Supprimer de la liste"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informations sur l\'application"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
@@ -117,7 +117,7 @@
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonnerie en mode silencieux"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Données 2G-3G désactivées"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Données 4G désactivées"</string>
- <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Service Internet mobile désactivé"</string>
+ <string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Données mobiles désactivées"</string>
<string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Données désactivées"</string>
<string name="data_usage_disabled_dialog" msgid="6524467913290900042">"Vous avez atteint la limite d\'utilisation de données spécifiée."\n\n"L\'utilisation supplémentaire de données peut entraîner la facturation de frais par votre opérateur."</string>
<string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Réactiver connexion données"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index ab052e0..e0ba8f2 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Očisti"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ne uznemiravaj"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Prikaži obavijesti"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ukloni"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Provjeri"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ukloni s popisa"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacije o aplikaciji"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bez obavijesti"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"U tijeku"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavijesti"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 676fa7e..3ec833e 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Törlés"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ne zavarjanak"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Értesítések megjelenítése"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eltávolítás"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Vizsgálat"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eltávolítás a listából"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Alkalmazásinformáció"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nincs értesítés"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Folyamatban van"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Értesítések"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 44a46fd..d491d74 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Bersihkan"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Jangan ganggu"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Tampilkan pemberitahuan"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Hapus"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Memeriksa"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Hapus dari daftar"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info apl"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tidak ada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Berkelanjutan"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 306cef9..5ad309f 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Cancella"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Non disturbare"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostra notifiche"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Rimuovi"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Esamina"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Rimuovi dall\'elenco"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informazioni applicazione"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nessuna notifica"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"In corso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifiche"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 1342c01..f9d01a1 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"נקה"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"נא לא להפריע"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"הצג התראות"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"הסר"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"בדיקה"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"הסר מהרשימה"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"פרטי יישום"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"אין התראות"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"מתמשך"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"התראות"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 619a1a1..305b4b2 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"지우기"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"응답 거부"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"알림 표시"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"삭제"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"검사"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"목록에서 삭제"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"앱 정보"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"알림 없음"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"진행 중"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"알림"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 0729ce2d..1d60ada 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Išvalyti"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Netrukdyti"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Rodyti pranešimus"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Pašalinti"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Tikrinti"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Pašalinti iš sąrašo"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Programos informacija"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nėra įspėjimų"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Vykstantys"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Įspėjimai"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 7827d53..add82b1 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Notīrīt"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Netraucēt"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Rādīt paziņojumus"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Noņemt"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Apskatīt"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Noņemšana no saraksta"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Lietotnes informācija"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nav paziņojumu"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Notiekošs"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Paziņojumi"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index f9d6325..c885881 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Pdm bersih"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Jangan ganggu"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Tunjukkan pemberitahuan"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alih keluar"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Periksa"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alih keluar dari senarai"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Maklumat aplikasi"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tiada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sedang berlangsung"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index bfd4d9e..4db29ea 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Fjern"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ikke forstyrr"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Vis varslinger"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspiser"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern fra listen"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info om app"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen varslinger"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktiviteter"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Varslinger"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 6178381..6cf24a1 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wissen"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Niet storen"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Meldingen weergeven"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Verwijderen"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspecteren"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Verwijderen uit lijst"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App-info"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Geen meldingen"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Actief"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meldingen"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 53c6e82..b7e11ad 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wyczyść"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Nie przeszkadzać"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Pokaż powiadomienia"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Usuń"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Sprawdź"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Usuń z listy"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacje o aplikacji"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Brak powiadomień"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Bieżące"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Powiadomienia"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 26660f5..c8ab40c 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Não incomodar"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostrar notificações"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspecionar"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informações da aplicação"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em curso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
@@ -110,7 +110,7 @@
<string name="accessibility_remove_notification" msgid="4883990503785778699">"Remover notificação."</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS ativado."</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"Adquirir GPS."</string>
- <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter ativado."</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"Teletipo ativado."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Campainha em vibração."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Campainha em silêncio."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Os dados 2G-3G estão desativados"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 49cb2ce..2edfca1 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Não perturbe"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Mostrar notificações"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inspecionar"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informações do aplicativo"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 8941457..a3f5fb3 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очистить"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Не беспокоить"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Показать уведомления"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Удалить"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Просмотр свойств"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Удаление приложения из списка"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Сведения о приложении"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нет уведомлений"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текущие"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Уведомления"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 6058bbe..7716e9f 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazať"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Nerušiť"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Zobraziť upozornenia"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrániť"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Skontrolovať"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrániť zo zoznamu"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informácie o aplikácii"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žiadne upozornenia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Prebiehajúce"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Upozornenia"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index f74f7e0..c414730 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Počisti"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ne moti"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Pokaži obvestila"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrani"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Preverite"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrani s seznama"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Podatki o programu"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ni obvestil"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Trenutno"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obvestila"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 9f7a254..310aa78 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Обриши"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Не узнемиравај"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Приказуј упозорења"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Уклони"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Провера"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Уклањање са листе"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Информације о апликацији"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нема обавештења"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текуће"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Обавештења"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 875f736..573a62f 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ta bort"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Stör ej"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Visa aviseringar"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ta bort"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Kontrollera"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ta bort från listan"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info om appen"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Inga aviseringar"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Pågående"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meddelanden"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 90bbd104..b5a070c 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -23,10 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Futa"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Usisumbue"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Onyesha arifa"</string>
- <!-- no translation found for status_bar_recent_remove_item_title (6026395868129852968) -->
- <skip />
- <!-- no translation found for status_bar_recent_inspect_item_title (7793624864528818569) -->
- <skip />
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ondoa kwenye orodha"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Taarifa za programu-matumizi"</string>
<!-- no translation found for status_bar_no_notifications_title (4755261167193833213) -->
<skip />
<!-- no translation found for status_bar_ongoing_events_title (1682504513316879202) -->
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 686df67..810e2b4 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"ล้างข้อมูล"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"ห้ามรบกวน"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"แสดงการแจ้งเตือน"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"นำออก"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ตรวจสอบ"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ลบจากรายการ"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ข้อมูลแอปพลิเคชัน"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ไม่มีการแจ้งเตือน"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ดำเนินอยู่"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"การแจ้งเตือน"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 449e44f..0c09d10 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"I-clear"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Huwag gambalain"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Magpakita ng notification"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alisin"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Siyasatin"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alisin mula sa listahan"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Impormasyon ng app"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Walang mga notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Nagpapatuloy"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Mga Notification"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index bef4a57..fbb51e2 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очист."</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Не турбувати"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Показувати сповіщення"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Видалити"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Перевірити"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Видалити зі списку"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Інформація про програму"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Немає сповіщень"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Поточні"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Сповіщення"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index c81f35c..84a9c3c 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Xoá"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Không làm phiền"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Hiển thị thông báo"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Xóa"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Kiểm tra"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Xóa khỏi danh sách"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Thông tin về ứng dụng"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Không có thông báo nào"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Đang diễn ra"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Thông báo"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index bacb64f..11b07ca 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"请勿打扰"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"显示通知"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"删除"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"检查"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"从列表中删除"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"应用程序信息"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"无通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"正在进行的"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 634462b..b62b00f 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -23,8 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"勿干擾"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"顯示通知"</string>
- <!-- outdated translation 6561944127804037619 --> <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"移除"</string>
- <!-- outdated translation 4906947311448880529 --> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"查驗"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"從清單中移除"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"應用程式資訊"</string>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"沒有通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"進行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index ec986ab..862c375 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -23,10 +23,8 @@
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Sula"</string>
<string name="status_bar_do_not_disturb_button" msgid="5812628897510997853">"Ungaphazamisi"</string>
<string name="status_bar_please_disturb_button" msgid="3345398298841572813">"Bonisa izaziso"</string>
- <!-- no translation found for status_bar_recent_remove_item_title (6026395868129852968) -->
- <skip />
- <!-- no translation found for status_bar_recent_inspect_item_title (7793624864528818569) -->
- <skip />
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Susa ohlwini"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Ulwazi lwensiza"</string>
<!-- no translation found for status_bar_no_notifications_title (4755261167193833213) -->
<skip />
<!-- no translation found for status_bar_ongoing_events_title (1682504513316879202) -->
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 4c222f9..e780ae6 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -23,5 +23,9 @@
<drawable name="status_bar_background">#ff000000</drawable>
<drawable name="status_bar_recents_background">#b3000000</drawable>
<drawable name="status_bar_recents_app_thumbnail_background">#88000000</drawable>
- <drawable name="status_bar_notification_row_background_color">#ff000000</drawable>
+ <color name="status_bar_recents_app_label_color">#ffffffff</color>
+ <drawable name="status_bar_notification_row_background_color">#ff090909</drawable>
+ <drawable name="notification_header_bg">#FF000000</drawable>
+ <drawable name="notification_tracking_bg">#d8000000</drawable>
+ <color name="notification_list_shadow_top">#80000000</color>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 0354fd7..07281d4 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -41,9 +41,10 @@
public static final int Y = 1;
private float SWIPE_ESCAPE_VELOCITY = 100f; // dp/sec
- private int MAX_ESCAPE_ANIMATION_DURATION = 500; // ms
- private int MAX_DISMISS_VELOCITY = 1000; // dp/sec
- private static final int SNAP_ANIM_LEN = SLOW_ANIMATIONS ? 1000 : 250; // ms
+ private int DEFAULT_ESCAPE_ANIMATION_DURATION = 200; // ms
+ private int MAX_ESCAPE_ANIMATION_DURATION = 400; // ms
+ private int MAX_DISMISS_VELOCITY = 2000; // dp/sec
+ private static final int SNAP_ANIM_LEN = SLOW_ANIMATIONS ? 1000 : 150; // ms
public static float ALPHA_FADE_START = 0f; // fraction of thumbnail width
// where fade starts
@@ -126,7 +127,10 @@
} else if (pos < viewSize * (1.0f - ALPHA_FADE_START)) {
result = 1.0f + (viewSize * ALPHA_FADE_START + pos) / fadeSize;
}
- return result;
+ // Make .03 alpha the minimum so you always see the item a bit-- slightly below
+ // .03, the item disappears entirely (as if alpha = 0) and that discontinuity looks
+ // a bit jarring
+ return Math.max(0.03f, result);
}
// invalidate the view's own bounds all the way up the view hierarchy
@@ -186,6 +190,7 @@
}
break;
case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
mDragging = false;
mCurrView = null;
mCurrAnimView = null;
@@ -212,7 +217,10 @@
duration = Math.min(duration,
(int) (Math.abs(newPos - getTranslation(animView)) * 1000f / Math
.abs(velocity)));
+ } else {
+ duration = DEFAULT_ESCAPE_ANIMATION_DURATION;
}
+
ObjectAnimator anim = createTranslationAnimation(animView, newPos);
anim.setInterpolator(new LinearInterpolator());
anim.setDuration(duration);
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
index fc03a27..1c9d80d 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
@@ -44,15 +44,6 @@
private SwipeHelper mSwipeHelper;
private RecentsScrollViewPerformanceHelper mPerformanceHelper;
- private OnLongClickListener mOnLongClick = new OnLongClickListener() {
- public boolean onLongClick(View v) {
- final View anchorView = v.findViewById(R.id.app_description);
- final View thumbnailView = v.findViewById(R.id.app_thumbnail);
- mCallback.handleLongPress(v, anchorView, thumbnailView);
- return true;
- }
- };
-
public RecentsHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
float densityScale = getResources().getDisplayMetrics().density;
@@ -69,8 +60,6 @@
mLinearLayout.removeAllViews();
for (int i = 0; i < mAdapter.getCount(); i++) {
final View view = mAdapter.getView(i, null, mLinearLayout);
- view.setLongClickable(true);
- view.setOnLongClickListener(mOnLongClick);
if (mPerformanceHelper != null) {
mPerformanceHelper.addViewCallback(view);
@@ -81,18 +70,30 @@
mCallback.dismiss();
}
});
+ // We don't want a click sound when we dimiss recents
+ view.setSoundEffectsEnabled(false);
OnClickListener launchAppListener = new OnClickListener() {
public void onClick(View v) {
mCallback.handleOnClick(view);
}
};
+ OnLongClickListener longClickListener = new OnLongClickListener() {
+ public boolean onLongClick(View v) {
+ final View anchorView = view.findViewById(R.id.app_description);
+ final View thumbnailView = view.findViewById(R.id.app_thumbnail);
+ mCallback.handleLongPress(view, anchorView, thumbnailView);
+ return true;
+ }
+ };
final View thumbnail = view.findViewById(R.id.app_thumbnail);
thumbnail.setClickable(true);
thumbnail.setOnClickListener(launchAppListener);
+ thumbnail.setOnLongClickListener(longClickListener);
final View appTitle = view.findViewById(R.id.app_label);
appTitle.setClickable(true);
appTitle.setOnClickListener(launchAppListener);
+ appTitle.setOnLongClickListener(longClickListener);
mLinearLayout.addView(view);
}
// Scroll to end after layout.
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index f7afe3a..0621b22 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -186,12 +186,6 @@
holder.labelView = (TextView) convertView.findViewById(R.id.app_label);
holder.descriptionView = (TextView) convertView.findViewById(R.id.app_description);
- /* StateListDrawable thumbnailForegroundDrawable = new StateListDrawable();
- thumbnailForegroundDrawable.addState(new int[] { android.R.attr.state_pressed },
- mPressedDrawable);
- thumbnailForegroundDrawable.addState(new int[] { android.R.attr.state_selected },
- mPressedDrawable);
- ((FrameLayout)holder.thumbnailView).setForeground(thumbnailForegroundDrawable);*/
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
index b12387a..213803c 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
@@ -43,15 +43,6 @@
private SwipeHelper mSwipeHelper;
private RecentsScrollViewPerformanceHelper mPerformanceHelper;
- private OnLongClickListener mOnLongClick = new OnLongClickListener() {
- public boolean onLongClick(View v) {
- final View anchorView = v.findViewById(R.id.app_description);
- final View thumbnailView = v.findViewById(R.id.app_thumbnail);
- mCallback.handleLongPress(v, anchorView, thumbnailView);
- return true;
- }
- };
-
public RecentsVerticalScrollView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
float densityScale = getResources().getDisplayMetrics().density;
@@ -83,28 +74,39 @@
}
if (old == null) {
- view.setClickable(true);
- view.setOnLongClickListener(mOnLongClick);
view.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mCallback.dismiss();
}
});
+ // We don't want a click sound when we dimiss recents
+ view.setSoundEffectsEnabled(false);
OnClickListener launchAppListener = new OnClickListener() {
public void onClick(View v) {
mCallback.handleOnClick(view);
}
};
+ OnLongClickListener longClickListener = new OnLongClickListener() {
+ public boolean onLongClick(View v) {
+ final View anchorView = view.findViewById(R.id.app_description);
+ final View thumbnailView = view.findViewById(R.id.app_thumbnail);
+ mCallback.handleLongPress(view, anchorView, thumbnailView);
+ return true;
+ }
+ };
final View thumbnail = view.findViewById(R.id.app_thumbnail);
thumbnail.setClickable(true);
thumbnail.setOnClickListener(launchAppListener);
+ thumbnail.setOnLongClickListener(longClickListener);
final View appTitle = view.findViewById(R.id.app_label);
appTitle.setClickable(true);
appTitle.setOnClickListener(launchAppListener);
+ appTitle.setOnLongClickListener(longClickListener);
final View calloutLine = view.findViewById(R.id.recents_callout_line);
calloutLine.setClickable(true);
calloutLine.setOnClickListener(launchAppListener);
+ calloutLine.setOnLongClickListener(longClickListener);
mLinearLayout.addView(view);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 65b022a..59b09d49 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -29,6 +29,7 @@
import com.android.systemui.R;
+// Intimately tied to the design of res/layout/signal_cluster_view.xml
public class SignalClusterView
extends LinearLayout
implements NetworkController.SignalCluster {
@@ -42,9 +43,11 @@
private int mWifiStrengthId = 0, mWifiActivityId = 0;
private boolean mMobileVisible = false;
private int mMobileStrengthId = 0, mMobileActivityId = 0, mMobileTypeId = 0;
+ private boolean mIsAirplaneMode = false;
ViewGroup mWifiGroup, mMobileGroup;
ImageView mWifi, mMobile, mWifiActivity, mMobileActivity, mMobileType;
+ View mSpacer;
public SignalClusterView(Context context) {
this(context, null);
@@ -74,6 +77,7 @@
mMobile = (ImageView) findViewById(R.id.mobile_signal);
mMobileActivity = (ImageView) findViewById(R.id.mobile_inout);
mMobileType = (ImageView) findViewById(R.id.mobile_type);
+ mSpacer = findViewById(R.id.spacer);
apply();
}
@@ -109,6 +113,10 @@
apply();
}
+ public void setIsAirplaneMode(boolean is) {
+ mIsAirplaneMode = is;
+ }
+
// Run after each indicator change.
private void apply() {
if (mWifiGroup == null) return;
@@ -135,6 +143,12 @@
mMobileGroup.setVisibility(View.GONE);
}
+ if (mMobileVisible && mWifiVisible && mIsAirplaneMode) {
+ mSpacer.setVisibility(View.INVISIBLE);
+ } else {
+ mSpacer.setVisibility(View.GONE);
+ }
+
if (DEBUG) Slog.d(TAG,
String.format("mobile: %s sig=%d act=%d typ=%d",
(mMobileVisible ? "VISIBLE" : "GONE"),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 98dca92..0b02a7e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -42,7 +42,7 @@
public class NavigationBarView extends LinearLayout {
final static boolean DEBUG = false;
- final static String TAG = "NavigationBarView";
+ final static String TAG = "PhoneStatusBar/NavigationBarView";
final static boolean DEBUG_DEADZONE = false;
@@ -59,8 +59,8 @@
int mBarSize;
boolean mVertical;
- boolean mHidden, mLowProfile;
- boolean mEnabled = true;
+ boolean mHidden, mLowProfile, mShowMenu;
+ int mDisabledFlags = 0;
public View getRecentsButton() {
return mCurrentView.findViewById(R.id.recent_apps);
@@ -91,11 +91,7 @@
final Resources res = mContext.getResources();
mBarSize = res.getDimensionPixelSize(R.dimen.navigation_bar_size);
mVertical = false;
- }
-
- public void setEnabled(final boolean enable) {
- mEnabled = enable;
- mCurrentView.setVisibility(enable ? View.VISIBLE : View.INVISIBLE);
+ mShowMenu = false;
}
View.OnTouchListener mLightsOutListener = new View.OnTouchListener() {
@@ -105,7 +101,7 @@
// even though setting the systemUI visibility below will turn these views
// on, we need them to come up faster so that they can catch this motion
// event
- setLowProfile(false, false);
+ setLowProfile(false, false, false);
try {
mBarService.setSystemUiVisibility(0);
@@ -116,12 +112,46 @@
}
};
- public void setLowProfile(final boolean lightsOut) {
- setLowProfile(lightsOut, true);
+ public void setDisabledFlags(int disabledFlags) {
+ setDisabledFlags(disabledFlags, false);
}
- public void setLowProfile(final boolean lightsOut, final boolean animate) {
- if (lightsOut == mLowProfile) return;
+ public void setDisabledFlags(int disabledFlags, boolean force) {
+ if (!force && mDisabledFlags == disabledFlags) return;
+
+ mDisabledFlags = disabledFlags;
+
+ final boolean disableNavigation = ((disabledFlags & View.STATUS_BAR_DISABLE_NAVIGATION) != 0);
+ final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0);
+
+ getBackButton() .setVisibility(disableBack ? View.INVISIBLE : View.VISIBLE);
+ getHomeButton() .setVisibility(disableNavigation ? View.INVISIBLE : View.VISIBLE);
+ getRecentsButton().setVisibility(disableNavigation ? View.INVISIBLE : View.VISIBLE);
+
+ getMenuButton() .setVisibility((disableNavigation || !mShowMenu)
+ ? View.INVISIBLE : View.VISIBLE);
+ }
+
+ public void setMenuVisibility(final boolean show) {
+ setMenuVisibility(show, false);
+ }
+
+ public void setMenuVisibility(final boolean show, final boolean force) {
+ if (!force && mShowMenu == show) return;
+
+ mShowMenu = show;
+
+ getMenuButton().setVisibility(
+ (0 != (mDisabledFlags & View.STATUS_BAR_DISABLE_NAVIGATION) || !mShowMenu)
+ ? View.INVISIBLE : View.VISIBLE);
+ }
+
+ public void setLowProfile(final boolean lightsOut) {
+ setLowProfile(lightsOut, true, false);
+ }
+
+ public void setLowProfile(final boolean lightsOut, final boolean animate, final boolean force) {
+ if (!force && lightsOut == mLowProfile) return;
mLowProfile = lightsOut;
@@ -241,6 +271,11 @@
mCurrentView.setVisibility(View.VISIBLE);
mVertical = (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270);
+ // force the low profile & disabled states into compliance
+ setLowProfile(mLowProfile, false, true /* force */);
+ setDisabledFlags(mDisabledFlags, true /* force */);
+ setMenuVisibility(mShowMenu, true /* force */);
+
if (DEBUG_DEADZONE) {
mCurrentView.findViewById(R.id.deadzone).setBackgroundColor(0x808080FF);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 55623f0..8fc8448 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -20,6 +20,7 @@
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.Dialog;
+import android.app.KeyguardManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.StatusBarManager;
@@ -296,7 +297,7 @@
mNavigationBarView =
(NavigationBarView) View.inflate(context, R.layout.navigation_bar, null);
- mNavigationBarView.setEnabled((mDisabled & StatusBarManager.DISABLE_NAVIGATION) == 0);
+ mNavigationBarView.setDisabledFlags(mDisabled);
sb.setOnSystemUiVisibilityChangeListener(
new View.OnSystemUiVisibilityChangeListener() {
@@ -468,20 +469,10 @@
}
private WindowManager.LayoutParams getNavigationBarLayoutParams() {
- final int rotation = mDisplay.getRotation();
- final boolean sideways =
- (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270);
-
- final Resources res = mContext.getResources();
- final int size = res.getDimensionPixelSize(R.dimen.navigation_bar_size);
-
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- sideways ? size : ViewGroup.LayoutParams.MATCH_PARENT,
- sideways ? ViewGroup.LayoutParams.MATCH_PARENT : size,
+ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR,
0
- | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
| WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
@@ -493,21 +484,6 @@
}
lp.setTitle("NavigationBar");
- switch (rotation) {
- case Surface.ROTATION_90:
- // device has been turned 90deg counter-clockwise
- lp.gravity = Gravity.RIGHT | Gravity.FILL_VERTICAL;
- break;
- case Surface.ROTATION_270:
- // device has been turned 90deg clockwise
- lp.gravity = (NavigationBarView.NAVBAR_ALWAYS_AT_RIGHT ? Gravity.RIGHT
- : Gravity.LEFT)
- | Gravity.FILL_VERTICAL;
- break;
- default:
- lp.gravity = Gravity.BOTTOM | Gravity.FILL_HORIZONTAL;
- break;
- }
lp.windowAnimations = 0;
return lp;
@@ -760,12 +736,10 @@
}
});
} else {
- if ((notification.notification.flags & Notification.FLAG_ONGOING_EVENT) == 0) {
- vetoButton.setVisibility(View.INVISIBLE);
- } else {
- vetoButton.setVisibility(View.GONE);
- }
+ vetoButton.setVisibility(View.GONE);
}
+ vetoButton.setContentDescription(mContext.getString(
+ R.string.accessibility_remove_notification));
// the large icon
ImageView largeIcon = (ImageView)row.findViewById(R.id.large_icon);
@@ -957,12 +931,7 @@
}
});
} else {
- if ((sbn.notification.flags & Notification.FLAG_ONGOING_EVENT) == 0) {
- vetoButton.setVisibility(View.INVISIBLE);
- vetoButton.setContentDescription("VETO");
- } else {
- vetoButton.setVisibility(View.GONE);
- }
+ vetoButton.setVisibility(View.GONE);
}
vetoButton.setContentDescription(mContext.getString(
R.string.accessibility_remove_notification));
@@ -1089,70 +1058,67 @@
old, state, diff));
}
+ StringBuilder flagdbg = new StringBuilder();
+ flagdbg.append("disable: < ");
+ flagdbg.append(((state & StatusBarManager.DISABLE_EXPAND) != 0) ? "EXPAND" : "expand");
+ flagdbg.append(((diff & StatusBarManager.DISABLE_EXPAND) != 0) ? "* " : " ");
+ flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) ? "ICONS" : "icons");
+ flagdbg.append(((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) ? "* " : " ");
+ flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0) ? "ALERTS" : "alerts");
+ flagdbg.append(((diff & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0) ? "* " : " ");
+ flagdbg.append(((state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) ? "TICKER" : "ticker");
+ flagdbg.append(((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) ? "* " : " ");
+ flagdbg.append(((state & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) ? "SYSTEM_INFO" : "system_info");
+ flagdbg.append(((diff & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) ? "* " : " ");
+ flagdbg.append(((state & StatusBarManager.DISABLE_NAVIGATION) != 0) ? "NAVIGATION" : "navigation");
+ flagdbg.append(((diff & StatusBarManager.DISABLE_NAVIGATION) != 0) ? "* " : " ");
+ flagdbg.append(((state & StatusBarManager.DISABLE_BACK) != 0) ? "BACK" : "back");
+ flagdbg.append(((diff & StatusBarManager.DISABLE_BACK) != 0) ? "* " : " ");
+ flagdbg.append(((state & StatusBarManager.DISABLE_CLOCK) != 0) ? "CLOCK" : "clock");
+ flagdbg.append(((diff & StatusBarManager.DISABLE_CLOCK) != 0) ? "* " : " ");
+ flagdbg.append(">");
+ Slog.d(TAG, flagdbg.toString());
+
if ((diff & StatusBarManager.DISABLE_CLOCK) != 0) {
boolean show = (state & StatusBarManager.DISABLE_CLOCK) == 0;
showClock(show);
}
if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
if ((state & StatusBarManager.DISABLE_EXPAND) != 0) {
- Slog.d(TAG, "DISABLE_EXPAND: yes");
animateCollapse();
}
}
if ((diff & (StatusBarManager.DISABLE_NAVIGATION | StatusBarManager.DISABLE_BACK)) != 0) {
- setNavigationVisibility(state &
- (StatusBarManager.DISABLE_NAVIGATION | StatusBarManager.DISABLE_BACK));
+ // the nav bar will take care of DISABLE_NAVIGATION and DISABLE_BACK
+ if (mNavigationBarView != null) mNavigationBarView.setDisabledFlags(state);
+
+ if ((state & StatusBarManager.DISABLE_NAVIGATION) != 0) {
+ // close recents if it's visible
+ mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
+ }
}
if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
- Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes");
if (mTicking) {
mTicker.halt();
} else {
setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out);
}
} else {
- Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no");
if (!mExpandedVisible) {
setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
}
}
} else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
- Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: yes");
mTicker.halt();
}
}
}
- private void setNavigationVisibility(int visibility) {
- boolean disableNavigation = ((visibility & StatusBarManager.DISABLE_NAVIGATION) != 0);
- boolean disableBack = ((visibility & StatusBarManager.DISABLE_BACK) != 0);
-
- Slog.i(TAG, "DISABLE_BACK: " + (disableBack ? "yes" : "no"));
- Slog.i(TAG, "DISABLE_NAVIGATION: " + (disableNavigation ? "yes" : "no"));
-
- if (mNavigationBarView != null) {
- if (disableNavigation && disableBack) {
- mNavigationBarView.setEnabled(false);
- } else {
- mNavigationBarView.getBackButton().setEnabled(!disableBack);
- mNavigationBarView.getHomeButton().setEnabled(!disableNavigation);
- mNavigationBarView.getRecentsButton().setEnabled(!disableNavigation);
-
- mNavigationBarView.setEnabled(true);
- }
- }
-
- if (disableNavigation) {
- // close recents if it's visible
- mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
- mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
- }
- }
-
/**
* All changes to the status bar and notifications funnel through here and are batched.
*/
@@ -1472,9 +1438,10 @@
Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled="
+ mDisabled);
} else if (CHATTY) {
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ if (event.getAction() != MotionEvent.ACTION_MOVE) {
Slog.d(TAG, String.format(
- "panel: ACTION_DOWN at (%f, %f) mDisabled=0x%08x",
+ "panel: %s at (%f, %f) mDisabled=0x%08x",
+ MotionEvent.actionToString(event.getAction()),
event.getRawX(), event.getRawY(), mDisabled));
}
}
@@ -1483,11 +1450,11 @@
return false;
}
+ final int action = event.getAction();
final int statusBarSize = mStatusBarView.getHeight();
final int hitSize = statusBarSize*2;
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- final int y = (int)event.getRawY();
-
+ final int y = (int)event.getRawY();
+ if (action == MotionEvent.ACTION_DOWN) {
if (!mExpanded) {
mViewDelta = statusBarSize - y;
} else {
@@ -1504,21 +1471,21 @@
final int edgeBorder = mEdgeBorder;
if (x >= edgeBorder && x < mDisplayMetrics.widthPixels - edgeBorder) {
prepareTracking(y, !mExpanded);// opening if we're not already fully visible
- mVelocityTracker.addMovement(event);
+ trackMovement(event);
}
}
} else if (mTracking) {
- mVelocityTracker.addMovement(event);
+ trackMovement(event);
final int minY = statusBarSize + mCloseView.getHeight();
- if (event.getAction() == MotionEvent.ACTION_MOVE) {
- int y = (int)event.getRawY();
+ if (action == MotionEvent.ACTION_MOVE) {
if (mAnimatingReveal && y < minY) {
// nothing
} else {
mAnimatingReveal = false;
updateExpandedViewPos(y + mViewDelta);
}
- } else if (event.getAction() == MotionEvent.ACTION_UP) {
+ } else if (action == MotionEvent.ACTION_UP
+ || action == MotionEvent.ACTION_CANCEL) {
mVelocityTracker.computeCurrentVelocity(1000);
float yVel = mVelocityTracker.getYVelocity();
@@ -1545,13 +1512,23 @@
vel));
}
- performFling((int)event.getRawY(), vel, false);
+ performFling(y + mViewDelta, vel, false);
}
}
return false;
}
+ private void trackMovement(MotionEvent event) {
+ // Add movement to velocity tracker using raw screen X and Y coordinates instead
+ // of window coordinates because the window frame may be moving at the same time.
+ float deltaX = event.getRawX() - event.getX();
+ float deltaY = event.getRawY() - event.getY();
+ event.offsetLocation(deltaX, deltaY);
+ mVelocityTracker.addMovement(event);
+ event.offsetLocation(-deltaX, -deltaY);
+ }
+
@Override // CommandQueue
public void setSystemUiVisibility(int vis) {
final int old = mSystemUiVisibility;
@@ -1595,8 +1572,7 @@
Slog.d(TAG, (showMenu?"showing":"hiding") + " the MENU button");
}
if (mNavigationBarView != null) {
- mNavigationBarView.getMenuButton().setVisibility(showMenu
- ? View.VISIBLE : View.INVISIBLE);
+ mNavigationBarView.setMenuVisibility(showMenu);
}
// See above re: lights-out policy for legacy apps.
@@ -1647,6 +1623,10 @@
// the stack trace isn't very helpful here. Just log the exception message.
Slog.w(TAG, "Sending contentIntent failed: " + e);
}
+
+ KeyguardManager kgm =
+ (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+ if (kgm != null) kgm.exitKeyguardSecurely(null);
}
try {
@@ -1795,30 +1775,34 @@
pw.println(" [" + i + "] icon=" + ic);
}
- pw.println("see the logcat for a dump of the views we have created.");
- // must happen on ui thread
- mHandler.post(new Runnable() {
- public void run() {
- mStatusBarView.getLocationOnScreen(mAbsPos);
- Slog.d(TAG, "mStatusBarView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
- + ") " + mStatusBarView.getWidth() + "x"
- + mStatusBarView.getHeight());
- mStatusBarView.debug();
+ if (false) {
+ pw.println("see the logcat for a dump of the views we have created.");
+ // must happen on ui thread
+ mHandler.post(new Runnable() {
+ public void run() {
+ mStatusBarView.getLocationOnScreen(mAbsPos);
+ Slog.d(TAG, "mStatusBarView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+ + ") " + mStatusBarView.getWidth() + "x"
+ + mStatusBarView.getHeight());
+ mStatusBarView.debug();
- mExpandedView.getLocationOnScreen(mAbsPos);
- Slog.d(TAG, "mExpandedView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
- + ") " + mExpandedView.getWidth() + "x"
- + mExpandedView.getHeight());
- mExpandedView.debug();
+ mExpandedView.getLocationOnScreen(mAbsPos);
+ Slog.d(TAG, "mExpandedView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+ + ") " + mExpandedView.getWidth() + "x"
+ + mExpandedView.getHeight());
+ mExpandedView.debug();
- mTrackingView.getLocationOnScreen(mAbsPos);
- Slog.d(TAG, "mTrackingView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
- + ") " + mTrackingView.getWidth() + "x"
- + mTrackingView.getHeight());
- mTrackingView.debug();
- }
- });
+ mTrackingView.getLocationOnScreen(mAbsPos);
+ Slog.d(TAG, "mTrackingView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+ + ") " + mTrackingView.getWidth() + "x"
+ + mTrackingView.getHeight());
+ mTrackingView.debug();
+ }
+ });
+ }
}
+
+ mNetworkController.dump(fd, pw, args);
}
void onBarViewAttached() {
@@ -1840,7 +1824,7 @@
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
- PixelFormat.OPAQUE);
+ PixelFormat.TRANSLUCENT);
if (ActivityManager.isHighEndGfx(mDisplay)) {
lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index 840087c..3a06068 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -16,12 +16,10 @@
package com.android.systemui.statusbar.policy;
-import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.TypedArray;
-import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.Canvas;
import android.graphics.RectF;
@@ -29,7 +27,6 @@
import android.os.SystemClock;
import android.os.ServiceManager;
import android.util.AttributeSet;
-import android.util.Slog;
import android.view.accessibility.AccessibilityEvent;
import android.view.HapticFeedbackConstants;
import android.view.IWindowManager;
@@ -40,9 +37,7 @@
import android.view.SoundEffectConstants;
import android.view.View;
import android.view.ViewConfiguration;
-import android.view.ViewGroup;
import android.widget.ImageView;
-import android.widget.RemoteViews.RemoteView;
import com.android.systemui.R;
@@ -53,9 +48,7 @@
IWindowManager mWindowManager;
long mDownTime;
- boolean mSending;
int mCode;
- int mRepeat;
int mTouchSlop;
Drawable mGlowBG;
float mGlowAlpha = 0f, mGlowScale = 1f, mDrawingAlpha = 1f;
@@ -67,12 +60,7 @@
if (isPressed()) {
// Slog.d("KeyButtonView", "longpressed: " + this);
if (mCode != 0) {
- mRepeat++;
- sendEvent(KeyEvent.ACTION_DOWN,
- KeyEvent.FLAG_FROM_SYSTEM
- | KeyEvent.FLAG_VIRTUAL_HARD_KEY
- | KeyEvent.FLAG_LONG_PRESS);
-
+ sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.FLAG_LONG_PRESS);
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);
} else {
// Just an old-fashioned ImageView
@@ -217,64 +205,54 @@
case MotionEvent.ACTION_DOWN:
//Slog.d("KeyButtonView", "press");
mDownTime = SystemClock.uptimeMillis();
- mRepeat = 0;
- mSending = true;
setPressed(true);
- sendEvent(KeyEvent.ACTION_DOWN,
- KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY, mDownTime);
+ if (mCode != 0) {
+ sendEvent(KeyEvent.ACTION_DOWN, 0, mDownTime);
+ } else {
+ // Provide the same haptic feedback that the system offers for virtual keys.
+ performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
+ }
if (mSupportsLongpress) {
removeCallbacks(mCheckLongPress);
postDelayed(mCheckLongPress, ViewConfiguration.getLongPressTimeout());
- } else {
- mSending = false;
- sendEvent(KeyEvent.ACTION_UP,
- KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY, mDownTime);
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
- playSoundEffect(SoundEffectConstants.CLICK);
}
break;
case MotionEvent.ACTION_MOVE:
- if (mSending) {
- x = (int)ev.getX();
- y = (int)ev.getY();
- setPressed(x >= -mTouchSlop
- && x < getWidth() + mTouchSlop
- && y >= -mTouchSlop
- && y < getHeight() + mTouchSlop);
- }
+ x = (int)ev.getX();
+ y = (int)ev.getY();
+ setPressed(x >= -mTouchSlop
+ && x < getWidth() + mTouchSlop
+ && y >= -mTouchSlop
+ && y < getHeight() + mTouchSlop);
break;
case MotionEvent.ACTION_CANCEL:
setPressed(false);
- if (mSending) {
- mSending = false;
- sendEvent(KeyEvent.ACTION_UP,
- KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY
- | KeyEvent.FLAG_CANCELED);
- if (mSupportsLongpress) {
- removeCallbacks(mCheckLongPress);
- }
+ if (mCode != 0) {
+ sendEvent(KeyEvent.ACTION_UP, KeyEvent.FLAG_CANCELED);
+ }
+ if (mSupportsLongpress) {
+ removeCallbacks(mCheckLongPress);
}
break;
case MotionEvent.ACTION_UP:
final boolean doIt = isPressed();
setPressed(false);
- if (mSending) {
- mSending = false;
- final int flags = KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY;
- if (mSupportsLongpress) {
- removeCallbacks(mCheckLongPress);
- }
-
- if (mCode != 0) {
- if (doIt) {
- sendEvent(KeyEvent.ACTION_UP, flags);
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
- playSoundEffect(SoundEffectConstants.CLICK);
- }
+ if (mCode != 0) {
+ if (doIt) {
+ sendEvent(KeyEvent.ACTION_UP, 0);
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
+ playSoundEffect(SoundEffectConstants.CLICK);
} else {
- // no key code, just a regular ImageView
- if (doIt) performClick();
+ sendEvent(KeyEvent.ACTION_UP, KeyEvent.FLAG_CANCELED);
}
+ } else {
+ // no key code, just a regular ImageView
+ if (doIt) {
+ performClick();
+ }
+ }
+ if (mSupportsLongpress) {
+ removeCallbacks(mCheckLongPress);
}
break;
}
@@ -287,8 +265,11 @@
}
void sendEvent(int action, int flags, long when) {
- final KeyEvent ev = new KeyEvent(mDownTime, when, action, mCode, mRepeat,
- 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, flags, InputDevice.SOURCE_KEYBOARD);
+ final int repeatCount = (flags & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0;
+ final KeyEvent ev = new KeyEvent(mDownTime, when, action, mCode, repeatCount,
+ 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
+ flags | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
+ InputDevice.SOURCE_KEYBOARD);
try {
//Slog.d(TAG, "injecting event " + ev);
mWindowManager.injectInputEventNoWait(ev);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 3c85814..8a40cec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -141,6 +141,7 @@
void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon);
void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon,
int typeIcon);
+ void setIsAirplaneMode(boolean is);
}
/**
@@ -296,6 +297,7 @@
}
mServiceState = state;
updateTelephonySignalStrength();
+ updateDataNetType();
updateDataIcon();
refreshViews();
}
@@ -448,6 +450,7 @@
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
+ case TelephonyManager.NETWORK_TYPE_HSPAP:
if (mHspaDataDistinguishable) {
mDataIconList = TelephonyIcons.DATA_H[mInetCondition];
mDataTypeIconId = R.drawable.stat_sys_data_connected_h;
@@ -831,7 +834,12 @@
mHasMobileDataFeature ? mDataSignalIconId : mWifiIconId;
mContentDescriptionCombinedSignal = mHasMobileDataFeature
? mContentDescriptionDataType : mContentDescriptionWifi;
- mDataTypeIconId = 0;
+
+ if ((isCdma() && isCdmaEri()) || mPhone.isNetworkRoaming()) {
+ mDataTypeIconId = R.drawable.stat_sys_data_connected_roam;
+ } else {
+ mDataTypeIconId = 0;
+ }
}
if (DEBUG) {
@@ -870,6 +878,7 @@
mPhoneSignalIconId,
mMobileActivityIconId,
mDataTypeIconId);
+ cluster.setIsAirplaneMode(mAirplaneMode);
}
}
@@ -969,6 +978,7 @@
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("Network Controller state:");
pw.println(" - telephony ------");
pw.print(" mHspaDataDistinguishable=");
pw.println(mHspaDataDistinguishable);
@@ -982,6 +992,10 @@
pw.println(mDataState);
pw.print(" mDataActivity=");
pw.println(mDataActivity);
+ pw.print(" mDataNetType=");
+ pw.print(mDataNetType);
+ pw.print("/");
+ pw.println(TelephonyManager.getNetworkTypeName(mDataNetType));
pw.print(" mServiceState=");
pw.println(mServiceState);
pw.print(" mNetworkName=");
@@ -989,7 +1003,7 @@
pw.print(" mNetworkNameDefault=");
pw.println(mNetworkNameDefault);
pw.print(" mNetworkNameSeparator=");
- pw.println(mNetworkNameSeparator);
+ pw.println(mNetworkNameSeparator.replace("\n","\\n"));
pw.print(" mPhoneSignalIconId=0x");
pw.print(Integer.toHexString(mPhoneSignalIconId));
pw.print("/");
@@ -1060,7 +1074,7 @@
}
private String getResourceName(int resId) {
- if (resId == 0) {
+ if (resId != 0) {
final Resources res = mContext.getResources();
try {
return res.getResourceName(resId);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
index fd58174..fa8aa6d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java
@@ -102,7 +102,9 @@
return true;
} else if (nonAuxCount == 1 && auxCount == 1) {
if (nonAuxSubtype != null && auxSubtype != null
- && nonAuxSubtype.getLocale().equals(auxSubtype.getLocale())
+ && (nonAuxSubtype.getLocale().equals(auxSubtype.getLocale())
+ || auxSubtype.overridesImplicitlyEnabledSubtype()
+ || nonAuxSubtype.overridesImplicitlyEnabledSubtype())
&& nonAuxSubtype.containsExtraValueKey(TAG_TRY_SUPPRESSING_IME_SWITCHER)) {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java
index 5911378..f793af9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java
@@ -218,15 +218,20 @@
private View createInputMethodItem(
final InputMethodInfo imi, final InputMethodSubtype subtype) {
- CharSequence subtypeName = getSubtypeName(imi, subtype);
- CharSequence imiName = getIMIName(imi);
- Drawable icon = getSubtypeIcon(imi, subtype);
- View view = View.inflate(mContext, R.layout.status_bar_input_methods_item, null);
- ImageView subtypeIcon = (ImageView)view.findViewById(R.id.item_icon);
- TextView itemTitle = (TextView)view.findViewById(R.id.item_title);
- TextView itemSubtitle = (TextView)view.findViewById(R.id.item_subtitle);
- ImageView settingsIcon = (ImageView)view.findViewById(R.id.item_settings_icon);
- View subtypeView = view.findViewById(R.id.item_subtype);
+ final CharSequence subtypeName;
+ if (subtype == null || subtype.overridesImplicitlyEnabledSubtype()) {
+ subtypeName = null;
+ } else {
+ subtypeName = getSubtypeName(imi, subtype);
+ }
+ final CharSequence imiName = getIMIName(imi);
+ final Drawable icon = getSubtypeIcon(imi, subtype);
+ final View view = View.inflate(mContext, R.layout.status_bar_input_methods_item, null);
+ final ImageView subtypeIcon = (ImageView)view.findViewById(R.id.item_icon);
+ final TextView itemTitle = (TextView)view.findViewById(R.id.item_title);
+ final TextView itemSubtitle = (TextView)view.findViewById(R.id.item_subtitle);
+ final ImageView settingsIcon = (ImageView)view.findViewById(R.id.item_settings_icon);
+ final View subtypeView = view.findViewById(R.id.item_subtype);
if (subtypeName == null) {
itemTitle.setText(imiName);
itemSubtitle.setVisibility(View.GONE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index 39011d3..c2f07d6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -24,6 +24,7 @@
import android.animation.ObjectAnimator;
import android.app.ActivityManagerNative;
import android.app.Dialog;
+import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.app.Notification;
import android.app.StatusBarManager;
@@ -1318,10 +1319,15 @@
new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight()));
try {
mIntent.send(mContext, 0, overlay);
+
} catch (PendingIntent.CanceledException e) {
// the stack trace isn't very helpful here. Just log the exception message.
Slog.w(TAG, "Sending contentIntent failed: " + e);
}
+
+ KeyguardManager kgm =
+ (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+ if (kgm != null) kgm.exitKeyguardSecurely(null);
}
try {
@@ -1747,12 +1753,7 @@
}
});
} else {
- if ((sbn.notification.flags & Notification.FLAG_ONGOING_EVENT) == 0) {
- vetoButton.setVisibility(View.INVISIBLE);
- vetoButton.setContentDescription("VETO");
- } else {
- vetoButton.setVisibility(View.GONE);
- }
+ vetoButton.setVisibility(View.GONE);
}
vetoButton.setContentDescription(mContext.getString(
R.string.accessibility_remove_notification));
diff --git a/packages/VpnDialogs/res/layout/manage.xml b/packages/VpnDialogs/res/layout/manage.xml
index 3dcbb46..ec710ff 100644
--- a/packages/VpnDialogs/res/layout/manage.xml
+++ b/packages/VpnDialogs/res/layout/manage.xml
@@ -19,7 +19,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="3mm"
- android:stretchColumns="0,1">
+ android:stretchColumns="0,1"
+ android:shrinkColumns="1">
<TableRow>
<TextView android:text="@string/session" style="@style/label"/>
diff --git a/packages/VpnDialogs/res/values/strings.xml b/packages/VpnDialogs/res/values/strings.xml
index df6d36b..1352e9b 100644
--- a/packages/VpnDialogs/res/values/strings.xml
+++ b/packages/VpnDialogs/res/values/strings.xml
@@ -16,10 +16,12 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Dialog title to identify the request from a VPN application. [CHAR LIMIT=60] -->
<string name="prompt"><xliff:g id="app">%s</xliff:g>
attempts to create a VPN connection.
</string>
+ <!-- Dialog message to warn about the risk of using a VPN application. [CHAR LIMIT=NONE] -->
<string name="warning">By proceeding, you are giving the application
permission to intercept all network traffic.
<b>Do NOT accept unless you trust the application.</b> Otherwise,
@@ -27,18 +29,28 @@
software.
</string>
+ <!-- Checkbox label to accept the request from a VPN application. [CHAR LIMIT=60] -->
<string name="accept">I trust this application.</string>
+ <!-- Dialog title for built-in VPN. [CHAR LIMIT=40] -->
<string name="legacy_title">VPN is connected</string>
+ <!-- Button label to configure the current VPN session. [CHAR LIMIT=20] -->
<string name="configure">Configure</string>
+ <!-- Button label to disconnect the current VPN session. [CHAR LIMIT=20] -->
<string name="disconnect">Disconnect</string>
+ <!-- Label for the name of the current VPN session. [CHAR LIMIT=20] -->
<string name="session">Session:</string>
+ <!-- Label for the duration of the current VPN session. [CHAR LIMIT=20] -->
<string name="duration">Duration:</string>
- <string name="data_transmitted">Data Transmitted:</string>
- <string name="data_received">Data Received:</string>
+ <!-- Label for the network usage of data transmitted over VPN. [CHAR LIMIT=20] -->
+ <string name="data_transmitted">Sent:</string>
+ <!-- Label for the network usage of data received over VPN. [CHAR LIMIT=20] -->
+ <string name="data_received">Received:</string>
+ <!-- Dummy string for a blank value. [CHAR LIMIT=40] -->
<string name="blank_value">--</string>
+ <!-- Formatted string for the network usage over VPN. [CHAR LIMIT=40] -->
<string name="data_value_format">
<xliff:g id="number">%1$s</xliff:g> bytes /
<xliff:g id="number">%2$s</xliff:g> packets
diff --git a/packages/VpnDialogs/res/values/styles.xml b/packages/VpnDialogs/res/values/styles.xml
index 6eae218..cf10596 100644
--- a/packages/VpnDialogs/res/values/styles.xml
+++ b/packages/VpnDialogs/res/values/styles.xml
@@ -24,7 +24,7 @@
<style name="label">
<item name="android:gravity">center_vertical|right</item>
- <item name="android:paddingRight">5mm</item>
+ <item name="android:paddingRight">2mm</item>
<item name="android:textSize">16sp</item>
</style>
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
index 9588a01..cbf1c90 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
@@ -24,6 +24,7 @@
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Canvas;
+import android.os.SystemProperties;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@@ -100,7 +101,9 @@
if (DEBUG) Log.d(TAG, "show(); mKeyguardView==" + mKeyguardView);
Resources res = mContext.getResources();
- boolean enableScreenRotation = res.getBoolean(R.bool.config_enableLockScreenRotation);
+ boolean enableScreenRotation =
+ SystemProperties.getBoolean("lockscreen.rot_override",false)
+ || res.getBoolean(R.bool.config_enableLockScreenRotation);
if (mKeyguardHost == null) {
if (DEBUG) Log.d(TAG, "keyguard host is null, creating it...");
@@ -197,10 +200,10 @@
mScreenOn = false;
if (mKeyguardView != null) {
mKeyguardView.onScreenTurnedOff();
- }
- // When screen is turned off, need to unbind from FaceLock service if we are using FaceLock
- mKeyguardView.stopAndUnbindFromFaceLock();
+ // When screen is turned off, need to unbind from FaceLock service if using FaceLock
+ mKeyguardView.stopAndUnbindFromFaceLock();
+ }
}
public synchronized void onScreenTurnedOn() {
@@ -208,10 +211,10 @@
mScreenOn = true;
if (mKeyguardView != null) {
mKeyguardView.onScreenTurnedOn();
- }
- // When screen is turned on, need to bind to FaceLock service if we are using FaceLock
- mKeyguardView.bindToFaceLock();
+ // When screen is turned on, need to bind to FaceLock service if we are using FaceLock
+ mKeyguardView.bindToFaceLock();
+ }
}
public synchronized void verifyUnlock() {
@@ -248,9 +251,11 @@
public synchronized void hide() {
if (DEBUG) Log.d(TAG, "hide()");
- // When view is hidden, need to unbind from FaceLock service if we are using FaceLock
- // e.g., when device becomes unlocked
- mKeyguardView.stopAndUnbindFromFaceLock();
+ if (mKeyguardView != null) {
+ // When view is hidden, need to unbind from FaceLock service if we are using FaceLock
+ // e.g., when device becomes unlocked
+ mKeyguardView.stopAndUnbindFromFaceLock();
+ }
if (mKeyguardHost != null) {
mKeyguardHost.setVisibility(View.GONE);
diff --git a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
index 1d311d6..cba1ea1 100644
--- a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
+++ b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
@@ -593,10 +593,6 @@
}
private boolean isSecure() {
- // TODO: make this work with SIM and Account cases below.
- boolean usingBiometric = mLockPatternUtils.usingBiometricWeak();
- if (usingBiometric && mLockPatternUtils.isBiometricEnabled())
- return true;
UnlockMode unlockMode = getUnlockMode();
boolean secure = false;
switch (unlockMode) {
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 20088b1..903b405 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -2171,6 +2171,8 @@
if (mActionModePopup != null) {
post(mShowActionModePopup);
}
+ mActionModeView.sendAccessibilityEvent(
+ AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
} else {
mActionMode = null;
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 304df72..10447ad 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -189,16 +189,16 @@
static final int STATUS_BAR_SUB_PANEL_LAYER = 14;
static final int STATUS_BAR_LAYER = 15;
static final int STATUS_BAR_PANEL_LAYER = 16;
- // the navigation bar, if available, shows atop most things
- static final int NAVIGATION_BAR_LAYER = 17;
// the on-screen volume indicator and controller shown when the user
// changes the device volume
- static final int VOLUME_OVERLAY_LAYER = 18;
+ static final int VOLUME_OVERLAY_LAYER = 17;
+ // things in here CAN NOT take focus, but are shown on top of everything else.
+ static final int SYSTEM_OVERLAY_LAYER = 18;
+ // the navigation bar, if available, shows atop most things
+ static final int NAVIGATION_BAR_LAYER = 19;
// the drag layer: input for drag-and-drop is associated with this window,
// which sits above all other focusable windows
- static final int DRAG_LAYER = 19;
- // things in here CAN NOT take focus, but are shown on top of everything else.
- static final int SYSTEM_OVERLAY_LAYER = 20;
+ static final int DRAG_LAYER = 20;
static final int SECURE_SYSTEM_OVERLAY_LAYER = 21;
static final int BOOT_PROGRESS_LAYER = 22;
// the (mouse) pointer layer
@@ -345,6 +345,7 @@
static final Rect mTmpDisplayFrame = new Rect();
static final Rect mTmpContentFrame = new Rect();
static final Rect mTmpVisibleFrame = new Rect();
+ static final Rect mTmpNavigationFrame = new Rect();
WindowState mTopFullscreenOpaqueWindowState;
WindowState mTopAppWindowState;
@@ -629,15 +630,6 @@
mContext.getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 0) != 0;
}
- /**
- * When a home-key longpress expires, close other system windows and launch the recent apps
- */
- Runnable mHomeLongPress = new Runnable() {
- public void run() {
- handleLongPressOnHome();
- }
- };
-
private void handleLongPressOnHome() {
// We can't initialize this in init() since the configuration hasn't been loaded yet.
if (mLongPressOnHomeBehavior < 0) {
@@ -894,10 +886,10 @@
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT);
lp.type = WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY;
- lp.flags =
- WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE|
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
- WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
+ lp.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
lp.format = PixelFormat.TRANSLUCENT;
lp.setTitle("PointerLocation");
WindowManager wm = (WindowManager)
@@ -995,6 +987,7 @@
// These types of windows can't receive input events.
attrs.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+ attrs.flags &= ~WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
break;
}
}
@@ -1133,27 +1126,27 @@
return mStatusBarCanHide;
}
- public int getNonDecorDisplayWidth(int rotation, int fullWidth) {
+ public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation) {
// Assumes that the navigation bar appears on the side of the display in landscape.
- final boolean horizontal
- = (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90);
- return fullWidth - (horizontal ? mNavigationBarWidth : 0);
+ if (fullWidth > fullHeight) {
+ return fullWidth - mNavigationBarWidth;
+ }
+ return fullWidth;
}
- public int getNonDecorDisplayHeight(int rotation, int fullHeight) {
- final boolean horizontal
- = (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90);
+ public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation) {
+ // Assumes the navigation bar appears on the bottom of the display in portrait.
return fullHeight
- (mStatusBarCanHide ? 0 : mStatusBarHeight)
- - (horizontal ? 0 : mNavigationBarHeight);
+ - ((fullWidth > fullHeight) ? 0 : mNavigationBarHeight);
}
- public int getConfigDisplayWidth(int rotation, int fullWidth) {
- return getNonDecorDisplayWidth(rotation, fullWidth);
+ public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation) {
+ return getNonDecorDisplayWidth(fullWidth, fullHeight, rotation);
}
- public int getConfigDisplayHeight(int rotation, int fullHeight) {
- return getNonDecorDisplayHeight(rotation, fullHeight);
+ public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation) {
+ return getNonDecorDisplayHeight(fullWidth, fullHeight, rotation);
}
public boolean doesForceHide(WindowState win, WindowManager.LayoutParams attrs) {
@@ -1417,11 +1410,6 @@
// it handle it, because that gives us the correct 5 second
// timeout.
if (keyCode == KeyEvent.KEYCODE_HOME) {
- // Clear a pending HOME longpress if the user releases Home
- if (!down) {
- mHandler.removeCallbacks(mHomeLongPress);
- }
-
// If we have released the home key, and didn't do anything else
// while it was pressed, then it is time to go home!
if (mHomePressed && !down) {
@@ -1469,12 +1457,15 @@
}
}
}
-
- if (down && repeatCount == 0) {
- if (!keyguardOn) {
- mHandler.postDelayed(mHomeLongPress, ViewConfiguration.getGlobalActionKeyTimeout());
+
+ if (down) {
+ if (repeatCount == 0) {
+ mHomePressed = true;
+ } else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {
+ if (!keyguardOn) {
+ handleLongPressOnHome();
+ }
}
- mHomePressed = true;
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_MENU) {
@@ -1697,7 +1688,7 @@
}
/** {@inheritDoc} */
- public void beginLayoutLw(int displayWidth, int displayHeight) {
+ public void beginLayoutLw(int displayWidth, int displayHeight, int displayRotation) {
mUnrestrictedScreenLeft = mUnrestrictedScreenTop = 0;
mUnrestrictedScreenWidth = displayWidth;
mUnrestrictedScreenHeight = displayHeight;
@@ -1723,30 +1714,33 @@
if (mStatusBar != null) {
Rect navr = null;
if (mNavigationBar != null) {
- mNavigationBar.computeFrameLw(pf, df, vf, vf);
- if (mNavigationBar.isVisibleLw()) {
- navr = mNavigationBar.getFrameLw();
-
- if (navr.top == 0) {
- // Navigation bar is vertical
- if (mDockLeft == navr.left) {
- mDockLeft = navr.right;
- } else if (mDockRight == navr.right) {
- mDockRight = navr.left;
- }
- } else {
- // Navigation bar horizontal, at bottom
- if (mDockBottom == navr.bottom) {
- mDockBottom = navr.top;
- }
+ // Force the navigation bar to its appropriate place and
+ // size. We need to do this directly, instead of relying on
+ // it to bubble up from the nav bar, because this needs to
+ // change atomically with screen rotations.
+ if (displayWidth < displayHeight) {
+ // Portrait screen; nav bar goes on bottom.
+ mTmpNavigationFrame.set(0, displayHeight-mNavigationBarHeight,
+ displayWidth, displayHeight);
+ if (mNavigationBar.isVisibleLw()) {
+ mDockBottom = mTmpNavigationFrame.top;
+ mRestrictedScreenHeight = mDockBottom - mDockTop;
+ }
+ } else {
+ // Landscape screen; nav bar goes to the right.
+ mTmpNavigationFrame.set(displayWidth-mNavigationBarWidth, 0,
+ displayWidth, displayHeight);
+ if (mNavigationBar.isVisibleLw()) {
+ mDockRight = mTmpNavigationFrame.left;
+ mRestrictedScreenWidth = mDockRight - mDockLeft;
}
}
+ mNavigationBar.computeFrameLw(mTmpNavigationFrame, mTmpNavigationFrame,
+ mTmpNavigationFrame, mTmpNavigationFrame);
+ if (DEBUG_LAYOUT) Log.i(TAG, "mNavigationBar frame: " + mTmpNavigationFrame);
}
- if (DEBUG_LAYOUT) {
- Log.i(TAG, "mNavigationBar frame: " + navr);
- Log.i(TAG, String.format("mDock rect: (%d,%d - %d,%d)",
- mDockLeft, mDockTop, mDockRight, mDockBottom));
- }
+ if (DEBUG_LAYOUT) Log.i(TAG, String.format("mDock rect: (%d,%d - %d,%d)",
+ mDockLeft, mDockTop, mDockRight, mDockBottom));
// apply navigation bar insets
pf.left = df.left = vf.left = mDockLeft;
@@ -1756,25 +1750,6 @@
mStatusBar.computeFrameLw(pf, df, vf, vf);
- // now, let's consider the navigation bar; if it exists, it must be removed from the
- // available screen real estate (like an un-hideable status bar)
- if (navr != null) {
- if (navr.top == 0) {
- // Navigation bar is vertical
- if (mRestrictedScreenLeft == navr.left) {
- mRestrictedScreenLeft = navr.right;
- mRestrictedScreenWidth -= (navr.right - navr.left);
- } else if ((mRestrictedScreenLeft+mRestrictedScreenWidth) == navr.right) {
- mRestrictedScreenWidth -= (navr.right - navr.left);
- }
- } else {
- // Navigation bar horizontal, at bottom
- if ((mRestrictedScreenHeight+mRestrictedScreenTop) == navr.bottom) {
- mRestrictedScreenHeight -= (navr.bottom-navr.top);
- }
- }
- }
-
if (mStatusBar.isVisibleLw()) {
// If the status bar is hidden, we don't want to cause
// windows behind it to scroll.
@@ -1872,7 +1847,7 @@
public void layoutWindowLw(WindowState win, WindowManager.LayoutParams attrs,
WindowState attached) {
// we've already done the status bar
- if (win == mStatusBar) {
+ if (win == mStatusBar || win == mNavigationBar) {
return;
}
@@ -1993,6 +1968,13 @@
"Laying out navigation bar window: (%d,%d - %d,%d)",
pf.left, pf.top, pf.right, pf.bottom));
}
+ } else if (attrs.type == TYPE_SECURE_SYSTEM_OVERLAY
+ && ((fl & FLAG_FULLSCREEN) != 0)) {
+ // Fullscreen secure system overlays get what they ask for.
+ pf.left = df.left = mUnrestrictedScreenLeft;
+ pf.top = df.top = mUnrestrictedScreenTop;
+ pf.right = df.right = mUnrestrictedScreenLeft+mUnrestrictedScreenWidth;
+ pf.bottom = df.bottom = mUnrestrictedScreenTop+mUnrestrictedScreenHeight;
} else {
pf.left = df.left = cf.left = mRestrictedScreenLeft;
pf.top = df.top = cf.top = mRestrictedScreenTop;
@@ -2172,7 +2154,17 @@
if (topIsFullscreen) {
if (mStatusBarCanHide) {
if (DEBUG_LAYOUT) Log.v(TAG, "Hiding status bar");
- if (mStatusBar.hideLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT;
+ if (mStatusBar.hideLw(true)) {
+ changes |= FINISH_LAYOUT_REDO_LAYOUT;
+
+ mHandler.post(new Runnable() { public void run() {
+ if (mStatusBarService != null) {
+ try {
+ mStatusBarService.collapse();
+ } catch (RemoteException ex) {}
+ }
+ }});
+ }
} else if (localLOGV) {
Log.v(TAG, "Preventing status bar from hiding by policy");
}
@@ -2510,7 +2502,8 @@
+ " screenIsOn=" + isScreenOn + " keyguardActive=" + keyguardActive);
}
- if (down && (policyFlags & WindowManagerPolicy.FLAG_VIRTUAL) != 0) {
+ if (down && (policyFlags & WindowManagerPolicy.FLAG_VIRTUAL) != 0
+ && event.getRepeatCount() == 0) {
performHapticFeedbackLw(null, HapticFeedbackConstants.VIRTUAL_KEY, false);
}
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 94efa74..a58f64c 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -87,6 +87,8 @@
// RecordThread loop sleep time upon application overrun or audio HAL read error
static const int kRecordThreadSleepUs = 5000;
+static const nsecs_t kSetParametersTimeout = seconds(2);
+
// ----------------------------------------------------------------------------
static bool recordingAllowed() {
@@ -1032,7 +1034,7 @@
mWaitWorkCV.signal();
// wait condition with timeout in case the thread loop has exited
// before the request could be processed
- if (mParamCond.waitRelative(mLock, seconds(2)) == NO_ERROR) {
+ if (mParamCond.waitRelative(mLock, kSetParametersTimeout) == NO_ERROR) {
status = mParamStatus;
mWaitWorkCV.signal();
} else {
@@ -2349,7 +2351,9 @@
mParamStatus = status;
mParamCond.signal();
- mWaitWorkCV.wait(mLock);
+ // wait for condition with time out in case the thread calling ThreadBase::setParameters()
+ // already timed out waiting for the status and will never signal the condition.
+ mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout);
}
return reconfig;
}
@@ -2828,7 +2832,9 @@
mParamStatus = status;
mParamCond.signal();
- mWaitWorkCV.wait(mLock);
+ // wait for condition with time out in case the thread calling ThreadBase::setParameters()
+ // already timed out waiting for the status and will never signal the condition.
+ mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout);
}
return reconfig;
}
@@ -4669,7 +4675,9 @@
mParamStatus = status;
mParamCond.signal();
- mWaitWorkCV.wait(mLock);
+ // wait for condition with time out in case the thread calling ThreadBase::setParameters()
+ // already timed out waiting for the status and will never signal the condition.
+ mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout);
}
return reconfig;
}
diff --git a/services/input/InputWindow.h b/services/input/InputWindow.h
index 8861bee..38968f9 100644
--- a/services/input/InputWindow.h
+++ b/services/input/InputWindow.h
@@ -103,6 +103,8 @@
TYPE_STATUS_BAR_SUB_PANEL = FIRST_SYSTEM_WINDOW+17,
TYPE_POINTER = FIRST_SYSTEM_WINDOW+18,
TYPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW+19,
+ TYPE_VOLUME_OVERLAY = FIRST_SYSTEM_WINDOW+20,
+ TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW+21,
LAST_SYSTEM_WINDOW = 2999,
};
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index be2ef82..6ac6c98 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -34,6 +34,7 @@
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -497,10 +498,14 @@
case MSG_RUN_FULL_BACKUP:
{
+ // TODO: refactor full backup to be a looper-based state machine
+ // similar to normal backup/restore.
FullBackupParams params = (FullBackupParams)msg.obj;
- (new PerformFullBackupTask(params.fd, params.observer, params.includeApks,
+ PerformFullBackupTask task = new PerformFullBackupTask(params.fd,
+ params.observer, params.includeApks,
params.includeShared, params.curPassword, params.encryptPassword,
- params.allApps, params.packages, params.latch)).run();
+ params.allApps, params.packages, params.latch);
+ (new Thread(task)).start();
break;
}
@@ -519,9 +524,13 @@
case MSG_RUN_FULL_RESTORE:
{
+ // TODO: refactor full restore to be a looper-based state machine
+ // similar to normal backup/restore.
FullRestoreParams params = (FullRestoreParams)msg.obj;
- (new PerformFullRestoreTask(params.fd, params.curPassword, params.encryptPassword,
- params.observer, params.latch)).run();
+ PerformFullRestoreTask task = new PerformFullRestoreTask(params.fd,
+ params.curPassword, params.encryptPassword,
+ params.observer, params.latch);
+ (new Thread(task)).start();
break;
}
@@ -4757,6 +4766,11 @@
}
}
+ boolean deviceIsProvisioned() {
+ final ContentResolver resolver = mContext.getContentResolver();
+ return (Settings.Secure.getInt(resolver, Settings.Secure.DEVICE_PROVISIONED, 0) != 0);
+ }
+
// Run a *full* backup pass for the given package, writing the resulting data stream
// to the supplied file descriptor. This method is synchronous and does not return
// to the caller until the backup has been completed.
@@ -4777,12 +4791,19 @@
}
}
- if (DEBUG) Slog.v(TAG, "Requesting full backup: apks=" + includeApks
- + " shared=" + includeShared + " all=" + doAllApps
- + " pkgs=" + pkgList);
-
long oldId = Binder.clearCallingIdentity();
try {
+ // Doesn't make sense to do a full backup prior to setup
+ if (!deviceIsProvisioned()) {
+ Slog.i(TAG, "Full backup not supported before setup");
+ return;
+ }
+
+ if (DEBUG) Slog.v(TAG, "Requesting full backup: apks=" + includeApks
+ + " shared=" + includeShared + " all=" + doAllApps
+ + " pkgs=" + pkgList);
+ Slog.i(TAG, "Beginning full backup...");
+
FullBackupParams params = new FullBackupParams(fd, includeApks, includeShared,
doAllApps, pkgList);
final int token = generateToken();
@@ -4814,17 +4835,25 @@
// just eat it
}
Binder.restoreCallingIdentity(oldId);
+ Slog.d(TAG, "Full backup processing complete.");
}
- if (MORE_DEBUG) Slog.d(TAG, "Full backup done; returning to caller");
}
public void fullRestore(ParcelFileDescriptor fd) {
mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "fullRestore");
- Slog.i(TAG, "Beginning full restore...");
long oldId = Binder.clearCallingIdentity();
try {
+ // Check whether the device has been provisioned -- we don't handle
+ // full restores prior to completing the setup process.
+ if (!deviceIsProvisioned()) {
+ Slog.i(TAG, "Full restore not permitted before setup");
+ return;
+ }
+
+ Slog.i(TAG, "Beginning full restore...");
+
FullRestoreParams params = new FullRestoreParams(fd);
final int token = generateToken();
synchronized (mFullConfirmations) {
@@ -4855,7 +4884,7 @@
Slog.w(TAG, "Error trying to close fd after full restore: " + e);
}
Binder.restoreCallingIdentity(oldId);
- Slog.i(TAG, "Full restore completed");
+ Slog.i(TAG, "Full restore processing complete.");
}
}
diff --git a/services/java/com/android/server/EventLogTags.logtags b/services/java/com/android/server/EventLogTags.logtags
index f0b5958..99f6b8e 100644
--- a/services/java/com/android/server/EventLogTags.logtags
+++ b/services/java/com/android/server/EventLogTags.logtags
@@ -142,5 +142,5 @@
# ---------------------------
# NetworkStatsService.java
# ---------------------------
-51100 netstats_mobile_sample (iface_rx|2|2),(iface_tx|2|2),(uid_rx|2|2),(uid_tx|2|2)
-51101 netstats_wifi_sample (iface_rx|2|2),(iface_tx|2|2),(uid_rx|2|2),(uid_tx|2|2)
+51100 netstats_mobile_sample (iface_rx_bytes|2|2),(iface_tx_bytes|2|2),(iface_rx_pkts|2|1),(iface_tx_pkts|2|1),(uid_rx_bytes|2|2),(uid_tx_bytes|2|2),(uid_rx_pkts|2|1),(uid_tx_pkts|2|1)
+51101 netstats_wifi_sample (iface_rx_bytes|2|2),(iface_tx_bytes|2|2),(iface_rx_pkts|2|1),(iface_tx_pkts|2|1),(uid_rx_bytes|2|2),(uid_tx_bytes|2|2),(uid_rx_pkts|2|1),(uid_tx_pkts|2|1)
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index ab70d6c..146bc94 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -1115,7 +1115,9 @@
return true;
} else if (nonAuxCount == 1 && auxCount == 1) {
if (nonAuxSubtype != null && auxSubtype != null
- && nonAuxSubtype.getLocale().equals(auxSubtype.getLocale())
+ && (nonAuxSubtype.getLocale().equals(auxSubtype.getLocale())
+ || auxSubtype.overridesImplicitlyEnabledSubtype()
+ || nonAuxSubtype.overridesImplicitlyEnabledSubtype())
&& nonAuxSubtype.containsExtraValueKey(TAG_TRY_SUPPRESSING_IME_SWITCHER)) {
return false;
}
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index d806309..582f0ed 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -304,17 +304,19 @@
class UnmountCallBack {
final String path;
final boolean force;
+ final boolean removeEncryption;
int retries;
- UnmountCallBack(String path, boolean force) {
+ UnmountCallBack(String path, boolean force, boolean removeEncryption) {
retries = 0;
this.path = path;
this.force = force;
+ this.removeEncryption = removeEncryption;
}
void handleFinished() {
if (DEBUG_UNMOUNT) Slog.i(TAG, "Unmounting " + path);
- doUnmountVolume(path, true);
+ doUnmountVolume(path, true, removeEncryption);
}
}
@@ -322,7 +324,7 @@
final String method;
UmsEnableCallBack(String path, String method, boolean force) {
- super(path, force);
+ super(path, force, false);
this.method = method;
}
@@ -336,13 +338,13 @@
class ShutdownCallBack extends UnmountCallBack {
IMountShutdownObserver observer;
ShutdownCallBack(String path, IMountShutdownObserver observer) {
- super(path, true);
+ super(path, true, false);
this.observer = observer;
}
@Override
void handleFinished() {
- int ret = doUnmountVolume(path, true);
+ int ret = doUnmountVolume(path, true, removeEncryption);
if (observer != null) {
try {
observer.onShutDownComplete(ret);
@@ -888,8 +890,10 @@
* This might even take a while and might be retried after timed delays
* to make sure we dont end up in an instable state and kill some core
* processes.
+ * If removeEncryption is set, force is implied, and the system will remove any encryption
+ * mapping set on the volume when unmounting.
*/
- private int doUnmountVolume(String path, boolean force) {
+ private int doUnmountVolume(String path, boolean force, boolean removeEncryption) {
if (!getVolumeState(path).equals(Environment.MEDIA_MOUNTED)) {
return VoldResponseCode.OpFailedVolNotMounted;
}
@@ -905,8 +909,10 @@
// Redundant probably. But no harm in updating state again.
mPms.updateExternalMediaStatus(false, false);
try {
- mConnector.doCommand(String.format(
- "volume unmount %s%s", path, (force ? " force" : "")));
+ String arg = removeEncryption
+ ? " force_and_revert"
+ : (force ? " force" : "");
+ mConnector.doCommand(String.format("volume unmount %s%s", path, arg));
// We unmounted the volume. None of the asec containers are available now.
synchronized (mAsecMountSet) {
mAsecMountSet.clear();
@@ -1371,12 +1377,16 @@
return doMountVolume(path);
}
- public void unmountVolume(String path, boolean force) {
+ public void unmountVolume(String path, boolean force, boolean removeEncryption) {
validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);
waitForReady();
String volState = getVolumeState(path);
- if (DEBUG_UNMOUNT) Slog.i(TAG, "Unmounting " + path + " force = " + force);
+ if (DEBUG_UNMOUNT) {
+ Slog.i(TAG, "Unmounting " + path
+ + " force = " + force
+ + " removeEncryption = " + removeEncryption);
+ }
if (Environment.MEDIA_UNMOUNTED.equals(volState) ||
Environment.MEDIA_REMOVED.equals(volState) ||
Environment.MEDIA_SHARED.equals(volState) ||
@@ -1385,7 +1395,7 @@
// TODO return valid return code when adding observer call back.
return;
}
- UnmountCallBack ucb = new UnmountCallBack(path, force);
+ UnmountCallBack ucb = new UnmountCallBack(path, force, removeEncryption);
mHandler.sendMessage(mHandler.obtainMessage(H_UNMOUNT_PM_UPDATE, ucb));
}
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index 349b4d2..c517965 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -480,6 +480,20 @@
}
}
+ public void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable)
+ throws IllegalStateException {
+ String cmd = String.format("interface ipv6privacyextensions %s %s", iface,
+ enable ? "enable" : "disable");
+ try {
+ mConnector.doCommand(cmd);
+ } catch (NativeDaemonConnectorException e) {
+ throw new IllegalStateException(
+ "Unable to communicate with native daemon to set ipv6privacyextensions - " + e);
+ }
+ }
+
+
+
/* TODO: This is right now a IPv4 only function. Works for wifi which loses its
IPv6 addresses on interface down, but we need to do full clean up here */
public void clearInterfaceAddresses(String iface) throws IllegalStateException {
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index bbc26d6..bb21d81 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -235,6 +235,7 @@
private boolean mPreventScreenOn;
private int mScreenBrightnessOverride = -1;
private int mButtonBrightnessOverride = -1;
+ private int mScreenBrightnessDim;
private boolean mUseSoftwareAutoBrightness;
private boolean mAutoBrightessEnabled;
private int[] mAutoBrightnessLevels;
@@ -586,6 +587,9 @@
mUnplugTurnsOnScreen = resources.getBoolean(
com.android.internal.R.bool.config_unplugTurnsOnScreen);
+ mScreenBrightnessDim = resources.getInteger(
+ com.android.internal.R.integer.config_screenBrightnessDim);
+
// read settings for auto-brightness
mUseSoftwareAutoBrightness = resources.getBoolean(
com.android.internal.R.bool.config_automatic_brightness_available);
@@ -1880,7 +1884,7 @@
nominalCurrentValue = preferredBrightness;
break;
case SCREEN_ON_BIT:
- nominalCurrentValue = Power.BRIGHTNESS_DIM;
+ nominalCurrentValue = mScreenBrightnessDim;
break;
case 0:
nominalCurrentValue = Power.BRIGHTNESS_OFF;
@@ -1899,7 +1903,7 @@
// the scale is because the brightness ramp isn't linear and this biases
// it so the later parts take longer.
final float scale = 1.5f;
- float ratio = (((float)Power.BRIGHTNESS_DIM)/preferredBrightness);
+ float ratio = (((float)mScreenBrightnessDim)/preferredBrightness);
if (ratio > 1.0f) ratio = 1.0f;
if ((newState & SCREEN_ON_BIT) == 0) {
if ((oldState & SCREEN_BRIGHT_BIT) != 0) {
@@ -1926,7 +1930,7 @@
// will then count going dim as turning off.
mScreenOffTime = SystemClock.elapsedRealtime();
}
- brightness = Power.BRIGHTNESS_DIM;
+ brightness = mScreenBrightnessDim;
}
}
long identity = Binder.clearCallingIdentity();
@@ -1956,7 +1960,7 @@
setLightBrightness(offMask, Power.BRIGHTNESS_OFF);
}
if (dimMask != 0) {
- int brightness = Power.BRIGHTNESS_DIM;
+ int brightness = mScreenBrightnessDim;
if ((newState & BATTERY_LOW_BIT) != 0 &&
brightness > Power.BRIGHTNESS_LOW_BATTERY) {
brightness = Power.BRIGHTNESS_LOW_BATTERY;
@@ -2122,7 +2126,7 @@
final int brightness = Settings.System.getInt(mContext.getContentResolver(),
SCREEN_BRIGHTNESS);
// Don't let applications turn the screen all the way off
- return Math.max(brightness, Power.BRIGHTNESS_DIM);
+ return Math.max(brightness, mScreenBrightnessDim);
} catch (SettingNotFoundException snfe) {
return Power.BRIGHTNESS_ON;
}
@@ -2810,7 +2814,7 @@
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
// Don't let applications turn the screen all the way off
synchronized (mLocks) {
- brightness = Math.max(brightness, Power.BRIGHTNESS_DIM);
+ brightness = Math.max(brightness, mScreenBrightnessDim);
mLcdLight.setBrightness(brightness);
mKeyboardLight.setBrightness(mKeyboardVisible ? brightness : 0);
mButtonLight.setBrightness(brightness);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 2714fc5..7e28c4f 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -148,7 +148,8 @@
Slog.i(TAG, "Package Manager");
pm = PackageManagerService.main(context,
- factoryTest != SystemServer.FACTORY_TEST_OFF);
+ factoryTest != SystemServer.FACTORY_TEST_OFF,
+ false);
ActivityManagerService.setSystemProcess();
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index e6b5898..883fc71 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -37,7 +37,7 @@
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiWatchdogStateMachine;
import android.net.wifi.WifiConfiguration.KeyMgmt;
-import android.net.wifi.Wps;
+import android.net.wifi.WpsInfo;
import android.net.wifi.WpsResult;
import android.net.ConnectivityManager;
import android.net.DhcpInfo;
@@ -69,6 +69,7 @@
import java.io.PrintWriter;
import com.android.internal.app.IBatteryStats;
+import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.AsyncChannel;
import com.android.server.am.BatteryStatsService;
import com.android.internal.R;
@@ -96,6 +97,7 @@
private static final int IDLE_REQUEST = 0;
private boolean mScreenOff;
private boolean mDeviceIdle;
+ private boolean mEmergencyCallbackMode = false;
private int mPluggedType;
/* Chipset supports background scan */
@@ -286,7 +288,7 @@
}
case WifiManager.CMD_START_WPS: {
//replyTo has the original source
- mWifiStateMachine.startWps(msg.replyTo, (Wps)msg.obj);
+ mWifiStateMachine.startWps(msg.replyTo, (WpsInfo)msg.obj);
break;
}
case WifiManager.CMD_DISABLE_NETWORK: {
@@ -996,6 +998,9 @@
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE,
BluetoothAdapter.STATE_DISCONNECTED);
mWifiStateMachine.sendBluetoothAdapterStateChange(state);
+ } else if (action.equals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED)) {
+ mEmergencyCallbackMode = intent.getBooleanExtra("phoneinECMState", false);
+ updateWifiState();
}
}
@@ -1057,7 +1062,13 @@
private void updateWifiState() {
boolean lockHeld = mLocks.hasLocks();
int strongestLockMode = WifiManager.WIFI_MODE_FULL;
- boolean wifiShouldBeStarted = !mDeviceIdle || lockHeld;
+ boolean wifiShouldBeStarted;
+
+ if (mEmergencyCallbackMode) {
+ wifiShouldBeStarted = false;
+ } else {
+ wifiShouldBeStarted = !mDeviceIdle || lockHeld;
+ }
if (lockHeld) {
strongestLockMode = mLocks.getStrongestLockMode();
@@ -1097,6 +1108,7 @@
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
intentFilter.addAction(ACTION_DEVICE_IDLE);
intentFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
+ intentFilter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
mContext.registerReceiver(mReceiver, intentFilter);
}
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 09ddc2f..6830055 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -190,6 +190,22 @@
}
@Override
+ public void onPackageRemoved(String packageName, int uid) {
+ synchronized (mLock) {
+ Iterator<ComponentName> it = mEnabledServices.iterator();
+ while (it.hasNext()) {
+ ComponentName comp = it.next();
+ String compPkg = comp.getPackageName();
+ if (compPkg.equals(packageName)) {
+ it.remove();
+ updateEnabledAccessibilitySerivcesSettingLocked(mEnabledServices);
+ return;
+ }
+ }
+ }
+ }
+
+ @Override
public boolean onHandleForceStop(Intent intent, String[] packages,
int uid, boolean doit) {
synchronized (mLock) {
@@ -209,23 +225,12 @@
}
}
if (changed) {
- it = mEnabledServices.iterator();
- StringBuilder str = new StringBuilder();
- while (it.hasNext()) {
- if (str.length() > 0) {
- str.append(':');
- }
- str.append(it.next().flattenToShortString());
- }
- Settings.Secure.putString(mContext.getContentResolver(),
- Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
- str.toString());
- manageServicesLocked();
+ updateEnabledAccessibilitySerivcesSettingLocked(mEnabledServices);
}
return false;
}
}
-
+
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() == Intent.ACTION_BOOT_COMPLETED) {
@@ -252,6 +257,21 @@
super.onReceive(context, intent);
}
+
+ private void updateEnabledAccessibilitySerivcesSettingLocked(
+ Set<ComponentName> enabledServices) {
+ Iterator<ComponentName> it = enabledServices.iterator();
+ StringBuilder str = new StringBuilder();
+ while (it.hasNext()) {
+ if (str.length() > 0) {
+ str.append(':');
+ }
+ str.append(it.next().flattenToShortString());
+ }
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ str.toString());
+ }
};
// package changes
@@ -469,14 +489,16 @@
if (oldService != null) {
tryRemoveServiceLocked(oldService);
}
+ // Now this service is enabled.
+ mEnabledServices.add(componentName);
+ // Also make sure this service is the only one.
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ componentName.flattenToString());
// This API is intended for testing so enable accessibility to make
// sure clients can start poking with the window content.
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, 1);
- // Also disable all accessibility services to avoid interference
- // with the tests.
- Settings.Secure.putString(mContext.getContentResolver(),
- Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "");
}
AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();
accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
@@ -697,6 +719,7 @@
private void manageServicesLocked() {
populateEnabledServicesLocked(mEnabledServices);
updateServicesStateLocked(mInstalledServices, mEnabledServices);
+ disableAccessibilityIfNoEnabledServices(mEnabledServices);
}
/**
@@ -781,6 +804,19 @@
}
/**
+ * Disables accessibility if there are no enabled accessibility services which
+ * to consume the generated accessibility events.
+ *
+ * @param enabledServices The set of enabled services.
+ */
+ private void disableAccessibilityIfNoEnabledServices(Set<ComponentName> enabledServices) {
+ if (enabledServices.isEmpty()) {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0);
+ }
+ }
+
+ /**
* Sends the state to the clients.
*/
private void sendStateToClientsLocked() {
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index d6d3b9d..41af137 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -3327,20 +3327,28 @@
boolean didSomething = killPackageProcessesLocked(name, uid, -100,
callerWillRestart, false, doit, evenPersistent);
- for (i=mMainStack.mHistory.size()-1; i>=0; i--) {
+ TaskRecord lastTask = null;
+ for (i=0; i<mMainStack.mHistory.size(); i++) {
ActivityRecord r = (ActivityRecord)mMainStack.mHistory.get(i);
- if (r.packageName.equals(name)
+ final boolean samePackage = r.packageName.equals(name);
+ if ((samePackage || r.task == lastTask)
&& (r.app == null || evenPersistent || !r.app.persistent)) {
if (!doit) {
return true;
}
didSomething = true;
Slog.i(TAG, " Force finishing activity " + r);
- if (r.app != null) {
- r.app.removed = true;
+ if (samePackage) {
+ if (r.app != null) {
+ r.app.removed = true;
+ }
+ r.app = null;
}
- r.app = null;
- r.stack.finishActivityLocked(r, i, Activity.RESULT_CANCELED, null, "uninstall");
+ lastTask = r.task;
+ if (r.stack.finishActivityLocked(r, i, Activity.RESULT_CANCELED,
+ null, "force-stop")) {
+ i--;
+ }
}
}
diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java
index 9067fae..0da5cc6 100644
--- a/services/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -572,8 +572,7 @@
switch (type) {
case TYPE_WARNING: {
final CharSequence title = res.getText(R.string.data_usage_warning_title);
- final CharSequence body = res.getString(R.string.data_usage_warning_body,
- Formatter.formatFileSize(mContext, policy.warningBytes));
+ final CharSequence body = res.getString(R.string.data_usage_warning_body);
builder.setSmallIcon(R.drawable.ic_menu_info_details);
builder.setTicker(title);
diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java
index af29d85..3673eab 100644
--- a/services/java/com/android/server/net/NetworkStatsService.java
+++ b/services/java/com/android/server/net/NetworkStatsService.java
@@ -34,6 +34,7 @@
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.NetworkTemplate.buildTemplateWifi;
import static android.net.TrafficStats.UID_REMOVED;
+import static android.provider.Settings.Secure.NETSTATS_FORCE_COMPLETE_POLL;
import static android.provider.Settings.Secure.NETSTATS_NETWORK_BUCKET_DURATION;
import static android.provider.Settings.Secure.NETSTATS_NETWORK_MAX_HISTORY;
import static android.provider.Settings.Secure.NETSTATS_PERSIST_THRESHOLD;
@@ -176,6 +177,7 @@
public long getUidMaxHistory();
public long getTagMaxHistory();
public long getTimeCacheMaxAge();
+ public boolean getForceCompletePoll();
}
private final Object mStatsLock = new Object();
@@ -682,8 +684,16 @@
if (LOGV) Slog.v(TAG, "performPollLocked(flags=0x" + Integer.toHexString(flags) + ")");
final long startRealtime = SystemClock.elapsedRealtime();
- final boolean pollNetwork = (flags & FLAG_POLL_NETWORK) != 0;
- final boolean pollUid = (flags & FLAG_POLL_UID) != 0;
+ boolean pollNetwork = (flags & FLAG_POLL_NETWORK) != 0;
+ boolean pollUid = (flags & FLAG_POLL_UID) != 0;
+
+ // when complete poll requested, any partial poll enables everything
+ final boolean forceCompletePoll = mSettings.getForceCompletePoll();
+ if (forceCompletePoll && (pollNetwork || pollUid)) {
+ pollNetwork = true;
+ pollUid = true;
+ }
+
final boolean persistNetwork = (flags & FLAG_PERSIST_NETWORK) != 0;
final boolean persistUid = (flags & FLAG_PERSIST_UID) != 0;
final boolean forcePersist = (flags & FLAG_FORCE_PERSIST) != 0;
@@ -855,14 +865,20 @@
ifaceTotal = getSummaryForNetwork(template, start, end).getTotal(ifaceTotal);
uidTotal = getSummaryForAllUid(template, start, end, false).getTotal(uidTotal);
EventLogTags.writeNetstatsMobileSample(
- ifaceTotal.rxBytes, ifaceTotal.txBytes, uidTotal.rxBytes, uidTotal.txBytes);
+ ifaceTotal.rxBytes, ifaceTotal.txBytes,
+ ifaceTotal.rxPackets, ifaceTotal.txPackets,
+ uidTotal.rxBytes, uidTotal.txBytes,
+ uidTotal.rxPackets, uidTotal.txPackets);
// collect wifi sample
template = buildTemplateWifi();
ifaceTotal = getSummaryForNetwork(template, start, end).getTotal(ifaceTotal);
uidTotal = getSummaryForAllUid(template, start, end, false).getTotal(uidTotal);
EventLogTags.writeNetstatsWifiSample(
- ifaceTotal.rxBytes, ifaceTotal.txBytes, uidTotal.rxBytes, uidTotal.txBytes);
+ ifaceTotal.rxBytes, ifaceTotal.txBytes,
+ ifaceTotal.rxPackets, ifaceTotal.txPackets,
+ uidTotal.rxBytes, uidTotal.txBytes,
+ uidTotal.rxPackets, uidTotal.txPackets);
}
/**
@@ -1360,6 +1376,10 @@
private long getSecureLong(String name, long def) {
return Settings.Secure.getLong(mResolver, name, def);
}
+ private boolean getSecureBoolean(String name, boolean def) {
+ final int defInt = def ? 1 : 0;
+ return Settings.Secure.getInt(mResolver, name, defInt) != 0;
+ }
public long getPollInterval() {
return getSecureLong(NETSTATS_POLL_INTERVAL, 30 * MINUTE_IN_MILLIS);
@@ -1385,5 +1405,8 @@
public long getTimeCacheMaxAge() {
return DAY_IN_MILLIS;
}
+ public boolean getForceCompletePoll() {
+ return getSecureBoolean(NETSTATS_FORCE_COMPLETE_POLL, false);
+ }
}
}
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index bfb244b..9ebdd52 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -71,6 +71,7 @@
import android.content.pm.Signature;
import android.content.pm.UserInfo;
import android.content.pm.ManifestDigest;
+import android.content.pm.VerifierDeviceIdentity;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
@@ -221,6 +222,7 @@
final Context mContext;
final boolean mFactoryTest;
+ final boolean mOnlyCore;
final boolean mNoDexOpt;
final DisplayMetrics mMetrics;
final int mDefParseFlags;
@@ -809,8 +811,9 @@
return false;
}
- public static final IPackageManager main(Context context, boolean factoryTest) {
- PackageManagerService m = new PackageManagerService(context, factoryTest);
+ public static final IPackageManager main(Context context, boolean factoryTest,
+ boolean onlyCore) {
+ PackageManagerService m = new PackageManagerService(context, factoryTest, onlyCore);
ServiceManager.addService("package", m);
return m;
}
@@ -837,7 +840,7 @@
return res;
}
- public PackageManagerService(Context context, boolean factoryTest) {
+ public PackageManagerService(Context context, boolean factoryTest, boolean onlyCore) {
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
SystemClock.uptimeMillis());
@@ -847,6 +850,7 @@
mContext = context;
mFactoryTest = factoryTest;
+ mOnlyCore = onlyCore;
mNoDexOpt = "eng".equals(SystemProperties.get("ro.build.type"));
mMetrics = new DisplayMetrics();
mSettings = new Settings();
@@ -1051,18 +1055,20 @@
mInstaller.moveFiles();
// Prune any system packages that no longer exist.
- Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator();
- while (psit.hasNext()) {
- PackageSetting ps = psit.next();
- if ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0
- && !mPackages.containsKey(ps.name)
- && !mSettings.mDisabledSysPackages.containsKey(ps.name)) {
- psit.remove();
- String msg = "System package " + ps.name
- + " no longer exists; wiping its data";
- reportSettingsProblem(Log.WARN, msg);
- mInstaller.remove(ps.name, 0);
- mUserManager.removePackageForAllUsers(ps.name);
+ if (!mOnlyCore) {
+ Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator();
+ while (psit.hasNext()) {
+ PackageSetting ps = psit.next();
+ if ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0
+ && !mPackages.containsKey(ps.name)
+ && !mSettings.mDisabledSysPackages.containsKey(ps.name)) {
+ psit.remove();
+ String msg = "System package " + ps.name
+ + " no longer exists; wiping its data";
+ reportSettingsProblem(Log.WARN, msg);
+ mInstaller.remove(ps.name, 0);
+ mUserManager.removePackageForAllUsers(ps.name);
+ }
}
}
@@ -1077,18 +1083,23 @@
//delete tmp files
deleteTempPackageFiles();
- EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
- SystemClock.uptimeMillis());
- mAppInstallObserver = new AppDirObserver(
- mAppInstallDir.getPath(), OBSERVER_EVENTS, false);
- mAppInstallObserver.startWatching();
- scanDirLI(mAppInstallDir, 0, scanMode, 0);
-
- mDrmAppInstallObserver = new AppDirObserver(
- mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
- mDrmAppInstallObserver.startWatching();
- scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,
- scanMode, 0);
+ if (!mOnlyCore) {
+ EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
+ SystemClock.uptimeMillis());
+ mAppInstallObserver = new AppDirObserver(
+ mAppInstallDir.getPath(), OBSERVER_EVENTS, false);
+ mAppInstallObserver.startWatching();
+ scanDirLI(mAppInstallDir, 0, scanMode, 0);
+
+ mDrmAppInstallObserver = new AppDirObserver(
+ mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
+ mDrmAppInstallObserver.startWatching();
+ scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,
+ scanMode, 0);
+ } else {
+ mAppInstallObserver = null;
+ mDrmAppInstallObserver = null;
+ }
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,
SystemClock.uptimeMillis());
@@ -2749,6 +2760,7 @@
parseFlags |= mDefParseFlags;
PackageParser pp = new PackageParser(scanPath);
pp.setSeparateProcesses(mSeparateProcesses);
+ pp.setOnlyCoreApps(mOnlyCore);
final PackageParser.Package pkg = pp.parsePackage(scanFile,
scanPath, mMetrics, parseFlags);
if (pkg == null) {
@@ -4044,7 +4056,7 @@
+ " info=" + bp.pendingInfo);
if (bp.packageSetting == null && bp.pendingInfo != null) {
final BasePermission tree = findPermissionTreeLP(bp.name);
- if (tree != null) {
+ if (tree != null && tree.perm != null) {
bp.packageSetting = tree.packageSetting;
bp.perm = new PackageParser.Permission(tree.perm.owner,
new PermissionInfo(bp.pendingInfo));
@@ -8394,4 +8406,15 @@
mUserManager.removeUser(userId);
return true;
}
+
+ @Override
+ public VerifierDeviceIdentity getVerifierDeviceIdentity() throws RemoteException {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.PACKAGE_VERIFICATION_AGENT,
+ "Only package verification agents can read the verifier device identity");
+
+ synchronized (mPackages) {
+ return mSettings.getVerifierDeviceIdentityLPw();
+ }
+ }
}
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index f270003..7cdb5b1 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -39,6 +39,7 @@
import android.content.pm.PackageParser;
import android.content.pm.PermissionInfo;
import android.content.pm.Signature;
+import android.content.pm.VerifierDeviceIdentity;
import android.os.Binder;
import android.os.Environment;
import android.os.FileUtils;
@@ -86,7 +87,10 @@
// used to grant newer permissions one time during a system upgrade.
int mInternalSdkPlatform;
int mExternalSdkPlatform;
-
+
+ /** Device identity for the purpose of package verification. */
+ private VerifierDeviceIdentity mVerifierDeviceIdentity;
+
// The user's preferred activities associated with particular intent
// filters.
final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities =
@@ -865,6 +869,12 @@
serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
serializer.endTag(null, "last-platform-version");
+ if (mVerifierDeviceIdentity != null) {
+ serializer.startTag(null, "verifier");
+ serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
+ serializer.endTag(null, "verifier");
+ }
+
serializer.startTag(null, "permission-trees");
for (BasePermission bp : mPermissionTrees.values()) {
writePermissionLPr(serializer, bp);
@@ -1280,6 +1290,14 @@
}
} catch (NumberFormatException e) {
}
+ } else if (tagName.equals("verifier")) {
+ final String deviceIdentity = parser.getAttributeValue(null, "device");
+ try {
+ mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
+ } catch (IllegalArgumentException e) {
+ Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
+ + e.getMessage());
+ }
} else {
Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
+ parser.getName());
@@ -1894,6 +1912,16 @@
return PackageManagerService.FIRST_APPLICATION_UID + N;
}
+ public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
+ if (mVerifierDeviceIdentity == null) {
+ mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
+
+ writeLPr();
+ }
+
+ return mVerifierDeviceIdentity;
+ }
+
public PackageSetting getDisabledSystemPkgLPr(String name) {
PackageSetting ps = mDisabledSysPackages.get(name);
return ps;
diff --git a/services/java/com/android/server/wm/DimSurface.java b/services/java/com/android/server/wm/DimSurface.java
index d7bb8b3..dc6cc0d 100644
--- a/services/java/com/android/server/wm/DimSurface.java
+++ b/services/java/com/android/server/wm/DimSurface.java
@@ -53,19 +53,22 @@
void show(int dw, int dh, int layer, int color) {
if (!mDimShown) {
if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM " + mDimSurface + ": SHOW pos=(0,0) (" +
- dw + "x" + dh + ")");
+ dw + "x" + dh + " layer=" + layer + ")");
mDimShown = true;
try {
mLastDimWidth = dw;
mLastDimHeight = dh;
mDimSurface.setPosition(0, 0);
mDimSurface.setSize(dw, dh);
+ mDimSurface.setLayer(layer);
mDimSurface.show();
} catch (RuntimeException e) {
Slog.w(WindowManagerService.TAG, "Failure showing dim surface", e);
}
} else if (mLastDimWidth != dw || mLastDimHeight != dh || mDimColor != color
|| mLayer != layer) {
+ if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM " + mDimSurface + ": pos=(0,0) (" +
+ dw + "x" + dh + " layer=" + layer + ")");
mLastDimWidth = dw;
mLastDimHeight = dh;
mLayer = layer;
@@ -80,6 +83,7 @@
if (mDimShown) {
mDimShown = false;
try {
+ if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " HIDE " + mDimSurface);
mDimSurface.hide();
} catch (RuntimeException e) {
Slog.w(WindowManagerService.TAG, "Illegal argument exception hiding dim surface");
diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java
index 3c475a0..e25638f 100644
--- a/services/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -304,8 +304,12 @@
}
if (!mStarted) {
- mEnterAnimation.setStartTime(now);
- mExitAnimation.setStartTime(now);
+ if (mEnterAnimation != null) {
+ mEnterAnimation.setStartTime(now);
+ }
+ if (mExitAnimation != null) {
+ mExitAnimation.setStartTime(now);
+ }
mStarted = true;
}
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 211c4da..609016b 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -774,7 +774,7 @@
// The window manager only throws security exceptions, so let's
// log all others.
if (!(e instanceof SecurityException)) {
- Slog.e(TAG, "Window Manager Crash", e);
+ Log.wtf(TAG, "Window Manager Crash", e);
}
throw e;
}
@@ -5701,8 +5701,8 @@
return config;
}
- private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw) {
- int size = (int)(mPolicy.getConfigDisplayWidth(rotation, dw) / density);
+ private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw, int dh) {
+ int size = (int)(mPolicy.getConfigDisplayWidth(dw, dh, rotation) / density);
if (size < curSize) {
curSize = size;
}
@@ -5722,17 +5722,17 @@
unrotDw = dw;
unrotDh = dh;
}
- int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw);
- sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDh);
- sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw);
- sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDh);
+ int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw, unrotDh);
+ sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDw, unrotDh);
+ sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw, unrotDh);
+ sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDw, unrotDh);
return sw;
}
private int reduceCompatConfigWidthSize(int curSize, int rotation, DisplayMetrics dm,
int dw, int dh) {
- dm.noncompatWidthPixels = mPolicy.getNonDecorDisplayWidth(rotation, dw);
- dm.noncompatHeightPixels = mPolicy.getNonDecorDisplayHeight(rotation, dh);
+ dm.noncompatWidthPixels = mPolicy.getNonDecorDisplayWidth(dw, dh, rotation);
+ dm.noncompatHeightPixels = mPolicy.getNonDecorDisplayHeight(dw, dh, rotation);
float scale = CompatibilityInfo.computeCompatibleScaling(dm, null);
int size = (int)(((dm.noncompatWidthPixels / scale) / dm.density) + .5f);
if (curSize == 0 || size < curSize) {
@@ -5809,15 +5809,17 @@
// Update application display metrics.
final DisplayMetrics dm = mDisplayMetrics;
- mAppDisplayWidth = mPolicy.getNonDecorDisplayWidth(mRotation, dw);
- mAppDisplayHeight = mPolicy.getNonDecorDisplayHeight(mRotation, dh);
+ mAppDisplayWidth = mPolicy.getNonDecorDisplayWidth(dw, dh, mRotation);
+ mAppDisplayHeight = mPolicy.getNonDecorDisplayHeight(dw, dh, mRotation);
mDisplay.getMetricsWithSize(dm, mAppDisplayWidth, mAppDisplayHeight);
mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(dm,
mCompatDisplayMetrics);
- config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(mRotation, dw) / dm.density);
- config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(mRotation, dh) / dm.density);
+ config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(dw, dh, mRotation)
+ / dm.density);
+ config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(dw, dh, mRotation)
+ / dm.density);
config.smallestScreenWidthDp = computeSmallestWidth(rotated, dw, dh, dm.density);
config.compatScreenWidthDp = (int)(config.screenWidthDp / mCompatibleScreenScale);
@@ -7096,7 +7098,7 @@
}
}
} catch (RuntimeException e) {
- Slog.e(TAG, "Unhandled exception while force removing for memory", e);
+ Log.wtf(TAG, "Unhandled exception while force removing for memory", e);
}
try {
@@ -7131,7 +7133,7 @@
}
} catch (RuntimeException e) {
mInLayout = false;
- Slog.e(TAG, "Unhandled exception while layout out windows", e);
+ Log.wtf(TAG, "Unhandled exception while laying out windows", e);
}
}
@@ -7151,7 +7153,7 @@
if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed="
+ mLayoutNeeded + " dw=" + dw + " dh=" + dh);
- mPolicy.beginLayoutLw(dw, dh);
+ mPolicy.beginLayoutLw(dw, dh, mRotation);
int seq = mLayoutSeq+1;
if (seq < 0) seq = 0;
@@ -7458,9 +7460,12 @@
windowDetachedWallpaper = w;
}
if (w.mAnimation.getBackgroundColor() != 0) {
- windowAnimationBackground = w;
- windowAnimationBackgroundColor =
- w.mAnimation.getBackgroundColor();
+ if (windowAnimationBackground == null || w.mAnimLayer <
+ windowAnimationBackground.mAnimLayer) {
+ windowAnimationBackground = w;
+ windowAnimationBackgroundColor =
+ w.mAnimation.getBackgroundColor();
+ }
}
}
animating = true;
@@ -7469,14 +7474,18 @@
// If this window's app token is running a detached wallpaper
// animation, make a note so we can ensure the wallpaper is
// displayed behind it.
- if (w.mAppToken != null && w.mAppToken.animation != null) {
+ if (w.mAppToken != null && w.mAppToken.animation != null
+ && w.mAppToken.animating) {
if (w.mAppToken.animation.getDetachWallpaper()) {
windowDetachedWallpaper = w;
}
if (w.mAppToken.animation.getBackgroundColor() != 0) {
- windowAnimationBackground = w;
- windowAnimationBackgroundColor =
- w.mAppToken.animation.getBackgroundColor();
+ if (windowAnimationBackground == null || w.mAnimLayer <
+ windowAnimationBackground.mAnimLayer) {
+ windowAnimationBackground = w;
+ windowAnimationBackgroundColor =
+ w.mAppToken.animation.getBackgroundColor();
+ }
}
}
@@ -8397,7 +8406,7 @@
}
}
} catch (RuntimeException e) {
- Slog.e(TAG, "Unhandled exception in Window Manager", e);
+ Log.wtf(TAG, "Unhandled exception in Window Manager", e);
}
Surface.closeTransaction();
@@ -9179,7 +9188,7 @@
if (windows == null || windows.contains(w)) {
pw.print(" Window #"); pw.print(i); pw.print(' ');
pw.print(w); pw.println(":");
- w.dump(pw, " ", dumpAll);
+ w.dump(pw, " ", dumpAll || windows != null);
}
}
if (mInputMethodDialogs.size() > 0) {
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index bb36d3a7..0ee3f17 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -968,6 +968,7 @@
+ mPolicyVisibilityAfterAnim);
}
mPolicyVisibility = mPolicyVisibilityAfterAnim;
+ mService.mLayoutNeeded = true;
if (!mPolicyVisibility) {
if (mService.mCurrentFocus == this) {
mService.mFocusMayChange = true;
diff --git a/services/sensorservice/Fusion.cpp b/services/sensorservice/Fusion.cpp
index 0ab86c3..d76f19c 100644
--- a/services/sensorservice/Fusion.cpp
+++ b/services/sensorservice/Fusion.cpp
@@ -167,6 +167,9 @@
Bm.y = 1;
Bm.z = 0;
+ x0 = 0;
+ x1 = 0;
+
init();
}
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
index 38d498c..d82a7e2 100644
--- a/services/sensorservice/SensorDevice.cpp
+++ b/services/sensorservice/SensorDevice.cpp
@@ -138,9 +138,18 @@
Mutex::Autolock _l(mLock);
for (size_t i=0 ; i<size_t(count) ; i++) {
- snprintf(buffer, SIZE, "handle=0x%08x, active-count=%d\n",
+ const Info& info = mActivationCount.valueFor(list[i].handle);
+ snprintf(buffer, SIZE, "handle=0x%08x, active-count=%d, rates(ms)={ ",
list[i].handle,
- mActivationCount.valueFor(list[i].handle).rates.size());
+ info.rates.size());
+ result.append(buffer);
+ for (size_t j=0 ; j<info.rates.size() ; j++) {
+ snprintf(buffer, SIZE, "%4.1f%s",
+ info.rates.valueAt(j) / 1e6f,
+ j<info.rates.size()-1 ? ", " : "");
+ result.append(buffer);
+ }
+ snprintf(buffer, SIZE, " }, selected=%4.1f ms\n", info.delay / 1e6f);
result.append(buffer);
}
}
@@ -217,17 +226,9 @@
}
}
- if (!actuateHardware || enabled) {
+ { // scope for the lock
Mutex::Autolock _l(mLock);
- nsecs_t ns = info.rates.valueAt(0);
- for (size_t i=1 ; i<info.rates.size() ; i++) {
- if (info.rates.valueAt(i) < ns) {
- nsecs_t cur = info.rates.valueAt(i);
- if (cur < ns) {
- ns = cur;
- }
- }
- }
+ nsecs_t ns = info.selectDelay();
mSensorDevice->setDelay(mSensorDevice, handle, ns);
}
@@ -237,24 +238,39 @@
status_t SensorDevice::setDelay(void* ident, int handle, int64_t ns)
{
if (!mSensorDevice) return NO_INIT;
+ Mutex::Autolock _l(mLock);
Info& info( mActivationCount.editValueFor(handle) );
- { // scope for lock
- Mutex::Autolock _l(mLock);
- ssize_t index = info.rates.indexOfKey(ident);
- if (index < 0) return BAD_INDEX;
- info.rates.editValueAt(index) = ns;
- ns = info.rates.valueAt(0);
- for (size_t i=1 ; i<info.rates.size() ; i++) {
- nsecs_t cur = info.rates.valueAt(i);
- if (cur < ns) {
- ns = cur;
- }
+ status_t err = info.setDelayForIdent(ident, ns);
+ if (err < 0) return err;
+ ns = info.selectDelay();
+ return mSensorDevice->setDelay(mSensorDevice, handle, ns);
+}
+
+// ---------------------------------------------------------------------------
+
+status_t SensorDevice::Info::setDelayForIdent(void* ident, int64_t ns)
+{
+ ssize_t index = rates.indexOfKey(ident);
+ if (index < 0) {
+ LOGE("Info::setDelayForIdent(ident=%p, ns=%lld) failed (%s)",
+ ident, ns, strerror(-index));
+ return BAD_INDEX;
+ }
+ rates.editValueAt(index) = ns;
+ return NO_ERROR;
+}
+
+nsecs_t SensorDevice::Info::selectDelay()
+{
+ nsecs_t ns = rates.valueAt(0);
+ for (size_t i=1 ; i<rates.size() ; i++) {
+ nsecs_t cur = rates.valueAt(i);
+ if (cur < ns) {
+ ns = cur;
}
}
-
- //LOGD("setDelay: ident=%p, handle=%d, ns=%lld", ident, handle, ns);
-
- return mSensorDevice->setDelay(mSensorDevice, handle, ns);
+ delay = ns;
+ return ns;
}
// ---------------------------------------------------------------------------
diff --git a/services/sensorservice/SensorDevice.h b/services/sensorservice/SensorDevice.h
index c19b2ce..728b6cb 100644
--- a/services/sensorservice/SensorDevice.h
+++ b/services/sensorservice/SensorDevice.h
@@ -37,11 +37,14 @@
friend class Singleton<SensorDevice>;
struct sensors_poll_device_t* mSensorDevice;
struct sensors_module_t* mSensorModule;
- Mutex mLock; // protect mActivationCount[].rates
+ mutable Mutex mLock; // protect mActivationCount[].rates
// fixed-size array after construction
struct Info {
- Info() { }
+ Info() : delay(0) { }
KeyedVector<void*, nsecs_t> rates;
+ nsecs_t delay;
+ status_t setDelayForIdent(void* ident, int64_t ns);
+ nsecs_t selectDelay();
};
DefaultKeyedVector<int, Info> mActivationCount;
diff --git a/services/sensorservice/tests/sensorservicetest.cpp b/services/sensorservice/tests/sensorservicetest.cpp
index 54bce09..1025fa8 100644
--- a/services/sensorservice/tests/sensorservicetest.cpp
+++ b/services/sensorservice/tests/sensorservicetest.cpp
@@ -35,22 +35,21 @@
while ((n = q->read(buffer, 8)) > 0) {
for (int i=0 ; i<n ; i++) {
- if (buffer[i].type == Sensor::TYPE_ACCELEROMETER) {
- printf("time=%lld, value=<%5.1f,%5.1f,%5.1f>\n",
- buffer[i].timestamp,
- buffer[i].acceleration.x,
- buffer[i].acceleration.y,
- buffer[i].acceleration.z);
- }
-
+ float t;
if (oldTimeStamp) {
- float t = float(buffer[i].timestamp - oldTimeStamp) / s2ns(1);
- printf("%f ms (%f Hz)\n", t*1000, 1.0/t);
+ t = float(buffer[i].timestamp - oldTimeStamp) / s2ns(1);
} else {
- float t = float(buffer[i].timestamp - sStartTime) / s2ns(1);
- printf("first event: %f ms\n", t*1000);
+ t = float(buffer[i].timestamp - sStartTime) / s2ns(1);
}
oldTimeStamp = buffer[i].timestamp;
+
+ if (buffer[i].type == Sensor::TYPE_ACCELEROMETER) {
+ printf("%lld\t%8f\t%8f\t%8f\t%f\n",
+ buffer[i].timestamp,
+ buffer[i].data[0], buffer[i].data[1], buffer[i].data[2],
+ 1.0/t);
+ }
+
}
}
if (n<0 && n != -EAGAIN) {
@@ -79,7 +78,7 @@
q->enableSensor(accelerometer);
- q->setEventRate(accelerometer, ms2ns(200));
+ q->setEventRate(accelerometer, ms2ns(10));
sp<Looper> loop = new Looper(false);
loop->addFd(q->getFd(), 0, ALOOPER_EVENT_INPUT, receiver, q.get());
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index edbc7b0..f85ce7f 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -404,7 +404,9 @@
void Layer::lockPageFlip(bool& recomputeVisibleRegions)
{
if (mQueuedFrames > 0) {
+ // Capture the old state of the layer for comparisons later
const bool oldOpacity = isOpaque();
+ sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
// signal another event if we have more frames pending
if (android_atomic_dec(&mQueuedFrames) > 1) {
@@ -417,7 +419,8 @@
return;
}
- sp<GraphicBuffer> newFrontBuffer(mSurfaceTexture->getCurrentBuffer());
+ // update the active buffer
+ mActiveBuffer = mSurfaceTexture->getCurrentBuffer();
const Rect crop(mSurfaceTexture->getCurrentCrop());
const uint32_t transform(mSurfaceTexture->getCurrentTransform());
@@ -439,16 +442,16 @@
mFlinger->invalidateHwcGeometry();
}
- uint32_t bufWidth = newFrontBuffer->getWidth();
- uint32_t bufHeight = newFrontBuffer->getHeight();
- if (mActiveBuffer != NULL) {
- if (bufWidth != uint32_t(mActiveBuffer->width) ||
- bufHeight != uint32_t(mActiveBuffer->height)) {
+ uint32_t bufWidth = mActiveBuffer->getWidth();
+ uint32_t bufHeight = mActiveBuffer->getHeight();
+ if (oldActiveBuffer != NULL) {
+ if (bufWidth != uint32_t(oldActiveBuffer->width) ||
+ bufHeight != uint32_t(oldActiveBuffer->height)) {
mFlinger->invalidateHwcGeometry();
}
}
- mCurrentOpacity = getOpacityForFormat(newFrontBuffer->format);
+ mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
if (oldOpacity != isOpaque()) {
recomputeVisibleRegions = true;
}
@@ -462,9 +465,6 @@
// FIXME: mPostedDirtyRegion = dirty & bounds
mPostedDirtyRegion.set(front.w, front.h);
- // update active buffer
- mActiveBuffer = newFrontBuffer;
-
if ((front.w != front.requested_w) ||
(front.h != front.requested_h))
{
diff --git a/services/tests/servicestests/res/raw/xt_qtaguid_extended b/services/tests/servicestests/res/raw/xt_qtaguid_extended
index 5bef3dd..2f3b4ec 100644
--- a/services/tests/servicestests/res/raw/xt_qtaguid_extended
+++ b/services/tests/servicestests/res/raw/xt_qtaguid_extended
@@ -1,3 +1,3 @@
-acct_tag_hex uid_tag_int iface rx_bytes rx_packets tx_bytes tx_packets teleported_goats
-0x0 1000 test0 1024 10 2048 20 2716057
-0x0000F00D00000000 1000 test0 512 5 512 5 3370318
+acct_tag_hex uid_tag_int iface rx_bytes rx_packets tx_bytes tx_packets teleported_goats idx
+0x0 1000 test0 1024 10 2048 20 2716057 2
+0x0000F00D00000000 1000 test0 512 5 512 5 3370318 3
diff --git a/services/tests/servicestests/res/raw/xt_qtaguid_typical b/services/tests/servicestests/res/raw/xt_qtaguid_typical
index 7c4f04e..8df4b1b 100644
--- a/services/tests/servicestests/res/raw/xt_qtaguid_typical
+++ b/services/tests/servicestests/res/raw/xt_qtaguid_typical
@@ -1,32 +1,32 @@
idx iface acct_tag_hex uid_tag_int rx_bytes tx_bytes
-1 wlan0 0x0 0 14615 4270
-2 wlan0 0x0 1000 5175 915
-3 wlan0 0x0 1021 3381 903
-4 wlan0 0x0 10004 333821 53558
-5 wlan0 0x0 10010 4888 37363
-6 wlan0 0x0 10013 52 104
-7 wlan0 0x74182ada00000000 10004 18725 1066
-8 rmnet0 0x0 0 301274 30244
-9 rmnet0 0x0 1000 304 441
-10 rmnet0 0x0 1013 2880 2272
-11 rmnet0 0x0 1021 31407 8430
-12 rmnet0 0x0 10003 32665 3814
-13 rmnet0 0x0 10004 2373141 420112
-14 rmnet0 0x0 10010 870370 1111727
-15 rmnet0 0x0 10013 240 240
-16 rmnet0 0x0 10016 16703 13512
-17 rmnet0 0x0 10017 3990 3269
-18 rmnet0 0x0 10018 474504 14516062
-19 rmnet0 0x0 10019 782804 71077
-20 rmnet0 0x0 10022 70671 49684
-21 rmnet0 0x0 10029 5785354 397159
-22 rmnet0 0x0 10033 2102 1686
-23 rmnet0 0x0 10034 15495464 227694
-24 rmnet0 0x0 10037 31184994 684122
-25 rmnet0 0x0 10051 298687 113485
-26 rmnet0 0x0 10056 29504 20669
-27 rmnet0 0x0 10069 683 596
-28 rmnet0 0x0 10072 34051 12453
-29 rmnet0 0x0 10077 7025393 213866
-30 rmnet0 0x0 10081 354 1178
-31 rmnet0 0x74182ada00000000 10037 28507378 437004
+2 wlan0 0x0 0 14615 4270
+3 wlan0 0x0 1000 5175 915
+4 wlan0 0x0 1021 3381 903
+5 wlan0 0x0 10004 333821 53558
+6 wlan0 0x0 10010 4888 37363
+7 wlan0 0x0 10013 52 104
+8 wlan0 0x74182ada00000000 10004 18725 1066
+9 rmnet0 0x0 0 301274 30244
+10 rmnet0 0x0 1000 304 441
+11 rmnet0 0x0 1013 2880 2272
+12 rmnet0 0x0 1021 31407 8430
+13 rmnet0 0x0 10003 32665 3814
+14 rmnet0 0x0 10004 2373141 420112
+15 rmnet0 0x0 10010 870370 1111727
+16 rmnet0 0x0 10013 240 240
+17 rmnet0 0x0 10016 16703 13512
+18 rmnet0 0x0 10017 3990 3269
+19 rmnet0 0x0 10018 474504 14516062
+20 rmnet0 0x0 10019 782804 71077
+21 rmnet0 0x0 10022 70671 49684
+22 rmnet0 0x0 10029 5785354 397159
+23 rmnet0 0x0 10033 2102 1686
+24 rmnet0 0x0 10034 15495464 227694
+25 rmnet0 0x0 10037 31184994 684122
+26 rmnet0 0x0 10051 298687 113485
+27 rmnet0 0x0 10056 29504 20669
+28 rmnet0 0x0 10069 683 596
+29 rmnet0 0x0 10072 34051 12453
+30 rmnet0 0x0 10077 7025393 213866
+31 rmnet0 0x0 10081 354 1178
+32 rmnet0 0x74182ada00000000 10037 28507378 437004
diff --git a/services/tests/servicestests/res/raw/xt_qtaguid_typical_with_set b/services/tests/servicestests/res/raw/xt_qtaguid_typical_with_set
index 3678b10..f9f34ac 100644
--- a/services/tests/servicestests/res/raw/xt_qtaguid_typical_with_set
+++ b/services/tests/servicestests/res/raw/xt_qtaguid_typical_with_set
@@ -1,13 +1,13 @@
idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_packets rx_tcp_bytes rx_udp_packets rx_udp_bytes rx_other_packets rx_other_bytes tx_tcp_packets tx_tcp_bytes tx_udp_packets tx_udp_bytes tx_other_packets tx_other_bytes
-1 rmnet0 0x0 0 0 14855 82 2804 47 2000 45 12799 35 56 2 676 13 2128 34 0 0
-1 rmnet0 0x0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-2 rmnet0 0x0 1000 0 278102 253 10487 182 277342 243 760 10 0 0 9727 172 760 10 0 0
-2 rmnet0 0x0 1000 1 26033 30 1401 26 25881 28 152 2 0 0 1249 24 152 2 0 0
-3 rmnet0 0x0 10012 0 40524 272 134138 293 40524 272 0 0 0 0 134138 293 0 0 0 0
-3 rmnet0 0x0 10012 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-4 rmnet0 0x0 10034 0 15791 59 9905 69 15791 59 0 0 0 0 9905 69 0 0 0 0
-4 rmnet0 0x0 10034 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-5 rmnet0 0x0 10055 0 3602 29 7739 59 3602 29 0 0 0 0 7739 59 0 0 0 0
-5 rmnet0 0x0 10055 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-6 rmnet0 0x7fff000300000000 1000 0 483 4 1931 6 483 4 0 0 0 0 1931 6 0 0 0 0
-6 rmnet0 0x7fff000300000000 1000 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+2 rmnet0 0x0 0 0 14855 82 2804 47 2000 45 12799 35 56 2 676 13 2128 34 0 0
+3 rmnet0 0x0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+4 rmnet0 0x0 1000 0 278102 253 10487 182 277342 243 760 10 0 0 9727 172 760 10 0 0
+5 rmnet0 0x0 1000 1 26033 30 1401 26 25881 28 152 2 0 0 1249 24 152 2 0 0
+6 rmnet0 0x0 10012 0 40524 272 134138 293 40524 272 0 0 0 0 134138 293 0 0 0 0
+7 rmnet0 0x0 10012 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+8 rmnet0 0x0 10034 0 15791 59 9905 69 15791 59 0 0 0 0 9905 69 0 0 0 0
+9 rmnet0 0x0 10034 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+10 rmnet0 0x0 10055 0 3602 29 7739 59 3602 29 0 0 0 0 7739 59 0 0 0 0
+11 rmnet0 0x0 10055 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+12 rmnet0 0x7fff000300000000 1000 0 483 4 1931 6 483 4 0 0 0 0 1931 6 0 0 0 0
+13 rmnet0 0x7fff000300000000 1000 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
diff --git a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
index 2a25866..ab1597c 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java
@@ -21,7 +21,6 @@
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
import static com.android.server.NetworkManagementSocketTagger.kernelToTag;
-import static com.android.server.NetworkManagementSocketTagger.tagToKernel;
import android.content.res.Resources;
import android.net.NetworkStats;
@@ -144,12 +143,6 @@
}
public void testKernelTags() throws Exception {
- assertEquals("0", tagToKernel(0x0));
- assertEquals("214748364800", tagToKernel(0x32));
- assertEquals("9223372032559808512", tagToKernel(Integer.MAX_VALUE));
- assertEquals("0", tagToKernel(Integer.MIN_VALUE));
- assertEquals("9223369837831520256", tagToKernel(Integer.MIN_VALUE - 512));
-
assertEquals(0, kernelToTag("0x0000000000000000"));
assertEquals(0x32, kernelToTag("0x0000003200000000"));
assertEquals(2147483647, kernelToTag("0x7fffffff00000000"));
diff --git a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
index e7f1d9a..2b1eea1 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
@@ -758,6 +758,7 @@
expect(mSettings.getUidMaxHistory()).andReturn(maxHistory).anyTimes();
expect(mSettings.getTagMaxHistory()).andReturn(maxHistory).anyTimes();
expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes();
+ expect(mSettings.getForceCompletePoll()).andReturn(false).anyTimes();
}
private void expectCurrentTime() throws Exception {
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index 51922da..e898aac 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -1547,6 +1547,32 @@
}
/**
+ * Checks if a given number is an emergency number for a specific country.
+ *
+ * @param number the number to look up.
+ * @param defaultCountryIso the specific country which the number should be checked against
+ * @return if the number is an emergency number for the specific country, then return true,
+ * otherwise false
+ * @hide
+ */
+ public static boolean isEmergencyNumber(String number, String defaultCountryIso) {
+ PhoneNumberUtil util = PhoneNumberUtil.getInstance();
+ try {
+ PhoneNumber pn = util.parse(number, defaultCountryIso);
+ // libphonenumber guarantees short numbers such as emergency numbers are classified as
+ // invalid. Therefore, if the number passes the validation test, we believe it is not an
+ // emergency number.
+ // TODO: Compare against a list of country-specific known emergency numbers instead, once
+ // that has been collected.
+ if (util.isValidNumber(pn)) {
+ return false;
+ }
+ } catch (NumberParseException e) {
+ }
+ return isEmergencyNumber(number);
+ }
+
+ /**
* isVoiceMailNumber: checks a given number against the voicemail
* number provided by the RIL and SIM card. The caller must have
* the READ_PHONE_STATE credential.
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
old mode 100644
new mode 100755
index c59dd3c..8ead45e
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -762,6 +762,26 @@
}
/**
+ * Returns the MSISDN string.
+ * for a GSM phone. Return null if it is unavailable.
+ * <p>
+ * Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ *
+ * @hide
+ */
+ public String getMsisdn() {
+ try {
+ return getSubscriberInfo().getMsisdn();
+ } catch (RemoteException ex) {
+ return null;
+ } catch (NullPointerException ex) {
+ // This could happen before phone restarts due to crashing
+ return null;
+ }
+ }
+
+ /**
* Returns the voice mail number. Return null if it is unavailable.
* <p>
* Requires Permission:
diff --git a/telephony/java/com/android/internal/telephony/ApnSetting.java b/telephony/java/com/android/internal/telephony/ApnSetting.java
old mode 100644
new mode 100755
index b88bcf7..002ffad9
--- a/telephony/java/com/android/internal/telephony/ApnSetting.java
+++ b/telephony/java/com/android/internal/telephony/ApnSetting.java
@@ -38,12 +38,24 @@
public final String numeric;
public final String protocol;
public final String roamingProtocol;
+ /**
+ * Current status of APN
+ * true : enabled APN, false : disabled APN.
+ */
+ public final boolean carrierEnabled;
+ /**
+ * Radio Access Technology info
+ * To check what values can hold, refer to ServiceState.java.
+ * This should be spread to other technologies,
+ * but currently only used for LTE(14) and EHRPD(13).
+ */
+ public final int bearer;
public ApnSetting(int id, String numeric, String carrier, String apn,
String proxy, String port,
String mmsc, String mmsProxy, String mmsPort,
String user, String password, int authType, String[] types,
- String protocol, String roamingProtocol) {
+ String protocol, String roamingProtocol, boolean carrierEnabled, int bearer) {
this.id = id;
this.numeric = numeric;
this.carrier = carrier;
@@ -59,6 +71,8 @@
this.types = types;
this.protocol = protocol;
this.roamingProtocol = roamingProtocol;
+ this.carrierEnabled = carrierEnabled;
+ this.bearer = bearer;
}
/**
@@ -76,8 +90,8 @@
*
* v2 format:
* [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <mmsc>, <mmsproxy>,
- * <mmsport>, <user>, <password, <authtype>, <mcc>, <mnc>,
- * <type>[| <type>...], <protocol>, <roaming_protocol>
+ * <mmsport>, <user>, <password>, <authtype>, <mcc>, <mnc>,
+ * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearer>
*
* Note that the strings generated by toString() do not contain the username
* and password and thus cannot be read by this method.
@@ -110,22 +124,32 @@
String[] typeArray;
String protocol, roamingProtocol;
+ boolean carrierEnabled;
+ int bearer;
if (version == 1) {
typeArray = new String[a.length - 13];
System.arraycopy(a, 13, typeArray, 0, a.length - 13);
protocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
roamingProtocol = RILConstants.SETUP_DATA_PROTOCOL_IP;
+ carrierEnabled = true;
+ bearer = 0;
} else {
- if (a.length < 16) {
+ if (a.length < 18) {
return null;
}
typeArray = a[13].split("\\s*\\|\\s*");
protocol = a[14];
roamingProtocol = a[15];
+ try {
+ carrierEnabled = Boolean.parseBoolean(a[16]);
+ } catch (Exception e) {
+ carrierEnabled = true;
+ }
+ bearer = Integer.parseInt(a[17]);
}
return new ApnSetting(-1,a[10]+a[11],a[0],a[1],a[2],a[3],a[7],a[8],
- a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol);
+ a[9],a[4],a[5],authType,typeArray,protocol,roamingProtocol,carrierEnabled,bearer);
}
public String toString() {
@@ -149,6 +173,8 @@
}
sb.append(", ").append(protocol);
sb.append(", ").append(roamingProtocol);
+ sb.append(", ").append(carrierEnabled);
+ sb.append(", ").append(bearer);
return sb.toString();
}
diff --git a/telephony/java/com/android/internal/telephony/CallerInfo.java b/telephony/java/com/android/internal/telephony/CallerInfo.java
index 25f8c8b..7c37a65 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfo.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfo.java
@@ -254,7 +254,9 @@
// Change the callerInfo number ONLY if it is an emergency number
// or if it is the voicemail number. If it is either, take a
// shortcut and skip the query.
- if (PhoneNumberUtils.isEmergencyNumber(number)) {
+ Locale locale = context.getResources().getConfiguration().locale;
+ String countryIso = getCurrentCountryIso(context, locale);
+ if (PhoneNumberUtils.isEmergencyNumber(number, countryIso)) {
return new CallerInfo().markAsEmergency(context);
} else if (PhoneNumberUtils.isVoiceMailNumber(number)) {
return new CallerInfo().markAsVoiceMail();
@@ -514,18 +516,8 @@
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();
- String countryIso;
Locale locale = context.getResources().getConfiguration().locale;
- CountryDetector detector = (CountryDetector) context.getSystemService(
- Context.COUNTRY_DETECTOR);
- if (detector != null) {
- countryIso = detector.detectCountry().getCountryIso();
- } else {
- countryIso = locale.getCountry();
- Log.w(TAG, "No CountryDetector; falling back to countryIso based on locale: "
- + countryIso);
- }
-
+ String countryIso = getCurrentCountryIso(context, locale);
PhoneNumber pn = null;
try {
if (VDBG) Log.v(TAG, "parsing '" + number
@@ -546,6 +538,24 @@
}
/**
+ * @return The ISO 3166-1 two letters country code of the country the user
+ * is in.
+ */
+ private static String getCurrentCountryIso(Context context, Locale locale) {
+ String countryIso;
+ CountryDetector detector = (CountryDetector) context.getSystemService(
+ Context.COUNTRY_DETECTOR);
+ if (detector != null) {
+ countryIso = detector.detectCountry().getCountryIso();
+ } else {
+ countryIso = locale.getCountry();
+ Log.w(TAG, "No CountryDetector; falling back to countryIso based on locale: "
+ + countryIso);
+ }
+ return countryIso;
+ }
+
+ /**
* @return a string debug representation of this instance.
*/
public String toString() {
diff --git a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
index 2e8a742..17734ca 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
@@ -403,7 +403,9 @@
cw.number = number;
// check to see if these are recognized numbers, and use shortcuts if we can.
- if (PhoneNumberUtils.isEmergencyNumber(number)) {
+ CountryDetector detector = (CountryDetector) context.getSystemService(
+ Context.COUNTRY_DETECTOR);
+ if (PhoneNumberUtils.isEmergencyNumber(number, detector.detectCountry().getCountryIso())) {
cw.event = EVENT_EMERGENCY_NUMBER;
} else if (PhoneNumberUtils.isVoiceMailNumber(number)) {
cw.event = EVENT_VOICEMAIL_NUMBER;
diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
old mode 100644
new mode 100755
index def770f..da0326c
--- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
@@ -54,6 +54,11 @@
String getLine1AlphaTag();
/**
+ * Retrieves MSISDN Number.
+ */
+ String getMsisdn();
+
+ /**
* Retrieves the voice mail number.
*/
String getVoiceMailNumber();
diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java
index 5e64148..444f0d2 100644
--- a/telephony/java/com/android/internal/telephony/Phone.java
+++ b/telephony/java/com/android/internal/telephony/Phone.java
@@ -932,7 +932,8 @@
boolean getCallForwardingIndicator();
/**
- * Get the line 1 phone number (MSISDN).<p>
+ * Get the line 1 phone number (MSISDN). For CDMA phones, the MDN is returned
+ * and {@link #getMsisdn()} will return the MSISDN on CDMA/LTE phones.<p>
*
* @return phone number. May return null if not
* available or the SIM is not ready
@@ -1432,6 +1433,13 @@
String getMeid();
/**
+ * Retrieves the MSISDN from the UICC. For GSM/UMTS phones, this is equivalent to
+ * {@link #getLine1Number()}. For CDMA phones, {@link #getLine1Number()} returns
+ * the MDN, so this method is provided to return the MSISDN on CDMA/LTE phones.
+ */
+ String getMsisdn();
+
+ /**
* Retrieves IMEI for phones. Returns null if IMEI is not set.
*/
String getImei();
diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java
index 4f86ea8..82f3955 100644
--- a/telephony/java/com/android/internal/telephony/PhoneBase.java
+++ b/telephony/java/com/android/internal/telephony/PhoneBase.java
@@ -1124,6 +1124,11 @@
Log.e(LOG_TAG, "requestIsimAuthentication() is only supported on LTE devices");
}
+ public String getMsisdn() {
+ logUnexpectedGsmMethodCall("getMsisdn");
+ return null;
+ }
+
/**
* Common error logger method for unexpected calls to CDMA-only methods.
*/
diff --git a/telephony/java/com/android/internal/telephony/PhoneProxy.java b/telephony/java/com/android/internal/telephony/PhoneProxy.java
index 3678017..e0e8d49 100644
--- a/telephony/java/com/android/internal/telephony/PhoneProxy.java
+++ b/telephony/java/com/android/internal/telephony/PhoneProxy.java
@@ -686,6 +686,10 @@
return mActivePhone.getMeid();
}
+ public String getMsisdn() {
+ return mActivePhone.getMsisdn();
+ }
+
public String getImei() {
return mActivePhone.getImei();
}
diff --git a/telephony/java/com/android/internal/telephony/PhoneSubInfo.java b/telephony/java/com/android/internal/telephony/PhoneSubInfo.java
old mode 100644
new mode 100755
index de18d0a..e8449ce
--- a/telephony/java/com/android/internal/telephony/PhoneSubInfo.java
+++ b/telephony/java/com/android/internal/telephony/PhoneSubInfo.java
@@ -105,6 +105,14 @@
}
/**
+ * Retrieves the MSISDN string.
+ */
+ public String getMsisdn() {
+ mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
+ return mPhone.getMsisdn();
+ }
+
+ /**
* Retrieves the voice mail number.
*/
public String getVoiceMailNumber() {
diff --git a/telephony/java/com/android/internal/telephony/PhoneSubInfoProxy.java b/telephony/java/com/android/internal/telephony/PhoneSubInfoProxy.java
old mode 100644
new mode 100755
index a287b2e..bd130de
--- a/telephony/java/com/android/internal/telephony/PhoneSubInfoProxy.java
+++ b/telephony/java/com/android/internal/telephony/PhoneSubInfoProxy.java
@@ -75,6 +75,13 @@
}
/**
+ * Retrieves the MSISDN Number.
+ */
+ public String getMsisdn() {
+ return mPhoneSubInfo.getMsisdn();
+ }
+
+ /**
* Retrieves the voice mail number.
*/
public String getVoiceMailNumber() {
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
index f4ed91d..6903025 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
@@ -141,6 +141,11 @@
}
@Override
+ public String getMsisdn() {
+ return mIccRecords.getMsisdnNumber();
+ }
+
+ @Override
public void requestIsimAuthentication(String nonce, Message result) {
mCM.requestIsimAuthentication(nonce, result);
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index a728d0a..078e51d 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -338,7 +338,7 @@
apnId = mDefaultApnId;
}
mActiveApn = new ApnSetting(apnId, "", "", "", "", "", "", "", "", "",
- "", 0, types, "IP", "IP");
+ "", 0, types, "IP", "IP", true, 0);
if (DBG) log("call conn.bringUp mActiveApn=" + mActiveApn);
Message msg = obtainMessage();
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaLteUiccRecords.java b/telephony/java/com/android/internal/telephony/cdma/CdmaLteUiccRecords.java
index c4fa6f6..0617fee 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaLteUiccRecords.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaLteUiccRecords.java
@@ -19,6 +19,7 @@
import android.os.SystemProperties;
import android.util.Log;
+import com.android.internal.telephony.AdnRecordLoader;
import com.android.internal.telephony.GsmAlphabet;
import com.android.internal.telephony.IccCardApplication.AppType;
import com.android.internal.telephony.IccFileHandler;
@@ -276,6 +277,10 @@
obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfPlLoaded()));
recordsToLoad++;
+ new AdnRecordLoader(phone).loadFromEF(EF_MSISDN, EF_EXT1, 1,
+ obtainMessage(EVENT_GET_MSISDN_DONE));
+ recordsToLoad++;
+
iccFh.loadEFTransparent(EF_CSIM_LI,
obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimLiLoaded()));
recordsToLoad++;
diff --git a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
index 1db9860..d325aaa 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
@@ -877,6 +877,11 @@
return mIccRecords.getMsisdnNumber();
}
+ @Override
+ public String getMsisdn() {
+ return mIccRecords.getMsisdnNumber();
+ }
+
public String getLine1AlphaTag() {
return mIccRecords.getMsisdnAlphaTag();
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 4e43fcd..6d0b696 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -115,7 +115,6 @@
static final Uri PREFERAPN_URI = Uri.parse("content://telephony/carriers/preferapn");
static final String APN_ID = "apn_id";
private boolean canSetPreferApn = false;
- private boolean mRadioAvailable = false;
@Override
protected void onActionIntentReconnectAlarm(Intent intent) {
@@ -890,7 +889,10 @@
types,
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)),
cursor.getString(cursor.getColumnIndexOrThrow(
- Telephony.Carriers.ROAMING_PROTOCOL)));
+ Telephony.Carriers.ROAMING_PROTOCOL)),
+ cursor.getInt(cursor.getColumnIndexOrThrow(
+ Telephony.Carriers.CARRIER_ENABLED)) == 1,
+ cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.BEARER)));
result.add(apn);
} while (cursor.moveToNext());
}
@@ -1572,7 +1574,7 @@
private void onRecordsLoaded() {
if (DBG) log("onRecordsLoaded: createAllApnList");
createAllApnList();
- if (mRadioAvailable) {
+ if (mPhone.mCM.getRadioState().isOn()) {
if (DBG) log("onRecordsLoaded: notifying data availability");
notifyDataAvailability(Phone.REASON_SIM_LOADED);
}
@@ -1706,7 +1708,6 @@
@Override
protected void onRadioAvailable() {
if (DBG) log("onRadioAvailable");
- mRadioAvailable = true;
if (mPhone.getSimulatedRadioControl() != null) {
// Assume data is connected on the simulator
// FIXME this can be improved
@@ -1734,7 +1735,6 @@
dc.resetRetryCount();
}
mReregisterOnReconnectFailure = false;
- mRadioAvailable = false;
if (mPhone.getSimulatedRadioControl() != null) {
// Assume data is connected on the simulator
@@ -1985,6 +1985,9 @@
String operator = mPhone.mIccRecords.getOperatorNumeric();
if (operator != null) {
String selection = "numeric = '" + operator + "'";
+ // query only enabled apn.
+ // carrier_enabled : 1 means enabled apn, 0 disabled apn.
+ selection += " and carrier_enabled = 1";
if (DBG) log("createAllApnList: selection=" + selection);
Cursor cursor = mPhone.getContext().getContentResolver().query(
@@ -2072,6 +2075,18 @@
}
/**
+ * Check current radio access technology is LTE or EHRPD.
+ *
+ * @param integer value of radio access technology
+ * @return true when current radio access technology is LTE or EHRPD
+ * @ false when current radio access technology is not LTE or EHRPD
+ */
+ private boolean needToCheckApnBearer(int radioTech) {
+ return (radioTech == ServiceState.RADIO_TECHNOLOGY_LTE ||
+ radioTech == ServiceState.RADIO_TECHNOLOGY_EHRPD);
+ }
+
+ /**
* Build a list of APNs to be used to create PDP's.
*
* @param requestedApnType
@@ -2091,6 +2106,9 @@
}
String operator = mPhone.mIccRecords.getOperatorNumeric();
+ int radioTech = mPhone.getServiceState().getRadioTechnology();
+ boolean needToCheckApnBearer = needToCheckApnBearer(radioTech);
+
if (requestedApnType.equals(Phone.APN_TYPE_DEFAULT)) {
if (canSetPreferApn && mPreferredApn != null) {
if (DBG) {
@@ -2098,9 +2116,15 @@
+ mPreferredApn.numeric + ":" + mPreferredApn);
}
if (mPreferredApn.numeric.equals(operator)) {
- apnList.add(mPreferredApn);
- if (DBG) log("buildWaitingApns: X added preferred apnList=" + apnList);
- return apnList;
+ if (!needToCheckApnBearer || mPreferredApn.bearer == radioTech) {
+ apnList.add(mPreferredApn);
+ if (DBG) log("buildWaitingApns: X added preferred apnList=" + apnList);
+ return apnList;
+ } else {
+ if (DBG) log("buildWaitingApns: no preferred APN");
+ setPreferredApn(-1);
+ mPreferredApn = null;
+ }
} else {
if (DBG) log("buildWaitingApns: no preferred APN");
setPreferredApn(-1);
@@ -2111,7 +2135,10 @@
if (mAllApns != null) {
for (ApnSetting apn : mAllApns) {
if (apn.canHandleType(requestedApnType)) {
- apnList.add(apn);
+ if (!needToCheckApnBearer || apn.bearer == radioTech) {
+ if (DBG) log("apn info : " +apn.toString());
+ apnList.add(apn);
+ }
}
}
} else {
diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
index d84715e..73c319c 100755
--- a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
@@ -127,7 +127,7 @@
private static final int EVENT_GET_MWIS_DONE = 7;
private static final int EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE = 8;
protected static final int EVENT_GET_AD_DONE = 9; // Admin data on SIM
- private static final int EVENT_GET_MSISDN_DONE = 10;
+ protected static final int EVENT_GET_MSISDN_DONE = 10;
private static final int EVENT_GET_CPHS_MAILBOX_DONE = 11;
private static final int EVENT_GET_SPN_DONE = 12;
private static final int EVENT_GET_SPDI_DONE = 13;
diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java
old mode 100644
new mode 100755
index 1032074..ac8c4c16
--- a/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java
+++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/ApnSettingTest.java
@@ -44,6 +44,8 @@
for (i = 0; i < a1.types.length; i++) {
assertEquals(a1.types[i], a2.types[i]);
}
+ assertEquals(a1.carrierEnabled, a2.carrierEnabled);
+ assertEquals(a1.bearer, a2.bearer);
}
@SmallTest
@@ -58,21 +60,21 @@
testString = "Vodafone IT,web.omnitel.it,,,,,,,,,222,10,,DUN";
expected_apn = new ApnSetting(
-1, "22210", "Vodafone IT", "web.omnitel.it", "", "",
- "", "", "", "", "", 0, dunTypes, "IP", "IP");
+ "", "", "", "", "", 0, dunTypes, "IP", "IP",true,0);
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// A v2 string.
- testString = "[ApnSettingV2] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP";
+ testString = "[ApnSettingV2] Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,14";
expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "",
- "", "", "", "", "", 0, mmsTypes, "IPV6", "IP");
+ "", "", "", "", "", 0, mmsTypes, "IPV6", "IP",true,14);
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// A v2 string with spaces.
- testString = "[ApnSettingV2] Name,apn, ,,,,,,,,123,45,,mms|*,IPV4V6, IP";
+ testString = "[ApnSettingV2] Name,apn, ,,,,,,,,123,45,,mms|*,IPV4V6, IP,true,14";
expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "",
- "", "", "", "", "", 0, mmsTypes, "IPV4V6", "IP");
+ "", "", "", "", "", 0, mmsTypes, "IPV4V6", "IP",true,14);
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
// Return null if insufficient fields given.
@@ -83,11 +85,11 @@
assertEquals(null, ApnSetting.fromString(testString));
// Parse (incorrect) V2 format without the tag as V1.
- testString = "Name,apn,,,,,,,,,123, 45,,mms|*,IPV6";
+ testString = "Name,apn,,,,,,,,,123, 45,,mms|*,IPV6,true,14";
String[] incorrectTypes = {"mms|*", "IPV6"};
expected_apn = new ApnSetting(
-1, "12345", "Name", "apn", "", "",
- "", "", "", "", "", 0, incorrectTypes, "IP", "IP");
+ "", "", "", "", "", 0, incorrectTypes, "IP", "IP",true,14);
assertApnSettingEqual(expected_apn, ApnSetting.fromString(testString));
}
@@ -98,11 +100,10 @@
ApnSetting apn = new ApnSetting(
99, "12345", "Name", "apn", "proxy", "port",
"mmsc", "mmsproxy", "mmsport", "user", "password", 0,
- types, "IPV4V6", "IP");
+ types, "IPV4V6", "IP", true, 14);
String expected = "[ApnSettingV2] Name, 99, 12345, apn, proxy, " +
"mmsc, mmsproxy, mmsport, port, 0, default | *, " +
- "IPV4V6, IP";
+ "IPV4V6, IP, true, 14";
assertEquals(expected, apn.toString());
}
}
-
diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
index 6e9d0f9d..d3e4b78 100644
--- a/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
+++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
@@ -536,4 +536,20 @@
// The given number was formatted.
assertEquals("650-291-0000", PhoneNumberUtils.formatNumber("650-291-0000", null, "US"));
}
+ @SmallTest
+ public void testIsEmergencyNumber() {
+ assertTrue(PhoneNumberUtils.isEmergencyNumber("911", "US"));
+ assertTrue(PhoneNumberUtils.isEmergencyNumber("112", "US"));
+ // The next two numbers are not valid phone numbers in the US, but can be used to trick the
+ // system to dial 911 and 112, which are emergency numbers in the US. For the purpose of
+ // addressing that, they are also classified as emergency numbers in the US.
+ assertTrue(PhoneNumberUtils.isEmergencyNumber("91112345", "US"));
+ assertTrue(PhoneNumberUtils.isEmergencyNumber("11212345", "US"));
+ // A valid mobile phone number from Singapore shouldn't be classified as an emergency number
+ // in Singapore, as 911 is not an emergency number there.
+ assertFalse(PhoneNumberUtils.isEmergencyNumber("91121234", "SG"));
+ // A valid fixed-line phone number from Brazil shouldn't be classified as an emergency number
+ // in Brazil, as 112 is not an emergency number there.
+ assertFalse(PhoneNumberUtils.isEmergencyNumber("1121234567", "BR"));
+ }
}
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index 501c219..f2fb36f 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -38,6 +38,7 @@
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.content.pm.ManifestDigest;
+import android.content.pm.VerifierDeviceIdentity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
@@ -552,4 +553,12 @@
public void verifyPendingInstall(int id, boolean verified, String failureMessage) {
throw new UnsupportedOperationException();
}
+
+ /**
+ * @hide
+ */
+ @Override
+ public VerifierDeviceIdentity getVerifierDeviceIdentity() {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java b/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
index 637f0d2..54adc249 100644
--- a/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
+++ b/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
@@ -76,7 +76,7 @@
Long.MAX_VALUE, false);
reportStats(stats);
} catch (RemoteException e) {
- Log.w(LOG_TAG, "Failed to fetch network stats for wifi.");
+ Log.w(LOG_TAG, "Failed to fetch network stats.");
}
}
@@ -85,16 +85,22 @@
* @param stats {@link NetworkorStats} to print
*/
void reportStats(NetworkStats stats) {
+ Bundle result = new Bundle();
+ long rxBytes = 0;
+ long txBytes = 0;
for (int i = 0; i < stats.size(); ++i) {
+ // Label will be iface_uid_tag_set
Entry statsEntry = stats.getValues(i, null);
- Bundle result = new Bundle();
- result.putInt("uid", statsEntry.uid);
- result.putInt("tag", statsEntry.tag);
- result.putInt("set", statsEntry.set);
- result.putString("iface", statsEntry.iface);
- result.putLong("rxBytes", statsEntry.rxBytes);
- result.putLong("txBytes", statsEntry.txBytes);
- getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, result);
+ String labelTemplate = String.format("%s_%d_%d_%d", statsEntry.iface, statsEntry.uid,
+ statsEntry.tag, statsEntry.set) + "_%s";
+ result.putLong(String.format(labelTemplate, "rxBytes"), statsEntry.rxBytes);
+ result.putLong(String.format(labelTemplate, "txBytes"), statsEntry.txBytes);
+ rxBytes += statsEntry.rxBytes;
+ txBytes += statsEntry.txBytes;
}
+ result.putLong("Total rxBytes", rxBytes);
+ result.putLong("Total txBytes", txBytes);
+ getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, result);
+
}
}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
index f8c32dd..4ba2e18 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
@@ -286,11 +286,23 @@
mWebView.stopLoading();
}
+
+ //TODO: remove. this is temporary for bug investigation
+ @Override
+ public void finish() {
+ Exception e = new Exception("finish() call stack");
+ Log.d(LOGTAG, "finish stack trace", e);
+ super.finish();
+ }
+
@Override
protected void onDestroy() {
- super.onDestroy();
+ //TODO: remove exception log. this is temporary for bug investigation
+ Exception e = new Exception("onDestroy stack trace");
+ Log.d(LOGTAG, "onDestroy stack trace", e);
mWebView.destroy();
mWebView = null;
+ super.onDestroy();
}
@Override
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/horizontal_blur.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/horizontal_blur.rs
index 45eea5e..86479d5 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/horizontal_blur.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/horizontal_blur.rs
@@ -2,29 +2,26 @@
#include "ip.rsh"
-void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
- float4 *output = (float4 *)v_out;
+void root(float4 *out, const void *usrData, uint32_t x, uint32_t y) {
const FilterStruct *fs = (const FilterStruct *)usrData;
- const float4 *input = (const float4 *)rsGetElementAt(fs->ain, 0, y);
-
float3 blurredPixel = 0;
const float *gPtr = fs->gaussian;
if ((x > fs->radius) && (x < (fs->width - fs->radius))) {
- const float4 *i = input + (x - fs->radius);
for (int r = -fs->radius; r <= fs->radius; r ++) {
+ const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x + r, y);
blurredPixel += i->xyz * gPtr[0];
gPtr++;
- i++;
}
} else {
for (int r = -fs->radius; r <= fs->radius; r ++) {
// Stepping left and right away from the pixel
- int validW = rsClamp((int)x + r, (int)0, (int)(fs->width - 1));
- blurredPixel += input[validW].xyz * gPtr[0];
+ int validX = rsClamp((int)x + r, (int)0, (int)(fs->width - 1));
+ const float4 *i = (const float4 *)rsGetElementAt(fs->ain, validX, y);
+ blurredPixel += i->xyz * gPtr[0];
gPtr++;
}
}
- output->xyz = blurredPixel;
+ out->xyz = blurredPixel;
}
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vertical_blur.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vertical_blur.rs
index 6b0cde0..8b07bc2 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vertical_blur.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vertical_blur.rs
@@ -55,27 +55,20 @@
gamma = (float3)g;
}
-//sliao
-extern uchar3 __attribute__((overloadable)) convert2uchar3(float3 xyz);
-
-void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
- uchar4 *output = (uchar4 *)v_out;
+void root(uchar4 *out, const void *usrData, uint32_t x, uint32_t y) {
const FilterStruct *fs = (const FilterStruct *)usrData;
- const float4 *input = (const float4 *)rsGetElementAt(fs->ain, x, 0);
-
float3 blurredPixel = 0;
const float *gPtr = fs->gaussian;
if ((y > fs->radius) && (y < (fs->height - fs->radius))) {
- const float4 *i = input + ((y - fs->radius) * fs->width);
for (int r = -fs->radius; r <= fs->radius; r ++) {
+ const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x, y + r);
blurredPixel += i->xyz * gPtr[0];
gPtr++;
- i += fs->width;
}
} else {
for (int r = -fs->radius; r <= fs->radius; r ++) {
int validH = rsClamp((int)y + r, (int)0, (int)(fs->height - 1));
- const float4 *i = input + validH * fs->width;
+ const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x, validH);
blurredPixel += i->xyz * gPtr[0];
gPtr++;
}
@@ -87,7 +80,7 @@
temp = pow(temp, (float3)gamma);
temp = clamp(temp * outWMinOutB + outBlack, 0.f, 255.f);
- output->xyz = convert_uchar3(temp);
+ out->xyz = convert_uchar3(temp);
//output->w = input->w;
}
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/math.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/math.rs
index 8cad82b..aae29a4 100644
--- a/tests/RenderScriptTests/tests/src/com/android/rs/test/math.rs
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/math.rs
@@ -37,162 +37,6 @@
volatile uchar3 uc3;
volatile uchar4 uc4;
-#define TEST_FN_FUNC_FN(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1); \
- f2 = fnc(f2); \
- f3 = fnc(f3); \
- f4 = fnc(f4);
-
-#define TEST_FN_FUNC_FN_PFN(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1, (float*) &f1); \
- f2 = fnc(f2, (float2*) &f2); \
- f3 = fnc(f3, (float3*) &f3); \
- f4 = fnc(f4, (float4*) &f4);
-
-#define TEST_FN_FUNC_FN_FN(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1, f1); \
- f2 = fnc(f2, f2); \
- f3 = fnc(f3, f3); \
- f4 = fnc(f4, f4);
-
-#define TEST_FN_FUNC_FN_F(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1, f1); \
- f2 = fnc(f2, f1); \
- f3 = fnc(f3, f1); \
- f4 = fnc(f4, f1);
-
-#define TEST_FN_FUNC_FN_IN(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1, i1); \
- f2 = fnc(f2, i2); \
- f3 = fnc(f3, i3); \
- f4 = fnc(f4, i4);
-
-#define TEST_FN_FUNC_FN_I(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1, i1); \
- f2 = fnc(f2, i1); \
- f3 = fnc(f3, i1); \
- f4 = fnc(f4, i1);
-
-#define TEST_FN_FUNC_FN_FN_FN(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1, f1, f1); \
- f2 = fnc(f2, f2, f2); \
- f3 = fnc(f3, f3, f3); \
- f4 = fnc(f4, f4, f4);
-
-#define TEST_FN_FUNC_FN_PIN(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1, (int*) &i1); \
- f2 = fnc(f2, (int2*) &i2); \
- f3 = fnc(f3, (int3*) &i3); \
- f4 = fnc(f4, (int4*) &i4);
-
-#define TEST_FN_FUNC_FN_FN_PIN(fnc) \
- rsDebug("Testing " #fnc, 0); \
- f1 = fnc(f1, f1, (int*) &i1); \
- f2 = fnc(f2, f2, (int2*) &i2); \
- f3 = fnc(f3, f3, (int3*) &i3); \
- f4 = fnc(f4, f4, (int4*) &i4);
-
-#define TEST_IN_FUNC_FN(fnc) \
- rsDebug("Testing " #fnc, 0); \
- i1 = fnc(f1); \
- i2 = fnc(f2); \
- i3 = fnc(f3); \
- i4 = fnc(f4);
-
-
-static bool test_fp_math(uint32_t index) {
- bool failed = false;
- start();
-
- TEST_FN_FUNC_FN(acos);
- TEST_FN_FUNC_FN(acosh);
- TEST_FN_FUNC_FN(acospi);
- TEST_FN_FUNC_FN(asin);
- TEST_FN_FUNC_FN(asinh);
- TEST_FN_FUNC_FN(asinpi);
- TEST_FN_FUNC_FN(atan);
- TEST_FN_FUNC_FN_FN(atan2);
- TEST_FN_FUNC_FN(atanh);
- TEST_FN_FUNC_FN(atanpi);
- TEST_FN_FUNC_FN_FN(atan2pi);
- TEST_FN_FUNC_FN(cbrt);
- TEST_FN_FUNC_FN(ceil);
- TEST_FN_FUNC_FN_FN(copysign);
- TEST_FN_FUNC_FN(cos);
- TEST_FN_FUNC_FN(cosh);
- TEST_FN_FUNC_FN(cospi);
- TEST_FN_FUNC_FN(erfc);
- TEST_FN_FUNC_FN(erf);
- TEST_FN_FUNC_FN(exp);
- TEST_FN_FUNC_FN(exp2);
- TEST_FN_FUNC_FN(exp10);
- TEST_FN_FUNC_FN(expm1);
- TEST_FN_FUNC_FN(fabs);
- TEST_FN_FUNC_FN_FN(fdim);
- TEST_FN_FUNC_FN(floor);
- TEST_FN_FUNC_FN_FN_FN(fma);
- TEST_FN_FUNC_FN_FN(fmax);
- TEST_FN_FUNC_FN_F(fmax);
- TEST_FN_FUNC_FN_FN(fmin);
- TEST_FN_FUNC_FN_F(fmin);
- TEST_FN_FUNC_FN_FN(fmod);
- TEST_FN_FUNC_FN_PFN(fract);
- TEST_FN_FUNC_FN_PIN(frexp);
- TEST_FN_FUNC_FN_FN(hypot);
- TEST_IN_FUNC_FN(ilogb);
- TEST_FN_FUNC_FN_IN(ldexp);
- TEST_FN_FUNC_FN_I(ldexp);
- TEST_FN_FUNC_FN(lgamma);
- TEST_FN_FUNC_FN_PIN(lgamma);
- TEST_FN_FUNC_FN(log);
- TEST_FN_FUNC_FN(log2);
- TEST_FN_FUNC_FN(log10);
- TEST_FN_FUNC_FN(log1p);
- TEST_FN_FUNC_FN(logb);
- TEST_FN_FUNC_FN_FN_FN(mad);
- TEST_FN_FUNC_FN_PFN(modf);
- // nan
- TEST_FN_FUNC_FN_FN(nextafter);
- TEST_FN_FUNC_FN_FN(pow);
- TEST_FN_FUNC_FN_IN(pown);
- TEST_FN_FUNC_FN_FN(powr);
- TEST_FN_FUNC_FN_FN(remainder);
- TEST_FN_FUNC_FN_FN_PIN(remquo);
- TEST_FN_FUNC_FN(rint);
- TEST_FN_FUNC_FN_IN(rootn);
- TEST_FN_FUNC_FN(round);
- TEST_FN_FUNC_FN(rsqrt);
- TEST_FN_FUNC_FN(sin);
- TEST_FN_FUNC_FN_PFN(sincos);
- TEST_FN_FUNC_FN(sinh);
- TEST_FN_FUNC_FN(sinpi);
- TEST_FN_FUNC_FN(sqrt);
- TEST_FN_FUNC_FN(tan);
- TEST_FN_FUNC_FN(tanh);
- TEST_FN_FUNC_FN(tanpi);
- TEST_FN_FUNC_FN(tgamma);
- TEST_FN_FUNC_FN(trunc);
-
- float time = end(index);
-
- if (failed) {
- rsDebug("test_fp_math FAILED", time);
- }
- else {
- rsDebug("test_fp_math PASSED", time);
- }
-
- return failed;
-}
-
#define DECL_INT(prefix) \
volatile char prefix##_c_1 = 1; \
volatile char2 prefix##_c_2 = 1; \
@@ -221,6 +65,10 @@
volatile long prefix##_l_1 = 1; \
volatile ulong prefix##_ul_1 = 1;
+DECL_INT(res)
+DECL_INT(src1)
+DECL_INT(src2)
+
#define TEST_INT_OP_TYPE(op, type) \
rsDebug("Testing " #op " for " #type "1", i++); \
res_##type##_1 = src1_##type##_1 op src2_##type##_1; \
@@ -243,9 +91,274 @@
rsDebug("Testing " #op " for ul1", i++); \
res_ul_1 = src1_ul_1 op src2_ul_1;
-DECL_INT(res)
-DECL_INT(src1)
-DECL_INT(src2)
+#define TEST_XN_FUNC_YN(typeout, fnc, typein) \
+ res_##typeout##_1 = fnc(src1_##typein##_1); \
+ res_##typeout##_2 = fnc(src1_##typein##_2); \
+ res_##typeout##_3 = fnc(src1_##typein##_3); \
+ res_##typeout##_4 = fnc(src1_##typein##_4);
+
+#define TEST_XN_FUNC_XN_XN(type, fnc) \
+ res_##type##_1 = fnc(src1_##type##_1, src2_##type##_1); \
+ res_##type##_2 = fnc(src1_##type##_2, src2_##type##_2); \
+ res_##type##_3 = fnc(src1_##type##_3, src2_##type##_3); \
+ res_##type##_4 = fnc(src1_##type##_4, src2_##type##_4);
+
+#define TEST_X_FUNC_X_X_X(type, fnc) \
+ res_##type##_1 = fnc(src1_##type##_1, src2_##type##_1, src2_##type##_1);
+
+#define TEST_IN_FUNC_IN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ TEST_XN_FUNC_YN(uc, fnc, uc) \
+ TEST_XN_FUNC_YN(c, fnc, c) \
+ TEST_XN_FUNC_YN(us, fnc, us) \
+ TEST_XN_FUNC_YN(s, fnc, s) \
+ TEST_XN_FUNC_YN(ui, fnc, ui) \
+ TEST_XN_FUNC_YN(i, fnc, i)
+
+#define TEST_UIN_FUNC_IN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ TEST_XN_FUNC_YN(uc, fnc, c) \
+ TEST_XN_FUNC_YN(us, fnc, s) \
+ TEST_XN_FUNC_YN(ui, fnc, i) \
+
+#define TEST_IN_FUNC_IN_IN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ TEST_XN_FUNC_XN_XN(uc, fnc) \
+ TEST_XN_FUNC_XN_XN(c, fnc) \
+ TEST_XN_FUNC_XN_XN(us, fnc) \
+ TEST_XN_FUNC_XN_XN(s, fnc) \
+ TEST_XN_FUNC_XN_XN(ui, fnc) \
+ TEST_XN_FUNC_XN_XN(i, fnc)
+
+#define TEST_I_FUNC_I_I_I(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ TEST_X_FUNC_X_X_X(uc, fnc) \
+ TEST_X_FUNC_X_X_X(c, fnc) \
+ TEST_X_FUNC_X_X_X(us, fnc) \
+ TEST_X_FUNC_X_X_X(s, fnc) \
+ TEST_X_FUNC_X_X_X(ui, fnc) \
+ TEST_X_FUNC_X_X_X(i, fnc)
+
+#define TEST_FN_FUNC_FN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1); \
+ f2 = fnc(f2); \
+ f3 = fnc(f3); \
+ f4 = fnc(f4);
+
+#define TEST_FN_FUNC_FN_PFN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, (float*) &f1); \
+ f2 = fnc(f2, (float2*) &f2); \
+ f3 = fnc(f3, (float3*) &f3); \
+ f4 = fnc(f4, (float4*) &f4);
+
+#define TEST_FN_FUNC_FN_FN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, f1); \
+ f2 = fnc(f2, f2); \
+ f3 = fnc(f3, f3); \
+ f4 = fnc(f4, f4);
+
+#define TEST_F34_FUNC_F34_F34(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f3 = fnc(f3, f3); \
+ f4 = fnc(f4, f4);
+
+#define TEST_FN_FUNC_FN_F(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, f1); \
+ f2 = fnc(f2, f1); \
+ f3 = fnc(f3, f1); \
+ f4 = fnc(f4, f1);
+
+#define TEST_F_FUNC_FN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1); \
+ f1 = fnc(f2); \
+ f1 = fnc(f3); \
+ f1 = fnc(f4);
+
+#define TEST_F_FUNC_FN_FN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, f1); \
+ f1 = fnc(f2, f2); \
+ f1 = fnc(f3, f3); \
+ f1 = fnc(f4, f4);
+
+#define TEST_FN_FUNC_FN_IN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, i1); \
+ f2 = fnc(f2, i2); \
+ f3 = fnc(f3, i3); \
+ f4 = fnc(f4, i4);
+
+#define TEST_FN_FUNC_FN_I(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, i1); \
+ f2 = fnc(f2, i1); \
+ f3 = fnc(f3, i1); \
+ f4 = fnc(f4, i1);
+
+#define TEST_FN_FUNC_FN_FN_FN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, f1, f1); \
+ f2 = fnc(f2, f2, f2); \
+ f3 = fnc(f3, f3, f3); \
+ f4 = fnc(f4, f4, f4);
+
+#define TEST_FN_FUNC_FN_FN_F(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, f1, f1); \
+ f2 = fnc(f2, f1, f1); \
+ f3 = fnc(f3, f1, f1); \
+ f4 = fnc(f4, f1, f1);
+
+#define TEST_FN_FUNC_FN_PIN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, (int*) &i1); \
+ f2 = fnc(f2, (int2*) &i2); \
+ f3 = fnc(f3, (int3*) &i3); \
+ f4 = fnc(f4, (int4*) &i4);
+
+#define TEST_FN_FUNC_FN_FN_PIN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ f1 = fnc(f1, f1, (int*) &i1); \
+ f2 = fnc(f2, f2, (int2*) &i2); \
+ f3 = fnc(f3, f3, (int3*) &i3); \
+ f4 = fnc(f4, f4, (int4*) &i4);
+
+#define TEST_IN_FUNC_FN(fnc) \
+ rsDebug("Testing " #fnc, 0); \
+ i1 = fnc(f1); \
+ i2 = fnc(f2); \
+ i3 = fnc(f3); \
+ i4 = fnc(f4);
+
+static bool test_fp_math(uint32_t index) {
+ bool failed = false;
+ start();
+
+ TEST_FN_FUNC_FN(acos);
+ TEST_FN_FUNC_FN(acosh);
+ TEST_FN_FUNC_FN(acospi);
+ TEST_FN_FUNC_FN(asin);
+ TEST_FN_FUNC_FN(asinh);
+ TEST_FN_FUNC_FN(asinpi);
+ TEST_FN_FUNC_FN(atan);
+ TEST_FN_FUNC_FN_FN(atan2);
+ TEST_FN_FUNC_FN(atanh);
+ TEST_FN_FUNC_FN(atanpi);
+ TEST_FN_FUNC_FN_FN(atan2pi);
+ TEST_FN_FUNC_FN(cbrt);
+ TEST_FN_FUNC_FN(ceil);
+ TEST_FN_FUNC_FN_FN_FN(clamp);
+ TEST_FN_FUNC_FN_FN_F(clamp);
+ TEST_FN_FUNC_FN_FN(copysign);
+ TEST_FN_FUNC_FN(cos);
+ TEST_FN_FUNC_FN(cosh);
+ TEST_FN_FUNC_FN(cospi);
+ TEST_F34_FUNC_F34_F34(cross);
+ TEST_FN_FUNC_FN(degrees);
+ TEST_F_FUNC_FN_FN(distance);
+ TEST_F_FUNC_FN_FN(dot);
+ TEST_FN_FUNC_FN(erfc);
+ TEST_FN_FUNC_FN(erf);
+ TEST_FN_FUNC_FN(exp);
+ TEST_FN_FUNC_FN(exp2);
+ TEST_FN_FUNC_FN(exp10);
+ TEST_FN_FUNC_FN(expm1);
+ TEST_FN_FUNC_FN(fabs);
+ TEST_FN_FUNC_FN_FN(fdim);
+ TEST_FN_FUNC_FN(floor);
+ TEST_FN_FUNC_FN_FN_FN(fma);
+ TEST_FN_FUNC_FN_FN(fmax);
+ TEST_FN_FUNC_FN_F(fmax);
+ TEST_FN_FUNC_FN_FN(fmin);
+ TEST_FN_FUNC_FN_F(fmin);
+ TEST_FN_FUNC_FN_FN(fmod);
+ TEST_FN_FUNC_FN_PFN(fract);
+ TEST_FN_FUNC_FN_PIN(frexp);
+ TEST_FN_FUNC_FN_FN(hypot);
+ TEST_IN_FUNC_FN(ilogb);
+ TEST_FN_FUNC_FN_IN(ldexp);
+ TEST_FN_FUNC_FN_I(ldexp);
+ TEST_F_FUNC_FN(length);
+ TEST_FN_FUNC_FN(lgamma);
+ TEST_FN_FUNC_FN_PIN(lgamma);
+ TEST_FN_FUNC_FN(log);
+ TEST_FN_FUNC_FN(log2);
+ TEST_FN_FUNC_FN(log10);
+ TEST_FN_FUNC_FN(log1p);
+ TEST_FN_FUNC_FN(logb);
+ TEST_FN_FUNC_FN_FN_FN(mad);
+ TEST_FN_FUNC_FN_FN(max);
+ TEST_FN_FUNC_FN_F(max);
+ TEST_FN_FUNC_FN_FN(min);
+ TEST_FN_FUNC_FN_F(min);
+ TEST_FN_FUNC_FN_FN_FN(mix);
+ TEST_FN_FUNC_FN_FN_F(mix);
+ TEST_FN_FUNC_FN_PFN(modf);
+ // nan
+ TEST_FN_FUNC_FN_FN(nextafter);
+ TEST_FN_FUNC_FN(normalize);
+ TEST_FN_FUNC_FN_FN(pow);
+ TEST_FN_FUNC_FN_IN(pown);
+ TEST_FN_FUNC_FN_FN(powr);
+ TEST_FN_FUNC_FN(radians);
+ TEST_FN_FUNC_FN_FN(remainder);
+ TEST_FN_FUNC_FN_FN_PIN(remquo);
+ TEST_FN_FUNC_FN(rint);
+ TEST_FN_FUNC_FN_IN(rootn);
+ TEST_FN_FUNC_FN(round);
+ TEST_FN_FUNC_FN(rsqrt);
+ TEST_FN_FUNC_FN(sign);
+ TEST_FN_FUNC_FN(sin);
+ TEST_FN_FUNC_FN_PFN(sincos);
+ TEST_FN_FUNC_FN(sinh);
+ TEST_FN_FUNC_FN(sinpi);
+ TEST_FN_FUNC_FN(sqrt);
+ TEST_FN_FUNC_FN_FN(step);
+ TEST_FN_FUNC_FN_F(step);
+ TEST_FN_FUNC_FN(tan);
+ TEST_FN_FUNC_FN(tanh);
+ TEST_FN_FUNC_FN(tanpi);
+ TEST_FN_FUNC_FN(tgamma);
+ TEST_FN_FUNC_FN(trunc);
+
+ float time = end(index);
+
+ if (failed) {
+ rsDebug("test_fp_math FAILED", time);
+ }
+ else {
+ rsDebug("test_fp_math PASSED", time);
+ }
+
+ return failed;
+}
+
+static bool test_int_math(uint32_t index) {
+ bool failed = false;
+ start();
+
+ TEST_UIN_FUNC_IN(abs);
+ TEST_IN_FUNC_IN(clz);
+ TEST_IN_FUNC_IN_IN(min);
+ TEST_IN_FUNC_IN_IN(max);
+ TEST_I_FUNC_I_I_I(rsClamp);
+
+ float time = end(index);
+
+ if (failed) {
+ rsDebug("test_int_math FAILED", time);
+ }
+ else {
+ rsDebug("test_int_math PASSED", time);
+ }
+
+ return failed;
+}
static bool test_basic_operators() {
bool failed = false;
@@ -310,6 +423,7 @@
bool failed = false;
failed |= test_convert();
failed |= test_fp_math(index);
+ failed |= test_int_math(index);
failed |= test_basic_operators();
if (failed) {
diff --git a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java
index ad3073a..7c94c2d 100644
--- a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java
+++ b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java
@@ -114,7 +114,7 @@
// v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
// }
// },
- new Test("DISABLE_NAVIGATION") {
+ new Test("systemUiVisibility: STATUS_BAR_DISABLE_NAVIGATION") {
public void run() {
mListView.setSystemUiVisibility(View.STATUS_BAR_DISABLE_NAVIGATION);
}
@@ -232,6 +232,11 @@
mStatusBarManager.disable(StatusBarManager.DISABLE_NAVIGATION);
}
},
+ new Test("Disable Back") {
+ public void run() {
+ mStatusBarManager.disable(StatusBarManager.DISABLE_BACK);
+ }
+ },
new Test("Disable Clock") {
public void run() {
mStatusBarManager.disable(StatusBarManager.DISABLE_CLOCK);
diff --git a/voip/java/com/android/server/sip/SipService.java b/voip/java/com/android/server/sip/SipService.java
index c553947..f417ddd 100644
--- a/voip/java/com/android/server/sip/SipService.java
+++ b/voip/java/com/android/server/sip/SipService.java
@@ -442,6 +442,7 @@
if (wasConnected) {
mLocalIp = null;
+ stopPortMappingMeasurement();
for (SipSessionGroupExt group : mSipGroups.values()) {
group.onConnectivityChanged(false);
}
@@ -457,7 +458,6 @@
if (isWifi && (mWifiLock != null)) stopWifiScanner();
} else {
mMyWakeLock.reset(); // in case there's a leak
- stopPortMappingMeasurement();
if (isWifi && (mWifiLock != null)) startWifiScanner();
}
} catch (SipException e) {
@@ -784,52 +784,50 @@
private static final int PASS_THRESHOLD = 10;
private static final int MAX_RETRY_COUNT = 5;
private static final int NAT_MEASUREMENT_RETRY_INTERVAL = 120; // in seconds
+ private SipProfile mLocalProfile;
private SipSessionGroupExt mGroup;
private SipSessionGroup.SipSessionImpl mSession;
private int mMinInterval;
private int mMaxInterval;
private int mInterval;
- private int mPassCount = 0;
+ private int mPassCount;
public IntervalMeasurementProcess(SipProfile localProfile,
int minInterval, int maxInterval) {
mMaxInterval = maxInterval;
mMinInterval = minInterval;
- mInterval = (maxInterval + minInterval) / 2;
-
- // Don't start measurement if the interval is too small
- if (mInterval < DEFAULT_KEEPALIVE_INTERVAL) {
- Log.w(TAG, "interval is too small; measurement aborted; "
- + "maxInterval=" + mMaxInterval);
- return;
- } else if (checkTermination()) {
- Log.w(TAG, "interval is too small; measurement aborted; "
- + "interval=[" + mMinInterval + "," + mMaxInterval
- + "]");
- return;
- }
-
- try {
- mGroup = new SipSessionGroupExt(localProfile, null, null);
- // TODO: remove this line once SipWakeupTimer can better handle
- // variety of timeout values
- mGroup.setWakeupTimer(new SipWakeupTimer(mContext, mExecutor));
- } catch (Exception e) {
- Log.w(TAG, "start interval measurement error: " + e);
- }
+ mLocalProfile = localProfile;
}
public void start() {
synchronized (SipService.this) {
- Log.d(TAG, "start measurement w interval=" + mInterval);
- if (mSession == null) {
+ if (mSession != null) {
+ return;
+ }
+
+ mInterval = (mMaxInterval + mMinInterval) / 2;
+ mPassCount = 0;
+
+ // Don't start measurement if the interval is too small
+ if (mInterval < DEFAULT_KEEPALIVE_INTERVAL || checkTermination()) {
+ Log.w(TAG, "measurement aborted; interval=[" +
+ mMinInterval + "," + mMaxInterval + "]");
+ return;
+ }
+
+ try {
+ Log.d(TAG, "start measurement w interval=" + mInterval);
+
+ mGroup = new SipSessionGroupExt(mLocalProfile, null, null);
+ // TODO: remove this line once SipWakeupTimer can better handle
+ // variety of timeout values
+ mGroup.setWakeupTimer(new SipWakeupTimer(mContext, mExecutor));
+
mSession = (SipSessionGroup.SipSessionImpl)
mGroup.createSession(null);
- }
- try {
mSession.startKeepAliveProcess(mInterval, this);
- } catch (SipException e) {
- Log.e(TAG, "start()", e);
+ } catch (Throwable t) {
+ onError(SipErrorCode.CLIENT_ERROR, t.toString());
}
}
}
@@ -840,6 +838,10 @@
mSession.stopKeepAliveProcess();
mSession = null;
}
+ if (mGroup != null) {
+ mGroup.close();
+ mGroup = null;
+ }
mTimer.cancel(this);
}
}
diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java
index eb5cce7..06cdaf2 100644
--- a/voip/java/com/android/server/sip/SipSessionGroup.java
+++ b/voip/java/com/android/server/sip/SipSessionGroup.java
@@ -100,7 +100,7 @@
private static final int EXPIRY_TIME = 3600; // in seconds
private static final int CANCEL_CALL_TIMER = 3; // in seconds
private static final int END_CALL_TIMER = 3; // in seconds
- private static final int KEEPALIVE_TIMEOUT = 3; // in seconds
+ private static final int KEEPALIVE_TIMEOUT = 5; // in seconds
private static final int INCALL_KEEPALIVE_INTERVAL = 10; // in seconds
private static final long WAKE_LOCK_HOLDING_TIME = 500; // in milliseconds
@@ -1555,7 +1555,7 @@
try {
sendKeepAlive();
} catch (Throwable t) {
- Log.w(TAG, "keepalive error: " + ": "
+ Log.w(TAG, "keepalive error: "
+ mLocalProfile.getUriString(), getRootCause(t));
// It's possible that the keepalive process is being stopped
// during session.sendKeepAlive() so need to check mRunning
diff --git a/voip/jni/rtp/AudioGroup.cpp b/voip/jni/rtp/AudioGroup.cpp
index 93c809e..459756d 100644
--- a/voip/jni/rtp/AudioGroup.cpp
+++ b/voip/jni/rtp/AudioGroup.cpp
@@ -28,6 +28,7 @@
#include <arpa/inet.h>
#include <netinet/in.h>
+// #define LOG_NDEBUG 0
#define LOG_TAG "AudioGroup"
#include <cutils/atomic.h>
#include <cutils/properties.h>
@@ -62,9 +63,9 @@
// a modulo operation on the index while accessing the array. However modulo can
// be expensive on some platforms, such as ARM. Thus we round up the size of the
// array to the nearest power of 2 and then use bitwise-and instead of modulo.
-// Currently we make it 512ms long and assume packet interval is 40ms or less.
-// The first 80ms is the place where samples get mixed. The rest 432ms is the
-// real jitter buffer. For a stream at 8000Hz it takes 8192 bytes. These numbers
+// Currently we make it 2048ms long and assume packet interval is 50ms or less.
+// The first 100ms is the place where samples get mixed. The rest is the real
+// jitter buffer. For a stream at 8000Hz it takes 32 kilobytes. These numbers
// are chosen by experiments and each of them can be adjusted as needed.
// Originally a stream does not send packets when it is receive-only or there is
@@ -84,9 +85,11 @@
// + Resampling is not done yet, so streams in one group must use the same rate.
// For the first release only 8000Hz is supported.
-#define BUFFER_SIZE 512
-#define HISTORY_SIZE 80
-#define MEASURE_PERIOD 2000
+#define BUFFER_SIZE 2048
+#define HISTORY_SIZE 100
+#define MEASURE_BASE 100
+#define MEASURE_PERIOD 5000
+#define DTMF_PERIOD 200
class AudioStream
{
@@ -278,7 +281,7 @@
if (mMode != RECEIVE_ONLY && mDtmfEvent != -1) {
int duration = mTimestamp - mDtmfStart;
// Make sure duration is reasonable.
- if (duration >= 0 && duration < mSampleRate * 100) {
+ if (duration >= 0 && duration < mSampleRate * DTMF_PERIOD) {
duration += mSampleCount;
int32_t buffer[4] = {
htonl(mDtmfMagic | mSequence),
@@ -286,7 +289,7 @@
mSsrc,
htonl(mDtmfEvent | duration),
};
- if (duration >= mSampleRate * 100) {
+ if (duration >= mSampleRate * DTMF_PERIOD) {
buffer[3] |= htonl(1 << 23);
mDtmfEvent = -1;
}
@@ -298,43 +301,39 @@
}
int32_t buffer[mSampleCount + 3];
+ bool data = false;
+ if (mMode != RECEIVE_ONLY) {
+ // Mix all other streams.
+ memset(buffer, 0, sizeof(buffer));
+ while (chain) {
+ if (chain != this) {
+ data |= chain->mix(buffer, tick - mInterval, tick, mSampleRate);
+ }
+ chain = chain->mNext;
+ }
+ }
+
int16_t samples[mSampleCount];
- if (mMode == RECEIVE_ONLY) {
+ if (data) {
+ // Saturate into 16 bits.
+ for (int i = 0; i < mSampleCount; ++i) {
+ int32_t sample = buffer[i];
+ if (sample < -32768) {
+ sample = -32768;
+ }
+ if (sample > 32767) {
+ sample = 32767;
+ }
+ samples[i] = sample;
+ }
+ } else {
if ((mTick ^ mKeepAlive) >> 10 == 0) {
return;
}
mKeepAlive = mTick;
memset(samples, 0, sizeof(samples));
- } else {
- // Mix all other streams.
- bool mixed = false;
- memset(buffer, 0, sizeof(buffer));
- while (chain) {
- if (chain != this &&
- chain->mix(buffer, tick - mInterval, tick, mSampleRate)) {
- mixed = true;
- }
- chain = chain->mNext;
- }
- if (mixed) {
- // Saturate into 16 bits.
- for (int i = 0; i < mSampleCount; ++i) {
- int32_t sample = buffer[i];
- if (sample < -32768) {
- sample = -32768;
- }
- if (sample > 32767) {
- sample = 32767;
- }
- samples[i] = sample;
- }
- } else {
- if ((mTick ^ mKeepAlive) >> 10 == 0) {
- return;
- }
- mKeepAlive = mTick;
- memset(samples, 0, sizeof(samples));
+ if (mMode != RECEIVE_ONLY) {
LOGV("stream[%d] no data", mSocket);
}
}
@@ -380,19 +379,16 @@
}
}
- // Adjust the jitter buffer if the latency keeps larger than two times of the
- // packet interval in the past two seconds.
- int score = mBufferTail - tick - mInterval * 2;
- if (mLatencyScore > score) {
+ // Adjust the jitter buffer if the latency keeps larger than the threshold
+ // in the measurement period.
+ int score = mBufferTail - tick - MEASURE_BASE;
+ if (mLatencyScore > score || mLatencyScore <= 0) {
mLatencyScore = score;
- }
- if (mLatencyScore <= 0) {
mLatencyTimer = tick;
- mLatencyScore = score;
} else if (tick - mLatencyTimer >= MEASURE_PERIOD) {
LOGV("stream[%d] reduces latency of %dms", mSocket, mLatencyScore);
mBufferTail -= mLatencyScore;
- mLatencyTimer = tick;
+ mLatencyScore = -1;
}
int count = (BUFFER_SIZE - (mBufferTail - mBufferHead)) * mSampleRate;
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 27a60cd..61dfebf 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -18,8 +18,6 @@
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiConfiguration;
-import android.net.wifi.Wps;
-import android.net.wifi.WpsResult;
import android.net.wifi.ScanResult;
import android.net.DhcpInfo;
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index c75dec7..18d6eaa 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -397,7 +397,7 @@
* Start WPS pin method configuration with pin obtained
* from the access point
*/
- static WpsResult startWpsWithPinFromAccessPoint(Wps config) {
+ static WpsResult startWpsWithPinFromAccessPoint(WpsInfo config) {
WpsResult result = new WpsResult();
if (WifiNative.startWpsWithPinFromAccessPointCommand(config.BSSID, config.pin)) {
/* WPS leaves all networks disabled */
@@ -415,7 +415,7 @@
* from the device
* @return WpsResult indicating status and pin
*/
- static WpsResult startWpsWithPinFromDevice(Wps config) {
+ static WpsResult startWpsWithPinFromDevice(WpsInfo config) {
WpsResult result = new WpsResult();
result.pin = WifiNative.startWpsWithPinFromDeviceCommand(config.BSSID);
/* WPS leaves all networks disabled */
@@ -432,7 +432,7 @@
/**
* Start WPS push button configuration
*/
- static WpsResult startWpsPbc(Wps config) {
+ static WpsResult startWpsPbc(WpsInfo config) {
WpsResult result = new WpsResult();
if (WifiNative.startWpsPbcCommand(config.BSSID)) {
/* WPS leaves all networks disabled */
@@ -594,7 +594,7 @@
sendConfiguredNetworksChangedBroadcast();
}
- static void updateIpAndProxyFromWpsConfig(int netId, Wps wpsConfig) {
+ static void updateIpAndProxyFromWpsConfig(int netId, WpsInfo wpsConfig) {
synchronized (sConfiguredNetworks) {
WifiConfiguration config = sConfiguredNetworks.get(netId);
if (config != null) {
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 0fce8e8..40ac2a0 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -1175,7 +1175,7 @@
* @param config WPS configuration
* @hide
*/
- public void startWps(Wps config) {
+ public void startWps(WpsInfo config) {
if (config == null) {
return;
}
@@ -1630,4 +1630,4 @@
return false;
}
}
-}
\ No newline at end of file
+}
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index 6cc09e9..a6ea6d4 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -261,23 +261,23 @@
public static String p2pConnect(WifiP2pConfig config, boolean joinExistingGroup) {
if (config == null) return null;
List<String> args = new ArrayList<String>();
- Wps wps = config.wps;
+ WpsInfo wps = config.wps;
args.add(config.deviceAddress);
switch (wps.setup) {
- case PBC:
+ case WpsInfo.PBC:
args.add("pbc");
break;
- case DISPLAY:
+ case WpsInfo.DISPLAY:
//TODO: pass the pin back for display
args.add("pin");
args.add("display");
break;
- case KEYPAD:
+ case WpsInfo.KEYPAD:
args.add(wps.pin);
args.add("keypad");
break;
- case LABEL:
+ case WpsInfo.LABEL:
args.add(wps.pin);
args.add("label");
default:
@@ -303,6 +303,10 @@
return doStringCommand(command);
}
+ public static boolean p2pCancelConnect() {
+ return doBooleanCommand("P2P_CANCEL");
+ }
+
public static boolean p2pGroupAdd() {
return doBooleanCommand("P2P_GROUP_ADD");
}
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 175a9ce..e0598a7 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -880,7 +880,7 @@
sendMessage(message);
}
- public void startWps(Messenger replyTo, Wps config) {
+ public void startWps(Messenger replyTo, WpsInfo config) {
Message msg = obtainMessage(CMD_START_WPS, config);
msg.replyTo = replyTo;
sendMessage(msg);
@@ -1917,15 +1917,17 @@
Log.e(TAG, "Failed to reload STA firmware " + e);
// continue
}
- //A runtime crash can leave the interface up and
- //this affects connectivity when supplicant starts up.
- //Ensure interface is down before a supplicant start.
- try {
+ try {
+ //A runtime crash can leave the interface up and
+ //this affects connectivity when supplicant starts up.
+ //Ensure interface is down before a supplicant start.
mNwService.setInterfaceDown(mInterfaceName);
+ //Set privacy extensions
+ mNwService.setInterfaceIpv6PrivacyExtensions(mInterfaceName, true);
} catch (RemoteException re) {
- if (DBG) Log.w(TAG, "Unable to bring down wlan interface: " + re);
+ if (DBG) Log.w(TAG, "Unable to change interface settings: " + re);
} catch (IllegalStateException ie) {
- if (DBG) Log.w(TAG, "Unable to bring down wlan interface: " + ie);
+ if (DBG) Log.w(TAG, "Unable to change interface settings: " + ie);
}
if(WifiNative.startSupplicant()) {
diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java
index 956c3f2..c34c4645 100644
--- a/wifi/java/android/net/wifi/WifiStateTracker.java
+++ b/wifi/java/android/net/wifi/WifiStateTracker.java
@@ -162,7 +162,7 @@
* Fetch NetworkInfo for the network
*/
public NetworkInfo getNetworkInfo() {
- return mNetworkInfo;
+ return new NetworkInfo(mNetworkInfo);
}
/**
@@ -242,7 +242,8 @@
} else {
mLastState = state;
}
- Message msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
+ Message msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED,
+ new NetworkInfo(mNetworkInfo));
msg.sendToTarget();
} else if (intent.getAction().equals(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION)) {
mLinkProperties = (LinkProperties) intent.getParcelableExtra(
diff --git a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
index c52142d..fe0e850 100644
--- a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
@@ -77,15 +77,15 @@
/**
* Low signal is defined as less than or equal to cut off
*/
- private static final int LOW_SIGNAL_CUTOFF = 1;
+ private static final int LOW_SIGNAL_CUTOFF = 0;
private static final long DEFAULT_DNS_CHECK_SHORT_INTERVAL_MS = 2 * 60 * 1000;
- private static final long DEFAULT_DNS_CHECK_LONG_INTERVAL_MS = 30 * 60 * 1000;
+ private static final long DEFAULT_DNS_CHECK_LONG_INTERVAL_MS = 60 * 60 * 1000;
private static final long DEFAULT_WALLED_GARDEN_INTERVAL_MS = 30 * 60 * 1000;
private static final int DEFAULT_MAX_SSID_BLACKLISTS = 7;
- private static final int DEFAULT_NUM_DNS_PINGS = 15; // Multiple pings to detect setup issues
- private static final int DEFAULT_MIN_DNS_RESPONSES = 3;
+ private static final int DEFAULT_NUM_DNS_PINGS = 5; // Multiple pings to detect setup issues
+ private static final int DEFAULT_MIN_DNS_RESPONSES = 1;
private static final int DEFAULT_DNS_PING_TIMEOUT_MS = 2000;
@@ -95,7 +95,9 @@
private static final String DEFAULT_WALLED_GARDEN_URL =
"http://clients3.google.com/generate_204";
private static final int WALLED_GARDEN_SOCKET_TIMEOUT_MS = 10000;
- private static final int DNS_INTRATEST_PING_INTERVAL = 200; // Long delay to detect setup issues
+ private static final int DNS_INTRATEST_PING_INTERVAL_MS = 200;
+ /* With some router setups, it takes a few hunder milli-seconds before connection is active */
+ private static final int DNS_START_DELAY_MS = 1000;
private static final int BASE = Protocol.BASE_WIFI_WATCHDOG;
@@ -677,7 +679,7 @@
for (int i=0; i < mNumDnsPings; i++) {
for (int j = 0; j < numDnses; j++) {
idDnsMap.put(mDnsPinger.pingDnsAsync(mDnsList.get(j), mDnsPingTimeoutMs,
- DNS_INTRATEST_PING_INTERVAL * i), j);
+ DNS_START_DELAY_MS + DNS_INTRATEST_PING_INTERVAL_MS * i), j);
}
}
}
diff --git a/wifi/java/android/net/wifi/Wps.aidl b/wifi/java/android/net/wifi/WpsInfo.aidl
similarity index 88%
rename from wifi/java/android/net/wifi/Wps.aidl
rename to wifi/java/android/net/wifi/WpsInfo.aidl
index ba82a9a..f5e4ebe 100644
--- a/wifi/java/android/net/wifi/Wps.aidl
+++ b/wifi/java/android/net/wifi/WpsInfo.aidl
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2010, The Android Open Source Project
+ * Copyright (c) 2011, 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.
@@ -16,4 +16,4 @@
package android.net.wifi;
-parcelable Wps;
+parcelable WpsInfo;
diff --git a/wifi/java/android/net/wifi/Wps.java b/wifi/java/android/net/wifi/WpsInfo.java
similarity index 70%
rename from wifi/java/android/net/wifi/Wps.java
rename to wifi/java/android/net/wifi/WpsInfo.java
index 6d006960..f70e5af 100644
--- a/wifi/java/android/net/wifi/Wps.java
+++ b/wifi/java/android/net/wifi/WpsInfo.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2011 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.
@@ -26,27 +26,24 @@
/**
* A class representing Wi-Fi Protected Setup
- * @hide
*
* {@see WifiP2pConfig}
*/
-public class Wps implements Parcelable {
+public class WpsInfo implements Parcelable {
+
+ /** Push button configuration */
+ public static final int PBC = 0;
+ /** Display pin method configuration - pin is generated and displayed on device */
+ public static final int DISPLAY = 1;
+ /** Keypad pin method configuration - pin is entered on device */
+ public static final int KEYPAD = 2;
+ /** Label pin method configuration - pin is labelled on device */
+ public static final int LABEL = 3;
+ /** Invalid configuration */
+ public static final int INVALID = 4;
/** Wi-Fi Protected Setup. www.wi-fi.org/wifi-protected-setup has details */
- public enum Setup {
- /* Push button configuration */
- PBC,
- /* Display pin method configuration - pin is generated and displayed on device */
- DISPLAY,
- /* Keypad pin method configuration - pin is entered on device */
- KEYPAD,
- /* Label pin method configuration - pin is obtained from a printed label */
- LABEL,
- /* Invalid config */
- INVALID
- }
-
- public Setup setup;
+ public int setup;
/** @hide */
public String BSSID;
@@ -63,8 +60,8 @@
/** @hide */
public LinkProperties linkProperties;
- public Wps() {
- setup = Setup.INVALID;
+ public WpsInfo() {
+ setup = INVALID;
BSSID = null;
pin = null;
ipAssignment = IpAssignment.UNASSIGNED;
@@ -72,10 +69,9 @@
linkProperties = new LinkProperties();
}
- /** @hide */
public String toString() {
StringBuffer sbuf = new StringBuffer();
- sbuf.append(" setup: ").append(setup.toString());
+ sbuf.append(" setup: ").append(setup);
sbuf.append('\n');
sbuf.append(" BSSID: ").append(BSSID);
sbuf.append('\n');
@@ -90,13 +86,13 @@
return sbuf.toString();
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public int describeContents() {
return 0;
}
- /** copy constructor {@hide} */
- public Wps(Wps source) {
+ /* Copy constructor */
+ public WpsInfo(WpsInfo source) {
if (source != null) {
setup = source.setup;
BSSID = source.BSSID;
@@ -107,9 +103,9 @@
}
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(setup.name());
+ dest.writeInt(setup);
dest.writeString(BSSID);
dest.writeString(pin);
dest.writeString(ipAssignment.name());
@@ -117,12 +113,12 @@
dest.writeParcelable(linkProperties, flags);
}
- /** Implement the Parcelable interface {@hide} */
- public static final Creator<Wps> CREATOR =
- new Creator<Wps>() {
- public Wps createFromParcel(Parcel in) {
- Wps config = new Wps();
- config.setup = Setup.valueOf(in.readString());
+ /** Implement the Parcelable interface */
+ public static final Creator<WpsInfo> CREATOR =
+ new Creator<WpsInfo>() {
+ public WpsInfo createFromParcel(Parcel in) {
+ WpsInfo config = new WpsInfo();
+ config.setup = in.readInt();
config.BSSID = in.readString();
config.pin = in.readString();
config.ipAssignment = IpAssignment.valueOf(in.readString());
@@ -131,8 +127,8 @@
return config;
}
- public Wps[] newArray(int size) {
- return new Wps[size];
+ public WpsInfo[] newArray(int size) {
+ return new WpsInfo[size];
}
};
}
diff --git a/wifi/java/android/net/wifi/WpsStateMachine.java b/wifi/java/android/net/wifi/WpsStateMachine.java
index f9e903a..c14a8db 100644
--- a/wifi/java/android/net/wifi/WpsStateMachine.java
+++ b/wifi/java/android/net/wifi/WpsStateMachine.java
@@ -53,7 +53,7 @@
private WifiStateMachine mWifiStateMachine;
- private Wps mWpsConfig;
+ private WpsInfo mWpsInfo;
private Context mContext;
AsyncChannel mReplyChannel = new AsyncChannel();
@@ -90,20 +90,20 @@
@Override
public boolean processMessage(Message message) {
if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
- Wps wpsConfig;
+ WpsInfo wpsConfig;
switch (message.what) {
case WifiStateMachine.CMD_START_WPS:
- mWpsConfig = (Wps) message.obj;
+ mWpsInfo = (WpsInfo) message.obj;
WpsResult result;
- switch (mWpsConfig.setup) {
- case PBC:
- result = WifiConfigStore.startWpsPbc(mWpsConfig);
+ switch (mWpsInfo.setup) {
+ case WpsInfo.PBC:
+ result = WifiConfigStore.startWpsPbc(mWpsInfo);
break;
- case KEYPAD:
- result = WifiConfigStore.startWpsWithPinFromAccessPoint(mWpsConfig);
+ case WpsInfo.KEYPAD:
+ result = WifiConfigStore.startWpsWithPinFromAccessPoint(mWpsInfo);
break;
- case DISPLAY:
- result = WifiConfigStore.startWpsWithPinFromDevice(mWpsConfig);
+ case WpsInfo.DISPLAY:
+ result = WifiConfigStore.startWpsWithPinFromDevice(mWpsInfo);
break;
default:
result = new WpsResult(Status.FAILURE);
@@ -114,7 +114,7 @@
if (result.status == Status.SUCCESS) {
transitionTo(mActiveState);
} else {
- Log.e(TAG, "Failed to start WPS with config " + mWpsConfig.toString());
+ Log.e(TAG, "Failed to start WPS with config " + mWpsInfo.toString());
}
break;
case WifiStateMachine.CMD_RESET_WPS_STATE:
@@ -154,7 +154,7 @@
WifiConfigStore.enableAllNetworks();
WifiConfigStore.loadConfiguredNetworks();
WifiConfigStore.updateIpAndProxyFromWpsConfig(
- stateChangeResult.networkId, mWpsConfig);
+ stateChangeResult.networkId, mWpsInfo);
mWifiStateMachine.sendMessage(WifiStateMachine.WPS_COMPLETED_EVENT);
transitionTo(mInactiveState);
break;
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
index e359ce5..e0c1b13 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
@@ -16,14 +16,12 @@
package android.net.wifi.p2p;
-import android.net.wifi.Wps;
-import android.net.wifi.Wps.Setup;
+import android.net.wifi.WpsInfo;
import android.os.Parcelable;
import android.os.Parcel;
/**
* A class representing a Wi-Fi P2p configuration for setting up a connection
- * @hide
*
* {@see WifiP2pManager}
*/
@@ -37,7 +35,7 @@
/**
* Wi-Fi Protected Setup information
*/
- public Wps wps;
+ public WpsInfo wps;
/**
* This is an integer value between 0 and 15 where 0 indicates the least
@@ -63,8 +61,8 @@
public WifiP2pConfig() {
//set defaults
- wps = new Wps();
- wps.setup = Setup.PBC;
+ wps = new WpsInfo();
+ wps.setup = WpsInfo.PBC;
}
/** P2P-GO-NEG-REQUEST 42:fc:89:a8:96:09 dev_passwd_id=4 {@hide}*/
@@ -76,7 +74,7 @@
}
deviceAddress = tokens[1];
- wps = new Wps();
+ wps = new WpsInfo();
if (tokens.length > 2) {
String[] nameVal = tokens[2].split("=");
@@ -89,25 +87,24 @@
//As defined in wps/wps_defs.h
switch (devPasswdId) {
case 0x00:
- wps.setup = Setup.LABEL;
+ wps.setup = WpsInfo.LABEL;
break;
case 0x01:
- wps.setup = Setup.KEYPAD;
+ wps.setup = WpsInfo.KEYPAD;
break;
case 0x04:
- wps.setup = Setup.PBC;
+ wps.setup = WpsInfo.PBC;
break;
case 0x05:
- wps.setup = Setup.DISPLAY;
+ wps.setup = WpsInfo.DISPLAY;
break;
default:
- wps.setup = Setup.PBC;
+ wps.setup = WpsInfo.PBC;
break;
}
}
}
- /** @hide */
public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("\n address: ").append(deviceAddress);
@@ -117,19 +114,22 @@
return sbuf.toString();
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public int describeContents() {
return 0;
}
- /** copy constructor {@hide} */
+ /** copy constructor */
public WifiP2pConfig(WifiP2pConfig source) {
if (source != null) {
- //TODO: implement
- }
+ deviceAddress = source.deviceAddress;
+ wps = new WpsInfo(source.wps);
+ groupOwnerIntent = source.groupOwnerIntent;
+ persist = source.persist;
+ }
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(deviceAddress);
dest.writeParcelable(wps, flags);
@@ -137,13 +137,13 @@
dest.writeString(persist.name());
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public static final Creator<WifiP2pConfig> CREATOR =
new Creator<WifiP2pConfig>() {
public WifiP2pConfig createFromParcel(Parcel in) {
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = in.readString();
- config.wps = (Wps) in.readParcelable(null);
+ config.wps = (WpsInfo) in.readParcelable(null);
config.groupOwnerIntent = in.readInt();
config.persist = Persist.valueOf(in.readString());
return config;
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
index 99c585f..1b0c301 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
@@ -24,7 +24,6 @@
/**
* A class representing a Wi-Fi p2p device
- * @hide
*
* {@see WifiP2pManager}
*/
@@ -109,18 +108,16 @@
*/
public int groupCapability;
+ public static final int CONNECTED = 0;
+ public static final int INVITED = 1;
+ public static final int FAILED = 2;
+ public static final int AVAILABLE = 3;
+ public static final int UNAVAILABLE = 4;
+
/** Device connection status */
- public enum Status {
- CONNECTED,
- INVITED,
- FAILED,
- AVAILABLE,
- UNAVAILABLE,
- }
+ public int status = UNAVAILABLE;
- public Status status = Status.UNAVAILABLE;
-
- WifiP2pDevice() {
+ public WifiP2pDevice() {
}
/**
@@ -197,7 +194,7 @@
}
if (tokens[0].startsWith("P2P-DEVICE-FOUND")) {
- status = Status.AVAILABLE;
+ status = AVAILABLE;
}
}
@@ -227,7 +224,6 @@
}
@Override
- /** @hide */
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof WifiP2pDevice)) return false;
@@ -239,7 +235,6 @@
return other.deviceAddress.equals(deviceAddress);
}
- /** @hide */
public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("Device: ").append(deviceName);
@@ -254,12 +249,12 @@
return sbuf.toString();
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public int describeContents() {
return 0;
}
- /** copy constructor {@hide} */
+ /** copy constructor */
public WifiP2pDevice(WifiP2pDevice source) {
if (source != null) {
deviceName = source.deviceName;
@@ -274,7 +269,7 @@
}
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(deviceName);
dest.writeString(deviceAddress);
@@ -284,10 +279,10 @@
dest.writeInt(wpsConfigMethodsSupported);
dest.writeInt(deviceCapability);
dest.writeInt(groupCapability);
- dest.writeString(status.name());
+ dest.writeInt(status);
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public static final Creator<WifiP2pDevice> CREATOR =
new Creator<WifiP2pDevice>() {
public WifiP2pDevice createFromParcel(Parcel in) {
@@ -300,7 +295,7 @@
device.wpsConfigMethodsSupported = in.readInt();
device.deviceCapability = in.readInt();
device.groupCapability = in.readInt();
- device.status = Status.valueOf(in.readString());
+ device.status = in.readInt();
return device;
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
index 242bce0..9ce2545 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
@@ -27,7 +27,6 @@
/**
* A class representing a Wi-Fi P2p device list
- * @hide
*
* {@see WifiP2pManager}
*/
@@ -35,11 +34,11 @@
private Collection<WifiP2pDevice> mDevices;
- WifiP2pDeviceList() {
+ public WifiP2pDeviceList() {
mDevices = new ArrayList<WifiP2pDevice>();
}
- /** copy constructor {@hide} */
+ /** copy constructor */
public WifiP2pDeviceList(WifiP2pDeviceList source) {
if (source != null) {
mDevices = source.getDeviceList();
@@ -91,7 +90,6 @@
return Collections.unmodifiableCollection(mDevices);
}
- /** @hide */
public String toString() {
StringBuffer sbuf = new StringBuffer();
for (WifiP2pDevice device : mDevices) {
@@ -100,12 +98,12 @@
return sbuf.toString();
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public int describeContents() {
return 0;
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mDevices.size());
for(WifiP2pDevice device : mDevices) {
@@ -113,7 +111,7 @@
}
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public static final Creator<WifiP2pDeviceList> CREATOR =
new Creator<WifiP2pDeviceList>() {
public WifiP2pDeviceList createFromParcel(Parcel in) {
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java
index 48f210b..9473993 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java
@@ -26,7 +26,6 @@
/**
* A class representing a Wi-Fi P2p group
- * @hide
*
* {@see WifiP2pManager}
*/
@@ -49,7 +48,7 @@
private String mInterface;
- WifiP2pGroup() {
+ public WifiP2pGroup() {
}
/**
@@ -202,7 +201,6 @@
return mInterface;
}
- /** @hide */
public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("network: ").append(mNetworkName);
@@ -215,19 +213,24 @@
return sbuf.toString();
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public int describeContents() {
return 0;
}
- /** copy constructor {@hide} */
- // TODO: implement
+ /** copy constructor */
public WifiP2pGroup(WifiP2pGroup source) {
if (source != null) {
- }
+ mNetworkName = source.getNetworkName();
+ mOwner = new WifiP2pDevice(source.getOwner());
+ mIsGroupOwner = source.mIsGroupOwner;
+ for (WifiP2pDevice d : source.getClientList()) mClients.add(d);
+ mPassphrase = source.getPassphrase();
+ mInterface = source.getInterface();
+ }
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mNetworkName);
dest.writeParcelable(mOwner, flags);
@@ -240,7 +243,7 @@
dest.writeString(mInterface);
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public static final Creator<WifiP2pGroup> CREATOR =
new Creator<WifiP2pGroup>() {
public WifiP2pGroup createFromParcel(Parcel in) {
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pInfo.java b/wifi/java/android/net/wifi/p2p/WifiP2pInfo.java
index 81b7708..dce315a 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pInfo.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pInfo.java
@@ -24,7 +24,6 @@
/**
* A class representing connection information about a Wi-Fi p2p group
- * @hide
*
* {@see WifiP2pManager}
*/
@@ -39,11 +38,9 @@
/** Group owner address */
public InetAddress groupOwnerAddress;
- /** @hide */
- WifiP2pInfo() {
+ public WifiP2pInfo() {
}
- /** @hide */
public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("groupFormed: ").append(groupFormed)
@@ -52,12 +49,12 @@
return sbuf.toString();
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public int describeContents() {
return 0;
}
- /** copy constructor {@hide} */
+ /** copy constructor */
public WifiP2pInfo(WifiP2pInfo source) {
if (source != null) {
groupFormed = source.groupFormed;
@@ -66,7 +63,7 @@
}
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public void writeToParcel(Parcel dest, int flags) {
dest.writeByte(groupFormed ? (byte)1 : (byte)0);
dest.writeByte(isGroupOwner ? (byte)1 : (byte)0);
@@ -79,7 +76,7 @@
}
}
- /** Implement the Parcelable interface {@hide} */
+ /** Implement the Parcelable interface */
public static final Creator<WifiP2pInfo> CREATOR =
new Creator<WifiP2pInfo>() {
public WifiP2pInfo createFromParcel(Parcel in) {
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index 5715186..9205300 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -24,6 +24,7 @@
import android.os.Binder;
import android.os.IBinder;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -34,36 +35,44 @@
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
+import java.util.HashMap;
+
/**
* This class provides the API for managing Wi-Fi peer-to-peer connectivity. This lets an
* application discover available peers, setup connection to peers and query for the list of peers.
* When a p2p connection is formed over wifi, the device continues to maintain the uplink
* connection over mobile or any other available network for internet connectivity on the device.
*
- * <p> The API is asynchronous and response to a request from an application is sent in the form
- * of a {@link android.os.Message} on a {@link android.os.Handler} that needs to be initialized
- * by the application right at the beginning before any p2p operations are performed via
- * {@link #initialize}.
+ * <p> The API is asynchronous and responses to requests from an application are on listener
+ * callbacks provided by the application. The application needs to do an initialization with
+ * {@link #initialize} before doing any p2p operation.
*
- * <p> An application can request for the current list of peers using {@link #requestPeers}. The
- * {@link #RESPONSE_PEERS} message on the handler indicates that the peer list is available.
- * Use {@link #peersInResponse} to extract the peer device list upon the receiving the
- * {@link #RESPONSE_PEERS} message.
+ * <p> Application actions {@link #discoverPeers}, {@link #connect}, {@link #cancelConnect},
+ * {@link #createGroup} and {@link #removeGroup} need a {@link ActionListener} instance for
+ * receiving callbacks {@link ActionListener#onSuccess} or {@link ActionListener#onFailure}.
+ * Action callbacks indicate whether the initiation of the action was a success or a failure.
+ * Upon failure, the reason of failure can be one of {@link #ERROR}, {@link #P2P_UNSUPPORTED}
+ * or {@link #BUSY}.
*
- * <p> If an application needs to initiate a discovery, use {@link #discoverPeers} and listen
- * to {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent action to initiate a request to fetch
- * list of peers with {@link #requestPeers}. An initiated discovery request from an application
- * stays active until the device starts connecting to a peer or forms a p2p group.
+ * <p> An application can initiate discovery of peers with {@link #discoverPeers}. An initiated
+ * discovery request from an application stays active until the device starts connecting to a peer
+ * or forms a p2p group. The {@link ActionListener} callbacks provide feedback on whether the
+ * discovery initiation was successful or failure. Additionally, applications can listen
+ * to {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent action to know when the peer list changes.
+ *
+ * <p> When the peer list change intent {@link #WIFI_P2P_PEERS_CHANGED_ACTION} is received
+ * or when an application needs to fetch the current list of peers, it can request the list
+ * of peers with {@link #requestPeers}. When the peer list is available
+ * {@link PeerListListener#onPeersAvailable} is called with the device list.
*
* <p> An application can initiate a connection request to a peer through {@link #connect}. See
* {@link WifiP2pConfig} for details on setting up the configuration. For communication with legacy
* Wi-Fi devices that do not support p2p, an app can create a group using {@link #createGroup}
* which creates an access point whose details can be fetched with {@link #requestGroupInfo}.
- *
+*
* <p> After a successful group formation through {@link #createGroup} or through {@link #connect},
- * use {@link #requestConnectionInfo} to fetch the connection details. Connection information
- * can be obtained with {@link #connectionInfoInResponse} on a {@link #RESPONSE_CONNECTION_INFO}
- * message. The connection info {@link WifiP2pInfo} contains the address of the group owner
+ * use {@link #requestConnectionInfo} to fetch the connection details. The connection info
+ * {@link WifiP2pInfo} contains the address of the group owner
* {@link WifiP2pInfo#groupOwnerAddress} and a flag {@link WifiP2pInfo#isGroupOwner} to indicate
* if the current device is a p2p group owner. A p2p client can thus communicate with
* the p2p group owner through a socket connection.
@@ -85,10 +94,10 @@
* {@see WifiP2pGroup}
* {@see WifiP2pDevice}
* {@see WifiP2pDeviceList}
- * {@see android.net.wifi.Wps}
- * @hide
+ * {@see android.net.wifi.WpsInfo}
*/
public class WifiP2pManager {
+ private static final String TAG = "WifiP2pManager";
/**
* Broadcast intent action to indicate whether Wi-Fi p2p is enabled or disabled. An
* extra {@link #EXTRA_WIFI_STATE} provides the state information as int.
@@ -97,7 +106,7 @@
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WIFI_P2P_STATE_CHANGED_ACTION =
- "android.net.wifi.P2P_STATE_CHANGED";
+ "android.net.wifi.p2p.STATE_CHANGED";
/**
* The lookup key for an int that indicates whether Wi-Fi p2p is enabled or disabled.
@@ -133,7 +142,7 @@
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WIFI_P2P_CONNECTION_CHANGED_ACTION =
- "android.net.wifi.CONNECTION_STATE_CHANGE";
+ "android.net.wifi.p2p.CONNECTION_STATE_CHANGE";
/**
* The lookup key for a {@link android.net.wifi.p2p.WifiP2pInfo} object
@@ -170,27 +179,23 @@
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WIFI_P2P_PEERS_CHANGED_ACTION =
- "android.net.wifi.PEERS_CHANGED";
+ "android.net.wifi.p2p.PEERS_CHANGED";
/**
- * Activity Action: Pick a Wi-Fi p2p network to connect to.
- * <p>Input: Nothing.
- * <p>Output: Nothing.
- * @hide
+ * Broadcast intent action indicating that this device details have changed.
*/
- @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
- public static final String ACTION_PICK_WIFI_P2P_NETWORK =
- "android.net.wifi.PICK_WIFI_P2P_NETWORK";
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION =
+ "android.net.wifi.p2p.THIS_DEVICE_CHANGED";
+
+ /**
+ * The lookup key for a {@link android.net.wifi.p2p.WifiP2pDevice} object
+ * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
+ */
+ public static final String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
IWifiP2pManager mService;
- /**
- * Message {@link android.os.Message#what} sent on the application handler specified
- * at {@link #initialize} indicating the asynchronous channel has disconnected. An
- * application could choose to reconnect with {@link #initialize}
- */
- public static final int HANDLER_DISCONNECTION = AsyncChannel.CMD_CHANNEL_DISCONNECTED;
-
private static final int BASE = Protocol.BASE_WIFI_P2P_MANAGER;
/** @hide */
@@ -209,150 +214,59 @@
/** @hide */
public static final int DISCOVER_PEERS = BASE + 7;
-
- /**
- * Message {@link android.os.Message#what} value indicating that the {@link #discoverPeers}
- * operation failed.
- * <p> The reason for failure could be one of {@link #P2P_UNSUPPORTED}, {@link #ERROR}
- * or {@link #BUSY}
- */
+ /** @hide */
public static final int DISCOVER_PEERS_FAILED = BASE + 8;
- /**
- * Message {@link android.os.Message#what} value indicating that the {@link #discoverPeers}
- * operation succeeded.
- * <p> The application can register for {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent
- * to listen for changes in the peer list as a result of the discovery process.
- */
+ /** @hide */
public static final int DISCOVER_PEERS_SUCCEEDED = BASE + 9;
/** @hide */
public static final int CONNECT = BASE + 10;
-
- /**
- * Message {@link android.os.Message#what} value indicating that the {@link #connect}
- * operation failed.
- * <p> The reason for failure could be one of {@link #P2P_UNSUPPORTED}, {@link #ERROR}
- * or {@link #BUSY}
- */
+ /** @hide */
public static final int CONNECT_FAILED = BASE + 11;
- /**
- * Message {@link android.os.Message#what} value indicating that the {@link #connect}
- * operation succeeded.
- * <p> The application can register for {@link #WIFI_P2P_CONNECTION_CHANGED_ACTION} intent
- * to listen for connectivity change as a result of the connect operation
- */
+ /** @hide */
public static final int CONNECT_SUCCEEDED = BASE + 12;
/** @hide */
- public static final int CREATE_GROUP = BASE + 13;
-
- /**
- * Message {@link android.os.Message#what} value indicating that the {@link #createGroup}
- * operation failed.
- * <p> The reason for failure could be one of {@link #P2P_UNSUPPORTED}, {@link #ERROR}
- * or {@link #BUSY}
- */
- public static final int CREATE_GROUP_FAILED = BASE + 14;
- /**
- * Message {@link android.os.Message#what} value indicating that the {@link #createGroup}
- * operation succeeded.
- * <p> The application can request the group details with {@link #requestGroupInfo}
- */
- public static final int CREATE_GROUP_SUCCEEDED = BASE + 15;
+ public static final int CANCEL_CONNECT = BASE + 13;
+ /** @hide */
+ public static final int CANCEL_CONNECT_FAILED = BASE + 14;
+ /** @hide */
+ public static final int CANCEL_CONNECT_SUCCEEDED = BASE + 15;
/** @hide */
- public static final int REMOVE_GROUP = BASE + 16;
- /**
- * Message {@link android.os.Message#what} value indicating that the {@link #removeGroup}
- * operation failed.
- * <p> The reason for failure could be one of {@link #P2P_UNSUPPORTED}, {@link #ERROR}
- * or {@link #BUSY}
- */
- public static final int REMOVE_GROUP_FAILED = BASE + 17;
- /**
- * Message {@link android.os.Message#what} value indicating that the {@link #removeGroup}
- * operation succeeded.
- */
- public static final int REMOVE_GROUP_SUCCEEDED = BASE + 18;
-
- /**
- * Supported {@link android.os.Message#arg1} value on the following response messages:
- * {@link #DISCOVER_PEERS_FAILED}, {@link #CONNECT_FAILED}, {@link #CREATE_GROUP_FAILED}
- * and {@link #REMOVE_GROUP_FAILED}
- *
- * <p> This indicates that the operation failed due to an internal error
- */
- public static final int ERROR = 0;
-
- /**
- * Supported {@link android.os.Message#arg1} value on the following response messages:
- * {@link #DISCOVER_PEERS_FAILED}, {@link #CONNECT_FAILED}, {@link #CREATE_GROUP_FAILED}
- * and {@link #REMOVE_GROUP_FAILED}
- *
- * <p> This indicates that the operation failed because p2p is unsupported on the
- * device
- */
- public static final int P2P_UNSUPPORTED = 1;
-
- /**
- * Supported {@link android.os.Message#arg1} value on the following response messages:
- * {@link #DISCOVER_PEERS_FAILED}, {@link #CONNECT_FAILED}, {@link #CREATE_GROUP_FAILED}
- * and {@link #REMOVE_GROUP_FAILED}
- *
- * <p> This indicates that the operation failed because the framework is busy and
- * unable to service the request
- */
- public static final int BUSY = 2;
+ public static final int CREATE_GROUP = BASE + 16;
+ /** @hide */
+ public static final int CREATE_GROUP_FAILED = BASE + 17;
+ /** @hide */
+ public static final int CREATE_GROUP_SUCCEEDED = BASE + 18;
/** @hide */
- public static final int REQUEST_PEERS = BASE + 19;
- /**
- * Message {@link android.os.Message#what} delivered on the application hander
- * in response to a {@link #requestPeers} call from the application.
- *
- * <p> Extract a {@link WifiP2pDeviceList} object by calling {@link #peersInResponse}
- * on the message object
- */
- public static final int RESPONSE_PEERS = BASE + 20;
+ public static final int REMOVE_GROUP = BASE + 19;
+ /** @hide */
+ public static final int REMOVE_GROUP_FAILED = BASE + 20;
+ /** @hide */
+ public static final int REMOVE_GROUP_SUCCEEDED = BASE + 21;
/** @hide */
- public static final int REQUEST_CONNECTION_INFO = BASE + 21;
-
- /**
- * Message {@link android.os.Message#what} delivered on the application hander
- * in response to a {@link #requestConnectionInfo} call from the application.
- *
- * <p> Extract a {@link WifiP2pInfo} object by calling {@link #connectionInfoInResponse}
- * on the message object
- */
- public static final int RESPONSE_CONNECTION_INFO = BASE + 22;
+ public static final int REQUEST_PEERS = BASE + 22;
+ /** @hide */
+ public static final int RESPONSE_PEERS = BASE + 23;
/** @hide */
- public static final int REQUEST_GROUP_INFO = BASE + 23;
-
- /**
- * Message {@link android.os.Message#what} delivered on the application hander
- * in response to a {@link #requestGroupInfo} call from the application.
- *
- * <p> Extract a {@link WifiP2pGroup} object by calling {@link #groupInfoInResponse}
- * on the message object
- */
-
- public static final int RESPONSE_GROUP_INFO = BASE + 24;
+ public static final int REQUEST_CONNECTION_INFO = BASE + 24;
+ /** @hide */
+ public static final int RESPONSE_CONNECTION_INFO = BASE + 25;
/** @hide */
- public static final int WPS_PBC = BASE + 25;
+ public static final int REQUEST_GROUP_INFO = BASE + 26;
/** @hide */
- public static final int WPS_PIN = BASE + 26;
- /** @hide */
- public static final int WPS_PIN_AVAILABLE = BASE + 27;
+ public static final int RESPONSE_GROUP_INFO = BASE + 27;
/**
* Create a new WifiP2pManager instance. Applications use
* {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
* the standard {@link android.content.Context#WIFI_P2P_SERVICE Context.WIFI_P2P_SERVICE}.
* @param service the Binder interface
- * @param handler target for messages
* @hide - hide this because it takes in a parameter of type IWifiP2pManager, which
* is a system private class.
*/
@@ -361,38 +275,182 @@
}
/**
- * A channel that connects the application handler to the Wifi framework.
- * Most p2p operations require a Channel as an argument. An instance of Channel is obtained
- * by doing a call on {@link #initialize}
+ * Passed with {@link ActionListener#onFailure}.
+ * Indicates that the operation failed due to an internal error.
*/
- public class Channel {
- Channel(AsyncChannel c) {
- mAsyncChannel = c;
- }
- AsyncChannel mAsyncChannel;
+ public static final int ERROR = 0;
+
+ /**
+ * Passed with {@link ActionListener#onFailure}.
+ * Indicates that the operation failed because p2p is unsupported on the device.
+ */
+ public static final int P2P_UNSUPPORTED = 1;
+
+ /**
+ * Passed with {@link ActionListener#onFailure}.
+ * Indicates that the operation failed because the framework is busy and
+ * unable to service the request
+ */
+ public static final int BUSY = 2;
+
+ /** Interface for callback invocation when framework channel is lost */
+ public interface ChannelListener {
+ /**
+ * The channel to the framework has been disconnected.
+ * Application could try re-initializing using {@link #initialize}
+ */
+ public void onChannelDisconnected();
+ }
+
+ /** Interface for callback invocation on an application action */
+ public interface ActionListener {
+ /** The operation succeeded */
+ public void onSuccess();
+ /**
+ * The operation failed
+ * @param reason The reason for failure could be one of {@link #P2P_UNSUPPORTED},
+ * {@link #ERROR} or {@link #BUSY}
+ */
+ public void onFailure(int reason);
+ }
+
+ /** Interface for callback invocation when peer list is available */
+ public interface PeerListListener {
+ /**
+ * The requested peer list is available
+ * @param peers List of available peers
+ */
+ public void onPeersAvailable(WifiP2pDeviceList peers);
+ }
+
+ /** Interface for callback invocation when connection info is available */
+ public interface ConnectionInfoListener {
+ /**
+ * The requested connection info is available
+ * @param info Wi-Fi p2p connection info
+ */
+ public void onConnectionInfoAvailable(WifiP2pInfo info);
+ }
+
+ /** Interface for callback invocation when group info is available */
+ public interface GroupInfoListener {
+ /**
+ * The requested p2p group info is available
+ * @param group Wi-Fi p2p group info
+ */
+ public void onGroupInfoAvailable(WifiP2pGroup group);
}
/**
- * Registers the application handler with the Wi-Fi framework. This function
+ * A channel that connects the application to the Wifi p2p framework.
+ * Most p2p operations require a Channel as an argument. An instance of Channel is obtained
+ * by doing a call on {@link #initialize}
+ */
+ public static class Channel {
+ Channel(Looper looper, ChannelListener l) {
+ mAsyncChannel = new AsyncChannel();
+ mHandler = new P2pHandler(looper);
+ mChannelListener = l;
+ }
+ private ChannelListener mChannelListener;
+ private HashMap<Integer, Object> mListenerMap = new HashMap<Integer, Object>();
+ private Object mListenerMapLock = new Object();
+ private int mListenerKey = 0;
+
+ AsyncChannel mAsyncChannel;
+ P2pHandler mHandler;
+ class P2pHandler extends Handler {
+ P2pHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ Object listener = getListener(message.arg2);
+ switch (message.what) {
+ case AsyncChannel.CMD_CHANNEL_DISCONNECTED:
+ if (mChannelListener != null) {
+ mChannelListener.onChannelDisconnected();
+ mChannelListener = null;
+ }
+ break;
+ /* ActionListeners grouped together */
+ case WifiP2pManager.DISCOVER_PEERS_FAILED:
+ case WifiP2pManager.CONNECT_FAILED:
+ case WifiP2pManager.CANCEL_CONNECT_FAILED:
+ case WifiP2pManager.CREATE_GROUP_FAILED:
+ case WifiP2pManager.REMOVE_GROUP_FAILED:
+ if (listener != null) {
+ ((ActionListener) listener).onFailure(message.arg1);
+ }
+ break;
+ /* ActionListeners grouped together */
+ case WifiP2pManager.DISCOVER_PEERS_SUCCEEDED:
+ case WifiP2pManager.CONNECT_SUCCEEDED:
+ case WifiP2pManager.CANCEL_CONNECT_SUCCEEDED:
+ case WifiP2pManager.CREATE_GROUP_SUCCEEDED:
+ case WifiP2pManager.REMOVE_GROUP_SUCCEEDED:
+ if (listener != null) {
+ ((ActionListener) listener).onSuccess();
+ }
+ break;
+ case WifiP2pManager.RESPONSE_PEERS:
+ WifiP2pDeviceList peers = (WifiP2pDeviceList) message.obj;
+ if (listener != null) {
+ ((PeerListListener) listener).onPeersAvailable(peers);
+ }
+ break;
+ case WifiP2pManager.RESPONSE_CONNECTION_INFO:
+ WifiP2pInfo wifiP2pInfo = (WifiP2pInfo) message.obj;
+ if (listener != null) {
+ ((ConnectionInfoListener) listener).onConnectionInfoAvailable(wifiP2pInfo);
+ }
+ break;
+ case WifiP2pManager.RESPONSE_GROUP_INFO:
+ WifiP2pGroup group = (WifiP2pGroup) message.obj;
+ if (listener != null) {
+ ((GroupInfoListener) listener).onGroupInfoAvailable(group);
+ }
+ break;
+ default:
+ Log.d(TAG, "Ignored " + message);
+ break;
+ }
+ }
+ }
+
+ int putListener(Object listener) {
+ if (listener == null) return 0;
+ int key;
+ synchronized (mListenerMapLock) {
+ key = mListenerKey++;
+ mListenerMap.put(key, listener);
+ }
+ return key;
+ }
+
+ Object getListener(int key) {
+ synchronized (mListenerMapLock) {
+ return mListenerMap.remove(key);
+ }
+ }
+ }
+
+ /**
+ * Registers the application with the Wi-Fi framework. This function
* must be the first to be called before any p2p operations are performed.
*
- * <p class="note"><strong>Note:</strong>
- * The handler registered with the framework should only handle messages
- * with {@link android.os.Message#what} values defined in this file. Adding application
- * specific private {@link android.os.Message#what} types should be done on a seperate handler
- *
* @param srcContext is the context of the source
- * @param srcHandler is the handler on which the source will receive message responses
- * asynchronously
+ * @param srcLooper is the Looper on which the callbacks are receivied
+ * @param listener for callback at loss of framework communication. Can be null.
* @return Channel instance that is necessary for performing any further p2p operations
*/
- public Channel initialize(Context srcContext, Handler srcHandler) {
+ public Channel initialize(Context srcContext, Looper srcLooper, ChannelListener listener) {
Messenger messenger = getMessenger();
if (messenger == null) return null;
- AsyncChannel asyncChannel = new AsyncChannel();
- Channel c = new Channel(asyncChannel);
- if (asyncChannel.connectSync(srcContext, srcHandler, messenger)
+ Channel c = new Channel(srcLooper, listener);
+ if (c.mAsyncChannel.connectSync(srcContext, c.mHandler, messenger)
== AsyncChannel.STATUS_SUCCESSFUL) {
return c;
} else {
@@ -425,30 +483,32 @@
* for the purpose of establishing a connection.
*
* <p> The function call immediately returns after sending a discovery request
- * to the framework. The application handler is notified of a success or failure to initiate
- * discovery with {@link #DISCOVER_PEERS_SUCCEEDED} or {@link #DISCOVER_PEERS_FAILED}.
+ * to the framework. The application is notified of a success or failure to initiate
+ * discovery through listener callbacks {@link ActionListener#onSuccess} or
+ * {@link ActionListener#onFailure}.
*
* <p> The discovery remains active until a connection is initiated or
* a p2p group is formed. Register for {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent to
* determine when the framework notifies of a change as peers are discovered.
*
* <p> Upon receiving a {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent, an application
- * can request for the list of peers using {@link #requestPeers} which will deliver a
- * {@link #RESPONSE_PEERS} message on the application handler. The application can then
- * extract a {@link WifiP2pDeviceList} object by calling {@link #peersInResponse}
- * on the message.
+ * can request for the list of peers using {@link #requestPeers}.
+ *
+ * @param c is the channel created at {@link #initialize}
+ * @param listener for callbacks on success or failure. Can be null.
*/
- public void discoverPeers(Channel c) {
+ public void discoverPeers(Channel c, ActionListener listener) {
if (c == null) return;
- c.mAsyncChannel.sendMessage(DISCOVER_PEERS);
+ c.mAsyncChannel.sendMessage(DISCOVER_PEERS, 0, c.putListener(listener));
}
/**
* Start a p2p connection to a device with the specified configuration.
*
* <p> The function call immediately returns after sending a connection request
- * to the framework. The application handler is notified of a success or failure to initiate
- * connectivity with {@link #CONNECT_SUCCEEDED} or {@link #CONNECT_FAILED}.
+ * to the framework. The application is notified of a success or failure to initiate
+ * connect through listener callbacks {@link ActionListener#onSuccess} or
+ * {@link ActionListener#onFailure}.
*
* <p> Register for {@link #WIFI_P2P_CONNECTION_CHANGED_ACTION} intent to
* determine when the framework notifies of a change in connectivity.
@@ -460,100 +520,102 @@
* a p2p group with {@link #createGroup}, an invitation to join the group is sent to
* the peer device.
*
- * @param config options as described in {@link WifiP2pConfig} class.
+ * @param c is the channel created at {@link #initialize}
+ * @param config options as described in {@link WifiP2pConfig} class
+ * @param listener for callbacks on success or failure. Can be null.
*/
- public void connect(Channel c, WifiP2pConfig config) {
+ public void connect(Channel c, WifiP2pConfig config, ActionListener listener) {
if (c == null) return;
- c.mAsyncChannel.sendMessage(CONNECT, config);
+ c.mAsyncChannel.sendMessage(CONNECT, 0, c.putListener(listener), config);
+ }
+
+ /**
+ * Cancel any ongoing p2p group negotiation
+ *
+ * <p> The function call immediately returns after sending a connection cancellation request
+ * to the framework. The application is notified of a success or failure to initiate
+ * cancellation through listener callbacks {@link ActionListener#onSuccess} or
+ * {@link ActionListener#onFailure}.
+ *
+ * @param c is the channel created at {@link #initialize}
+ * @param listener for callbacks on success or failure. Can be null.
+ */
+ public void cancelConnect(Channel c, ActionListener listener) {
+ if (c == null) return;
+ c.mAsyncChannel.sendMessage(CANCEL_CONNECT, 0, c.putListener(listener));
}
/**
* Create a p2p group with the current device as the group owner. This essentially creates
* an access point that can accept connections from legacy clients as well as other p2p
* devices.
- * <p> For p2p operation, this would normally not be used unless the current device needs
+ *
+ * <p class="note"><strong>Note:</strong>
+ * This function would normally not be used unless the current device needs
* to form a p2p connection with a legacy client
*
* <p> The function call immediately returns after sending a group creation request
- * to the framework. The application handler is notified of a success or failure to create
- * group with {@link #CREATE_GROUP_SUCCEEDED} or {@link #CREATE_GROUP_FAILED}.
+ * to the framework. The application is notified of a success or failure to initiate
+ * group creation through listener callbacks {@link ActionListener#onSuccess} or
+ * {@link ActionListener#onFailure}.
*
- * <p> Application can request for the group details with {@link #requestGroupInfo} which will
- * deliver a {@link #RESPONSE_GROUP_INFO} message on the application handler. The application
- * can then extract a {@link WifiP2pGroup} object by calling {@link #groupInfoInResponse}
- * on the message.
+ * <p> Application can request for the group details with {@link #requestGroupInfo}.
+ *
+ * @param c is the channel created at {@link #initialize}
+ * @param listener for callbacks on success or failure. Can be null.
*/
- public void createGroup(Channel c) {
+ public void createGroup(Channel c, ActionListener listener) {
if (c == null) return;
- c.mAsyncChannel.sendMessage(CREATE_GROUP);
+ c.mAsyncChannel.sendMessage(CREATE_GROUP, 0, c.putListener(listener));
}
/**
* Remove the current p2p group.
*
* <p> The function call immediately returns after sending a group removal request
- * to the framework. The application handler is notified of a success or failure to remove
- * a group with {@link #REMOVE_GROUP_SUCCEEDED} or {@link #REMOVE_GROUP_FAILED}.
+ * to the framework. The application is notified of a success or failure to initiate
+ * group removal through listener callbacks {@link ActionListener#onSuccess} or
+ * {@link ActionListener#onFailure}.
+ *
+ * @param c is the channel created at {@link #initialize}
+ * @param listener for callbacks on success or failure. Can be null.
*/
- public void removeGroup(Channel c) {
+ public void removeGroup(Channel c, ActionListener listener) {
if (c == null) return;
- c.mAsyncChannel.sendMessage(REMOVE_GROUP);
+ c.mAsyncChannel.sendMessage(REMOVE_GROUP, 0, c.putListener(listener));
}
/**
- * Request the current list of peers. This returns a {@link #RESPONSE_PEERS} on the application
- * handler. The {@link #RESPONSE_PEERS} message on the handler indicates that the peer list is
- * available. Use {@link #peersInResponse} to extract {@link WifiP2pDeviceList} from the message
+ * Request the current list of peers.
+ *
+ * @param c is the channel created at {@link #initialize}
+ * @param listener for callback when peer list is available. Can be null.
*/
- public void requestPeers(Channel c) {
+ public void requestPeers(Channel c, PeerListListener listener) {
if (c == null) return;
- c.mAsyncChannel.sendMessage(REQUEST_PEERS);
+ c.mAsyncChannel.sendMessage(REQUEST_PEERS, 0, c.putListener(listener));
}
/**
- * Upon receiving a {@link #RESPONSE_PEERS} on the application handler, an application
- * can extract the peer device list using this function.
+ * Request device connection info.
+ *
+ * @param c is the channel created at {@link #initialize}
+ * @param listener for callback when connection info is available. Can be null.
*/
- public WifiP2pDeviceList peersInResponse(Message msg) {
- return (WifiP2pDeviceList) msg.obj;
- }
-
- /**
- * Request device connection info. This returns a {@link #RESPONSE_CONNECTION_INFO} on
- * the application handler. The {@link #RESPONSE_CONNECTION_INFO} message on the handler
- * indicates that connection info is available. Use {@link #connectionInfoInResponse} to
- * extract {@link WifiP2pInfo} from the message.
- */
- public void requestConnectionInfo(Channel c) {
+ public void requestConnectionInfo(Channel c, ConnectionInfoListener listener) {
if (c == null) return;
- c.mAsyncChannel.sendMessage(REQUEST_CONNECTION_INFO);
+ c.mAsyncChannel.sendMessage(REQUEST_CONNECTION_INFO, 0, c.putListener(listener));
}
/**
- * Upon receiving a {@link #RESPONSE_CONNECTION_INFO} on the application handler, an application
- * can extract the connection info using this function.
+ * Request p2p group info.
+ *
+ * @param c is the channel created at {@link #initialize}
+ * @param listener for callback when group info is available. Can be null.
*/
- public WifiP2pInfo connectionInfoInResponse(Message msg) {
- return (WifiP2pInfo) msg.obj;
- }
-
- /**
- * Request p2p group info. This returns a {@link #RESPONSE_GROUP_INFO} on
- * the application handler. The {@link #RESPONSE_GROUP_INFO} message on the handler
- * indicates that group info is available. Use {@link #groupInfoInResponse} to
- * extract {@link WifiP2pGroup} from the message.
- */
- public void requestGroupInfo(Channel c) {
+ public void requestGroupInfo(Channel c, GroupInfoListener listener) {
if (c == null) return;
- c.mAsyncChannel.sendMessage(REQUEST_GROUP_INFO);
- }
-
- /**
- * Upon receiving a {@link #RESPONSE_GROUP_INFO} on the application handler, an application
- * can extract the group info using this function.
- */
- public WifiP2pGroup groupInfoInResponse(Message msg) {
- return (WifiP2pGroup) msg.obj;
+ c.mAsyncChannel.sendMessage(REQUEST_GROUP_INFO, 0, c.putListener(listener));
}
/**
@@ -571,36 +633,4 @@
}
}
- /**
- * Setup DNS connectivity on the current process to the connected Wi-Fi p2p peers
- *
- * @return -1 on failure
- * @hide
- */
- public int startPeerCommunication() {
- IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
- IConnectivityManager cm = IConnectivityManager.Stub.asInterface(b);
- try {
- return cm.startUsingNetworkFeature(ConnectivityManager.TYPE_WIFI, "p2p", new Binder());
- } catch (RemoteException e) {
- return -1;
- }
- }
-
- /**
- * Tear down connectivity to the connected Wi-Fi p2p peers
- *
- * @return -1 on failure
- * @hide
- */
- public int stopPeerCommunication() {
- IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
- IConnectivityManager cm = IConnectivityManager.Stub.asInterface(b);
- try {
- return cm.stopUsingNetworkFeature(ConnectivityManager.TYPE_WIFI, "p2p");
- } catch (RemoteException e) {
- return -1;
- }
- }
-
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
index e2b2249..1b02774 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
@@ -41,9 +41,7 @@
import android.net.wifi.WifiMonitor;
import android.net.wifi.WifiNative;
import android.net.wifi.WifiStateMachine;
-import android.net.wifi.Wps;
-import android.net.wifi.Wps.Setup;
-import android.net.wifi.p2p.WifiP2pDevice.Status;
+import android.net.wifi.WpsInfo;
import android.os.Binder;
import android.os.IBinder;
import android.os.INetworkManagementService;
@@ -61,6 +59,7 @@
import android.widget.EditText;
import com.android.internal.R;
+import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
import com.android.internal.util.State;
@@ -132,10 +131,16 @@
/* User rejected to disable Wi-Fi in order to enable p2p */
private static final int WIFI_DISABLE_USER_REJECT = BASE + 5;
+ /* Airplane mode changed */
+ private static final int AIRPLANE_MODE_CHANGED = BASE + 6;
+ /* Emergency callback mode */
+ private static final int EMERGENCY_CALLBACK_MODE = BASE + 7;
+ private static final int WPS_PBC = BASE + 8;
+ private static final int WPS_PIN = BASE + 9;
+
private final boolean mP2pSupported;
- private final String mDeviceType;
- private String mDeviceName;
- private String mDeviceAddress;
+
+ private WifiP2pDevice mThisDevice = new WifiP2pDevice();
/* When a group has been explicitly created by an app, we persist the group
* even after all clients have been disconnected until an explicit remove
@@ -158,9 +163,9 @@
mP2pSupported = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_WIFI_DIRECT);
- mDeviceType = mContext.getResources().getString(
+ mThisDevice.primaryDeviceType = mContext.getResources().getString(
com.android.internal.R.string.config_wifi_p2p_device_type);
- mDeviceName = getDefaultDeviceName();
+ mThisDevice.deviceName = getDefaultDeviceName();
mP2pStateMachine = new P2pStateMachine(TAG, mP2pSupported);
mP2pStateMachine.start();
@@ -168,6 +173,8 @@
// broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
mContext.registerReceiver(new WifiStateReceiver(), filter);
@@ -181,12 +188,19 @@
private class WifiStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
+ String action = intent.getAction();
+ if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
mWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
WifiManager.WIFI_STATE_DISABLED);
- } else if (intent.getAction().equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
+ } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
mWifiApState = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE,
WifiManager.WIFI_AP_STATE_DISABLED);
+ } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
+ mP2pStateMachine.sendMessage(AIRPLANE_MODE_CHANGED);
+ } else if (action.equals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED)) {
+ if (intent.getBooleanExtra("phoneinECMState", false) == true) {
+ mP2pStateMachine.sendMessage(EMERGENCY_CALLBACK_MODE);
+ }
}
}
}
@@ -335,6 +349,10 @@
replyToMessage(message, WifiP2pManager.CONNECT_FAILED,
WifiP2pManager.BUSY);
break;
+ case WifiP2pManager.CANCEL_CONNECT:
+ replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED,
+ WifiP2pManager.BUSY);
+ break;
case WifiP2pManager.CREATE_GROUP:
replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED,
WifiP2pManager.BUSY);
@@ -352,7 +370,13 @@
case WifiP2pManager.REQUEST_GROUP_INFO:
replyToMessage(message, WifiP2pManager.RESPONSE_GROUP_INFO, mGroup);
break;
- // Ignore
+ case AIRPLANE_MODE_CHANGED:
+ if (isAirplaneModeOn()) sendMessage(WifiP2pManager.DISABLE_P2P);
+ break;
+ case EMERGENCY_CALLBACK_MODE:
+ sendMessage(WifiP2pManager.DISABLE_P2P);
+ break;
+ // Ignore
case WIFI_DISABLE_USER_ACCEPT:
case WIFI_DISABLE_USER_REJECT:
case GROUP_NEGOTIATION_TIMED_OUT:
@@ -389,6 +413,10 @@
replyToMessage(message, WifiP2pManager.CONNECT_FAILED,
WifiP2pManager.P2P_UNSUPPORTED);
break;
+ case WifiP2pManager.CANCEL_CONNECT:
+ replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED,
+ WifiP2pManager.P2P_UNSUPPORTED);
+ break;
case WifiP2pManager.CREATE_GROUP:
replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED,
WifiP2pManager.P2P_UNSUPPORTED);
@@ -635,7 +663,7 @@
break;
case WifiMonitor.P2P_DEVICE_FOUND_EVENT:
WifiP2pDevice device = (WifiP2pDevice) message.obj;
- if (mDeviceAddress.equals(device.deviceAddress)) break;
+ if (mThisDevice.deviceAddress.equals(device.deviceAddress)) break;
mPeers.update(device);
sendP2pPeersChangedBroadcast();
break;
@@ -662,7 +690,7 @@
// do nothing if p2pConnect did not return a pin
}
}
- updateDeviceStatus(mSavedConnectConfig.deviceAddress, Status.INVITED);
+ updateDeviceStatus(mSavedConnectConfig.deviceAddress, WifiP2pDevice.INVITED);
sendP2pPeersChangedBroadcast();
replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED);
transitionTo(mGroupNegotiationState);
@@ -685,7 +713,7 @@
P2pStateMachine.this, mGroup.getInterface());
mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_START_DHCP);
WifiP2pDevice groupOwner = mGroup.getOwner();
- updateDeviceStatus(groupOwner.deviceAddress, Status.CONNECTED);
+ updateDeviceStatus(groupOwner.deviceAddress, WifiP2pDevice.CONNECTED);
sendP2pPeersChangedBroadcast();
}
transitionTo(mGroupCreatedState);
@@ -762,7 +790,7 @@
case WifiMonitor.P2P_GO_NEGOTIATION_FAILURE_EVENT:
case WifiMonitor.P2P_GROUP_FORMATION_FAILURE_EVENT:
if (DBG) logd(getName() + " go failure");
- updateDeviceStatus(mSavedConnectConfig.deviceAddress, Status.FAILED);
+ updateDeviceStatus(mSavedConnectConfig.deviceAddress, WifiP2pDevice.FAILED);
mSavedConnectConfig = null;
sendP2pPeersChangedBroadcast();
transitionTo(mInactiveState);
@@ -770,7 +798,7 @@
case GROUP_NEGOTIATION_TIMED_OUT:
if (mGroupNegotiationTimeoutIndex == message.arg1) {
if (DBG) logd("Group negotiation timed out");
- updateDeviceStatus(mSavedConnectConfig.deviceAddress, Status.FAILED);
+ updateDeviceStatus(mSavedConnectConfig.deviceAddress, WifiP2pDevice.FAILED);
mSavedConnectConfig = null;
sendP2pPeersChangedBroadcast();
transitionTo(mInactiveState);
@@ -781,6 +809,14 @@
replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED,
WifiP2pManager.BUSY);
break;
+ case WifiP2pManager.CANCEL_CONNECT:
+ if (WifiNative.p2pCancelConnect()) {
+ replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_SUCCEEDED);
+ } else {
+ replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED,
+ WifiP2pManager.ERROR);
+ }
+ break;
default:
return NOT_HANDLED;
}
@@ -794,6 +830,8 @@
if (DBG) logd(getName());
mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null);
+ updateThisDevice(WifiP2pDevice.CONNECTED);
+
//DHCP server has already been started if I am a group owner
if (mGroup.isGroupOwner()) {
setWifiP2pInfoOnGroupFormation(SERVER_ADDRESS);
@@ -811,7 +849,7 @@
String deviceAddress = getDeviceAddress(interfaceAddress);
if (deviceAddress != null) {
mGroup.addClient(deviceAddress);
- updateDeviceStatus(deviceAddress, Status.CONNECTED);
+ updateDeviceStatus(deviceAddress, WifiP2pDevice.CONNECTED);
if (DBG) logd(getName() + " ap sta connected");
sendP2pPeersChangedBroadcast();
} else {
@@ -822,7 +860,7 @@
interfaceAddress = (String) message.obj;
deviceAddress = getDeviceAddress(interfaceAddress);
if (deviceAddress != null) {
- updateDeviceStatus(deviceAddress, Status.AVAILABLE);
+ updateDeviceStatus(deviceAddress, WifiP2pDevice.AVAILABLE);
if (mGroup.removeClient(deviceAddress)) {
if (DBG) logd("Removed client " + deviceAddress);
if (!mPersistGroup && mGroup.isClientListEmpty()) {
@@ -867,7 +905,7 @@
boolean changed = false;
for (WifiP2pDevice d : mPeers.getDeviceList()) {
if (devices.contains(d) || mGroup.getOwner().equals(d)) {
- d.status = Status.AVAILABLE;
+ d.status = WifiP2pDevice.AVAILABLE;
changed = true;
}
}
@@ -905,7 +943,7 @@
WifiP2pConfig config = (WifiP2pConfig) message.obj;
logd("Inviting device : " + config.deviceAddress);
if (WifiNative.p2pInvite(mGroup, config.deviceAddress)) {
- updateDeviceStatus(config.deviceAddress, Status.INVITED);
+ updateDeviceStatus(config.deviceAddress, WifiP2pDevice.INVITED);
sendP2pPeersChangedBroadcast();
replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED);
} else {
@@ -926,10 +964,10 @@
case WifiMonitor.P2P_GROUP_STARTED_EVENT:
Slog.e(TAG, "Duplicate group creation event notice, ignore");
break;
- case WifiP2pManager.WPS_PBC:
+ case WPS_PBC:
WifiNative.wpsPbc();
break;
- case WifiP2pManager.WPS_PIN:
+ case WPS_PIN:
WifiNative.wpsPin((String) message.obj);
break;
default:
@@ -939,6 +977,7 @@
}
public void exit() {
+ updateThisDevice(WifiP2pDevice.AVAILABLE);
setWifiP2pInfoOnGroupTermination();
mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null);
sendP2pConnectionChangedBroadcast();
@@ -958,6 +997,13 @@
mContext.sendStickyBroadcast(intent);
}
+ private void sendThisDeviceChangedBroadcast() {
+ final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE, new WifiP2pDevice(mThisDevice));
+ mContext.sendStickyBroadcast(intent);
+ }
+
private void sendP2pPeersChangedBroadcast() {
final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
@@ -1027,7 +1073,7 @@
private void notifyP2pGoNegotationRequest(WifiP2pConfig config) {
Resources r = Resources.getSystem();
- Wps wps = config.wps;
+ WpsInfo wps = config.wps;
final View textEntryView = LayoutInflater.from(mContext)
.inflate(R.layout.wifi_p2p_go_negotiation_request_alert, null);
final EditText pin = (EditText) textEntryView .findViewById(R.id.wifi_p2p_wps_pin);
@@ -1040,9 +1086,9 @@
if (DBG) logd(getName() + " connect " + pin.getText());
if (pin.getVisibility() == View.GONE) {
- mSavedGoNegotiationConfig.wps.setup = Setup.PBC;
+ mSavedGoNegotiationConfig.wps.setup = WpsInfo.PBC;
} else {
- mSavedGoNegotiationConfig.wps.setup = Setup.KEYPAD;
+ mSavedGoNegotiationConfig.wps.setup = WpsInfo.KEYPAD;
mSavedGoNegotiationConfig.wps.pin = pin.getText().toString();
}
sendMessage(WifiP2pManager.CONNECT, mSavedGoNegotiationConfig);
@@ -1058,7 +1104,7 @@
})
.create();
- if (wps.setup == Setup.PBC) {
+ if (wps.setup == WpsInfo.PBC) {
pin.setVisibility(View.GONE);
dialog.setMessage(r.getString(R.string.wifi_p2p_pbc_go_negotiation_request_message,
config.deviceAddress));
@@ -1083,7 +1129,7 @@
.setPositiveButton(r.getString(R.string.ok), new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (DBG) logd(getName() + " wps_pbc");
- sendMessage(WifiP2pManager.WPS_PBC);
+ sendMessage(WPS_PBC);
}
})
.setNegativeButton(r.getString(R.string.cancel), null)
@@ -1109,7 +1155,7 @@
.setPositiveButton(r.getString(R.string.ok), new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (DBG) logd(getName() + " wps_pin");
- sendMessage(WifiP2pManager.WPS_PIN, pin.getText().toString());
+ sendMessage(WPS_PIN, pin.getText().toString());
}
})
.setNegativeButton(r.getString(R.string.cancel), null)
@@ -1152,7 +1198,7 @@
dialog.show();
}
- private void updateDeviceStatus(String deviceAddress, Status status) {
+ private void updateDeviceStatus(String deviceAddress, int status) {
for (WifiP2pDevice d : mPeers.getDeviceList()) {
if (d.deviceAddress.equals(deviceAddress)) {
d.status = status;
@@ -1197,28 +1243,50 @@
private void initializeP2pSettings() {
WifiNative.setPersistentReconnect(true);
- WifiNative.setDeviceName(mDeviceName);
- WifiNative.setDeviceType(mDeviceType);
+ WifiNative.setDeviceName(mThisDevice.deviceName);
+ WifiNative.setDeviceType(mThisDevice.primaryDeviceType);
- mDeviceAddress = WifiNative.p2pGetDeviceAddress();
- if (DBG) Slog.d(TAG, "DeviceAddress: " + mDeviceAddress);
+ mThisDevice.deviceAddress = WifiNative.p2pGetDeviceAddress();
+ updateThisDevice(WifiP2pDevice.AVAILABLE);
+ if (DBG) Slog.d(TAG, "DeviceAddress: " + mThisDevice.deviceAddress);
+ }
+
+ private void updateThisDevice(int status) {
+ mThisDevice.status = status;
+ sendThisDeviceChangedBroadcast();
}
//State machine initiated requests can have replyTo set to null indicating
//there are no recepients, we ignore those reply actions
private void replyToMessage(Message msg, int what) {
if (msg.replyTo == null) return;
- mReplyChannel.replyToMessage(msg, what);
+ Message dstMsg = obtainMessage(msg);
+ dstMsg.what = what;
+ mReplyChannel.replyToMessage(msg, dstMsg);
}
private void replyToMessage(Message msg, int what, int arg1) {
if (msg.replyTo == null) return;
- mReplyChannel.replyToMessage(msg, what, arg1);
+ Message dstMsg = obtainMessage(msg);
+ dstMsg.what = what;
+ dstMsg.arg1 = arg1;
+ mReplyChannel.replyToMessage(msg, dstMsg);
}
private void replyToMessage(Message msg, int what, Object obj) {
if (msg.replyTo == null) return;
- mReplyChannel.replyToMessage(msg, what, obj);
+ Message dstMsg = obtainMessage(msg);
+ dstMsg.what = what;
+ dstMsg.obj = obj;
+ mReplyChannel.replyToMessage(msg, dstMsg);
+ }
+
+ /* arg2 on the source message has a hash code that needs to be retained in replies
+ * see WifiP2pManager for details */
+ private Message obtainMessage(Message srcMsg) {
+ Message msg = Message.obtain();
+ msg.arg2 = srcMsg.arg2;
+ return msg;
}
private void logd(String s) {
@@ -1266,5 +1334,17 @@
}
}
+ private boolean isAirplaneSensitive() {
+ String airplaneModeRadios = Settings.System.getString(mContext.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_RADIOS);
+ return airplaneModeRadios == null
+ || airplaneModeRadios.contains(Settings.System.RADIO_WIFI);
+ }
+
+ private boolean isAirplaneModeOn() {
+ return isAirplaneSensitive() && Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_ON, 0) == 1;
+ }
+
}
}