diff options
201 files changed, 3654 insertions, 2380 deletions
diff --git a/api/current.txt b/api/current.txt index 67c9276da900..615384228666 100644 --- a/api/current.txt +++ b/api/current.txt @@ -267,6 +267,7 @@ package android { 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 actionOverflowMenuStyle = 16843857; // 0x1010451 field public static final int actionProviderClass = 16843657; // 0x1010389 field public static final int actionViewClass = 16843516; // 0x10102fc field public static final int activatedBackgroundIndicator = 16843517; // 0x10102fd @@ -1858,28 +1859,28 @@ package android { field public static final int TextAppearance_Medium = 16973892; // 0x1030044 field public static final int TextAppearance_Medium_Inverse = 16973893; // 0x1030045 field public static final int TextAppearance_Quantum = 16974352; // 0x1030210 - field public static final int TextAppearance_Quantum_Body1 = 16974542; // 0x10302ce - field public static final int TextAppearance_Quantum_Body2 = 16974541; // 0x10302cd - field public static final int TextAppearance_Quantum_Button = 16974545; // 0x10302d1 - field public static final int TextAppearance_Quantum_Caption = 16974543; // 0x10302cf + field public static final int TextAppearance_Quantum_Body1 = 16974544; // 0x10302d0 + field public static final int TextAppearance_Quantum_Body2 = 16974543; // 0x10302cf + field public static final int TextAppearance_Quantum_Button = 16974547; // 0x10302d3 + field public static final int TextAppearance_Quantum_Caption = 16974545; // 0x10302d1 field public static final int TextAppearance_Quantum_DialogWindowTitle = 16974353; // 0x1030211 - field public static final int TextAppearance_Quantum_Display1 = 16974537; // 0x10302c9 - field public static final int TextAppearance_Quantum_Display2 = 16974536; // 0x10302c8 - field public static final int TextAppearance_Quantum_Display3 = 16974535; // 0x10302c7 - field public static final int TextAppearance_Quantum_Display4 = 16974534; // 0x10302c6 - field public static final int TextAppearance_Quantum_Headline = 16974538; // 0x10302ca + field public static final int TextAppearance_Quantum_Display1 = 16974539; // 0x10302cb + field public static final int TextAppearance_Quantum_Display2 = 16974538; // 0x10302ca + field public static final int TextAppearance_Quantum_Display3 = 16974537; // 0x10302c9 + field public static final int TextAppearance_Quantum_Display4 = 16974536; // 0x10302c8 + field public static final int TextAppearance_Quantum_Headline = 16974540; // 0x10302cc field public static final int TextAppearance_Quantum_Inverse = 16974354; // 0x1030212 field public static final int TextAppearance_Quantum_Large = 16974355; // 0x1030213 field public static final int TextAppearance_Quantum_Large_Inverse = 16974356; // 0x1030214 field public static final int TextAppearance_Quantum_Medium = 16974357; // 0x1030215 field public static final int TextAppearance_Quantum_Medium_Inverse = 16974358; // 0x1030216 - field public static final int TextAppearance_Quantum_Menu = 16974544; // 0x10302d0 + field public static final int TextAppearance_Quantum_Menu = 16974546; // 0x10302d2 field public static final int TextAppearance_Quantum_SearchResult_Subtitle = 16974359; // 0x1030217 field public static final int TextAppearance_Quantum_SearchResult_Title = 16974360; // 0x1030218 field public static final int TextAppearance_Quantum_Small = 16974361; // 0x1030219 field public static final int TextAppearance_Quantum_Small_Inverse = 16974362; // 0x103021a - field public static final int TextAppearance_Quantum_Subhead = 16974540; // 0x10302cc - field public static final int TextAppearance_Quantum_Title = 16974539; // 0x10302cb + field public static final int TextAppearance_Quantum_Subhead = 16974542; // 0x10302ce + field public static final int TextAppearance_Quantum_Title = 16974541; // 0x10302cd field public static final int TextAppearance_Quantum_Widget = 16974364; // 0x103021c field public static final int TextAppearance_Quantum_Widget_ActionBar_Menu = 16974365; // 0x103021d field public static final int TextAppearance_Quantum_Widget_ActionBar_Subtitle = 16974366; // 0x103021e @@ -2351,92 +2352,94 @@ package android { field public static final int Widget_Quantum_GridView = 16974445; // 0x103026d field public static final int Widget_Quantum_HorizontalScrollView = 16974446; // 0x103026e field public static final int Widget_Quantum_ImageButton = 16974447; // 0x103026f - field public static final int Widget_Quantum_Light = 16974473; // 0x1030289 - field public static final int Widget_Quantum_Light_ActionBar = 16974474; // 0x103028a - field public static final int Widget_Quantum_Light_ActionBar_Solid = 16974475; // 0x103028b - field public static final int Widget_Quantum_Light_ActionBar_TabBar = 16974476; // 0x103028c - field public static final int Widget_Quantum_Light_ActionBar_TabText = 16974477; // 0x103028d - field public static final int Widget_Quantum_Light_ActionBar_TabView = 16974478; // 0x103028e - field public static final int Widget_Quantum_Light_ActionButton = 16974479; // 0x103028f - field public static final int Widget_Quantum_Light_ActionButton_CloseMode = 16974480; // 0x1030290 - field public static final int Widget_Quantum_Light_ActionButton_Overflow = 16974481; // 0x1030291 - field public static final int Widget_Quantum_Light_ActionMode = 16974482; // 0x1030292 - field public static final int Widget_Quantum_Light_AutoCompleteTextView = 16974483; // 0x1030293 - field public static final int Widget_Quantum_Light_Button = 16974484; // 0x1030294 - field public static final int Widget_Quantum_Light_ButtonBar = 16974490; // 0x103029a - field public static final int Widget_Quantum_Light_ButtonBar_AlertDialog = 16974491; // 0x103029b - field public static final int Widget_Quantum_Light_Button_Borderless = 16974485; // 0x1030295 - field public static final int Widget_Quantum_Light_Button_Borderless_Small = 16974486; // 0x1030296 - field public static final int Widget_Quantum_Light_Button_Inset = 16974487; // 0x1030297 - field public static final int Widget_Quantum_Light_Button_Small = 16974488; // 0x1030298 - field public static final int Widget_Quantum_Light_Button_Toggle = 16974489; // 0x1030299 - field public static final int Widget_Quantum_Light_CalendarView = 16974492; // 0x103029c - field public static final int Widget_Quantum_Light_CheckedTextView = 16974493; // 0x103029d - field public static final int Widget_Quantum_Light_CompoundButton_CheckBox = 16974494; // 0x103029e - field public static final int Widget_Quantum_Light_CompoundButton_RadioButton = 16974495; // 0x103029f - field public static final int Widget_Quantum_Light_CompoundButton_Star = 16974496; // 0x10302a0 - field public static final int Widget_Quantum_Light_DropDownItem = 16974497; // 0x10302a1 - field public static final int Widget_Quantum_Light_DropDownItem_Spinner = 16974498; // 0x10302a2 - field public static final int Widget_Quantum_Light_EditText = 16974499; // 0x10302a3 - field public static final int Widget_Quantum_Light_ExpandableListView = 16974500; // 0x10302a4 - field public static final int Widget_Quantum_Light_FastScroll = 16974501; // 0x10302a5 - field public static final int Widget_Quantum_Light_FragmentBreadCrumbs = 16974502; // 0x10302a6 - field public static final int Widget_Quantum_Light_GridView = 16974503; // 0x10302a7 - field public static final int Widget_Quantum_Light_HorizontalScrollView = 16974504; // 0x10302a8 - field public static final int Widget_Quantum_Light_ImageButton = 16974505; // 0x10302a9 - field public static final int Widget_Quantum_Light_ListPopupWindow = 16974506; // 0x10302aa - field public static final int Widget_Quantum_Light_ListView = 16974507; // 0x10302ab - field public static final int Widget_Quantum_Light_ListView_DropDown = 16974508; // 0x10302ac - field public static final int Widget_Quantum_Light_MediaRouteButton = 16974509; // 0x10302ad - field public static final int Widget_Quantum_Light_PopupMenu = 16974510; // 0x10302ae - field public static final int Widget_Quantum_Light_PopupWindow = 16974511; // 0x10302af - field public static final int Widget_Quantum_Light_ProgressBar = 16974512; // 0x10302b0 - field public static final int Widget_Quantum_Light_ProgressBar_Horizontal = 16974513; // 0x10302b1 - field public static final int Widget_Quantum_Light_ProgressBar_Inverse = 16974514; // 0x10302b2 - field public static final int Widget_Quantum_Light_ProgressBar_Large = 16974515; // 0x10302b3 - field public static final int Widget_Quantum_Light_ProgressBar_Large_Inverse = 16974516; // 0x10302b4 - field public static final int Widget_Quantum_Light_ProgressBar_Small = 16974517; // 0x10302b5 - field public static final int Widget_Quantum_Light_ProgressBar_Small_Inverse = 16974518; // 0x10302b6 - field public static final int Widget_Quantum_Light_ProgressBar_Small_Title = 16974519; // 0x10302b7 - field public static final int Widget_Quantum_Light_RatingBar = 16974520; // 0x10302b8 - field public static final int Widget_Quantum_Light_RatingBar_Indicator = 16974521; // 0x10302b9 - field public static final int Widget_Quantum_Light_RatingBar_Small = 16974522; // 0x10302ba - field public static final int Widget_Quantum_Light_ScrollView = 16974523; // 0x10302bb - field public static final int Widget_Quantum_Light_SeekBar = 16974524; // 0x10302bc - field public static final int Widget_Quantum_Light_SegmentedButton = 16974525; // 0x10302bd - field public static final int Widget_Quantum_Light_Spinner = 16974527; // 0x10302bf - field public static final int Widget_Quantum_Light_StackView = 16974526; // 0x10302be - field public static final int Widget_Quantum_Light_Tab = 16974528; // 0x10302c0 - field public static final int Widget_Quantum_Light_TabWidget = 16974529; // 0x10302c1 - field public static final int Widget_Quantum_Light_TextView = 16974530; // 0x10302c2 - field public static final int Widget_Quantum_Light_TextView_SpinnerItem = 16974531; // 0x10302c3 - field public static final int Widget_Quantum_Light_WebTextView = 16974532; // 0x10302c4 - field public static final int Widget_Quantum_Light_WebView = 16974533; // 0x10302c5 + field public static final int Widget_Quantum_Light = 16974474; // 0x103028a + field public static final int Widget_Quantum_Light_ActionBar = 16974475; // 0x103028b + field public static final int Widget_Quantum_Light_ActionBar_Solid = 16974476; // 0x103028c + field public static final int Widget_Quantum_Light_ActionBar_TabBar = 16974477; // 0x103028d + field public static final int Widget_Quantum_Light_ActionBar_TabText = 16974478; // 0x103028e + field public static final int Widget_Quantum_Light_ActionBar_TabView = 16974479; // 0x103028f + field public static final int Widget_Quantum_Light_ActionButton = 16974480; // 0x1030290 + field public static final int Widget_Quantum_Light_ActionButton_CloseMode = 16974481; // 0x1030291 + field public static final int Widget_Quantum_Light_ActionButton_Overflow = 16974482; // 0x1030292 + field public static final int Widget_Quantum_Light_ActionMode = 16974483; // 0x1030293 + field public static final int Widget_Quantum_Light_AutoCompleteTextView = 16974484; // 0x1030294 + field public static final int Widget_Quantum_Light_Button = 16974485; // 0x1030295 + field public static final int Widget_Quantum_Light_ButtonBar = 16974491; // 0x103029b + field public static final int Widget_Quantum_Light_ButtonBar_AlertDialog = 16974492; // 0x103029c + field public static final int Widget_Quantum_Light_Button_Borderless = 16974486; // 0x1030296 + field public static final int Widget_Quantum_Light_Button_Borderless_Small = 16974487; // 0x1030297 + field public static final int Widget_Quantum_Light_Button_Inset = 16974488; // 0x1030298 + field public static final int Widget_Quantum_Light_Button_Small = 16974489; // 0x1030299 + field public static final int Widget_Quantum_Light_Button_Toggle = 16974490; // 0x103029a + field public static final int Widget_Quantum_Light_CalendarView = 16974493; // 0x103029d + field public static final int Widget_Quantum_Light_CheckedTextView = 16974494; // 0x103029e + field public static final int Widget_Quantum_Light_CompoundButton_CheckBox = 16974495; // 0x103029f + field public static final int Widget_Quantum_Light_CompoundButton_RadioButton = 16974496; // 0x10302a0 + field public static final int Widget_Quantum_Light_CompoundButton_Star = 16974497; // 0x10302a1 + field public static final int Widget_Quantum_Light_DropDownItem = 16974498; // 0x10302a2 + field public static final int Widget_Quantum_Light_DropDownItem_Spinner = 16974499; // 0x10302a3 + field public static final int Widget_Quantum_Light_EditText = 16974500; // 0x10302a4 + field public static final int Widget_Quantum_Light_ExpandableListView = 16974501; // 0x10302a5 + field public static final int Widget_Quantum_Light_FastScroll = 16974502; // 0x10302a6 + field public static final int Widget_Quantum_Light_FragmentBreadCrumbs = 16974503; // 0x10302a7 + field public static final int Widget_Quantum_Light_GridView = 16974504; // 0x10302a8 + field public static final int Widget_Quantum_Light_HorizontalScrollView = 16974505; // 0x10302a9 + field public static final int Widget_Quantum_Light_ImageButton = 16974506; // 0x10302aa + field public static final int Widget_Quantum_Light_ListPopupWindow = 16974507; // 0x10302ab + field public static final int Widget_Quantum_Light_ListView = 16974508; // 0x10302ac + field public static final int Widget_Quantum_Light_ListView_DropDown = 16974509; // 0x10302ad + field public static final int Widget_Quantum_Light_MediaRouteButton = 16974510; // 0x10302ae + field public static final int Widget_Quantum_Light_PopupMenu = 16974511; // 0x10302af + field public static final int Widget_Quantum_Light_PopupMenu_Overflow = 16974512; // 0x10302b0 + field public static final int Widget_Quantum_Light_PopupWindow = 16974513; // 0x10302b1 + field public static final int Widget_Quantum_Light_ProgressBar = 16974514; // 0x10302b2 + field public static final int Widget_Quantum_Light_ProgressBar_Horizontal = 16974515; // 0x10302b3 + field public static final int Widget_Quantum_Light_ProgressBar_Inverse = 16974516; // 0x10302b4 + field public static final int Widget_Quantum_Light_ProgressBar_Large = 16974517; // 0x10302b5 + field public static final int Widget_Quantum_Light_ProgressBar_Large_Inverse = 16974518; // 0x10302b6 + field public static final int Widget_Quantum_Light_ProgressBar_Small = 16974519; // 0x10302b7 + field public static final int Widget_Quantum_Light_ProgressBar_Small_Inverse = 16974520; // 0x10302b8 + field public static final int Widget_Quantum_Light_ProgressBar_Small_Title = 16974521; // 0x10302b9 + field public static final int Widget_Quantum_Light_RatingBar = 16974522; // 0x10302ba + field public static final int Widget_Quantum_Light_RatingBar_Indicator = 16974523; // 0x10302bb + field public static final int Widget_Quantum_Light_RatingBar_Small = 16974524; // 0x10302bc + field public static final int Widget_Quantum_Light_ScrollView = 16974525; // 0x10302bd + field public static final int Widget_Quantum_Light_SeekBar = 16974526; // 0x10302be + field public static final int Widget_Quantum_Light_SegmentedButton = 16974527; // 0x10302bf + field public static final int Widget_Quantum_Light_Spinner = 16974529; // 0x10302c1 + field public static final int Widget_Quantum_Light_StackView = 16974528; // 0x10302c0 + field public static final int Widget_Quantum_Light_Tab = 16974530; // 0x10302c2 + field public static final int Widget_Quantum_Light_TabWidget = 16974531; // 0x10302c3 + field public static final int Widget_Quantum_Light_TextView = 16974532; // 0x10302c4 + field public static final int Widget_Quantum_Light_TextView_SpinnerItem = 16974533; // 0x10302c5 + field public static final int Widget_Quantum_Light_WebTextView = 16974534; // 0x10302c6 + field public static final int Widget_Quantum_Light_WebView = 16974535; // 0x10302c7 field public static final int Widget_Quantum_ListPopupWindow = 16974448; // 0x1030270 field public static final int Widget_Quantum_ListView = 16974449; // 0x1030271 field public static final int Widget_Quantum_ListView_DropDown = 16974450; // 0x1030272 field public static final int Widget_Quantum_MediaRouteButton = 16974451; // 0x1030273 field public static final int Widget_Quantum_PopupMenu = 16974452; // 0x1030274 - field public static final int Widget_Quantum_PopupWindow = 16974453; // 0x1030275 - field public static final int Widget_Quantum_ProgressBar = 16974454; // 0x1030276 - field public static final int Widget_Quantum_ProgressBar_Horizontal = 16974455; // 0x1030277 - field public static final int Widget_Quantum_ProgressBar_Large = 16974456; // 0x1030278 - field public static final int Widget_Quantum_ProgressBar_Small = 16974457; // 0x1030279 - field public static final int Widget_Quantum_ProgressBar_Small_Title = 16974458; // 0x103027a - field public static final int Widget_Quantum_RatingBar = 16974459; // 0x103027b - field public static final int Widget_Quantum_RatingBar_Indicator = 16974460; // 0x103027c - field public static final int Widget_Quantum_RatingBar_Small = 16974461; // 0x103027d - field public static final int Widget_Quantum_ScrollView = 16974462; // 0x103027e - field public static final int Widget_Quantum_SeekBar = 16974463; // 0x103027f - field public static final int Widget_Quantum_SegmentedButton = 16974464; // 0x1030280 - field public static final int Widget_Quantum_Spinner = 16974466; // 0x1030282 - field public static final int Widget_Quantum_StackView = 16974465; // 0x1030281 - field public static final int Widget_Quantum_Tab = 16974467; // 0x1030283 - field public static final int Widget_Quantum_TabWidget = 16974468; // 0x1030284 - field public static final int Widget_Quantum_TextView = 16974469; // 0x1030285 - field public static final int Widget_Quantum_TextView_SpinnerItem = 16974470; // 0x1030286 - field public static final int Widget_Quantum_WebTextView = 16974471; // 0x1030287 - field public static final int Widget_Quantum_WebView = 16974472; // 0x1030288 + field public static final int Widget_Quantum_PopupMenu_Overflow = 16974453; // 0x1030275 + field public static final int Widget_Quantum_PopupWindow = 16974454; // 0x1030276 + field public static final int Widget_Quantum_ProgressBar = 16974455; // 0x1030277 + field public static final int Widget_Quantum_ProgressBar_Horizontal = 16974456; // 0x1030278 + field public static final int Widget_Quantum_ProgressBar_Large = 16974457; // 0x1030279 + field public static final int Widget_Quantum_ProgressBar_Small = 16974458; // 0x103027a + field public static final int Widget_Quantum_ProgressBar_Small_Title = 16974459; // 0x103027b + field public static final int Widget_Quantum_RatingBar = 16974460; // 0x103027c + field public static final int Widget_Quantum_RatingBar_Indicator = 16974461; // 0x103027d + field public static final int Widget_Quantum_RatingBar_Small = 16974462; // 0x103027e + field public static final int Widget_Quantum_ScrollView = 16974463; // 0x103027f + field public static final int Widget_Quantum_SeekBar = 16974464; // 0x1030280 + field public static final int Widget_Quantum_SegmentedButton = 16974465; // 0x1030281 + field public static final int Widget_Quantum_Spinner = 16974467; // 0x1030283 + field public static final int Widget_Quantum_StackView = 16974466; // 0x1030282 + field public static final int Widget_Quantum_Tab = 16974468; // 0x1030284 + field public static final int Widget_Quantum_TabWidget = 16974469; // 0x1030285 + field public static final int Widget_Quantum_TextView = 16974470; // 0x1030286 + field public static final int Widget_Quantum_TextView_SpinnerItem = 16974471; // 0x1030287 + field public static final int Widget_Quantum_WebTextView = 16974472; // 0x1030288 + field public static final int Widget_Quantum_WebView = 16974473; // 0x1030289 field public static final int Widget_RatingBar = 16973857; // 0x1030021 field public static final int Widget_ScrollView = 16973869; // 0x103002d field public static final int Widget_SeekBar = 16973856; // 0x1030020 @@ -3303,7 +3306,6 @@ package android.app { method public void onUserInteraction(); method protected void onUserLeaveHint(); method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams); - method public void onWindowDismissed(); method public void onWindowFocusChanged(boolean); method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback); method public void openContextMenu(android.view.View); @@ -3859,7 +3861,6 @@ package android.app { method public boolean onTouchEvent(android.view.MotionEvent); method public boolean onTrackballEvent(android.view.MotionEvent); method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams); - method public void onWindowDismissed(); method public void onWindowFocusChanged(boolean); method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback); method public void openContextMenu(android.view.View); @@ -5006,12 +5007,12 @@ package android.app.admin { } public class DevicePolicyManager { + method public void addForwardingIntentFilter(android.content.ComponentName, android.content.IntentFilter, int); method public void addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName); method public void addUserRestriction(android.content.ComponentName, java.lang.String); method public void clearForwardingIntentFilters(android.content.ComponentName); method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String); method public void clearUserRestriction(android.content.ComponentName, java.lang.String); - method public void forwardMatchingIntents(android.content.ComponentName, android.content.IntentFilter, int); method public java.util.List<android.content.ComponentName> getActiveAdmins(); method public android.os.Bundle getApplicationRestrictions(android.content.ComponentName, java.lang.String); method public boolean getCameraDisabled(android.content.ComponentName); @@ -5309,6 +5310,7 @@ package android.appwidget { field public static final int RESIZE_VERTICAL = 2; // 0x2 field public static final int WIDGET_CATEGORY_HOME_SCREEN = 1; // 0x1 field public static final int WIDGET_CATEGORY_KEYGUARD = 2; // 0x2 + field public static final int WIDGET_CATEGORY_RECENTS = 4; // 0x4 field public int autoAdvanceViewId; field public android.content.ComponentName configure; field public int icon; @@ -11227,19 +11229,11 @@ package android.graphics.drawable { public class VectorDrawable extends android.graphics.drawable.Drawable { ctor public VectorDrawable(); method public void draw(android.graphics.Canvas); - method public float geAnimationFraction(); method public int getOpacity(); - method public int getRepeatCount(); method public void setAlpha(int); - method public void setAnimationFraction(float); method public void setColorFilter(android.graphics.ColorFilter); - method public void setDuration(long); method public void setPadding(android.graphics.Rect); method public void setPadding(int, int, int, int); - method public void setRepeatCount(int); - method public void setRepeatMode(int); - method public void start(); - method public void stop(); } } @@ -12002,6 +11996,8 @@ package android.hardware.camera2 { field public static final int CONTROL_SCENE_MODE_STEADYPHOTO = 11; // 0xb field public static final int CONTROL_SCENE_MODE_SUNSET = 10; // 0xa field public static final int CONTROL_SCENE_MODE_THEATRE = 7; // 0x7 + field public static final int CONTROL_VIDEO_STABILIZATION_MODE_OFF = 0; // 0x0 + field public static final int CONTROL_VIDEO_STABILIZATION_MODE_ON = 1; // 0x1 field public static final int EDGE_MODE_FAST = 1; // 0x1 field public static final int EDGE_MODE_HIGH_QUALITY = 2; // 0x2 field public static final int EDGE_MODE_OFF = 0; // 0x0 @@ -12175,17 +12171,29 @@ package android.hardware.camera2 { method public int getSequenceId(); field public static final android.hardware.camera2.CameraMetadata.Key BLACK_LEVEL_LOCK; field public static final android.hardware.camera2.CameraMetadata.Key COLOR_CORRECTION_GAINS; + field public static final android.hardware.camera2.CameraMetadata.Key COLOR_CORRECTION_MODE; field public static final android.hardware.camera2.CameraMetadata.Key COLOR_CORRECTION_TRANSFORM; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_ANTIBANDING_MODE; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_EXPOSURE_COMPENSATION; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_LOCK; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_MODE; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_PRECAPTURE_TRIGGER; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_REGIONS; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_STATE; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AE_TARGET_FPS_RANGE; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_MODE; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_REGIONS; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_STATE; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AF_TRIGGER; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_LOCK; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_MODE; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_REGIONS; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_AWB_STATE; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_CAPTURE_INTENT; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_EFFECT_MODE; field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_MODE; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_SCENE_MODE; + field public static final android.hardware.camera2.CameraMetadata.Key CONTROL_VIDEO_STABILIZATION_MODE; field public static final android.hardware.camera2.CameraMetadata.Key EDGE_MODE; field public static final android.hardware.camera2.CameraMetadata.Key FLASH_MODE; field public static final android.hardware.camera2.CameraMetadata.Key FLASH_STATE; @@ -12216,6 +12224,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_PROFILE_TONE_CURVE; field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_SENSITIVITY; field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_TEMPERATURE; + field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_TEST_PATTERN_DATA; field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_TEST_PATTERN_MODE; field public static final android.hardware.camera2.CameraMetadata.Key SENSOR_TIMESTAMP; field public static final android.hardware.camera2.CameraMetadata.Key SHADING_MODE; @@ -12224,6 +12233,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_HOT_PIXEL_MAP; field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_HOT_PIXEL_MAP_MODE; field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_LENS_SHADING_MAP; + field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_LENS_SHADING_MAP_MODE; field public static final android.hardware.camera2.CameraMetadata.Key STATISTICS_SCENE_FLICKER; field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_CURVE_BLUE; field public static final android.hardware.camera2.CameraMetadata.Key TONEMAP_CURVE_GREEN; @@ -25034,7 +25044,6 @@ package android.service.dreams { method public boolean onPreparePanel(int, android.view.View, android.view.Menu); method public boolean onSearchRequested(); method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams); - method public void onWindowDismissed(); method public void onWindowFocusChanged(boolean); method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback); method public void setContentView(int); @@ -25130,23 +25139,53 @@ package android.service.voice { public class VoiceInteractionService extends android.app.Service { ctor public VoiceInteractionService(); method public android.os.IBinder onBind(android.content.Intent); - method public void startVoiceActivity(android.content.Intent, android.os.Bundle); + method public void startSession(android.os.Bundle); field public static final java.lang.String SERVICE_INTERFACE = "android.service.voice.VoiceInteractionService"; field public static final java.lang.String SERVICE_META_DATA = "android.voice_interaction"; } - public abstract class VoiceInteractionSession { + public abstract class VoiceInteractionSession implements android.view.KeyEvent.Callback { ctor public VoiceInteractionSession(android.content.Context); ctor public VoiceInteractionSession(android.content.Context, android.os.Handler); + method public void finish(); + method public android.view.LayoutInflater getLayoutInflater(); + method public android.app.Dialog getWindow(); + method public void hideWindow(); + method public void onBackPressed(); method public abstract void onCancel(android.service.voice.VoiceInteractionSession.Request); + method public void onCloseSystemDialogs(); method public abstract void onCommand(android.service.voice.VoiceInteractionSession.Caller, android.service.voice.VoiceInteractionSession.Request, java.lang.String, android.os.Bundle); + method public void onComputeInsets(android.service.voice.VoiceInteractionSession.Insets); method public abstract void onConfirm(android.service.voice.VoiceInteractionSession.Caller, android.service.voice.VoiceInteractionSession.Request, java.lang.String, android.os.Bundle); + method public void onCreate(android.os.Bundle); + method public android.view.View onCreateContentView(); + method public void onDestroy(); method public abstract boolean[] onGetSupportedCommands(android.service.voice.VoiceInteractionSession.Caller, java.lang.String[]); + 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); + method public boolean onKeyUp(int, android.view.KeyEvent); + method public void onTaskFinished(android.content.Intent, int); + method public void onTaskStarted(android.content.Intent, int); + method public void setContentView(android.view.View); + method public void setTheme(int); + method public void showWindow(); + method public void startVoiceActivity(android.content.Intent); } public static class VoiceInteractionSession.Caller { } + public static final class VoiceInteractionSession.Insets { + ctor public VoiceInteractionSession.Insets(); + field public static final int TOUCHABLE_INSETS_CONTENT = 1; // 0x1 + field public static final int TOUCHABLE_INSETS_FRAME = 0; // 0x0 + field public static final int TOUCHABLE_INSETS_REGION = 3; // 0x3 + field public int contentTopInsets; + field public int touchableInsets; + field public final android.graphics.Region touchableRegion; + } + public static class VoiceInteractionSession.Request { method public void sendCancelResult(); method public void sendCommandResult(boolean, android.os.Bundle); @@ -30949,7 +30988,6 @@ package android.view { public class ViewConfiguration { ctor public deprecated ViewConfiguration(); method public static android.view.ViewConfiguration get(android.content.Context); - method public long getDeviceGlobalActionKeyTimeout(); method public static int getDoubleTapTimeout(); method public static deprecated int getEdgeSlop(); method public static deprecated int getFadingEdgeLength(); @@ -31524,7 +31562,6 @@ package android.view { method public abstract boolean onPreparePanel(int, android.view.View, android.view.Menu); method public abstract boolean onSearchRequested(); method public abstract void onWindowAttributesChanged(android.view.WindowManager.LayoutParams); - method public abstract void onWindowDismissed(); method public abstract void onWindowFocusChanged(boolean); method public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback); } @@ -49533,6 +49570,7 @@ package javax.net.ssl { method public abstract boolean getEnableSessionCreation(); method public abstract java.lang.String[] getEnabledCipherSuites(); method public abstract java.lang.String[] getEnabledProtocols(); + method public javax.net.ssl.SSLSession getHandshakeSession(); method public abstract javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus(); method public abstract boolean getNeedClientAuth(); method public java.lang.String getPeerHost(); @@ -49606,10 +49644,12 @@ package javax.net.ssl { ctor public SSLParameters(java.lang.String[]); ctor public SSLParameters(java.lang.String[], java.lang.String[]); method public java.lang.String[] getCipherSuites(); + method public java.lang.String getEndpointIdentificationAlgorithm(); method public boolean getNeedClientAuth(); method public java.lang.String[] getProtocols(); method public boolean getWantClientAuth(); method public void setCipherSuites(java.lang.String[]); + method public void setEndpointIdentificationAlgorithm(java.lang.String); method public void setNeedClientAuth(boolean); method public void setProtocols(java.lang.String[]); method public void setWantClientAuth(boolean); @@ -49710,6 +49750,7 @@ package javax.net.ssl { method public abstract boolean getEnableSessionCreation(); method public abstract java.lang.String[] getEnabledCipherSuites(); method public abstract java.lang.String[] getEnabledProtocols(); + method public javax.net.ssl.SSLSession getHandshakeSession(); method public abstract boolean getNeedClientAuth(); method public javax.net.ssl.SSLParameters getSSLParameters(); method public abstract javax.net.ssl.SSLSession getSession(); @@ -49765,6 +49806,14 @@ package javax.net.ssl { method public java.lang.String chooseEngineServerAlias(java.lang.String, java.security.Principal[], javax.net.ssl.SSLEngine); } + public abstract class X509ExtendedTrustManager implements javax.net.ssl.X509TrustManager { + ctor public X509ExtendedTrustManager(); + method public abstract void checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String, java.net.Socket) throws java.security.cert.CertificateException; + method public abstract void checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String, javax.net.ssl.SSLEngine) throws java.security.cert.CertificateException; + method public abstract void checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String, java.net.Socket) throws java.security.cert.CertificateException; + method public abstract void checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String, javax.net.ssl.SSLEngine) throws java.security.cert.CertificateException; + } + public abstract interface X509KeyManager implements javax.net.ssl.KeyManager { method public abstract java.lang.String chooseClientAlias(java.lang.String[], java.security.Principal[], java.net.Socket); method public abstract java.lang.String chooseServerAlias(java.lang.String, java.security.Principal[], java.net.Socket); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 5ec3117245cb..af3a92c02f7e 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -655,7 +655,8 @@ import java.util.HashMap; public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, - OnCreateContextMenuListener, ComponentCallbacks2 { + OnCreateContextMenuListener, ComponentCallbacks2, + Window.OnWindowDismissedCallback { private static final String TAG = "Activity"; private static final boolean DEBUG_LIFECYCLE = false; @@ -2519,7 +2520,9 @@ public class Activity extends ContextThemeWrapper /** * Called when the main window associated with the activity has been dismissed. + * @hide */ + @Override public void onWindowDismissed() { finish(); } @@ -5437,6 +5440,7 @@ public class Activity extends ContextThemeWrapper mWindow = PolicyManager.makeNewWindow(this); mWindow.setCallback(this); + mWindow.setOnWindowDismissedCallback(this); mWindow.getLayoutInflater().setPrivateFactory(this); if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) { mWindow.setSoftInputMode(info.softInputMode); diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java index 3c1455b0a4b8..3eb2fea55b03 100644 --- a/core/java/android/app/ActivityTransitionCoordinator.java +++ b/core/java/android/app/ActivityTransitionCoordinator.java @@ -21,6 +21,7 @@ import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Matrix; import android.graphics.Rect; import android.os.Bundle; import android.os.Handler; @@ -30,6 +31,7 @@ import android.transition.TransitionManager; import android.transition.TransitionSet; import android.util.ArrayMap; import android.util.Pair; +import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroupOverlay; @@ -138,6 +140,10 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { private static final String KEY_HEIGHT = "shared_element:height"; private static final String KEY_NAME = "shared_element:name"; private static final String KEY_BITMAP = "shared_element:bitmap"; + private static final String KEY_SCALE_TYPE = "shared_element:scaleType"; + private static final String KEY_IMAGE_MATRIX = "shared_element:imageMatrix"; + + private static final ImageView.ScaleType[] SCALE_TYPE_VALUES = ImageView.ScaleType.values(); /** * Sent by the exiting coordinator (either EnterTransitionCoordinator @@ -322,7 +328,8 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { final ArrayList<View> accepted = new ArrayList<View>(); final ArrayList<View> rejected = new ArrayList<View>(); createSharedElementImages(accepted, rejected, sharedElementNames, state); - setSharedElementState(state, accepted); + ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> originalImageViewState = + setSharedElementState(state, accepted); handleRejected(rejected); if (getViewsTransition() != null) { @@ -331,6 +338,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { setViewVisibility(mSharedElements, View.VISIBLE); Transition transition = beginTransition(mEnteringViews, true, allowOverlappingTransitions(), true); + setOriginalImageViewState(originalImageViewState); if (allowOverlappingTransitions()) { onStartEnterTransition(transition, mEnteringViews); @@ -568,15 +576,22 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { mEpicenterCallback.setEpicenter(epicenter); } - private void setSharedElementState(Bundle sharedElementState, - final ArrayList<View> acceptedOverlayViews) { + private ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> setSharedElementState( + Bundle sharedElementState, final ArrayList<View> acceptedOverlayViews) { + ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> originalImageState = + new ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>>(); final int[] tempLoc = new int[2]; if (sharedElementState != null) { for (int i = 0; i < mSharedElements.size(); i++) { View sharedElement = mSharedElements.get(i); + String name = mTargetSharedNames.get(i); + Pair<ImageView.ScaleType, Matrix> originalState = getOldImageState(sharedElement, + name, sharedElementState); + if (originalState != null) { + originalImageState.put((ImageView) sharedElement, originalState); + } View parent = (View) sharedElement.getParent(); parent.getLocationOnScreen(tempLoc); - String name = mTargetSharedNames.get(i); setSharedElementState(sharedElement, name, sharedElementState, tempLoc); sharedElement.requestLayout(); } @@ -596,6 +611,29 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { } } ); + return originalImageState; + } + + private static Pair<ImageView.ScaleType, Matrix> getOldImageState(View view, String name, + Bundle transitionArgs) { + if (!(view instanceof ImageView)) { + return null; + } + Bundle bundle = transitionArgs.getBundle(name); + int scaleTypeInt = bundle.getInt(KEY_SCALE_TYPE, -1); + if (scaleTypeInt < 0) { + return null; + } + + ImageView imageView = (ImageView) view; + ImageView.ScaleType originalScaleType = imageView.getScaleType(); + + Matrix originalMatrix = null; + if (originalScaleType == ImageView.ScaleType.MATRIX) { + originalMatrix = new Matrix(imageView.getImageMatrix()); + } + + return Pair.create(originalScaleType, originalMatrix); } /** @@ -614,6 +652,21 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { return; } + if (view instanceof ImageView) { + int scaleTypeInt = sharedElementBundle.getInt(KEY_SCALE_TYPE, -1); + if (scaleTypeInt >= 0) { + ImageView imageView = (ImageView) view; + ImageView.ScaleType scaleType = SCALE_TYPE_VALUES[scaleTypeInt]; + imageView.setScaleType(scaleType); + if (scaleType == ImageView.ScaleType.MATRIX) { + float[] matrixValues = sharedElementBundle.getFloatArray(KEY_IMAGE_MATRIX); + Matrix matrix = new Matrix(); + matrix.setValues(matrixValues); + imageView.setImageMatrix(matrix); + } + } + } + float z = sharedElementBundle.getFloat(KEY_TRANSLATION_Z); view.setTranslationZ(z); @@ -666,6 +719,17 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { view.draw(canvas); sharedElementBundle.putParcelable(KEY_BITMAP, bitmap); + if (view instanceof ImageView) { + ImageView imageView = (ImageView) view; + int scaleTypeInt = scaleTypeToInt(imageView.getScaleType()); + sharedElementBundle.putInt(KEY_SCALE_TYPE, scaleTypeInt); + if (imageView.getScaleType() == ImageView.ScaleType.MATRIX) { + float[] matrix = new float[9]; + imageView.getImageMatrix().getValues(matrix); + sharedElementBundle.putFloatArray(KEY_IMAGE_MATRIX, matrix); + } + } + transitionArgs.putBundle(name, sharedElementBundle); } @@ -829,6 +893,25 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { } } + private static void setOriginalImageViewState( + ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> originalState) { + for (int i = 0; i < originalState.size(); i++) { + ImageView imageView = originalState.keyAt(i); + Pair<ImageView.ScaleType, Matrix> state = originalState.valueAt(i); + imageView.setScaleType(state.first); + imageView.setImageMatrix(state.second); + } + } + + private static int scaleTypeToInt(ImageView.ScaleType scaleType) { + for (int i = 0; i < SCALE_TYPE_VALUES.length; i++) { + if (scaleType == SCALE_TYPE_VALUES[i]) { + return i; + } + } + return -1; + } + private static class FixedEpicenterCallback extends Transition.EpicenterCallback { private Rect mEpicenter; diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index a810134f28f2..097c64e723ae 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -33,6 +33,7 @@ import android.view.MotionEvent; import android.view.Surface; import android.view.TextureView; import android.view.TextureView.SurfaceTextureListener; +import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import dalvik.system.CloseGuard; @@ -51,6 +52,7 @@ public class ActivityView extends ViewGroup { private int mWidth; private int mHeight; private Surface mSurface; + private int mLastVisibility; // Only one IIntentSender or Intent may be queued at a time. Most recent one wins. IIntentSender mQueuedPendingIntent; @@ -95,6 +97,8 @@ public class ActivityView extends ViewGroup { mMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(mMetrics); + mLastVisibility = getVisibility(); + if (DEBUG) Log.v(TAG, "ctor()"); } @@ -103,6 +107,26 @@ public class ActivityView extends ViewGroup { mTextureView.layout(0, 0, r - l, b - t); } + @Override + protected void onVisibilityChanged(View changedView, int visibility) { + super.onVisibilityChanged(changedView, visibility); + + if (mSurface != null) { + try { + if (visibility == View.GONE) { + mActivityContainer.setSurface(null, mWidth, mHeight, mMetrics.densityDpi); + } else if (mLastVisibility == View.GONE) { + // Don't change surface when going between View.VISIBLE and View.INVISIBLE. + mActivityContainer.setSurface(mSurface, mWidth, mHeight, mMetrics.densityDpi); + } + } catch (RemoteException e) { + throw new RuntimeException( + "ActivityView: Unable to set surface of ActivityContainer. " + e); + } + } + mLastVisibility = visibility; + } + private boolean injectInputEvent(InputEvent event) { return mActivityContainer != null && mActivityContainer.injectEvent(event); } diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index ab6242747184..efd3d86a9060 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1440,6 +1440,31 @@ final class ApplicationPackageManager extends PackageManager { return null; } + /** + * @hide + */ + @Override + public void addForwardingIntentFilter(IntentFilter filter, boolean removable, int userIdOrig, + int userIdDest) { + try { + mPM.addForwardingIntentFilter(filter, removable, userIdOrig, userIdDest); + } catch (RemoteException e) { + // Should never happen! + } + } + + /** + * @hide + */ + @Override + public void clearForwardingIntentFilters(int userIdOrig) { + try { + mPM.clearForwardingIntentFilters(userIdOrig); + } catch (RemoteException e) { + // Should never happen! + } + } + private final ContextImpl mContext; private final IPackageManager mPM; diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index a4b265186261..fe532bf1c6ac 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -473,14 +473,14 @@ class ContextImpl extends Context { registerService(NOTIFICATION_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { final Context outerContext = ctx.getOuterContext(); - // TODO: Why are we not just using the theme attribute - // that defines the dialog theme? return new NotificationManager( new ContextThemeWrapper(outerContext, - outerContext.getResources().selectSystemTheme(0, + Resources.selectSystemTheme(0, outerContext.getApplicationInfo().targetSdkVersion, - com.android.internal.R.array.system_theme_sdks, - com.android.internal.R.array.system_theme_dialog_styles)), + com.android.internal.R.style.Theme_Dialog, + com.android.internal.R.style.Theme_Holo_Dialog, + com.android.internal.R.style.Theme_DeviceDefault_Dialog, + com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog)), ctx.mMainThread.getHandler()); }}); @@ -731,7 +731,7 @@ class ContextImpl extends Context { @Override public Resources.Theme getTheme() { if (mTheme == null) { - mThemeResource = mResources.selectDefaultTheme(mThemeResource, + mThemeResource = Resources.selectDefaultTheme(mThemeResource, getOuterContext().getApplicationInfo().targetSdkVersion); mTheme = mResources.newTheme(); mTheme.applyStyle(mThemeResource, true); diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index 07583fdd4974..12d451380c3d 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -79,7 +79,7 @@ import java.lang.ref.WeakReference; * </div> */ public class Dialog implements DialogInterface, Window.Callback, - KeyEvent.Callback, OnCreateContextMenuListener { + KeyEvent.Callback, OnCreateContextMenuListener, Window.OnWindowDismissedCallback { private static final String TAG = "Dialog"; private Activity mOwnerActivity; @@ -165,6 +165,7 @@ public class Dialog implements DialogInterface, Window.Callback, Window w = PolicyManager.makeNewWindow(mContext); mWindow = w; w.setCallback(this); + w.setOnWindowDismissedCallback(this); w.setWindowManager(mWindowManager, null, null); w.setGravity(Gravity.CENTER); mListenersHandler = new ListenersHandler(this); @@ -708,6 +709,8 @@ public class Dialog implements DialogInterface, Window.Callback, public void onDetachedFromWindow() { } + /** @hide */ + @Override public void onWindowDismissed() { dismiss(); } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 6f68dfba019b..929bf65424ee 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -173,12 +173,12 @@ public class DevicePolicyManager { public static final String ACTION_SET_NEW_PASSWORD = "android.app.action.SET_NEW_PASSWORD"; /** - * Flag for {@link #forwardMatchingIntents}: the intents will forwarded to the primary user. + * Flag for {@link #addForwardingIntentFilter}: the intents will forwarded to the primary user. */ public static int FLAG_TO_PRIMARY_USER = 0x0001; /** - * Flag for {@link #forwardMatchingIntents}: the intents will be forwarded to the managed + * Flag for {@link #addForwardingIntentFilter}: the intents will be forwarded to the managed * profile. */ public static int FLAG_TO_MANAGED_PROFILE = 0x0002; @@ -1949,10 +1949,10 @@ public class DevicePolicyManager { * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param filter if an intent matches this IntentFilter, then it can be forwarded. */ - public void forwardMatchingIntents(ComponentName admin, IntentFilter filter, int flags) { + public void addForwardingIntentFilter(ComponentName admin, IntentFilter filter, int flags) { if (mService != null) { try { - mService.forwardMatchingIntents(admin, filter, flags); + mService.addForwardingIntentFilter(admin, filter, flags); } catch (RemoteException e) { Log.w(TAG, "Failed talking with device policy service", e); } @@ -1960,7 +1960,7 @@ public class DevicePolicyManager { } /** - * Called by a profile owner to remove all the forwarding intent filters from the current user + * Called by a profile owner to remove the forwarding intent filters from the current user * and from the owner. * @param admin Which {@link DeviceAdminReceiver} this request is associated with. */ diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 495a5f912f50..e3090b6d44df 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -120,6 +120,6 @@ interface IDevicePolicyManager { Bundle getApplicationRestrictions(in ComponentName who, in String packageName); void setUserRestriction(in ComponentName who, in String key, boolean enable); - void forwardMatchingIntents(in ComponentName admin, in IntentFilter filter, int flags); + void addForwardingIntentFilter(in ComponentName admin, in IntentFilter filter, int flags); void clearForwardingIntentFilters(in ComponentName admin); } diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index dd3a871a2def..d3e908948e2b 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -181,7 +181,8 @@ public class AppWidgetManager { * A bundle extra that hints to the AppWidgetProvider the category of host that owns this * this widget. Can have the value {@link * AppWidgetProviderInfo#WIDGET_CATEGORY_HOME_SCREEN} or {@link - * AppWidgetProviderInfo#WIDGET_CATEGORY_KEYGUARD}. + * AppWidgetProviderInfo#WIDGET_CATEGORY_KEYGUARD} or {@link + * AppWidgetProviderInfo#WIDGET_CATEGORY_RECENTS}. */ public static final String OPTION_APPWIDGET_HOST_CATEGORY = "appWidgetCategory"; diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java index 8670da776885..8b9c7f0f5d7d 100644 --- a/core/java/android/appwidget/AppWidgetProviderInfo.java +++ b/core/java/android/appwidget/AppWidgetProviderInfo.java @@ -55,7 +55,6 @@ public class AppWidgetProviderInfo implements Parcelable { /** * Indicates that the widget can be displayed within recents. - * @hide */ public static final int WIDGET_CATEGORY_RECENTS = 4; diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index cf9a2961ec10..03eb50f3b6c0 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -247,7 +247,8 @@ interface IPackageManager { void clearPackagePersistentPreferredActivities(String packageName, int userId); - void addForwardingIntentFilter(in IntentFilter filter, int userIdOrig, int userIdDest); + void addForwardingIntentFilter(in IntentFilter filter, boolean removable, int userIdOrig, + int userIdDest); void clearForwardingIntentFilters(int userIdOrig); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 484a2a1367b3..1a003ff34132 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3507,4 +3507,26 @@ public abstract class PackageManager { return Environment.getDataDirectory().toString() + "/user/" + userId + "/" + packageName; } + + /** + * Adds a forwarding intent filter. After calling this method all intents sent from the user + * with id userIdOrig can also be be resolved by activities in the user with id userIdDest if + * they match the specified intent filter. + * @param filter the {@link IntentFilter} the intent has to match to be forwarded + * @param removable if set to false, {@link clearForwardingIntents} will not remove this intent + * filter + * @param userIdOrig user from which the intent can be forwarded + * @param userIdDest user to which the intent can be forwarded + * @hide + */ + public abstract void addForwardingIntentFilter(IntentFilter filter, boolean removable, + int userIdOrig, int userIdDest); + + /** + * Clearing all removable {@link ForwardingIntentFilter}s that are set with the given user as + * the origin. + * @param userIdOrig user from which the intent can be forwarded + * @hide + */ + public abstract void clearForwardingIntentFilters(int userIdOrig); } diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 133177711092..499de1716239 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -137,45 +137,42 @@ public class Resources { /** * Returns the most appropriate default theme for the specified target SDK version. + * <ul> + * <li>Below API 11: Gingerbread + * <li>APIs 11 thru 14: Holo + * <li>APIs 14 thru XX: Device default dark + * <li>API XX and above: Device default light with dark action bar + * </ul> * * @param curTheme The current theme, or 0 if not specified. * @param targetSdkVersion The target SDK version. * @return A theme resource identifier * @hide */ - public int selectDefaultTheme(int curTheme, int targetSdkVersion) { + public static int selectDefaultTheme(int curTheme, int targetSdkVersion) { return selectSystemTheme(curTheme, targetSdkVersion, - com.android.internal.R.array.system_theme_sdks, - com.android.internal.R.array.system_theme_styles); + com.android.internal.R.style.Theme, + com.android.internal.R.style.Theme_Holo, + com.android.internal.R.style.Theme_DeviceDefault, + com.android.internal.R.style.Theme_DeviceDefault_Light_DarkActionBar); } - /** - * Returns the most appropriate default theme for the specified target SDK version. - * - * @param curTheme The current theme, or 0 if not specified. - * @param targetSdkVersion The target SDK version. - * @param sdkArrayId Identifier for integer array resource containing - * sorted minimum SDK versions. First entry must be 0. - * @param themeArrayId Identifier for array resource containing the - * default themes that map to SDK versions. - * @return A theme resource identifier - * @hide - */ - public int selectSystemTheme( - int curTheme, int targetSdkVersion, int sdkArrayId, int themeArrayId) { + /** @hide */ + public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo, + int dark, int deviceDefault) { if (curTheme != 0) { return curTheme; } - - final int[] targetSdks = getIntArray(sdkArrayId); - final TypedArray defaultThemes = obtainTypedArray(themeArrayId); - for (int i = targetSdks.length - 1; i > 0; i--) { - if (targetSdkVersion >= targetSdks[i]) { - return defaultThemes.getResourceId(i, 0); - } + if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) { + return orig; } - - return defaultThemes.getResourceId(0, 0); + if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return holo; + } + if (targetSdkVersion < Build.VERSION_CODES.CUR_DEVELOPMENT) { + return dark; + } + return deviceDefault; } /** diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index ba8db3ab6fd6..6e38a22feb4a 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -1295,6 +1295,20 @@ public abstract class CameraMetadata { public static final int CONTROL_SCENE_MODE_BARCODE = 16; // + // Enumeration values for CaptureRequest#CONTROL_VIDEO_STABILIZATION_MODE + // + + /** + * @see CaptureRequest#CONTROL_VIDEO_STABILIZATION_MODE + */ + public static final int CONTROL_VIDEO_STABILIZATION_MODE_OFF = 0; + + /** + * @see CaptureRequest#CONTROL_VIDEO_STABILIZATION_MODE + */ + public static final int CONTROL_VIDEO_STABILIZATION_MODE_ON = 1; + + // // Enumeration values for CaptureRequest#EDGE_MODE // diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index c4e342c6e9bb..f161f3af37cc 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -831,9 +831,11 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * stabilized</p> * * @see CaptureRequest#SCALER_CROP_REGION + * @see #CONTROL_VIDEO_STABILIZATION_MODE_OFF + * @see #CONTROL_VIDEO_STABILIZATION_MODE_ON */ - public static final Key<Boolean> CONTROL_VIDEO_STABILIZATION_MODE = - new Key<Boolean>("android.control.videoStabilizationMode", boolean.class); + public static final Key<Integer> CONTROL_VIDEO_STABILIZATION_MODE = + new Key<Integer>("android.control.videoStabilizationMode", int.class); /** * <p>Operation mode for edge diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index d8981c82546a..1d2d0e999b8b 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -124,6 +124,58 @@ public final class CaptureResult extends CameraMetadata { /** + * <p>The mode control selects how the image data is converted from the + * sensor's native color into linear sRGB color.</p> + * <p>When auto-white balance is enabled with {@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}, this + * control is overridden by the AWB routine. When AWB is disabled, the + * application controls how the color mapping is performed.</p> + * <p>We define the expected processing pipeline below. For consistency + * across devices, this is always the case with TRANSFORM_MATRIX.</p> + * <p>When either FULL or HIGH_QUALITY is used, the camera device may + * do additional processing but {@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains} and + * {@link CaptureRequest#COLOR_CORRECTION_TRANSFORM android.colorCorrection.transform} will still be provided by the + * camera device (in the results) and be roughly correct.</p> + * <p>Switching to TRANSFORM_MATRIX and using the data provided from + * FAST or HIGH_QUALITY will yield a picture with the same white point + * as what was produced by the camera device in the earlier frame.</p> + * <p>The expected processing pipeline is as follows:</p> + * <p><img alt="White balance processing pipeline" src="../../../../images/camera2/metadata/android.colorCorrection.mode/processing_pipeline.png" /></p> + * <p>The white balance is encoded by two values, a 4-channel white-balance + * gain vector (applied in the Bayer domain), and a 3x3 color transform + * matrix (applied after demosaic).</p> + * <p>The 4-channel white-balance gains are defined as:</p> + * <pre><code>{@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains} = [ R G_even G_odd B ] + * </code></pre> + * <p>where <code>G_even</code> is the gain for green pixels on even rows of the + * output, and <code>G_odd</code> is the gain for green pixels on the odd rows. + * These may be identical for a given camera device implementation; if + * the camera device does not support a separate gain for even/odd green + * channels, it will use the <code>G_even</code> value, and write <code>G_odd</code> equal to + * <code>G_even</code> in the output result metadata.</p> + * <p>The matrices for color transforms are defined as a 9-entry vector:</p> + * <pre><code>{@link CaptureRequest#COLOR_CORRECTION_TRANSFORM android.colorCorrection.transform} = [ I0 I1 I2 I3 I4 I5 I6 I7 I8 ] + * </code></pre> + * <p>which define a transform from input sensor colors, <code>P_in = [ r g b ]</code>, + * to output linear sRGB, <code>P_out = [ r' g' b' ]</code>,</p> + * <p>with colors as follows:</p> + * <pre><code>r' = I0r + I1g + I2b + * g' = I3r + I4g + I5b + * b' = I6r + I7g + I8b + * </code></pre> + * <p>Both the input and output value ranges must match. Overflow/underflow + * values are clipped to fit within the range.</p> + * + * @see CaptureRequest#COLOR_CORRECTION_GAINS + * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM + * @see CaptureRequest#CONTROL_AWB_MODE + * @see #COLOR_CORRECTION_MODE_TRANSFORM_MATRIX + * @see #COLOR_CORRECTION_MODE_FAST + * @see #COLOR_CORRECTION_MODE_HIGH_QUALITY + */ + public static final Key<Integer> COLOR_CORRECTION_MODE = + new Key<Integer>("android.colorCorrection.mode", int.class); + + /** * <p>A color transform matrix to use to transform * from sensor RGB color space to output linear sRGB color space</p> * <p>This matrix is either set by the camera device when the request @@ -176,6 +228,82 @@ public final class CaptureResult extends CameraMetadata { new Key<Integer>("android.control.aePrecaptureId", int.class); /** + * <p>The desired setting for the camera device's auto-exposure + * algorithm's antibanding compensation.</p> + * <p>Some kinds of lighting fixtures, such as some fluorescent + * lights, flicker at the rate of the power supply frequency + * (60Hz or 50Hz, depending on country). While this is + * typically not noticeable to a person, it can be visible to + * a camera device. If a camera sets its exposure time to the + * wrong value, the flicker may become visible in the + * viewfinder as flicker or in a final captured image, as a + * set of variable-brightness bands across the image.</p> + * <p>Therefore, the auto-exposure routines of camera devices + * include antibanding routines that ensure that the chosen + * exposure value will not cause such banding. The choice of + * exposure time depends on the rate of flicker, which the + * camera device can detect automatically, or the expected + * rate can be selected by the application using this + * control.</p> + * <p>A given camera device may not support all of the possible + * options for the antibanding mode. The + * {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_ANTIBANDING_MODES android.control.aeAvailableAntibandingModes} key contains + * the available modes for a given camera device.</p> + * <p>The default mode is AUTO, which must be supported by all + * camera devices.</p> + * <p>If manual exposure control is enabled (by setting + * {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} or {@link CaptureRequest#CONTROL_MODE android.control.mode} to OFF), + * then this setting has no effect, and the application must + * ensure it selects exposure times that do not cause banding + * issues. The {@link CaptureResult#STATISTICS_SCENE_FLICKER android.statistics.sceneFlicker} key can assist + * the application in this.</p> + * + * @see CameraCharacteristics#CONTROL_AE_AVAILABLE_ANTIBANDING_MODES + * @see CaptureRequest#CONTROL_AE_MODE + * @see CaptureRequest#CONTROL_MODE + * @see CaptureResult#STATISTICS_SCENE_FLICKER + * @see #CONTROL_AE_ANTIBANDING_MODE_OFF + * @see #CONTROL_AE_ANTIBANDING_MODE_50HZ + * @see #CONTROL_AE_ANTIBANDING_MODE_60HZ + * @see #CONTROL_AE_ANTIBANDING_MODE_AUTO + */ + public static final Key<Integer> CONTROL_AE_ANTIBANDING_MODE = + new Key<Integer>("android.control.aeAntibandingMode", int.class); + + /** + * <p>Adjustment to AE target image + * brightness</p> + * <p>For example, if EV step is 0.333, '6' will mean an + * exposure compensation of +2 EV; -3 will mean an exposure + * compensation of -1</p> + */ + public static final Key<Integer> CONTROL_AE_EXPOSURE_COMPENSATION = + new Key<Integer>("android.control.aeExposureCompensation", int.class); + + /** + * <p>Whether AE is currently locked to its latest + * calculated values.</p> + * <p>Note that even when AE is locked, the flash may be + * fired if the {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is ON_AUTO_FLASH / ON_ALWAYS_FLASH / + * ON_AUTO_FLASH_REDEYE.</p> + * <p>If AE precapture is triggered (see {@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger}) + * when AE is already locked, the camera device will not change the exposure time + * ({@link CaptureRequest#SENSOR_EXPOSURE_TIME android.sensor.exposureTime}) and sensitivity ({@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity}) + * parameters. The flash may be fired if the {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} + * is ON_AUTO_FLASH/ON_AUTO_FLASH_REDEYE and the scene is too dark. If the + * {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is ON_ALWAYS_FLASH, the scene may become overexposed.</p> + * <p>See {@link CaptureResult#CONTROL_AE_STATE android.control.aeState} for AE lock related state transition details.</p> + * + * @see CaptureRequest#CONTROL_AE_MODE + * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER + * @see CaptureResult#CONTROL_AE_STATE + * @see CaptureRequest#SENSOR_EXPOSURE_TIME + * @see CaptureRequest#SENSOR_SENSITIVITY + */ + public static final Key<Boolean> CONTROL_AE_LOCK = + new Key<Boolean>("android.control.aeLock", boolean.class); + + /** * <p>The desired mode for the camera device's * auto-exposure routine.</p> * <p>This control is only effective if {@link CaptureRequest#CONTROL_MODE android.control.mode} is @@ -237,6 +365,35 @@ public final class CaptureResult extends CameraMetadata { new Key<int[]>("android.control.aeRegions", int[].class); /** + * <p>Range over which fps can be adjusted to + * maintain exposure</p> + * <p>Only constrains AE algorithm, not manual control + * of {@link CaptureRequest#SENSOR_EXPOSURE_TIME android.sensor.exposureTime}</p> + * + * @see CaptureRequest#SENSOR_EXPOSURE_TIME + */ + public static final Key<int[]> CONTROL_AE_TARGET_FPS_RANGE = + new Key<int[]>("android.control.aeTargetFpsRange", int[].class); + + /** + * <p>Whether the camera device will trigger a precapture + * metering sequence when it processes this request.</p> + * <p>This entry is normally set to IDLE, or is not + * included at all in the request settings. When included and + * set to START, the camera device will trigger the autoexposure + * precapture metering sequence.</p> + * <p>The effect of AE precapture trigger depends on the current + * AE mode and state; see {@link CaptureResult#CONTROL_AE_STATE android.control.aeState} for AE precapture + * state transition details.</p> + * + * @see CaptureResult#CONTROL_AE_STATE + * @see #CONTROL_AE_PRECAPTURE_TRIGGER_IDLE + * @see #CONTROL_AE_PRECAPTURE_TRIGGER_START + */ + public static final Key<Integer> CONTROL_AE_PRECAPTURE_TRIGGER = + new Key<Integer>("android.control.aePrecaptureTrigger", int.class); + + /** * <p>Current state of AE algorithm</p> * <p>Switching between or enabling AE modes ({@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}) always * resets the AE state to INACTIVE. Similarly, switching between {@link CaptureRequest#CONTROL_MODE android.control.mode}, @@ -481,6 +638,24 @@ public final class CaptureResult extends CameraMetadata { new Key<int[]>("android.control.afRegions", int[].class); /** + * <p>Whether the camera device will trigger autofocus for this request.</p> + * <p>This entry is normally set to IDLE, or is not + * included at all in the request settings.</p> + * <p>When included and set to START, the camera device will trigger the + * autofocus algorithm. If autofocus is disabled, this trigger has no effect.</p> + * <p>When set to CANCEL, the camera device will cancel any active trigger, + * and return to its initial AF state.</p> + * <p>See {@link CaptureResult#CONTROL_AF_STATE android.control.afState} for what that means for each AF mode.</p> + * + * @see CaptureResult#CONTROL_AF_STATE + * @see #CONTROL_AF_TRIGGER_IDLE + * @see #CONTROL_AF_TRIGGER_START + * @see #CONTROL_AF_TRIGGER_CANCEL + */ + public static final Key<Integer> CONTROL_AF_TRIGGER = + new Key<Integer>("android.control.afTrigger", int.class); + + /** * <p>Current state of AF algorithm.</p> * <p>Switching between or enabling AF modes ({@link CaptureRequest#CONTROL_AF_MODE android.control.afMode}) always * resets the AF state to INACTIVE. Similarly, switching between {@link CaptureRequest#CONTROL_MODE android.control.mode}, @@ -889,6 +1064,16 @@ public final class CaptureResult extends CameraMetadata { new Key<Integer>("android.control.afTriggerId", int.class); /** + * <p>Whether AWB is currently locked to its + * latest calculated values.</p> + * <p>Note that AWB lock is only meaningful for AUTO + * mode; in other modes, AWB is already fixed to a specific + * setting.</p> + */ + public static final Key<Boolean> CONTROL_AWB_LOCK = + new Key<Boolean>("android.control.awbLock", boolean.class); + + /** * <p>Whether AWB is currently setting the color * transform fields, and what its illumination target * is.</p> @@ -948,6 +1133,30 @@ public final class CaptureResult extends CameraMetadata { new Key<int[]>("android.control.awbRegions", int[].class); /** + * <p>Information to the camera device 3A (auto-exposure, + * auto-focus, auto-white balance) routines about the purpose + * of this capture, to help the camera device to decide optimal 3A + * strategy.</p> + * <p>This control (except for MANUAL) is only effective if + * <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} != OFF</code> and any 3A routine is active.</p> + * <p>ZERO_SHUTTER_LAG must be supported if {@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES android.request.availableCapabilities} + * contains ZSL. MANUAL must be supported if {@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES android.request.availableCapabilities} + * contains MANUAL_SENSOR.</p> + * + * @see CaptureRequest#CONTROL_MODE + * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES + * @see #CONTROL_CAPTURE_INTENT_CUSTOM + * @see #CONTROL_CAPTURE_INTENT_PREVIEW + * @see #CONTROL_CAPTURE_INTENT_STILL_CAPTURE + * @see #CONTROL_CAPTURE_INTENT_VIDEO_RECORD + * @see #CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT + * @see #CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG + * @see #CONTROL_CAPTURE_INTENT_MANUAL + */ + public static final Key<Integer> CONTROL_CAPTURE_INTENT = + new Key<Integer>("android.control.captureIntent", int.class); + + /** * <p>Current state of AWB algorithm</p> * <p>Switching between or enabling AWB modes ({@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}) always * resets the AWB state to INACTIVE. Similarly, switching between {@link CaptureRequest#CONTROL_MODE android.control.mode}, @@ -1078,6 +1287,31 @@ public final class CaptureResult extends CameraMetadata { new Key<Integer>("android.control.awbState", int.class); /** + * <p>A special color effect to apply.</p> + * <p>When this mode is set, a color effect will be applied + * to images produced by the camera device. The interpretation + * and implementation of these color effects is left to the + * implementor of the camera device, and should not be + * depended on to be consistent (or present) across all + * devices.</p> + * <p>A color effect will only be applied if + * {@link CaptureRequest#CONTROL_MODE android.control.mode} != OFF.</p> + * + * @see CaptureRequest#CONTROL_MODE + * @see #CONTROL_EFFECT_MODE_OFF + * @see #CONTROL_EFFECT_MODE_MONO + * @see #CONTROL_EFFECT_MODE_NEGATIVE + * @see #CONTROL_EFFECT_MODE_SOLARIZE + * @see #CONTROL_EFFECT_MODE_SEPIA + * @see #CONTROL_EFFECT_MODE_POSTERIZE + * @see #CONTROL_EFFECT_MODE_WHITEBOARD + * @see #CONTROL_EFFECT_MODE_BLACKBOARD + * @see #CONTROL_EFFECT_MODE_AQUA + */ + public static final Key<Integer> CONTROL_EFFECT_MODE = + new Key<Integer>("android.control.effectMode", int.class); + + /** * <p>Overall mode of 3A control * routines.</p> * <p>High-level 3A control. When set to OFF, all 3A control @@ -1106,6 +1340,57 @@ public final class CaptureResult extends CameraMetadata { new Key<Integer>("android.control.mode", int.class); /** + * <p>A camera mode optimized for conditions typical in a particular + * capture setting.</p> + * <p>This is the mode that that is active when + * <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} == USE_SCENE_MODE</code>. Aside from FACE_PRIORITY, + * these modes will disable {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}, + * {@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}, and {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} while in use.</p> + * <p>The interpretation and implementation of these scene modes is left + * to the implementor of the camera device. Their behavior will not be + * consistent across all devices, and any given device may only implement + * a subset of these modes.</p> + * + * @see CaptureRequest#CONTROL_AE_MODE + * @see CaptureRequest#CONTROL_AF_MODE + * @see CaptureRequest#CONTROL_AWB_MODE + * @see CaptureRequest#CONTROL_MODE + * @see #CONTROL_SCENE_MODE_DISABLED + * @see #CONTROL_SCENE_MODE_FACE_PRIORITY + * @see #CONTROL_SCENE_MODE_ACTION + * @see #CONTROL_SCENE_MODE_PORTRAIT + * @see #CONTROL_SCENE_MODE_LANDSCAPE + * @see #CONTROL_SCENE_MODE_NIGHT + * @see #CONTROL_SCENE_MODE_NIGHT_PORTRAIT + * @see #CONTROL_SCENE_MODE_THEATRE + * @see #CONTROL_SCENE_MODE_BEACH + * @see #CONTROL_SCENE_MODE_SNOW + * @see #CONTROL_SCENE_MODE_SUNSET + * @see #CONTROL_SCENE_MODE_STEADYPHOTO + * @see #CONTROL_SCENE_MODE_FIREWORKS + * @see #CONTROL_SCENE_MODE_SPORTS + * @see #CONTROL_SCENE_MODE_PARTY + * @see #CONTROL_SCENE_MODE_CANDLELIGHT + * @see #CONTROL_SCENE_MODE_BARCODE + */ + public static final Key<Integer> CONTROL_SCENE_MODE = + new Key<Integer>("android.control.sceneMode", int.class); + + /** + * <p>Whether video stabilization is + * active</p> + * <p>If enabled, video stabilization can modify the + * {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion} to keep the video stream + * stabilized</p> + * + * @see CaptureRequest#SCALER_CROP_REGION + * @see #CONTROL_VIDEO_STABILIZATION_MODE_OFF + * @see #CONTROL_VIDEO_STABILIZATION_MODE_ON + */ + public static final Key<Integer> CONTROL_VIDEO_STABILIZATION_MODE = + new Key<Integer>("android.control.videoStabilizationMode", int.class); + + /** * <p>Operation mode for edge * enhancement.</p> * <p>Edge/sharpness/detail enhancement. OFF means no @@ -1688,6 +1973,22 @@ public final class CaptureResult extends CameraMetadata { new Key<Float>("android.sensor.greenSplit", float.class); /** + * <p>A pixel <code>[R, G_even, G_odd, B]</code> that supplies the test pattern + * when {@link CaptureRequest#SENSOR_TEST_PATTERN_MODE android.sensor.testPatternMode} is SOLID_COLOR.</p> + * <p>Each color channel is treated as an unsigned 32-bit integer. + * The camera device then uses the most significant X bits + * that correspond to how many bits are in its Bayer raw sensor + * output.</p> + * <p>For example, a sensor with RAW10 Bayer output would use the + * 10 most significant bits from each color channel.</p> + * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * + * @see CaptureRequest#SENSOR_TEST_PATTERN_MODE + */ + public static final Key<int[]> SENSOR_TEST_PATTERN_DATA = + new Key<int[]>("android.sensor.testPatternData", int[].class); + + /** * <p>When enabled, the sensor sends a test pattern instead of * doing a real exposure from the camera.</p> * <p>When a test pattern is enabled, all manual sensor controls specified @@ -1936,6 +2237,20 @@ public final class CaptureResult extends CameraMetadata { new Key<int[]>("android.statistics.hotPixelMap", int[].class); /** + * <p>Whether the camera device will output the lens + * shading map in output result metadata.</p> + * <p>When set to ON, + * {@link CaptureResult#STATISTICS_LENS_SHADING_MAP android.statistics.lensShadingMap} must be provided in + * the output result metadata.</p> + * + * @see CaptureResult#STATISTICS_LENS_SHADING_MAP + * @see #STATISTICS_LENS_SHADING_MAP_MODE_OFF + * @see #STATISTICS_LENS_SHADING_MAP_MODE_ON + */ + public static final Key<Integer> STATISTICS_LENS_SHADING_MAP_MODE = + new Key<Integer>("android.statistics.lensShadingMapMode", int.class); + + /** * <p>Tonemapping / contrast / gamma curve for the blue * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is * CONTRAST_CURVE.</p> diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index e6dbcd0d4302..f6438b444cb5 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -654,17 +654,20 @@ public class InputMethodService extends AbstractInputMethodService { return false; } - @Override - public void onCreate() { - mTheme = getResources().selectSystemTheme(mTheme, getApplicationInfo().targetSdkVersion, - com.android.internal.R.array.system_theme_sdks, - com.android.internal.R.array.system_theme_ime_styles); + @Override public void onCreate() { + mTheme = Resources.selectSystemTheme(mTheme, + getApplicationInfo().targetSdkVersion, + android.R.style.Theme_InputMethod, + android.R.style.Theme_Holo_InputMethod, + android.R.style.Theme_DeviceDefault_InputMethod, + android.R.style.Theme_DeviceDefault_InputMethod); super.setTheme(mTheme); super.onCreate(); mImm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); mInflater = (LayoutInflater)getSystemService( Context.LAYOUT_INFLATER_SERVICE); - mWindow = new SoftInputWindow(this, mTheme, mDispatcherState); + mWindow = new SoftInputWindow(this, "InputMethod", mTheme, null, null, mDispatcherState, + false); if (mHardwareAccelerated) { mWindow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); } diff --git a/core/java/android/inputmethodservice/SoftInputWindow.java b/core/java/android/inputmethodservice/SoftInputWindow.java index df1afeea9b23..a9bace15ed1d 100644 --- a/core/java/android/inputmethodservice/SoftInputWindow.java +++ b/core/java/android/inputmethodservice/SoftInputWindow.java @@ -30,11 +30,20 @@ import android.view.WindowManager; * method window. It will be displayed along the edge of the screen, moving * the application user interface away from it so that the focused item is * always visible. + * @hide */ -class SoftInputWindow extends Dialog { +public class SoftInputWindow extends Dialog { + final String mName; + final Callback mCallback; + final KeyEvent.Callback mKeyEventCallback; final KeyEvent.DispatcherState mDispatcherState; + final boolean mTakesFocus; private final Rect mBounds = new Rect(); - + + public interface Callback { + public void onBackPressed(); + } + public void setToken(IBinder token) { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.token = token; @@ -53,10 +62,15 @@ class SoftInputWindow extends Dialog { * using styles. This theme is applied on top of the current theme in * <var>context</var>. If 0, the default dialog theme will be used. */ - public SoftInputWindow(Context context, int theme, - KeyEvent.DispatcherState dispatcherState) { + public SoftInputWindow(Context context, String name, int theme, Callback callback, + KeyEvent.Callback keyEventCallback, KeyEvent.DispatcherState dispatcherState, + boolean takesFocus) { super(context, theme); + mName = name; + mCallback = callback; + mKeyEventCallback = keyEventCallback; mDispatcherState = dispatcherState; + mTakesFocus = takesFocus; initDockWindow(); } @@ -148,11 +162,47 @@ class SoftInputWindow extends Dialog { } } + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (mKeyEventCallback != null && mKeyEventCallback.onKeyDown(keyCode, event)) { + return true; + } + return super.onKeyDown(keyCode, event); + } + + public boolean onKeyLongPress(int keyCode, KeyEvent event) { + if (mKeyEventCallback != null && mKeyEventCallback.onKeyLongPress(keyCode, event)) { + return true; + } + return super.onKeyLongPress(keyCode, event); + } + + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (mKeyEventCallback != null && mKeyEventCallback.onKeyUp(keyCode, event)) { + return true; + } + return super.onKeyUp(keyCode, event); + } + + public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { + if (mKeyEventCallback != null && mKeyEventCallback.onKeyMultiple(keyCode, count, event)) { + return true; + } + return super.onKeyMultiple(keyCode, count, event); + } + + public void onBackPressed() { + if (mCallback != null) { + mCallback.onBackPressed(); + } else { + super.onBackPressed(); + } + } + private void initDockWindow() { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.type = WindowManager.LayoutParams.TYPE_INPUT_METHOD; - lp.setTitle("InputMethod"); + lp.setTitle(mName); lp.gravity = Gravity.BOTTOM; lp.width = -1; @@ -161,11 +211,19 @@ class SoftInputWindow extends Dialog { //lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER; getWindow().setAttributes(lp); - getWindow().setFlags( - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | + + int windowSetFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; + int windowModFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | - WindowManager.LayoutParams.FLAG_DIM_BEHIND); + WindowManager.LayoutParams.FLAG_DIM_BEHIND; + + if (!mTakesFocus) { + windowSetFlags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + } else { + windowSetFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + windowModFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + } + + getWindow().setFlags(windowSetFlags, windowModFlags); } } diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index f1ad1f892b0a..e78ce339d120 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -911,6 +911,8 @@ public abstract class BatteryStats implements Parcelable { */ public abstract int getScreenOnCount(int which); + public abstract long getInteractiveTime(long elapsedRealtimeUs, int which); + public static final int SCREEN_BRIGHTNESS_DARK = 0; public static final int SCREEN_BRIGHTNESS_DIM = 1; public static final int SCREEN_BRIGHTNESS_MEDIUM = 2; @@ -936,8 +938,6 @@ public abstract class BatteryStats implements Parcelable { public abstract long getScreenBrightnessTime(int brightnessBin, long elapsedRealtimeUs, int which); - public abstract int getInputEventCount(int which); - /** * Returns the time in microseconds that the phone has been on while the device was * running on battery. @@ -1571,6 +1571,7 @@ public abstract class BatteryStats implements Parcelable { final long totalRealtime = computeRealtime(rawRealtime, which); final long totalUptime = computeUptime(rawUptime, which); final long screenOnTime = getScreenOnTime(rawRealtime, which); + final long interactiveTime = getInteractiveTime(rawRealtime, which); final long phoneOnTime = getPhoneOnTime(rawRealtime, which); final long wifiOnTime = getWifiOnTime(rawRealtime, which); final long wifiRunningTime = getGlobalWifiRunningTime(rawRealtime, which); @@ -1639,8 +1640,8 @@ public abstract class BatteryStats implements Parcelable { wifiRunningTime / 1000, bluetoothOnTime / 1000, mobileRxTotalBytes, mobileTxTotalBytes, wifiRxTotalBytes, wifiTxTotalBytes, fullWakeLockTimeTotal, partialWakeLockTimeTotal, - getInputEventCount(which), getMobileRadioActiveTime(rawRealtime, which), - getMobileRadioActiveAdjustedTime(which)); + 0 /*legacy input event count*/, getMobileRadioActiveTime(rawRealtime, which), + getMobileRadioActiveAdjustedTime(which), interactiveTime / 1000); // Dump screen brightness stats Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS]; @@ -2013,6 +2014,7 @@ public abstract class BatteryStats implements Parcelable { sb.append("realtime, "); formatTimeMs(sb, totalUptime / 1000); sb.append("uptime"); + pw.println(sb.toString()); if (batteryTimeRemaining >= 0) { sb.setLength(0); sb.append(prefix); @@ -2031,16 +2033,25 @@ public abstract class BatteryStats implements Parcelable { pw.println(DateFormat.format("yyyy-MM-dd-HH-mm-ss", getStartClockTime()).toString()); final long screenOnTime = getScreenOnTime(rawRealtime, which); + final long interactiveTime = getInteractiveTime(rawRealtime, which); final long phoneOnTime = getPhoneOnTime(rawRealtime, which); final long wifiRunningTime = getGlobalWifiRunningTime(rawRealtime, which); final long wifiOnTime = getWifiOnTime(rawRealtime, which); final long bluetoothOnTime = getBluetoothOnTime(rawRealtime, which); sb.setLength(0); sb.append(prefix); + sb.append(" Interactive: "); formatTimeMs(sb, interactiveTime / 1000); + sb.append("("); sb.append(formatRatioLocked(interactiveTime, whichBatteryRealtime)); + sb.append(")"); + pw.println(sb.toString()); + sb.setLength(0); + sb.append(prefix); sb.append(" Screen on: "); formatTimeMs(sb, screenOnTime / 1000); sb.append("("); sb.append(formatRatioLocked(screenOnTime, whichBatteryRealtime)); sb.append(") "); sb.append(getScreenOnCount(which)); - sb.append("x, Input events: "); sb.append(getInputEventCount(which)); + sb.append("x, Active phone call: "); formatTimeMs(sb, phoneOnTime / 1000); + sb.append("("); sb.append(formatRatioLocked(phoneOnTime, whichBatteryRealtime)); + sb.append(")"); pw.println(sb.toString()); if (phoneOnTime != 0) { sb.setLength(0); @@ -2899,7 +2910,7 @@ public abstract class BatteryStats implements Parcelable { } } if (!didWake && wakelockTag != null) { - pw.print(longNames ? "wake_lock=" : "w="); + pw.print(longNames ? " wake_lock=" : ",w="); if (longNames) { UserHandle.formatUid(pw, wakelockTag.uid); pw.print(":\""); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index ab0623080993..0eb994d884c7 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4395,6 +4395,13 @@ public final class Settings { public static final String ANR_SHOW_BACKGROUND = "anr_show_background"; /** + * (Experimental). If nonzero, WebView uses data reduction proxy to save network + * bandwidth. Otherwise, WebView does not use data reduction proxy. + * @hide + */ + public static final String WEBVIEW_DATA_REDUCTION_PROXY = "webview_data_reduction_proxy"; + + /** * The {@link ComponentName} string of the service to be used as the voice recognition * service. * diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 2303d657efd0..b02a79d74f77 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -300,10 +300,6 @@ public class DreamService extends Service implements Window.Callback { public void onDetachedFromWindow() { } - @Override - public void onWindowDismissed() { - } - /** {@inheritDoc} */ @Override public void onPanelClosed(int featureId, Menu menu) { diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java index 72720d197f3d..e7cdc4ea49e2 100644 --- a/core/java/android/service/notification/StatusBarNotification.java +++ b/core/java/android/service/notification/StatusBarNotification.java @@ -87,7 +87,7 @@ public class StatusBarNotification implements Parcelable { } private String key() { - return pkg + '|' + id + '|' + tag + '|' + uid; + return user.getIdentifier() + "|" + pkg + "|" + id + "|" + tag + "|" + uid; } public void writeToParcel(Parcel out, int flags) { diff --git a/core/java/android/service/voice/IVoiceInteractionSession.aidl b/core/java/android/service/voice/IVoiceInteractionSession.aidl index 7dbf66b003f5..9f9c31213b86 100644 --- a/core/java/android/service/voice/IVoiceInteractionSession.aidl +++ b/core/java/android/service/voice/IVoiceInteractionSession.aidl @@ -16,13 +16,14 @@ package android.service.voice; -import android.os.Bundle; - -import com.android.internal.app.IVoiceInteractorCallback; -import com.android.internal.app.IVoiceInteractorRequest; +import android.content.Intent; /** * @hide */ -interface IVoiceInteractionSession { +oneway interface IVoiceInteractionSession { + void taskStarted(in Intent intent, int taskId); + void taskFinished(in Intent intent, int taskId); + void closeSystemDialogs(); + void destroy(); } diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java index d00589095aa5..e15489b66ae6 100644 --- a/core/java/android/service/voice/VoiceInteractionService.java +++ b/core/java/android/service/voice/VoiceInteractionService.java @@ -27,6 +27,19 @@ import android.os.RemoteException; import android.os.ServiceManager; import com.android.internal.app.IVoiceInteractionManagerService; +/** + * Top-level service of the current global voice interactor, which is providing + * support for hotwording, the back-end of a {@link android.app.VoiceInteractor}, etc. + * The current VoiceInteractionService that has been selected by the user is kept + * always running by the system, to allow it to do things like listen for hotwords + * in the background to instigate voice interactions. + * + * <p>Because this service is always running, it should be kept as lightweight as + * possible. Heavy-weight operations (including showing UI) should be implemented + * in the associated {@link android.service.voice.VoiceInteractionSessionService} when + * an actual voice interaction is taking place, and that service should run in a + * separate process from this one. + */ public class VoiceInteractionService extends Service { /** * The {@link Intent} that must be declared as handled by the service. @@ -51,11 +64,9 @@ public class VoiceInteractionService extends Service { IVoiceInteractionManagerService mSystemService; - public void startVoiceActivity(Intent intent, Bundle sessionArgs) { + public void startSession(Bundle args) { try { - mSystemService.startVoiceActivity(intent, - intent.resolveType(getContentResolver()), - mInterface, sessionArgs); + mSystemService.startSession(mInterface, args); } catch (RemoteException e) { } } diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java index 963b6b4d6e3f..a83544d08c1a 100644 --- a/core/java/android/service/voice/VoiceInteractionSession.java +++ b/core/java/android/service/voice/VoiceInteractionSession.java @@ -16,7 +16,14 @@ package android.service.voice; +import android.app.Dialog; +import android.app.Instrumentation; import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Region; +import android.inputmethodservice.SoftInputWindow; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -25,16 +32,53 @@ import android.os.Message; import android.os.RemoteException; import android.util.ArrayMap; import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.WindowManager; +import android.widget.FrameLayout; +import com.android.internal.app.IVoiceInteractionManagerService; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.IVoiceInteractorCallback; import com.android.internal.app.IVoiceInteractorRequest; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; -public abstract class VoiceInteractionSession { +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; + +public abstract class VoiceInteractionSession implements KeyEvent.Callback { static final String TAG = "VoiceInteractionSession"; static final boolean DEBUG = true; + final Context mContext; + final HandlerCaller mHandlerCaller; + + final KeyEvent.DispatcherState mDispatcherState = new KeyEvent.DispatcherState(); + + IVoiceInteractionManagerService mSystemService; + IBinder mToken; + + int mTheme = 0; + LayoutInflater mInflater; + TypedArray mThemeAttrs; + View mRootView; + FrameLayout mContentFrame; + SoftInputWindow mWindow; + + boolean mInitialized; + boolean mWindowAdded; + boolean mWindowVisible; + boolean mWindowWasVisible; + boolean mInShowWindow; + + final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); + + final Insets mTmpInsets = new Insets(); + final int[] mTmpLocation = new int[2]; + final IVoiceInteractor mInteractor = new IVoiceInteractor.Stub() { @Override public IVoiceInteractorRequest startConfirmation(String callingPackage, @@ -71,6 +115,27 @@ public abstract class VoiceInteractionSession { }; final IVoiceInteractionSession mSession = new IVoiceInteractionSession.Stub() { + @Override + public void taskStarted(Intent intent, int taskId) { + mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_STARTED, + taskId, intent)); + } + + @Override + public void taskFinished(Intent intent, int taskId) { + mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageIO(MSG_TASK_FINISHED, + taskId, intent)); + } + + @Override + public void closeSystemDialogs() { + mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_CLOSE_SYSTEM_DIALOGS)); + } + + @Override + public void destroy() { + mHandlerCaller.sendMessage(mHandlerCaller.obtainMessage(MSG_DESTROY)); + } }; public static class Request { @@ -129,38 +194,128 @@ public abstract class VoiceInteractionSession { static final int MSG_SUPPORTS_COMMANDS = 3; static final int MSG_CANCEL = 4; - final Context mContext; - final HandlerCaller mHandlerCaller; - final HandlerCaller.Callback mHandlerCallerCallback = new HandlerCaller.Callback() { + static final int MSG_TASK_STARTED = 100; + static final int MSG_TASK_FINISHED = 101; + static final int MSG_CLOSE_SYSTEM_DIALOGS = 102; + static final int MSG_DESTROY = 103; + + class MyCallbacks implements HandlerCaller.Callback, SoftInputWindow.Callback { @Override public void executeMessage(Message msg) { - SomeArgs args = (SomeArgs)msg.obj; + SomeArgs args; switch (msg.what) { case MSG_START_CONFIRMATION: + args = (SomeArgs)msg.obj; if (DEBUG) Log.d(TAG, "onConfirm: req=" + ((Request) args.arg2).mInterface + " prompt=" + args.arg3 + " extras=" + args.arg4); onConfirm((Caller)args.arg1, (Request)args.arg2, (String)args.arg3, (Bundle)args.arg4); break; case MSG_START_COMMAND: + args = (SomeArgs)msg.obj; if (DEBUG) Log.d(TAG, "onCommand: req=" + ((Request) args.arg2).mInterface + " command=" + args.arg3 + " extras=" + args.arg4); onCommand((Caller) args.arg1, (Request) args.arg2, (String) args.arg3, (Bundle) args.arg4); break; case MSG_SUPPORTS_COMMANDS: + args = (SomeArgs)msg.obj; if (DEBUG) Log.d(TAG, "onGetSupportedCommands: cmds=" + args.arg2); args.arg1 = onGetSupportedCommands((Caller) args.arg1, (String[]) args.arg2); break; case MSG_CANCEL: + args = (SomeArgs)msg.obj; if (DEBUG) Log.d(TAG, "onCancel: req=" + ((Request) args.arg1).mInterface); onCancel((Request)args.arg1); break; + case MSG_TASK_STARTED: + if (DEBUG) Log.d(TAG, "onTaskStarted: intent=" + msg.obj + + " taskId=" + msg.arg1); + onTaskStarted((Intent) msg.obj, msg.arg1); + break; + case MSG_TASK_FINISHED: + if (DEBUG) Log.d(TAG, "onTaskFinished: intent=" + msg.obj + + " taskId=" + msg.arg1); + onTaskFinished((Intent) msg.obj, msg.arg1); + break; + case MSG_CLOSE_SYSTEM_DIALOGS: + if (DEBUG) Log.d(TAG, "onCloseSystemDialogs"); + onCloseSystemDialogs(); + break; + case MSG_DESTROY: + if (DEBUG) Log.d(TAG, "doDestroy"); + doDestroy(); + break; } } - }; - final ArrayMap<IBinder, Request> mActiveRequests = new ArrayMap<IBinder, Request>(); + @Override + public void onBackPressed() { + VoiceInteractionSession.this.onBackPressed(); + } + } + + final MyCallbacks mCallbacks = new MyCallbacks(); + + /** + * Information about where interesting parts of the input method UI appear. + */ + public static final class Insets { + /** + * This is the top part of the UI that is the main content. It is + * used to determine the basic space needed, to resize/pan the + * application behind. It is assumed that this inset does not + * change very much, since any change will cause a full resize/pan + * of the application behind. This value is relative to the top edge + * of the input method window. + */ + public int contentTopInsets; + + /** + * This is the region of the UI that is touchable. It is used when + * {@link #touchableInsets} is set to {@link #TOUCHABLE_INSETS_REGION}. + * The region should be specified relative to the origin of the window frame. + */ + public final Region touchableRegion = new Region(); + + /** + * Option for {@link #touchableInsets}: the entire window frame + * can be touched. + */ + public static final int TOUCHABLE_INSETS_FRAME + = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; + + /** + * Option for {@link #touchableInsets}: the area inside of + * the content insets can be touched. + */ + public static final int TOUCHABLE_INSETS_CONTENT + = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; + + /** + * Option for {@link #touchableInsets}: the region specified by + * {@link #touchableRegion} can be touched. + */ + public static final int TOUCHABLE_INSETS_REGION + = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; + + /** + * Determine which area of the window is touchable by the user. May + * be one of: {@link #TOUCHABLE_INSETS_FRAME}, + * {@link #TOUCHABLE_INSETS_CONTENT}, or {@link #TOUCHABLE_INSETS_REGION}. + */ + public int touchableInsets; + } + + final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = + new ViewTreeObserver.OnComputeInternalInsetsListener() { + public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { + onComputeInsets(mTmpInsets); + info.contentInsets.top = info.visibleInsets.top = mTmpInsets.contentTopInsets; + info.touchableRegion.set(mTmpInsets.touchableRegion); + info.setTouchableInsets(mTmpInsets.touchableInsets); + } + }; public VoiceInteractionSession(Context context) { this(context, new Handler()); @@ -169,7 +324,7 @@ public abstract class VoiceInteractionSession { public VoiceInteractionSession(Context context, Handler handler) { mContext = context; mHandlerCaller = new HandlerCaller(context, handler.getLooper(), - mHandlerCallerCallback, true); + mCallbacks, true); } Request findRequest(IVoiceInteractorCallback callback, boolean newRequest) { @@ -188,6 +343,192 @@ public abstract class VoiceInteractionSession { } } + void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args) { + mSystemService = service; + mToken = token; + onCreate(args); + } + + void doDestroy() { + if (mInitialized) { + mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( + mInsetsComputer); + if (mWindowAdded) { + mWindow.dismiss(); + mWindowAdded = false; + } + mInitialized = false; + } + } + + void initViews() { + mInitialized = true; + + mThemeAttrs = mContext.obtainStyledAttributes(android.R.styleable.VoiceInteractionSession); + mRootView = mInflater.inflate( + com.android.internal.R.layout.voice_interaction_session, null); + mRootView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + mWindow.setContentView(mRootView); + mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer); + + mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content); + } + + public void showWindow() { + if (DEBUG) Log.v(TAG, "Showing window: mWindowAdded=" + mWindowAdded + + " mWindowVisible=" + mWindowVisible); + + if (mInShowWindow) { + Log.w(TAG, "Re-entrance in to showWindow"); + return; + } + + try { + mInShowWindow = true; + if (!mWindowVisible) { + mWindowVisible = true; + if (!mWindowAdded) { + mWindowAdded = true; + View v = onCreateContentView(); + if (v != null) { + setContentView(v); + } + } + mWindow.show(); + } + } finally { + mWindowWasVisible = true; + mInShowWindow = false; + } + } + + public void hideWindow() { + if (mWindowVisible) { + mWindow.hide(); + mWindowVisible = false; + } + } + + /** + * You can call this to customize the theme used by your IME's window. + * This must be set before {@link #onCreate}, so you + * will typically call it in your constructor with the resource ID + * of your custom theme. + */ + public void setTheme(int theme) { + if (mWindow != null) { + throw new IllegalStateException("Must be called before onCreate()"); + } + mTheme = theme; + } + + public void startVoiceActivity(Intent intent) { + if (mToken == null) { + throw new IllegalStateException("Can't call before onCreate()"); + } + try { + int res = mSystemService.startVoiceActivity(mToken, intent, + intent.resolveType(mContext.getContentResolver())); + Instrumentation.checkStartActivityResult(res, intent); + } catch (RemoteException e) { + } + } + + public LayoutInflater getLayoutInflater() { + return mInflater; + } + + public Dialog getWindow() { + return mWindow; + } + + public void finish() { + if (mToken == null) { + throw new IllegalStateException("Can't call before onCreate()"); + } + hideWindow(); + try { + mSystemService.finish(mToken); + } catch (RemoteException e) { + } + } + + public void onCreate(Bundle args) { + mTheme = mTheme != 0 ? mTheme + : com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession; + mInflater = (LayoutInflater)mContext.getSystemService( + Context.LAYOUT_INFLATER_SERVICE); + mWindow = new SoftInputWindow(mContext, "VoiceInteractionSession", mTheme, + mCallbacks, this, mDispatcherState, true); + mWindow.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); + initViews(); + mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT); + mWindow.setToken(mToken); + } + + public void onDestroy() { + } + + public View onCreateContentView() { + return null; + } + + public void setContentView(View view) { + mContentFrame.removeAllViews(); + mContentFrame.addView(view, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + + } + + public boolean onKeyDown(int keyCode, KeyEvent event) { + return false; + } + + public boolean onKeyLongPress(int keyCode, KeyEvent event) { + return false; + } + + public boolean onKeyUp(int keyCode, KeyEvent event) { + return false; + } + + public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { + return false; + } + + public void onBackPressed() { + finish(); + } + + public void onCloseSystemDialogs() { + finish(); + } + + /** + * Compute the interesting insets into your UI. The default implementation + * uses the entire window frame as the insets. The default touchable + * insets are {@link Insets#TOUCHABLE_INSETS_FRAME}. + * + * @param outInsets Fill in with the current UI insets. + */ + public void onComputeInsets(Insets outInsets) { + int[] loc = mTmpLocation; + View decor = getWindow().getWindow().getDecorView(); + decor.getLocationInWindow(loc); + outInsets.contentTopInsets = loc[1]; + outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_FRAME; + outInsets.touchableRegion.setEmpty(); + } + + public void onTaskStarted(Intent intent, int taskId) { + } + + public void onTaskFinished(Intent intent, int taskId) { + finish(); + } + public abstract boolean[] onGetSupportedCommands(Caller caller, String[] commands); public abstract void onConfirm(Caller caller, Request request, String prompt, Bundle extras); public abstract void onCommand(Caller caller, Request request, String command, Bundle extras); diff --git a/core/java/android/service/voice/VoiceInteractionSessionService.java b/core/java/android/service/voice/VoiceInteractionSessionService.java index 40e5bba0bde2..e793849fb8ca 100644 --- a/core/java/android/service/voice/VoiceInteractionSessionService.java +++ b/core/java/android/service/voice/VoiceInteractionSessionService.java @@ -29,11 +29,15 @@ import com.android.internal.app.IVoiceInteractionManagerService; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; +/** + * An active voice interaction session, initiated by a {@link VoiceInteractionService}. + */ public abstract class VoiceInteractionSessionService extends Service { static final int MSG_NEW_SESSION = 1; IVoiceInteractionManagerService mSystemService; + VoiceInteractionSession mSession; IVoiceInteractionSessionService mInterface = new IVoiceInteractionSessionService.Stub() { public void newSession(IBinder token, Bundle args) { @@ -73,9 +77,14 @@ public abstract class VoiceInteractionSessionService extends Service { } void doNewSession(IBinder token, Bundle args) { - VoiceInteractionSession session = onNewSession(args); + if (mSession != null) { + mSession.doDestroy(); + mSession = null; + } + mSession = onNewSession(args); try { - mSystemService.deliverNewSession(token, session.mSession, session.mInteractor); + mSystemService.deliverNewSession(token, mSession.mSession, mSession.mInteractor); + mSession.doCreate(mSystemService, token, args); } catch (RemoteException e) { } } diff --git a/core/java/android/speech/tts/BlockingAudioTrack.java b/core/java/android/speech/tts/BlockingAudioTrack.java index 186cb493b133..92bb0ac6acfa 100644 --- a/core/java/android/speech/tts/BlockingAudioTrack.java +++ b/core/java/android/speech/tts/BlockingAudioTrack.java @@ -83,7 +83,7 @@ class BlockingAudioTrack { mVolume = volume; mPan = pan; - mBytesPerFrame = getBytesPerFrame(mAudioFormat) * mChannelCount; + mBytesPerFrame = AudioFormat.getBytesPerSample(mAudioFormat) * mChannelCount; mIsShortUtterance = false; mAudioBufferSize = 0; mBytesWritten = 0; @@ -229,17 +229,6 @@ class BlockingAudioTrack { return audioTrack; } - private static int getBytesPerFrame(int audioFormat) { - if (audioFormat == AudioFormat.ENCODING_PCM_8BIT) { - return 1; - } else if (audioFormat == AudioFormat.ENCODING_PCM_16BIT) { - return 2; - } - - return -1; - } - - private void blockUntilDone(AudioTrack audioTrack) { if (mBytesWritten <= 0) { return; diff --git a/core/java/android/speech/tts/FileSynthesisCallback.java b/core/java/android/speech/tts/FileSynthesisCallback.java index 717aeb6f00e5..d84f7f0d6435 100644 --- a/core/java/android/speech/tts/FileSynthesisCallback.java +++ b/core/java/android/speech/tts/FileSynthesisCallback.java @@ -278,8 +278,7 @@ class FileSynthesisCallback extends AbstractSynthesisCallback { private ByteBuffer makeWavHeader(int sampleRateInHz, int audioFormat, int channelCount, int dataLength) { - // TODO: is AudioFormat.ENCODING_DEFAULT always the same as ENCODING_PCM_16BIT? - int sampleSizeInBytes = (audioFormat == AudioFormat.ENCODING_PCM_8BIT ? 1 : 2); + int sampleSizeInBytes = AudioFormat.getBytesPerSample(audioFormat); int byteRate = sampleRateInHz * sampleSizeInBytes * channelCount; short blockAlign = (short) (sampleSizeInBytes * channelCount); short bitsPerSample = (short) (sampleSizeInBytes * 8); diff --git a/core/java/android/transition/MoveImage.java b/core/java/android/transition/MoveImage.java index e4c393995618..183cdd2397a8 100644 --- a/core/java/android/transition/MoveImage.java +++ b/core/java/android/transition/MoveImage.java @@ -125,7 +125,7 @@ public class MoveImage extends Transition { Matrix startMatrix = (Matrix) startValues.values.get(PROPNAME_MATRIX); Matrix endMatrix = (Matrix) endValues.values.get(PROPNAME_MATRIX); - if (!startMatrix.equals(endMatrix)) { + if (startMatrix != null && !startMatrix.equals(endMatrix)) { changes.add(PropertyValuesHolder.ofObject(MatrixClippedDrawable.MATRIX_PROPERTY, new MatrixEvaluator(), startMatrix, endMatrix)); } @@ -230,7 +230,9 @@ public class MoveImage extends Transition { private static void expandClip(Rect bounds, Matrix matrix, Rect clip, Rect otherClip) { RectF boundsF = new RectF(bounds); - matrix.mapRect(boundsF); + if (matrix != null) { + matrix.mapRect(boundsF); + } clip.left = expandMinDimension(boundsF.left, clip.left, otherClip.left); clip.top = expandMinDimension(boundsF.top, clip.top, otherClip.top); clip.right = expandMaxDimension(boundsF.right, clip.right, otherClip.right); @@ -256,10 +258,20 @@ public class MoveImage extends Transition { int drawableWidth = drawable.getIntrinsicWidth(); int drawableHeight = drawable.getIntrinsicHeight(); ImageView.ScaleType scaleType = imageView.getScaleType(); - if (drawableWidth <= 0 || drawableHeight <= 0 || scaleType == ImageView.ScaleType.FIT_XY) { - return null; + Matrix matrix; + if (drawableWidth <= 0 || drawableHeight <= 0) { + matrix = null; + } else if (scaleType == ImageView.ScaleType.FIT_XY) { + matrix = new Matrix(); + float scaleX = imageView.getWidth(); + scaleX /= drawableWidth; + float scaleY = imageView.getHeight(); + scaleY /= drawableHeight; + matrix.setScale(scaleX, scaleY); + } else { + matrix = new Matrix(imageView.getImageMatrix()); } - return new Matrix(imageView.getImageMatrix()); + return matrix; } private Rect findClip(ImageView imageView) { diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index f1523aefe04c..0a7607513378 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -259,6 +259,14 @@ public final class Choreographer { return delayMillis <= frameDelay ? 0 : delayMillis - frameDelay; } + /** + * @return The refresh rate as the nanoseconds between frames + * @hide + */ + long getFrameIntervalNanos() { + return mFrameIntervalNanos; + } + void dump(String prefix, PrintWriter writer) { String innerPrefix = prefix + " "; writer.print(prefix); writer.println("Choreographer:"); diff --git a/core/java/android/view/ContextThemeWrapper.java b/core/java/android/view/ContextThemeWrapper.java index ba1c4b663269..0afbde9ee14f 100644 --- a/core/java/android/view/ContextThemeWrapper.java +++ b/core/java/android/view/ContextThemeWrapper.java @@ -96,7 +96,7 @@ public class ContextThemeWrapper extends ContextWrapper { return mTheme; } - mThemeResource = getResources().selectDefaultTheme(mThemeResource, + mThemeResource = Resources.selectDefaultTheme(mThemeResource, getApplicationInfo().targetSdkVersion); initializeTheme(); diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 2d55a01b04a4..c15ce44eb2a2 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -74,8 +74,10 @@ public class SurfaceControl { IBinder displayToken, int orientation, int l, int t, int r, int b, int L, int T, int R, int B); - private static native boolean nativeGetDisplayInfo( - IBinder displayToken, SurfaceControl.PhysicalDisplayInfo outInfo); + private static native SurfaceControl.PhysicalDisplayInfo[] nativeGetDisplayConfigs( + IBinder displayToken); + private static native int nativeGetActiveConfig(IBinder displayToken); + private static native boolean nativeSetActiveConfig(IBinder displayToken, int id); private static native void nativeBlankDisplay(IBinder displayToken); private static native void nativeUnblankDisplay(IBinder displayToken); @@ -499,14 +501,25 @@ public class SurfaceControl { nativeBlankDisplay(displayToken); } - public static boolean getDisplayInfo(IBinder displayToken, SurfaceControl.PhysicalDisplayInfo outInfo) { + public static SurfaceControl.PhysicalDisplayInfo[] getDisplayConfigs(IBinder displayToken) { if (displayToken == null) { throw new IllegalArgumentException("displayToken must not be null"); } - if (outInfo == null) { - throw new IllegalArgumentException("outInfo must not be null"); + return nativeGetDisplayConfigs(displayToken); + } + + public static int getActiveConfig(IBinder displayToken) { + if (displayToken == null) { + throw new IllegalArgumentException("displayToken must not be null"); + } + return nativeGetActiveConfig(displayToken); + } + + public static boolean setActiveConfig(IBinder displayToken, int id) { + if (displayToken == null) { + throw new IllegalArgumentException("displayToken must not be null"); } - return nativeGetDisplayInfo(displayToken, outInfo); + return nativeSetActiveConfig(displayToken, id); } public static void setDisplayProjection(IBinder displayToken, diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index eaec8abe208b..0bf99d3bb3e3 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -19,7 +19,6 @@ package android.view; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.SurfaceTexture; -import android.os.SystemClock; import android.os.Trace; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; @@ -52,16 +51,29 @@ public class ThreadedRenderer extends HardwareRenderer { private static final Rect NULL_RECT = new Rect(); + private static final long NANOS_PER_MS = 1000000; + + // Keep in sync with DrawFrameTask.h SYNC_* flags + // Nothing interesting to report + private static final int SYNC_OK = 0x0; + // Needs a ViewRoot invalidate + private static final int SYNC_INVALIDATE_REQUIRED = 0x1; + private int mWidth, mHeight; private long mNativeProxy; private boolean mInitialized = false; private RenderNode mRootNode; + private Choreographer mChoreographer; ThreadedRenderer(boolean translucent) { long rootNodePtr = nCreateRootRenderNode(); mRootNode = RenderNode.adopt(rootNodePtr); mRootNode.setClipToBounds(false); mNativeProxy = nCreateProxy(translucent, rootNodePtr); + + // Setup timing + mChoreographer = Choreographer.getInstance(); + nSetFrameInterval(mNativeProxy, mChoreographer.getFrameIntervalNanos()); } @Override @@ -158,16 +170,7 @@ public class ThreadedRenderer extends HardwareRenderer { @Override boolean loadSystemProperties() { - return false; - } - - /** - * TODO: Remove - * Temporary hack to allow RenderThreadTest prototype app to trigger - * replaying a DisplayList after modifying the displaylist properties - * - * @hide */ - public void repeatLastDraw() { + return nLoadSystemProperties(mNativeProxy); } private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { @@ -194,7 +197,8 @@ public class ThreadedRenderer extends HardwareRenderer { @Override void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks, Rect dirty) { attachInfo.mIgnoreDirtyState = true; - attachInfo.mDrawingTime = SystemClock.uptimeMillis(); + long frameTimeNanos = mChoreographer.getFrameTimeNanos(); + attachInfo.mDrawingTime = frameTimeNanos / NANOS_PER_MS; updateRootDisplayList(view, callbacks); @@ -203,7 +207,11 @@ public class ThreadedRenderer extends HardwareRenderer { if (dirty == null) { dirty = NULL_RECT; } - nSyncAndDrawFrame(mNativeProxy, dirty.left, dirty.top, dirty.right, dirty.bottom); + int syncResult = nSyncAndDrawFrame(mNativeProxy, frameTimeNanos, + dirty.left, dirty.top, dirty.right, dirty.bottom); + if ((syncResult & SYNC_INVALIDATE_REQUIRED) != 0) { + attachInfo.mViewRootImpl.invalidate(); + } } @Override @@ -297,13 +305,16 @@ public class ThreadedRenderer extends HardwareRenderer { private static native long nCreateProxy(boolean translucent, long rootRenderNode); private static native void nDeleteProxy(long nativeProxy); + private static native void nSetFrameInterval(long nativeProxy, long frameIntervalNanos); + private static native boolean nLoadSystemProperties(long nativeProxy); + private static native boolean nInitialize(long nativeProxy, Surface window); private static native void nUpdateSurface(long nativeProxy, Surface window); private static native void nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height); private static native void nSetDisplayListData(long nativeProxy, long displayList, long newData); - private static native void nSyncAndDrawFrame(long nativeProxy, + private static native int nSyncAndDrawFrame(long nativeProxy, long frameTimeNanos, int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom); private static native void nRunWithGlContext(long nativeProxy, Runnable runnable); private static native void nDestroyCanvasAndSurface(long nativeProxy); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 6afff4d9ab66..3998c04053a3 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -9958,7 +9958,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @attr ref android.R.styleable#View_transformPivotX */ public void setPivotX(float pivotX) { - if (mRenderNode.isPivotExplicitlySet() || pivotX != getPivotX()) { + if (!mRenderNode.isPivotExplicitlySet() || pivotX != getPivotX()) { invalidateViewProperty(true, false); mRenderNode.setPivotX(pivotX); invalidateViewProperty(false, true); @@ -9999,7 +9999,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @attr ref android.R.styleable#View_transformPivotY */ public void setPivotY(float pivotY) { - if (mRenderNode.isPivotExplicitlySet() || pivotY != getPivotY()) { + if (!mRenderNode.isPivotExplicitlySet() || pivotY != getPivotY()) { invalidateViewProperty(true, false); mRenderNode.setPivotY(pivotY); invalidateViewProperty(false, true); diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index 20ef429eaf45..4e91ad4db977 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -702,8 +702,9 @@ public class ViewConfiguration { * * @return how long a user needs to press the relevant key to bring up * the global actions dialog. - * @deprecated use getDeviceGlobalActionKeyTimeout + * @deprecated This timeout should not be used by applications */ + @Deprecated public static long getGlobalActionKeyTimeout() { return GLOBAL_ACTIONS_KEY_TIMEOUT; } @@ -714,6 +715,7 @@ public class ViewConfiguration { * * @return how long a user needs to press the relevant key to bring up * the global actions dialog. + * @hide */ public long getDeviceGlobalActionKeyTimeout() { return mGlobalActionsKeyTimeout; diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 9c44bd1a77b1..375f5e3e8bf4 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -147,6 +147,7 @@ public abstract class Window { private TypedArray mWindowStyle; private Callback mCallback; + private OnWindowDismissedCallback mOnWindowDismissedCallback; private WindowManager mWindowManager; private IBinder mAppToken; private String mAppName; @@ -405,7 +406,10 @@ public abstract class Window { * @param mode The mode that was just finished. */ public void onActionModeFinished(ActionMode mode); + } + /** @hide */ + public interface OnWindowDismissedCallback { /** * Called when a window is dismissed. This informs the callback that the * window is gone, and it should finish itself. @@ -586,6 +590,18 @@ public abstract class Window { return mCallback; } + /** @hide */ + public final void setOnWindowDismissedCallback(OnWindowDismissedCallback dcb) { + mOnWindowDismissedCallback = dcb; + } + + /** @hide */ + public final void dispatchOnWindowDismissed() { + if (mOnWindowDismissedCallback != null) { + mOnWindowDismissedCallback.onWindowDismissed(); + } + } + /** * Take ownership of this window's surface. The window's view hierarchy * will no longer draw into the surface, though it will otherwise continue diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index d06cd759934d..4b2b52ca4b7c 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -251,6 +251,15 @@ public class WebView extends AbsoluteLayout implements ViewTreeObserver.OnGlobalFocusChangeListener, ViewGroup.OnHierarchyChangeListener, ViewDebug.HierarchyHandler { + /** + * Broadcast Action: Indicates the data reduction proxy setting changed. + * Sent by the settings app when user changes the data reduction proxy value. This intent will + * always stay as a hidden API. + * @hide + */ + public static final String DATA_REDUCTION_PROXY_SETTING_CHANGED = + "android.webkit.DATA_REDUCTION_PROXY_SETTING_CHANGED"; + private static final String LOGTAG = "WebView"; // Throwing an exception for incorrect thread usage if the diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 3fac883166c5..f4cd5fcf7b65 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -3380,7 +3380,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mScrollOffset)) { mMotionCorrection -= mScrollOffset[1]; lastYCorrection -= mScrollOffset[1]; - vtev.offsetLocation(0, mScrollOffset[1]); + if (vtev != null) { + vtev.offsetLocation(0, mScrollOffset[1]); + } } else { overScrollBy(0, overscroll, 0, mScrollY, 0, 0, 0, mOverscrollDistance, true); diff --git a/core/java/android/widget/ActionMenuPresenter.java b/core/java/android/widget/ActionMenuPresenter.java index e4575e51651d..51759c5b227d 100644 --- a/core/java/android/widget/ActionMenuPresenter.java +++ b/core/java/android/widget/ActionMenuPresenter.java @@ -649,7 +649,8 @@ public class ActionMenuPresenter extends BaseMenuPresenter private class OverflowPopup extends MenuPopupHelper { public OverflowPopup(Context context, MenuBuilder menu, View anchorView, boolean overflowOnly) { - super(context, menu, anchorView, overflowOnly); + super(context, menu, anchorView, overflowOnly, + com.android.internal.R.attr.actionOverflowMenuStyle); setGravity(Gravity.END); setCallback(mPopupPresenterCallback); } diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index 10ec1054e838..f91865b61553 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -622,8 +622,8 @@ public class ListPopupWindow { // only set this if the dropdown is not always visible mPopup.setOutsideTouchable(!mForceIgnoreOutsideTouch && !mDropDownAlwaysVisible); mPopup.setTouchInterceptor(mTouchInterceptor); - mPopup.showAsDropDown(getAnchorView(), - mDropDownHorizontalOffset, mDropDownVerticalOffset, mDropDownGravity); + mPopup.showAsDropDown(getAnchorView(), mDropDownHorizontalOffset, + mDropDownVerticalOffset, mDropDownGravity); mDropDownList.setSelection(ListView.INVALID_POSITION); if (!mModal || mDropDownList.isInTouchMode()) { diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 6e71a5ca3f1e..01632ae76309 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -18,6 +18,7 @@ package android.widget; import com.android.internal.R; +import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; @@ -116,6 +117,10 @@ public class PopupWindow { private Drawable mAboveAnchorBackgroundDrawable; private Drawable mBelowAnchorBackgroundDrawable; + // Temporary animation centers. Should be moved into window params? + private int mAnchorRelativeX; + private int mAnchorRelativeY; + private boolean mAboveAnchor; private int mWindowLayoutType = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; @@ -129,12 +134,14 @@ public class PopupWindow { }; private WeakReference<View> mAnchor; - private OnScrollChangedListener mOnScrollChangedListener = + + private final OnScrollChangedListener mOnScrollChangedListener = new OnScrollChangedListener() { + @Override public void onScrollChanged() { - View anchor = mAnchor != null ? mAnchor.get() : null; + final View anchor = mAnchor != null ? mAnchor.get() : null; if (anchor != null && mPopupView != null) { - WindowManager.LayoutParams p = (WindowManager.LayoutParams) + final WindowManager.LayoutParams p = (WindowManager.LayoutParams) mPopupView.getLayoutParams(); updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff, @@ -143,7 +150,9 @@ public class PopupWindow { } } }; + private int mAnchorXoff, mAnchorYoff, mAnchoredGravity; + private boolean mOverlapAnchor; private boolean mPopupViewInitialLayoutDirectionInherited; @@ -187,6 +196,7 @@ public class PopupWindow { attrs, com.android.internal.R.styleable.PopupWindow, defStyleAttr, defStyleRes); mBackground = a.getDrawable(R.styleable.PopupWindow_popupBackground); + mOverlapAnchor = a.getBoolean(R.styleable.PopupWindow_overlapAnchor, false); final int animStyle = a.getResourceId(R.styleable.PopupWindow_popupAnimationStyle, -1); mAnimationStyle = animStyle == com.android.internal.R.style.Animation_PopupWindow ? -1 : @@ -934,9 +944,9 @@ public class PopupWindow { // do the job. if (mAboveAnchorBackgroundDrawable != null) { if (mAboveAnchor) { - mPopupView.setBackgroundDrawable(mAboveAnchorBackgroundDrawable); + mPopupView.setBackground(mAboveAnchorBackgroundDrawable); } else { - mPopupView.setBackgroundDrawable(mBelowAnchorBackgroundDrawable); + mPopupView.setBackground(mBelowAnchorBackgroundDrawable); } } else { mPopupView.refreshDrawableState(); @@ -1114,36 +1124,43 @@ public class PopupWindow { } return mAnimationStyle; } - + /** - * <p>Positions the popup window on screen. When the popup window is too - * tall to fit under the anchor, a parent scroll view is seeked and scrolled - * up to reclaim space. If scrolling is not possible or not enough, the - * popup window gets moved on top of the anchor.</p> - * - * <p>The height must have been set on the layout parameters prior to - * calling this method.</p> - * + * Positions the popup window on screen. When the popup window is too tall + * to fit under the anchor, a parent scroll view is seeked and scrolled up + * to reclaim space. If scrolling is not possible or not enough, the popup + * window gets moved on top of the anchor. + * <p> + * The height must have been set on the layout parameters prior to calling + * this method. + * * @param anchor the view on which the popup window must be anchored * @param p the layout parameters used to display the drop down - * + * @param xoff horizontal offset used to adjust for background padding + * @param yoff vertical offset used to adjust for background padding + * @param gravity horizontal gravity specifying popup alignment * @return true if the popup is translated upwards to fit on screen */ - private boolean findDropDownPosition(View anchor, WindowManager.LayoutParams p, - int xoff, int yoff, int gravity) { - + private boolean findDropDownPosition(View anchor, WindowManager.LayoutParams p, int xoff, + int yoff, int gravity) { final int anchorHeight = anchor.getHeight(); + final int anchorWidth = anchor.getWidth(); + if (mOverlapAnchor) { + yoff -= anchorHeight; + } + anchor.getLocationInWindow(mDrawingLocation); p.x = mDrawingLocation[0] + xoff; p.y = mDrawingLocation[1] + anchorHeight + yoff; - final int hgrav = Gravity.getAbsoluteGravity(gravity, anchor.getLayoutDirection()) & - Gravity.HORIZONTAL_GRAVITY_MASK; + final int hgrav = Gravity.getAbsoluteGravity(gravity, anchor.getLayoutDirection()) + & Gravity.HORIZONTAL_GRAVITY_MASK; if (hgrav == Gravity.RIGHT) { - // Flip the location to align the right sides of the popup and anchor instead of left - p.x -= mPopupWidth - anchor.getWidth(); + // Flip the location to align the right sides of the popup and + // anchor instead of left. + p.x -= mPopupWidth - anchorWidth; } - + boolean onTop = false; p.gravity = Gravity.LEFT | Gravity.TOP; @@ -1152,60 +1169,58 @@ public class PopupWindow { final Rect displayFrame = new Rect(); anchor.getWindowVisibleDisplayFrame(displayFrame); - int screenY = mScreenLocation[1] + anchorHeight + yoff; - + final int screenY = mScreenLocation[1] + anchorHeight + yoff; final View root = anchor.getRootView(); - if (screenY + mPopupHeight > displayFrame.bottom || - p.x + mPopupWidth - root.getWidth() > 0) { - // if the drop down disappears at the bottom of the screen. we try to - // scroll a parent scrollview or move the drop down back up on top of - // the edit box + if (screenY + mPopupHeight > displayFrame.bottom + || p.x + mPopupWidth - root.getWidth() > 0) { + // If the drop down disappears at the bottom of the screen, we try + // to scroll a parent scrollview or move the drop down back up on + // top of the edit box. if (mAllowScrollingAnchorParent) { - int scrollX = anchor.getScrollX(); - int scrollY = anchor.getScrollY(); - Rect r = new Rect(scrollX, scrollY, scrollX + mPopupWidth + xoff, - scrollY + mPopupHeight + anchor.getHeight() + yoff); + final int scrollX = anchor.getScrollX(); + final int scrollY = anchor.getScrollY(); + final Rect r = new Rect(scrollX, scrollY, scrollX + mPopupWidth + xoff, + scrollY + mPopupHeight + anchorHeight + yoff); anchor.requestRectangleOnScreen(r, true); } - // now we re-evaluate the space available, and decide from that + // Now we re-evaluate the space available, and decide from that // whether the pop-up will go above or below the anchor. anchor.getLocationInWindow(mDrawingLocation); p.x = mDrawingLocation[0] + xoff; - p.y = mDrawingLocation[1] + anchor.getHeight() + yoff; + p.y = mDrawingLocation[1] + anchorHeight + yoff; - // Preserve the gravity adjustment + // Preserve the gravity adjustment. if (hgrav == Gravity.RIGHT) { - p.x -= mPopupWidth - anchor.getWidth(); + p.x -= mPopupWidth - anchorWidth; } - - // determine whether there is more space above or below the anchor + + // Determine whether there is more space above or below the anchor. anchor.getLocationOnScreen(mScreenLocation); - - onTop = (displayFrame.bottom - mScreenLocation[1] - anchor.getHeight() - yoff) < + onTop = (displayFrame.bottom - mScreenLocation[1] - anchorHeight - yoff) < (mScreenLocation[1] - yoff - displayFrame.top); if (onTop) { p.gravity = Gravity.LEFT | Gravity.BOTTOM; p.y = root.getHeight() - mDrawingLocation[1] + yoff; } else { - p.y = mDrawingLocation[1] + anchor.getHeight() + yoff; + p.y = mDrawingLocation[1] + anchorHeight + yoff; } } if (mClipToScreen) { final int displayFrameWidth = displayFrame.right - displayFrame.left; - - int right = p.x + p.width; + final int right = p.x + p.width; if (right > displayFrameWidth) { p.x -= right - displayFrameWidth; } + if (p.x < displayFrame.left) { p.x = displayFrame.left; p.width = Math.min(p.width, displayFrameWidth); } if (onTop) { - int popupTop = mScreenLocation[1] + yoff - mPopupHeight; + final int popupTop = mScreenLocation[1] + yoff - mPopupHeight; if (popupTop < 0) { p.y += popupTop; } @@ -1215,7 +1230,11 @@ public class PopupWindow { } p.gravity |= Gravity.DISPLAY_CLIP_VERTICAL; - + + // Compute the position of the anchor relative to the popup. + mAnchorRelativeX = mDrawingLocation[0] - p.x + anchorHeight / 2; + mAnchorRelativeY = mDrawingLocation[1] - p.y + anchorWidth / 2; + return onTop; } @@ -1503,7 +1522,8 @@ public class PopupWindow { } WeakReference<View> oldAnchor = mAnchor; - final boolean needsUpdate = updateLocation && (mAnchorXoff != xoff || mAnchorYoff != yoff); + final boolean needsUpdate = updateLocation + && (mAnchorXoff != xoff || mAnchorYoff != yoff); if (oldAnchor == null || oldAnchor.get() != anchor || (needsUpdate && !mIsDropdown)) { registerForScrollChanged(anchor, xoff, yoff, gravity); } else if (needsUpdate) { diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 8dfef25a7710..0fa75a6f7302 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -628,7 +628,7 @@ public class ScrollView extends FrameLayout { final int y = (int) ev.getY(activePointerIndex); int deltaY = mLastMotionY - y; if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) { - deltaY -= mScrollConsumed[1] + mScrollOffset[1]; + deltaY -= mScrollConsumed[1]; vtev.offsetLocation(0, mScrollOffset[1]); } if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) { @@ -645,7 +645,7 @@ public class ScrollView extends FrameLayout { } if (mIsBeingDragged) { // Scroll to follow the motion event - mLastMotionY = y; + mLastMotionY = y - mScrollOffset[1]; final int oldY = mScrollY; final int range = getScrollRange(); diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index 1bb577b4d998..0454749572e2 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -59,11 +59,10 @@ interface IBatteryStats { void noteVibratorOff(int uid); void noteStartGps(int uid); void noteStopGps(int uid); - void noteScreenOn(); + void noteScreenState(int state); void noteScreenBrightness(int brightness); - void noteScreenOff(); - void noteInputEvent(); void noteUserActivity(int uid, int event); + void noteInteractive(boolean interactive); void noteMobileRadioPowerState(int powerState, long timestampNs); void notePhoneOn(); void notePhoneOff(); diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl index 3219dddc308c..98e35ddf6cda 100644 --- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl +++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl @@ -24,8 +24,9 @@ import android.service.voice.IVoiceInteractionService; import android.service.voice.IVoiceInteractionSession; interface IVoiceInteractionManagerService { - void startVoiceActivity(in Intent intent, String resolvedType, IVoiceInteractionService service, - in Bundle sessionArgs); - int deliverNewSession(IBinder token, IVoiceInteractionSession session, + void startSession(IVoiceInteractionService service, in Bundle sessionArgs); + boolean deliverNewSession(IBinder token, IVoiceInteractionSession session, IVoiceInteractor interactor); + int startVoiceActivity(IBinder token, in Intent intent, String resolvedType); + void finish(IBinder token); } diff --git a/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java b/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java index cba09d1af796..e3f21cf5f21b 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java +++ b/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java @@ -227,25 +227,39 @@ public class InputMethodSubtypeSwitchingController { if (imList.size() <= 1) { return null; } + // Here we have two rotation groups, depending on the returned boolean value of + // {@link InputMethodInfo#supportsSwitchingToNextInputMethod()}. + final boolean expectedValueOfSupportsSwitchingToNextInputMethod = + imi.supportsSwitchingToNextInputMethod(); final int N = imList.size(); final int currentSubtypeId = subtype != null ? InputMethodUtils.getSubtypeIdFromHashCode(imi, subtype.hashCode()) : NOT_A_SUBTYPE_ID; for (int i = 0; i < N; ++i) { final ImeSubtypeListItem isli = imList.get(i); - if (isli.mImi.equals(imi) && isli.mSubtypeId == currentSubtypeId) { - if (!onlyCurrentIme) { - return imList.get((i + 1) % N); + // Skip until the current IME/subtype is found. + if (!isli.mImi.equals(imi) || isli.mSubtypeId != currentSubtypeId) { + continue; + } + // Found the current IME/subtype. Start searching the next IME/subtype from here. + for (int j = 0; j < N - 1; ++j) { + final ImeSubtypeListItem candidate = imList.get((i + j + 1) % N); + // Skip if the candidate doesn't belong to the expected rotation group. + if (expectedValueOfSupportsSwitchingToNextInputMethod != + candidate.mImi.supportsSwitchingToNextInputMethod()) { + continue; } - for (int j = 0; j < N - 1; ++j) { - final ImeSubtypeListItem candidate = imList.get((i + j + 1) % N); - if (candidate.mImi.equals(imi)) { - return candidate; - } + // Skip if searching inside the current IME only, but the candidate is not + // the current IME. + if (onlyCurrentIme && !candidate.mImi.equals(imi)) { + continue; } - return null; + return candidate; } + // No appropriate IME/subtype is found in the list. Give up. + return null; } + // The current IME/subtype is not found in the list. Give up. return null; } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index f63fa8aee7c9..1aff1909c045 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -51,6 +51,7 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.TimeUtils; +import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.net.NetworkStatsFactory; @@ -88,7 +89,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 104 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 105 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -237,13 +238,14 @@ public final class BatteryStatsImpl extends BatteryStats { int mWakeLockNesting; boolean mWakeLockImportant; - boolean mScreenOn; + int mScreenState = Display.STATE_UNKNOWN; StopwatchTimer mScreenOnTimer; int mScreenBrightnessBin = -1; final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; - Counter mInputEventCounter; + boolean mInteractive; + StopwatchTimer mInteractiveTimer; boolean mPhoneOn; StopwatchTimer mPhoneOnTimer; @@ -2661,58 +2663,61 @@ public final class BatteryStatsImpl extends BatteryStats { getUidStatsLocked(uid).noteStopGps(elapsedRealtime); } - public void noteScreenOnLocked() { - if (!mScreenOn) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); - mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG; - if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " - + Integer.toHexString(mHistoryCur.states)); - addHistoryRecordLocked(elapsedRealtime, uptime); - mScreenOn = true; - mScreenOnTimer.startRunningLocked(elapsedRealtime); - if (mScreenBrightnessBin >= 0) { - mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(elapsedRealtime); - } + public void noteScreenStateLocked(int state) { + if (mScreenState != state) { + final int oldState = mScreenState; + mScreenState = state; + if (DEBUG) Slog.v(TAG, "Screen state: oldState=" + Display.stateToString(oldState) + + ", newState=" + Display.stateToString(state)); - updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), false, - SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000); + if (state == Display.STATE_ON) { + // Screen turning on. + final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long uptime = SystemClock.uptimeMillis(); + mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(elapsedRealtime, uptime); + mScreenOnTimer.startRunningLocked(elapsedRealtime); + if (mScreenBrightnessBin >= 0) { + mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(elapsedRealtime); + } - // Fake a wake lock, so we consider the device waked as long - // as the screen is on. - noteStartWakeLocked(-1, -1, "screen", null, WAKE_TYPE_PARTIAL, false, - elapsedRealtime, uptime); + updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), false, + SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000); - // Update discharge amounts. - if (mOnBatteryInternal) { - updateDischargeScreenLevelsLocked(false, true); - } - } - } + // Fake a wake lock, so we consider the device waked as long + // as the screen is on. + noteStartWakeLocked(-1, -1, "screen", null, WAKE_TYPE_PARTIAL, false, + elapsedRealtime, uptime); - public void noteScreenOffLocked() { - if (mScreenOn) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); - mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; - if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " - + Integer.toHexString(mHistoryCur.states)); - addHistoryRecordLocked(elapsedRealtime, uptime); - mScreenOn = false; - mScreenOnTimer.stopRunningLocked(elapsedRealtime); - if (mScreenBrightnessBin >= 0) { - mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(elapsedRealtime); - } + // Update discharge amounts. + if (mOnBatteryInternal) { + updateDischargeScreenLevelsLocked(false, true); + } + } else if (oldState == Display.STATE_ON) { + // Screen turning off or dozing. + final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long uptime = SystemClock.uptimeMillis(); + mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(elapsedRealtime, uptime); + mScreenOnTimer.stopRunningLocked(elapsedRealtime); + if (mScreenBrightnessBin >= 0) { + mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(elapsedRealtime); + } - noteStopWakeLocked(-1, -1, "screen", WAKE_TYPE_PARTIAL, - elapsedRealtime, uptime); + noteStopWakeLocked(-1, -1, "screen", WAKE_TYPE_PARTIAL, + elapsedRealtime, uptime); - updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), true, - SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000); + updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), true, + SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000); - // Update discharge amounts. - if (mOnBatteryInternal) { - updateDischargeScreenLevelsLocked(true, false); + // Update discharge amounts. + if (mOnBatteryInternal) { + updateDischargeScreenLevelsLocked(true, false); + } } } } @@ -2730,7 +2735,7 @@ public final class BatteryStatsImpl extends BatteryStats { if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(elapsedRealtime, uptime); - if (mScreenOn) { + if (mScreenState == Display.STATE_ON) { if (mScreenBrightnessBin >= 0) { mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(elapsedRealtime); } @@ -2740,10 +2745,6 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public void noteInputEventAtomic() { - mInputEventCounter.stepAtomic(); - } - public void noteUserActivityLocked(int uid, int event) { if (mOnBatteryInternal) { uid = mapUid(uid); @@ -2751,6 +2752,19 @@ public final class BatteryStatsImpl extends BatteryStats { } } + public void noteInteractiveLocked(boolean interactive) { + if (mInteractive != interactive) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); + mInteractive = interactive; + if (DEBUG) Slog.v(TAG, "Interactive: " + interactive); + if (interactive) { + mInteractiveTimer.startRunningLocked(elapsedRealtime); + } else { + mInteractiveTimer.stopRunningLocked(elapsedRealtime); + } + } + } + public void noteMobileRadioPowerState(int powerState, long timestampNs) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); @@ -3449,8 +3463,8 @@ public final class BatteryStatsImpl extends BatteryStats { elapsedRealtimeUs, which); } - @Override public int getInputEventCount(int which) { - return mInputEventCounter.getCountLocked(which); + @Override public long getInteractiveTime(long elapsedRealtimeUs, int which) { + return mInteractiveTimer.getTotalTimeLocked(elapsedRealtimeUs, which); } @Override public long getPhoneOnTime(long elapsedRealtimeUs, int which) { @@ -5499,7 +5513,6 @@ public final class BatteryStatsImpl extends BatteryStats { for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mOnBatteryTimeBase); } - mInputEventCounter = new Counter(mOnBatteryTimeBase); mPhoneOnTimer = new StopwatchTimer(null, -2, null, mOnBatteryTimeBase); for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, @@ -5530,6 +5543,7 @@ public final class BatteryStatsImpl extends BatteryStats { } mAudioOnTimer = new StopwatchTimer(null, -6, null, mOnBatteryTimeBase); mVideoOnTimer = new StopwatchTimer(null, -7, null, mOnBatteryTimeBase); + mInteractiveTimer = new StopwatchTimer(null, -8, null, mOnBatteryTimeBase); mOnBattery = mOnBatteryInternal = false; long uptime = SystemClock.uptimeMillis() * 1000; long realtime = SystemClock.elapsedRealtime() * 1000; @@ -5713,7 +5727,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public boolean isScreenOn() { - return mScreenOn; + return mScreenState == Display.STATE_ON; } void initTimes(long uptime, long realtime) { @@ -5753,7 +5767,7 @@ public final class BatteryStatsImpl extends BatteryStats { mOnBatteryTimeBase.reset(uptime, realtime); mOnBatteryScreenOffTimeBase.reset(uptime, realtime); if ((mHistoryCur.states&HistoryItem.STATE_BATTERY_PLUGGED_FLAG) == 0) { - if (mScreenOn) { + if (mScreenState == Display.STATE_ON) { mDischargeScreenOnUnplugLevel = mHistoryCur.batteryLevel; mDischargeScreenOffUnplugLevel = 0; } else { @@ -5773,7 +5787,7 @@ public final class BatteryStatsImpl extends BatteryStats { for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { mScreenBrightnessTimer[i].reset(false); } - mInputEventCounter.reset(false); + mInteractiveTimer.reset(false); mPhoneOnTimer.reset(false); mAudioOnTimer.reset(false); mVideoOnTimer.reset(false); @@ -5874,7 +5888,8 @@ public final class BatteryStatsImpl extends BatteryStats { updateKernelWakelocksLocked(); updateNetworkActivityLocked(NET_UPDATE_ALL, SystemClock.elapsedRealtime()); if (mOnBatteryInternal) { - updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn); + final boolean screenOn = mScreenState == Display.STATE_ON; + updateDischargeScreenLevelsLocked(screenOn, screenOn); } } @@ -5888,6 +5903,7 @@ public final class BatteryStatsImpl extends BatteryStats { final long uptime = mSecUptime * 1000; final long realtime = mSecRealtime * 1000; + final boolean screenOn = mScreenState == Display.STATE_ON; if (onBattery) { // We will reset our status if we are unplugging after the // battery was last full, or the level is at 100, or @@ -5916,7 +5932,7 @@ public final class BatteryStatsImpl extends BatteryStats { } addHistoryRecordLocked(mSecRealtime, mSecUptime); mDischargeCurrentLevel = mDischargeUnplugLevel = level; - if (mScreenOn) { + if (screenOn) { mDischargeScreenOnUnplugLevel = level; mDischargeScreenOffUnplugLevel = 0; } else { @@ -5925,7 +5941,7 @@ public final class BatteryStatsImpl extends BatteryStats { } mDischargeAmountScreenOn = 0; mDischargeAmountScreenOff = 0; - updateTimeBasesLocked(true, !mScreenOn, uptime, realtime); + updateTimeBasesLocked(true, !screenOn, uptime, realtime); } else { pullPendingStateUpdatesLocked(); mHistoryCur.batteryLevel = (byte)level; @@ -5938,8 +5954,8 @@ public final class BatteryStatsImpl extends BatteryStats { mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1; mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; } - updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn); - updateTimeBasesLocked(false, !mScreenOn, uptime, realtime); + updateDischargeScreenLevelsLocked(screenOn, screenOn); + updateTimeBasesLocked(false, !screenOn, uptime, realtime); mNumChargeStepDurations = 0; mLastChargeStepLevel = level; mLastChargeStepTime = -1; @@ -6475,7 +6491,7 @@ public final class BatteryStatsImpl extends BatteryStats { public int getDischargeAmountScreenOn() { synchronized(this) { int val = mDischargeAmountScreenOn; - if (mOnBattery && mScreenOn + if (mOnBattery && mScreenState == Display.STATE_ON && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) { val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel; } @@ -6486,7 +6502,7 @@ public final class BatteryStatsImpl extends BatteryStats { public int getDischargeAmountScreenOnSinceCharge() { synchronized(this) { int val = mDischargeAmountScreenOnSinceCharge; - if (mOnBattery && mScreenOn + if (mOnBattery && mScreenState == Display.STATE_ON && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) { val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel; } @@ -6497,7 +6513,7 @@ public final class BatteryStatsImpl extends BatteryStats { public int getDischargeAmountScreenOff() { synchronized(this) { int val = mDischargeAmountScreenOff; - if (mOnBattery && !mScreenOn + if (mOnBattery && mScreenState != Display.STATE_ON && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) { val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel; } @@ -6508,7 +6524,7 @@ public final class BatteryStatsImpl extends BatteryStats { public int getDischargeAmountScreenOffSinceCharge() { synchronized(this) { int val = mDischargeAmountScreenOffSinceCharge; - if (mOnBattery && !mScreenOn + if (mOnBattery && mScreenState != Display.STATE_ON && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) { val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel; } @@ -6915,12 +6931,13 @@ public final class BatteryStatsImpl extends BatteryStats { mStartCount++; - mScreenOn = false; + mScreenState = Display.STATE_UNKNOWN; mScreenOnTimer.readSummaryFromParcelLocked(in); for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); } - mInputEventCounter.readSummaryFromParcelLocked(in); + mInteractive = false; + mInteractiveTimer.readSummaryFromParcelLocked(in); mPhoneOn = false; mPhoneOnTimer.readSummaryFromParcelLocked(in); for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { @@ -7175,7 +7192,7 @@ public final class BatteryStatsImpl extends BatteryStats { for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS); } - mInputEventCounter.writeSummaryFromParcelLocked(out); + mInteractiveTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS); mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS); for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS); @@ -7431,13 +7448,12 @@ public final class BatteryStatsImpl extends BatteryStats { mOnBatteryTimeBase.readFromParcel(in); mOnBatteryScreenOffTimeBase.readFromParcel(in); - mScreenOn = false; + mScreenState = Display.STATE_UNKNOWN; mScreenOnTimer = new StopwatchTimer(null, -1, null, mOnBatteryTimeBase, in); for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mOnBatteryTimeBase, in); } - mInputEventCounter = new Counter(mOnBatteryTimeBase, in); mPhoneOn = false; mPhoneOnTimer = new StopwatchTimer(null, -2, null, mOnBatteryTimeBase, in); for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { @@ -7461,19 +7477,25 @@ public final class BatteryStatsImpl extends BatteryStats { mMobileRadioActiveUnknownTime = new LongSamplingCounter(mOnBatteryTimeBase, in); mMobileRadioActiveUnknownCount = new LongSamplingCounter(mOnBatteryTimeBase, in); mWifiOn = false; - mWifiOnTimer = new StopwatchTimer(null, -2, null, mOnBatteryTimeBase, in); + mWifiOnTimer = new StopwatchTimer(null, -3, null, mOnBatteryTimeBase, in); mGlobalWifiRunning = false; - mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mOnBatteryTimeBase, in); + mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mOnBatteryTimeBase, in); for (int i=0; i<NUM_WIFI_STATES; i++) { mWifiStateTimer[i] = new StopwatchTimer(null, -600-i, null, mOnBatteryTimeBase, in); } mBluetoothOn = false; - mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mOnBatteryTimeBase, in); + mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mOnBatteryTimeBase, in); for (int i=0; i< NUM_BLUETOOTH_STATES; i++) { mBluetoothStateTimer[i] = new StopwatchTimer(null, -500-i, null, mOnBatteryTimeBase, in); } + mAudioOn = false; + mAudioOnTimer = new StopwatchTimer(null, -6, null, mOnBatteryTimeBase); + mVideoOn = false; + mVideoOnTimer = new StopwatchTimer(null, -7, null, mOnBatteryTimeBase); + mInteractive = false; + mInteractiveTimer = new StopwatchTimer(null, -8, null, mOnBatteryTimeBase, in); mDischargeUnplugLevel = in.readInt(); mDischargePlugLevel = in.readInt(); mDischargeCurrentLevel = in.readInt(); @@ -7571,7 +7593,7 @@ public final class BatteryStatsImpl extends BatteryStats { for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { mScreenBrightnessTimer[i].writeToParcel(out, uSecRealtime); } - mInputEventCounter.writeToParcel(out); + mInteractiveTimer.writeToParcel(out, uSecRealtime); mPhoneOnTimer.writeToParcel(out, uSecRealtime); for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { mPhoneSignalStrengthsTimer[i].writeToParcel(out, uSecRealtime); @@ -7688,8 +7710,8 @@ public final class BatteryStatsImpl extends BatteryStats { pr.println("*** Screen brightness #" + i + ":"); mScreenBrightnessTimer[i].logState(pr, " "); } - pr.println("*** Input event counter:"); - mInputEventCounter.logState(pr, " "); + pr.println("*** Interactive timer:"); + mInteractiveTimer.logState(pr, " "); pr.println("*** Phone timer:"); mPhoneOnTimer.logState(pr, " "); for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index 6428e150a52b..caa6b987e83a 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -42,7 +42,7 @@ interface IStatusBarService out int[] switches, out List<IBinder> binders); void onPanelRevealed(); void onPanelHidden(); - void onNotificationClick(String pkg, String tag, int id, int userId); + void onNotificationClick(String key); void onNotificationError(String pkg, String tag, int id, int uid, int initialPid, String message, int userId); void onClearAllNotifications(int userId); diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java index d664058c351b..5a12893812f0 100644 --- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java +++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java @@ -53,6 +53,7 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On private final MenuAdapter mAdapter; private final boolean mOverflowOnly; private final int mPopupMaxWidth; + private final int mPopupStyleAttr; private View mAnchorView; private ListPopupWindow mPopup; @@ -72,20 +73,21 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On private int mDropDownGravity = Gravity.NO_GRAVITY; public MenuPopupHelper(Context context, MenuBuilder menu) { - this(context, menu, null, false); + this(context, menu, null, false, com.android.internal.R.attr.popupMenuStyle); } public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView) { - this(context, menu, anchorView, false); + this(context, menu, anchorView, false, com.android.internal.R.attr.popupMenuStyle); } - public MenuPopupHelper(Context context, MenuBuilder menu, - View anchorView, boolean overflowOnly) { + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView, + boolean overflowOnly, int popupStyleAttr) { mContext = context; mInflater = LayoutInflater.from(context); mMenu = menu; mAdapter = new MenuAdapter(mMenu); mOverflowOnly = overflowOnly; + mPopupStyleAttr = popupStyleAttr; final Resources res = context.getResources(); mPopupMaxWidth = Math.max(res.getDisplayMetrics().widthPixels / 2, @@ -119,7 +121,7 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On } public boolean tryShow() { - mPopup = new ListPopupWindow(mContext, null, com.android.internal.R.attr.popupMenuStyle); + mPopup = new ListPopupWindow(mContext, null, mPopupStyleAttr); mPopup.setOnDismissListener(this); mPopup.setOnItemClickListener(this); mPopup.setAdapter(mAdapter); @@ -272,7 +274,7 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On @Override public boolean onSubMenuSelected(SubMenuBuilder subMenu) { if (subMenu.hasVisibleItems()) { - MenuPopupHelper subPopup = new MenuPopupHelper(mContext, subMenu, mAnchorView, false); + MenuPopupHelper subPopup = new MenuPopupHelper(mContext, subMenu, mAnchorView); subPopup.setCallback(mPresenterCallback); boolean preserveIconSpacing = false; diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index 957f95cc266f..05a99a36a560 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -18,8 +18,12 @@ // #define LOG_NDEBUG 0 // #define LOG_NNDEBUG 0 #define LOG_TAG "CameraMetadata-JNI" +#include <utils/Errors.h> #include <utils/Log.h> #include <utils/RefBase.h> +#include <utils/Vector.h> +#include <utils/SortedVector.h> +#include <utils/KeyedVector.h> #include <string.h> #include "jni.h" @@ -483,12 +487,20 @@ static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyN ALOGV("%s (key = '%s')", __FUNCTION__, key); + sp<VendorTagDescriptor> vTags = VendorTagDescriptor::getGlobalVendorTagDescriptor(); + + SortedVector<String8> vendorSections = vTags->getAllSectionNames(); + size_t vendorSectionCount = vendorSections.size(); + // First, find the section by the longest string match const char *section = NULL; size_t sectionIndex = 0; size_t sectionLength = 0; - for (size_t i = 0; i < ANDROID_SECTION_COUNT; ++i) { - const char *str = camera_metadata_section_names[i]; + size_t totalSectionCount = ANDROID_SECTION_COUNT + vendorSectionCount; + for (size_t i = 0; i < totalSectionCount; ++i) { + + const char *str = (i < ANDROID_SECTION_COUNT) ? camera_metadata_section_names[i] : + vendorSections[i - ANDROID_SECTION_COUNT].string(); ALOGVV("%s: Trying to match against section '%s'", __FUNCTION__, str); if (strstr(key, str) == key) { // key begins with the section name @@ -502,12 +514,11 @@ static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyN sectionIndex = i; sectionLength = strLength; - ALOGVV("%s: Found new best section (idx %d)", __FUNCTION__, sectionIndex); + ALOGVV("%s: Found new best section (%s)", __FUNCTION__, section); } } } - // TODO: vendor ext // TODO: Make above get_camera_metadata_section_from_name ? if (section == NULL) { @@ -524,33 +535,47 @@ static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyN if (sectionLength + 1 >= keyLength) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Key length too short for key '%s')", key); + return 0; } // Match rest of name against the tag names in that section only - uint32_t tagBegin, tagEnd; // [tagBegin, tagEnd) - tagBegin = camera_metadata_section_bounds[sectionIndex][0]; - tagEnd = camera_metadata_section_bounds[sectionIndex][1]; - - uint32_t tag; - for (tag = tagBegin; tag < tagEnd; ++tag) { - const char *tagName = get_camera_metadata_tag_name(tag); - - if (strcmp(keyTagName, tagName) == 0) { - ALOGV("%s: Found matched tag '%s' (%d)", - __FUNCTION__, tagName, tag); - break; + uint32_t tag = 0; + if (sectionIndex < ANDROID_SECTION_COUNT) { + // Match built-in tags (typically android.*) + uint32_t tagBegin, tagEnd; // [tagBegin, tagEnd) + tagBegin = camera_metadata_section_bounds[sectionIndex][0]; + tagEnd = camera_metadata_section_bounds[sectionIndex][1]; + + for (tag = tagBegin; tag < tagEnd; ++tag) { + const char *tagName = get_camera_metadata_tag_name(tag); + + if (strcmp(keyTagName, tagName) == 0) { + ALOGV("%s: Found matched tag '%s' (%d)", + __FUNCTION__, tagName, tag); + break; + } + } + + if (tag == tagEnd) { + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", + "Could not find tag name for key '%s')", key); + return 0; + } + } else { + // Match vendor tags (typically com.*) + const String8 sectionName(section); + const String8 tagName(keyTagName); + + status_t res = OK; + if ((res = vTags->lookupTag(tagName, sectionName, &tag)) != OK) { + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", + "%s: No vendor tag matches key '%s'", __FUNCTION__, key); + return 0; } } - // TODO: vendor ext // TODO: Make above get_camera_metadata_tag_from_name ? - if (tag == tagEnd) { - jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", - "Could not find tag name for key '%s')", key); - return 0; - } - return tag; } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index c293c7af56d4..5a935a96eaff 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -50,6 +50,8 @@ static const char* const OutOfResourcesException = "android/view/Surface$OutOfResourcesException"; static struct { + jclass clazz; + jmethodID ctor; jfieldID width; jfieldID height; jfieldID refreshRate; @@ -346,24 +348,49 @@ static void nativeSetDisplayProjection(JNIEnv* env, jclass clazz, SurfaceComposerClient::setDisplayProjection(token, orientation, layerStackRect, displayRect); } -static jboolean nativeGetDisplayInfo(JNIEnv* env, jclass clazz, - jobject tokenObj, jobject infoObj) { +static jobjectArray nativeGetDisplayConfigs(JNIEnv* env, jclass clazz, + jobject tokenObj) { sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); - if (token == NULL) return JNI_FALSE; + if (token == NULL) return NULL; - DisplayInfo info; - if (SurfaceComposerClient::getDisplayInfo(token, &info)) { - return JNI_FALSE; + Vector<DisplayInfo> configs; + if (SurfaceComposerClient::getDisplayConfigs(token, &configs) != NO_ERROR || + configs.size() == 0) { + return NULL; } - env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.width, info.w); - env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.height, info.h); - env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.refreshRate, info.fps); - env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.density, info.density); - env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.xDpi, info.xdpi); - env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.yDpi, info.ydpi); - env->SetBooleanField(infoObj, gPhysicalDisplayInfoClassInfo.secure, info.secure); - return JNI_TRUE; + jobjectArray configArray = env->NewObjectArray(configs.size(), + gPhysicalDisplayInfoClassInfo.clazz, NULL); + + for (size_t c = 0; c < configs.size(); ++c) { + const DisplayInfo& info = configs[c]; + jobject infoObj = env->NewObject(gPhysicalDisplayInfoClassInfo.clazz, + gPhysicalDisplayInfoClassInfo.ctor); + env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.width, info.w); + env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.height, info.h); + env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.refreshRate, info.fps); + env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.density, info.density); + env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.xDpi, info.xdpi); + env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.yDpi, info.ydpi); + env->SetBooleanField(infoObj, gPhysicalDisplayInfoClassInfo.secure, info.secure); + env->SetObjectArrayElement(configArray, static_cast<jsize>(c), infoObj); + env->DeleteLocalRef(infoObj); + } + + return configArray; +} + +static jint nativeGetActiveConfig(JNIEnv* env, jclass clazz, jobject tokenObj) { + sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); + if (token == NULL) return -1; + return static_cast<jint>(SurfaceComposerClient::getActiveConfig(token)); +} + +static jboolean nativeSetActiveConfig(JNIEnv* env, jclass clazz, jobject tokenObj, jint id) { + sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); + if (token == NULL) return JNI_FALSE; + status_t err = SurfaceComposerClient::setActiveConfig(token, static_cast<int>(id)); + return err == NO_ERROR ? JNI_TRUE : JNI_FALSE; } static void nativeBlankDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) { @@ -576,8 +603,12 @@ static JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSetDisplayLayerStack }, {"nativeSetDisplayProjection", "(Landroid/os/IBinder;IIIIIIIII)V", (void*)nativeSetDisplayProjection }, - {"nativeGetDisplayInfo", "(Landroid/os/IBinder;Landroid/view/SurfaceControl$PhysicalDisplayInfo;)Z", - (void*)nativeGetDisplayInfo }, + {"nativeGetDisplayConfigs", "(Landroid/os/IBinder;)[Landroid/view/SurfaceControl$PhysicalDisplayInfo;", + (void*)nativeGetDisplayConfigs }, + {"nativeGetActiveConfig", "(Landroid/os/IBinder;)I", + (void*)nativeGetActiveConfig }, + {"nativeSetActiveConfig", "(Landroid/os/IBinder;I)Z", + (void*)nativeSetActiveConfig }, {"nativeBlankDisplay", "(Landroid/os/IBinder;)V", (void*)nativeBlankDisplay }, {"nativeUnblankDisplay", "(Landroid/os/IBinder;)V", @@ -598,6 +629,9 @@ int register_android_view_SurfaceControl(JNIEnv* env) sSurfaceControlMethods, NELEM(sSurfaceControlMethods)); jclass clazz = env->FindClass("android/view/SurfaceControl$PhysicalDisplayInfo"); + gPhysicalDisplayInfoClassInfo.clazz = static_cast<jclass>(env->NewGlobalRef(clazz)); + gPhysicalDisplayInfoClassInfo.ctor = env->GetMethodID(gPhysicalDisplayInfoClassInfo.clazz, + "<init>", "()V"); gPhysicalDisplayInfoClassInfo.width = env->GetFieldID(clazz, "width", "I"); gPhysicalDisplayInfoClassInfo.height = env->GetFieldID(clazz, "height", "I"); gPhysicalDisplayInfoClassInfo.refreshRate = env->GetFieldID(clazz, "refreshRate", "F"); diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 564c9a62ba99..6ff28e305a0e 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -152,6 +152,18 @@ static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz delete proxy; } +static void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz, + jlong proxyPtr, jlong frameIntervalNanos) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + proxy->setFrameInterval(frameIntervalNanos); +} + +static jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, + jlong proxyPtr) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + return proxy->loadSystemProperties(); +} + static jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); @@ -185,11 +197,11 @@ static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, proxy->setup(width, height); } -static void android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, - jlong proxyPtr, jint dirtyLeft, jint dirtyTop, +static int android_view_ThreadedRenderer_syncAndDrawFrame(JNIEnv* env, jobject clazz, + jlong proxyPtr, jlong frameTimeNanos, jint dirtyLeft, jint dirtyTop, jint dirtyRight, jint dirtyBottom) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); - proxy->syncAndDrawFrame(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); + return proxy->syncAndDrawFrame(frameTimeNanos, dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); } static void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz, @@ -261,11 +273,13 @@ static JNINativeMethod gMethods[] = { { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, + { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval }, + { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup }, - { "nSyncAndDrawFrame", "(JIIII)V", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, + { "nSyncAndDrawFrame", "(JJIIII)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface }, { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext }, diff --git a/core/res/res/anim/popup_enter_quantum.xml b/core/res/res/anim/popup_enter_quantum.xml new file mode 100644 index 000000000000..79de26ba144f --- /dev/null +++ b/core/res/res/anim/popup_enter_quantum.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false" > + <alpha android:fromAlpha="0.0" android:toAlpha="1.0" + android:interpolator="@interpolator/decelerate_cubic" + android:duration="@android:integer/config_activityShortDur" /> +</set> diff --git a/core/res/res/anim/popup_exit_quantum.xml b/core/res/res/anim/popup_exit_quantum.xml new file mode 100644 index 000000000000..7d7d5c5468f9 --- /dev/null +++ b/core/res/res/anim/popup_exit_quantum.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false" > + <alpha android:fromAlpha="1.0" android:toAlpha="0.0" + android:interpolator="@interpolator/decelerate_cubic" + android:duration="@android:integer/config_activityShortDur"/> +</set> diff --git a/core/res/res/drawable/popup_background_quantum.xml b/core/res/res/drawable/popup_background_quantum.xml new file mode 100644 index 000000000000..7e5b00305c1b --- /dev/null +++ b/core/res/res/drawable/popup_background_quantum.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + + <corners + android:radius="2dp" /> + <solid + android:color="?attr/colorBackground" /> + +</shape> diff --git a/core/res/res/layout/voice_interaction_session.xml b/core/res/res/layout/voice_interaction_session.xml new file mode 100644 index 000000000000..48b6579a7c65 --- /dev/null +++ b/core/res/res/layout/voice_interaction_session.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/res/layout/alert_dialog.xml +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@android:id/content" + android:layout_width="match_parent" + android:layout_height="wrap_content"> +</FrameLayout> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 20d306db4c4c..4358dd3f9121 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="UNIT">%2$s</xliff:g><xliff:g id="NUMBER">%1$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dae"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> uur"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> minute"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> minuut"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minute"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> minuut <xliff:g id="SECONDS">%2$d</xliff:g> sekondes"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> minuut <xliff:g id="SECONDS">%2$d</xliff:g> sekond"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekondes"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sekonde"</string> <string name="untitled" msgid="4638956954852782576">"<Titelloos>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Veiligmodus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-stelsel"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Persoonlik"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Werk"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Dienste wat jou geld kos"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Doen dinge wat jou geld kan kos."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Jou boodskappe"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 04bfee5254c2..7fac03f9245f 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ቀኖች"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ <xliff:g id="MINUTES">%2$d</xliff:g> ደቂቃ"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ <xliff:g id="MINUTES">%2$d</xliff:g> ደቂቃ"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃዎች"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃ <xliff:g id="SECONDS">%2$d</xliff:g> ሴ"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃ <xliff:g id="SECONDS">%2$d</xliff:g> ሴ"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ሴ"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ሴ"</string> <string name="untitled" msgid="4638956954852782576">"<ርዕስ አልባ>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"የሚያስተማምን ሁነታ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android ስርዓት"</string> + <string name="user_owner_label" msgid="2804351898001038951">"የግል"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"ስራ"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"ገንዘብ የሚያስወጥዎ አገልግሎቶች"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ገንዘብ የሚያስወጡህን ነገሮች አድርግ።"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"መልዕክቶችዎ"</string> @@ -1077,7 +1068,7 @@ </plurals> <plurals name="in_num_days"> <item quantity="one" msgid="5413088743009839518">"ነገ"</item> - <item quantity="other" msgid="5109449375100953247">"በ<xliff:g id="COUNT">%d</xliff:g> ቀናት"</item> + <item quantity="other" msgid="5109449375100953247">"በ<xliff:g id="COUNT">%d</xliff:g> ቀኖች"</item> </plurals> <plurals name="abbrev_num_seconds_ago"> <item quantity="one" msgid="1849036840200069118">"1 ሴኮንድ በፊት"</item> @@ -1109,7 +1100,7 @@ </plurals> <plurals name="abbrev_in_num_days"> <item quantity="one" msgid="2178576254385739855">"ነገ"</item> - <item quantity="other" msgid="2973062968038355991">"በ<xliff:g id="COUNT">%d</xliff:g> ቀናት"</item> + <item quantity="other" msgid="2973062968038355991">"በ<xliff:g id="COUNT">%d</xliff:g> ቀኖች"</item> </plurals> <string name="preposition_for_date" msgid="9093949757757445117">"በ <xliff:g id="DATE">%s</xliff:g>"</string> <string name="preposition_for_time" msgid="5506831244263083793">"በ <xliff:g id="TIME">%s</xliff:g>"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 83168e49920d..a32c74c0213d 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"تيرابايت"</string> <string name="petabyteShort" msgid="5637816680144990219">"بيتابايت"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> يوم"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة <xliff:g id="MINUTES">%2$d</xliff:g> دقيقة"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة <xliff:g id="MINUTES">%2$d</xliff:g> دقيقة"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة <xliff:g id="SECONDS">%2$d</xliff:g> ثانية"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة <xliff:g id="SECONDS">%2$d</xliff:g> ثانية"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانية"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانية"</string> <string name="untitled" msgid="4638956954852782576">"<بلا عنوان>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string> <string name="android_system_label" msgid="6577375335728551336">"نظام Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"شخصي"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"عمل"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"الخدمات التي تكلفك المال"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"يمكنك تنفيذ إجراءات يمكن أن تكلفك مالاً."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"رسائلك"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 2d22cdc1254d..3ebe79853191 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дни"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ч"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> <string name="untitled" msgid="4638956954852782576">"<Без заглавие>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Безопасен режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Системно от Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Личен"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Служебен"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Услуги, които ви струват пари"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Извършват неща, които могат да ви струват пари."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Вашите съобщения"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index cfb77d3d629c..a767e7f4ca24 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dies"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hores"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuts"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sense títol>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"+999"</string> <string name="safeMode" msgid="2788228061547930246">"Mode segur"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Feina"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Serveis de pagament"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Dur a terme activitats de pagament."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Missatges"</string> @@ -409,8 +400,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Permet que el titular vinculi a la interfície de nivell superior d\'un servei de VPN. No s\'hauria de necessitar mai per a les aplicacions normals."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"enllaça amb un fons de pantalla"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Permet que el titular vinculi a la interfície de nivell superior d\'un fons de pantalla. No s\'hauria de necessitar mai per a les aplicacions normals."</string> - <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"vinculació amb una eina d\'interacció de veu"</string> - <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Permet que el titular es vinculi amb la interfície de nivell superior d\'un servei d\'interacció de veu. No ha de ser mai necessari per a aplicacions normals."</string> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"enllaçar amb una eina d\'interacció de veu"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Permet enllaçar amb la interfície de nivell superior d\'un servei d\'interacció de veu. No ha de ser mai necessari per a aplicacions normals."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"vincula a una pantalla remota"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permet que el titular es vinculi a la interfície de nivell superior d\'una pantalla remota. No s\'hauria de necessitar mai per a les aplicacions normals."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"vincula a un servei de widget"</string> @@ -723,8 +714,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permet que l\'aplicació recuperi, examini i esborri les notificacions, incloses les que han publicat altres aplicacions."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"vincula a un servei oient de notificacions"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permet que el titular vinculi la interfície de nivell superior d\'un servei oient de notificacions. No s\'hauria de necessitar mai per a les aplicacions normals."</string> - <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"vinculació amb el servei d\'un proveïdor de condicions"</string> - <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permet que el titular es vinculi amb la interfície de nivell superior del servei d\'un proveïdor de condicions. No ha de ser mai necessari per a aplicacions normals."</string> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"enllaçar amb el servei de proveïdor de condicions"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permet enllaçar amb la interfície de nivell superior d\'un servei de proveïdor de condicions. No ha de ser mai necessari per a aplicacions normals."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invoca l\'aplicació de configuració proporcionada per l\'operador"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permet que el titular invoqui l\'aplicació de configuració proporcionada per l\'operador. No s\'hauria de necessitar mai per a les aplicacions normals."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"conèixer les observacions sobre les condicions de la xarxa"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 868f899fb8fa..1c4e8b8b3651 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez názvu>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Nouzový režim"</string> <string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osobní"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Práce"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Zpoplatněné služby"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Provádět činnosti, které vás mohou stát peníze."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Vaše zprávy"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 206db12b2ece..1724de1f37f2 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"Tb"</string> <string name="petabyteShort" msgid="5637816680144990219">"Pb"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dage"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> timer"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> <string name="untitled" msgid="4638956954852782576">"<Uden titel>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personlig"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Arbejde"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Tjenester, der koster dig penge"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Gør ting, der kan koste dig penge."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Dine beskeder"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 87d4aa017e23..e527521cd011 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> Tage"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> Std."</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> Std. <xliff:g id="MINUTES">%2$d</xliff:g> Min."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> Std. <xliff:g id="MINUTES">%2$d</xliff:g> Min."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> Min."</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> Min. <xliff:g id="SECONDS">%2$d</xliff:g> Sek."</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> Min. <xliff:g id="SECONDS">%2$d</xliff:g> Sek."</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> Sek."</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> Sek."</string> <string name="untitled" msgid="4638956954852782576">"<Unbenannt>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Abgesicherter Modus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-System"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Privat"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Geschäftlich"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Kostenpflichtige Dienste"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Kostenpflichtige Aktionen"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Ihre Nachrichten"</string> @@ -723,8 +714,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Ermöglicht der App das Abrufen, Überprüfen und Löschen von Benachrichtigungen, einschließlich Benachrichtigungen, die von anderen Apps gepostet wurden"</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"An Benachrichtigungs-Listener-Dienst binden"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Ermöglicht dem Inhaber, sich an die Oberfläche der obersten Ebene eines Benachrichtigungs-Listener-Dienstes zu binden. Sollte nie für normale Apps benötigt werden."</string> - <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"An einen Bedingungsanbieterdienst binden"</string> - <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Ermöglicht dem Inhaber, sich an die Oberfläche eines Bedingungsanbieterdienstes auf oberster Ebene zu binden. Für normale Apps sollte dies nie erforderlich sein."</string> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"An einen Bedingungsproviderdienst binden"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Ermöglicht dem Inhaber, sich an die Oberfläche eines Bedingungsproviderdienstes auf oberster Ebene zu binden. Für normale Apps sollte dies nie erforderlich sein."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"Vom Mobilfunkanbieter bereitgestellte Konfigurations-App aufrufen"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Ermöglicht dem Inhaber, die vom Mobilfunkanbieter bereitgestellte Konfigurations-App aufzurufen. Sollte für normale Apps nie benötigt werden."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"Informationen zu den Netzwerkbedingungen erfassen"</string> @@ -740,11 +731,11 @@ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Anzahl der falsch eingegebenen Passwörter beim Entsperren des Bildschirms überwachen und Telefon sperren oder alle Daten auf dem Telefon löschen, wenn zu häufig ein falsches Passwort eingegeben wird."</string> <string name="policylab_resetPassword" msgid="2620077191242688955">"Passwort zum Entsperren des Bildschirms ändern"</string> <string name="policydesc_resetPassword" msgid="605963962301904458">"Ändern Sie das Passwort zum Entsperren des Bildschirms."</string> - <string name="policylab_forceLock" msgid="2274085384704248431">"Display sperren"</string> + <string name="policylab_forceLock" msgid="2274085384704248431">"Bildschirm sperren"</string> <string name="policydesc_forceLock" msgid="1141797588403827138">"Legen Sie fest, wie und wann der Bildschirm gesperrt wird."</string> <string name="policylab_wipeData" msgid="3910545446758639713">"Alle Daten löschen"</string> <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Auf Werkseinstellungen zurücksetzen und Daten auf dem Tablet ohne Warnung löschen"</string> - <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Setzen Sie das Telefon auf Werkseinstellungen zurück. Dabei werden alle Daten ohne Warnung gelöscht."</string> + <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Setzen Sie das Telefon auf die Werkseinstellungen zurück. Dabei werden alle Daten ohne Warnung gelöscht."</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Den globalen Proxy des Geräts festlegen"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Den bei aktivierter Richtlinie zu verwendenden globalen Proxy des Geräts festlegen. Nur der erste Geräteadministrator kann den gültigen globalen Proxy festlegen."</string> <string name="policylab_expirePassword" msgid="885279151847254056">"Ablauf von Sperr-Passwort festlegen"</string> @@ -1395,7 +1386,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Hintergrund"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Hintergrund ändern"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Benachrichtigungs-Listener"</string> - <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Bedingungsanbieter"</string> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Bedingungsprovider"</string> <string name="vpn_title" msgid="19615213552042827">"VPN aktiviert"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN wurde von <xliff:g id="APP">%s</xliff:g> aktiviert."</string> <string name="vpn_text" msgid="3011306607126450322">"Zum Verwalten des Netzwerks berühren"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 9105cb26fe92..296fd7109be9 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ημέρες"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρες"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρα"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ώρες"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ώρα <xliff:g id="MINUTES">%2$d</xliff:g> λ"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ώρα <xliff:g id="MINUTES">%2$d</xliff:g> λ"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> λεπτά"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> λ. <xliff:g id="SECONDS">%2$d</xliff:g> δευτ."</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> λ <xliff:g id="SECONDS">%2$d</xliff:g> δευτ."</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> δευτ."</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> δευτ."</string> <string name="untitled" msgid="4638956954852782576">"<Χωρίς τίτλο>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string> <string name="android_system_label" msgid="6577375335728551336">"Σύστημα Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Προσωπικό"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Εργασία"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Υπηρεσίες επί πληρωμή"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Πραγματοποίηση ενεργειών για τις οποίες ενδέχεται να χρεωθείτε."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Τα μηνύματά σας"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 51a85e30d00a..c4b7aa0d3a7d 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> <string name="untitled" msgid="4638956954852782576">"<Untitled>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Work"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services that cost you money"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Do things that can cost you money."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Your messages"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 51a85e30d00a..c4b7aa0d3a7d 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> <string name="untitled" msgid="4638956954852782576">"<Untitled>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Work"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services that cost you money"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Do things that can cost you money."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Your messages"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 2a4f7e9a15d8..1225c81efcf1 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sin título>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Trabajo"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servicios que te cuestan dinero"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Permite que las aplicaciones realicen actividades con cargo."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Tus mensajes"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 2e0d68b32b9e..1c6aa8d49c5a 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sin título>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"..."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"> 999"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Trabajo"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servicios por los que tienes que pagar"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Hacer acciones por las que puede que tengas que pagar"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Tus mensajes"</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 32abeb82c22a..1c3d94a4a720 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päeva"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Pealkirjata>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Turvarežiim"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-süsteem"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Isiklik"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Töö"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Tasulised teenused"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Tasuliste toimingute tegemine."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Teie sõnumid"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index c5abcbd43ef1..dbc0d43179ad 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"ترابایت"</string> <string name="petabyteShort" msgid="5637816680144990219">"پتابایت"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> روز"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت و <xliff:g id="MINUTES">%2$d</xliff:g> دقیقه"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت و <xliff:g id="MINUTES">%2$d</xliff:g> دقیقه"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه و <xliff:g id="SECONDS">%2$d</xliff:g> ثانیه"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه و <xliff:g id="SECONDS">%2$d</xliff:g> ثانیه"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانیه"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانیه"</string> <string name="untitled" msgid="4638956954852782576">"<بدون عنوان>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"بیشتر از 999"</string> <string name="safeMode" msgid="2788228061547930246">"حالت ایمن"</string> <string name="android_system_label" msgid="6577375335728551336">"سیستم Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"شخصی"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"محل کار"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"سرویسهای غیر رایگان"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"انجام کارهایی که برای شما هزینه دارد."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"پیامهای شما"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 945c7ab075a0..03dfb1262a7e 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"Tt"</string> <string name="petabyteShort" msgid="5637816680144990219">"Pt"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päivää"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> t"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Nimetön>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string> @@ -199,6 +188,10 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Suojattu tila"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-järjestelmä"</string> + <!-- no translation found for user_owner_label (2804351898001038951) --> + <skip /> + <!-- no translation found for managed_profile_label (6260850669674791528) --> + <skip /> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Maksulliset palvelut"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Suorita mahdollisesti maksullisia toimintoja."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Omat viestit"</string> @@ -409,10 +402,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Antaa sovelluksen sitoutua VPN-palvelun ylemmän tason käyttöliittymään. Ei tavallisten sovellusten käyttöön."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"sido taustakuvaan"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Antaa sovelluksen sitoutua taustakuvan ylätason käyttöliittymään. Ei tavallisten sovellusten käyttöön."</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"puheohjauspalveluun sitominen"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Antaa sovelluksen luoda sidoksen puheohjauspalvelun ylätason rajapintaan. Ei tavallisten sovelluksien käyttöön."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"etänäyttöön sitoutuminen"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Antaa sovelluksen sitoutua etänäytön ylemmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"sitoudu widget-palveluun"</string> @@ -725,10 +716,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Antaa sovelluksen noutaa, tutkia ja tyhjentää ilmoituksia (myös muiden sovelluksien lähettämiä)."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"sido ilmoituskuuntelijapalveluun"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Antaa sovelluksen sitoutua ilmoituskuuntelijan ylimmän tason käyttöliittymään. Ei tavallisten sovelluksien käyttöön."</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"ehtojen toimituspalveluun sitominen"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Antaa sovelluksen luoda sidoksen ehtojen toimituspalvelun ylätason rajapintaan. Ei tavallisten sovelluksien käyttöön."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"Palveluntarjoajan määrityssovelluksen käynnistäminen"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Antaa luvanhaltijan käynnistää palveluntarjoajan määrityssovelluksen. Ei tavallisten sovelluksien käyttöön."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"verkon tilahavaintojen kuunteleminen"</string> @@ -1399,8 +1388,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Taustakuva"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Vaihda taustakuvaa"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Ilmoituskuuntelija"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Ehtojen toimituspalvelu"</string> <string name="vpn_title" msgid="19615213552042827">"VPN on aktivoitu"</string> <string name="vpn_title_long" msgid="6400714798049252294">"<xliff:g id="APP">%s</xliff:g> on aktivoinut VPN-yhteyden"</string> <string name="vpn_text" msgid="3011306607126450322">"Voit hallinnoida verkkoa koskettamalla."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index c917749f0255..276be7916806 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"To"</string> <string name="petabyteShort" msgid="5637816680144990219">"Po"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sans_titre>"</string> <string name="ellipsis" msgid="7899829516048813237">"..."</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> <string name="android_system_label" msgid="6577375335728551336">"Système Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personnel"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Travail"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services payants"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Effectuer des opérations payantes"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Vos messages"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 93596063867d..6a6ed88708b9 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"To"</string> <string name="petabyteShort" msgid="5637816680144990219">"Po"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sans nom>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> <string name="android_system_label" msgid="6577375335728551336">"Système Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personnel"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Professionnel"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services payants"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Effectuer des opérations payantes"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Vos messages"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 3d5f4df37e19..957e76aba078 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटे"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटा"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> घंटे"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> घं. <xliff:g id="MINUTES">%2$d</xliff:g> मि."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> घं. <xliff:g id="MINUTES">%2$d</xliff:g> मि."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनट"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मि. <xliff:g id="SECONDS">%2$d</xliff:g> से."</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मि. <xliff:g id="SECONDS">%2$d</xliff:g> से."</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंड"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंड"</string> <string name="untitled" msgid="4638956954852782576">"<शीर्षक-रहित>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> <string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string> + <string name="user_owner_label" msgid="2804351898001038951">"व्यक्तिगत"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"कार्यालय"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"वे सेवाएं जिन पर आप खर्चा करते हैं"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ऐसे कार्य करें जिससे आपका धन खर्च हो सकता है."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"आपके संदेश"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index a195512be91a..e4db3e658a58 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez naslova>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string> <string name="android_system_label" msgid="6577375335728551336">"Sustav Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osobno"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Posao"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Usluge koje se plaćaju"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Radite stvari koje će uzrokovati novčane troškove."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Vaše poruke"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 6e82bb8a49b5..6130c5e9fbff 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> nap"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> óra"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> óra <xliff:g id="MINUTES">%2$d</xliff:g> perc"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> óra <xliff:g id="MINUTES">%2$d</xliff:g> perc"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> perc"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> perc <xliff:g id="SECONDS">%2$d</xliff:g> mp"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> perc <xliff:g id="SECONDS">%2$d</xliff:g> mp"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> másodperc"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> másodperc"</string> <string name="untitled" msgid="4638956954852782576">"<Névtelen>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Biztonsági üzemmód"</string> <string name="android_system_label" msgid="6577375335728551336">"Android rendszer"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Személyes"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Munkahelyi"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Fizetős szolgáltatások"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Olyan dolgok végrehajtása, amelyek pénzbe kerülnek."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Saját üzenetek"</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 12e5fdb577cf..a4a5f488d8f6 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"Տբ"</string> <string name="petabyteShort" msgid="5637816680144990219">"Պբ"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> օր"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ժ"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ժ <xliff:g id="MINUTES">%2$d</xliff:g> ր"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ժ <xliff:g id="MINUTES">%2$d</xliff:g> ր"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> րոպե"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ր <xliff:g id="SECONDS">%2$d</xliff:g> վ"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ր <xliff:g id="SECONDS">%2$d</xliff:g> վ"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> վ"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> վ"</string> <string name="untitled" msgid="4638956954852782576">"<Անանուն>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Անվտանգ ռեժիմ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android համակարգ"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Անձնական"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Աշխատանքային"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Ծառայություններ, որոնց համար կգանձվեք"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Կատարել գործողություններ, որի դիմաց ձեր հաշվից գումար կծախսվի:"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Ձեր հաղորդագրությունները"</string> @@ -409,10 +400,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Թույլ է տալիս սեփականատիրոջը միանալ Vpn ծառայության վերին մակարդակի ինտերֆեյսին: Սովորական հավելվածների համար երբևէ չպետք է անհրաժեշտ լինի:"</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"միանալ պաստառին"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Թույլ է տալիս սեփականատիրոջը միանալ պաստառի վերին մակարդակի ինտերֆեյսին: Սովորական հավելվածների համար երբևէ չպետք է անհրաժեշտ լինի:"</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"կապվել ձայնային փոխազդիչին"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Թույլ է տալիս սեփականատիրոջը միանալ ձայնային փոխազդիչի բազային միջերեսին: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"միանալ հեռակա էկրանին"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Թույլ է տալիս սեփականատիրոջը միանալ հեռակա էկրանի վերին մակարդակի ինտերֆեյսին: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"միանալ վիջեթ ծառայությանը"</string> @@ -725,10 +714,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Թույլ է տալիս հավելվածին առբերել, ուսումնասիրել և մաքրել ծանուցումներն, այդ թվում նաև այլ հավելվածների կողմից գրառվածները:"</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"միանալ ծանուցումների ունկնդրիչ ծառայությանը"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Թույլ է տալիս սեփականատիրոջը միանալ ծանուցումները ունկնդրող ծառայության վերին մակարդակի ինտերֆեյսին: Սովորական հավելվածների համար երբևէ չպետք է անհրաժեշտ լինի:"</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"կապվել պայմանների մատակարարի ծառայությանը"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Թույլ է տալիս սեփականատիրոջը միանալ պայմանների մատակարարների բազային միջերեսին: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"գործարկել օպերատորի կողմից տրամադրված կազմաձևման ծրագիրը"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Թույլ է տալիս սեփականատիրոջը գործարկել օպերատորի կողմից տրամադրված կազմաձևման ծրագիրը: Սովորական ծրագրերի համար երբևէ չպետք է անհրաժեշտ լինի:"</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"լսել դիտարկումներ ցանցային պայմանների վերաբերյալ"</string> @@ -1399,8 +1386,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Պաստառ"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Փոխել պաստառը"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Ծանուցման ունկնդիր"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Պայմանների մատակարար"</string> <string name="vpn_title" msgid="19615213552042827">"VPN-ը ակտիվացված է"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN-ն ակտիվացված է <xliff:g id="APP">%s</xliff:g>-ի կողմից"</string> <string name="vpn_text" msgid="3011306607126450322">"Հպեք` ցանցի կառավարման համար:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 2fb00bb8bd29..6003a23f7b25 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> jam"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> mnt"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> mnt"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt <xliff:g id="SECONDS">%2$d</xliff:g> dtk"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt <xliff:g id="SECONDS">%2$d</xliff:g> dtk"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> dtk"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> dtk"</string> <string name="untitled" msgid="4638956954852782576">"<Tanpa judul>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Mode aman"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Pribadi"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Kantor"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Layanan berbayar"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Lakukan hal yang dapat dikenai biaya."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Pesan Anda"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index af8ed3fe90d5..0e83a2f291ba 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> giorni"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ore"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ora"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ore"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ora <xliff:g id="MINUTES">%2$d</xliff:g> minuti"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ora <xliff:g id="MINUTES">%2$d</xliff:g> minuto"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuti"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto <xliff:g id="SECONDS">%2$d</xliff:g> secondi"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto <xliff:g id="SECONDS">%2$d</xliff:g> secondo"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secondi"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> secondo"</string> <string name="untitled" msgid="4638956954852782576">"<Senza nome>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personale"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Lavoro"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servizi che prevedono un costo"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Svolgono operazioni che possono comportare un costo."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"I tuoi messaggi"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 0157f74f198a..8002d3aea142 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ימים"</string> + <string name="durationDayHours" msgid="2713107458736744435">"יום <xliff:g id="DAYS">%1$d</xliff:g> <xliff:g id="HOURS">%2$d</xliff:g> שע\'"</string> + <string name="durationDayHour" msgid="7293789639090958917">"יום <xliff:g id="DAYS">%1$d</xliff:g> שעה <xliff:g id="HOURS">%2$d</xliff:g>"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> שעות"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"שעה <xliff:g id="HOURS">%1$d</xliff:g> <xliff:g id="MINUTES">%2$d</xliff:g> דק\'"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> שעות <xliff:g id="MINUTES">%2$d</xliff:g> דק\'"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> דקות"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"דקה <xliff:g id="MINUTES">%1$d</xliff:g> <xliff:g id="SECONDS">%2$d</xliff:g> שנ\'"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"דקה <xliff:g id="MINUTES">%1$d</xliff:g> שנ\' <xliff:g id="SECONDS">%2$d</xliff:g>"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> שניות"</string> + <string name="durationSecond" msgid="985669622276420331">"שנייה <xliff:g id="SECONDS">%1$d</xliff:g>"</string> <string name="untitled" msgid="4638956954852782576">">ללא כותרת<"</string> <string name="ellipsis" msgid="7899829516048813237">"..."</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string> <string name="android_system_label" msgid="6577375335728551336">"מערכת Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"אישי"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"עבודה"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"שירותים שעולים כסף"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ביצוע פעולות שעשויות לעלות לך כסף."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"ההודעות שלך"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index a9c5cfbab045..704b9354f86a 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>日"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>時間"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>分"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string> <string name="untitled" msgid="4638956954852782576">"<新規>"</string> <string name="ellipsis" msgid="7899829516048813237">"..."</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"セーフモード"</string> <string name="android_system_label" msgid="6577375335728551336">"Androidシステム"</string> + <string name="user_owner_label" msgid="2804351898001038951">"プライベート"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"職場"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"料金の発生するサービス"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"料金発生の可能性がある操作を実行します。"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"送受信したメッセージ"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index e5ec81b85cd6..0c179c053618 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"ტბაიტი"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> დღე"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> სთ"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> სთ <xliff:g id="MINUTES">%2$d</xliff:g> წთ"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> სთ <xliff:g id="MINUTES">%2$d</xliff:g> წთ"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ <xliff:g id="SECONDS">%2$d</xliff:g> წმ"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ <xliff:g id="SECONDS">%2$d</xliff:g> წმ"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> წმ"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> წმ"</string> <string name="untitled" msgid="4638956954852782576">"უსათაურო"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"უსაფრთხო რეჟიმი"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-ის სისტემა"</string> + <string name="user_owner_label" msgid="2804351898001038951">"პირადი"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"სამსახური"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"სერვისები, რომელშიც ფულის გადახდა გიწევთ"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ისეთი აქტივობების განხორციელება, რომლებშიც ფულის გადახდა მოგიწევთ."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"თქვენი შეტყობინებები"</string> @@ -409,10 +400,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"აპს შეეძლება Vpn სერვისის ზედა დონის ინტერფეისთან დაკავშირება. არასდროს გამოიყენება ჩვეულებრივ აპებში."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"ფონზე მიჭედება"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"მფლობელს შეეძლება ფონის ზედა დონის ინტერფეისთან დაკავშირება. არასდროს გამოიყენება ჩვეულებრივ აპებში."</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"ხმის ინტერაქტორთან შეკავშირება"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"მფლობელს შეეძლება შეკავშირდეს ხმის ინტერაქციის სერვისების ზედა დონის ინტერფეისთან. ჩვეულებრივ აპს ეს წესით არასოდეს უნდა დასჭირდეს."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"დისტანციურ მონიტორზე მიბმა"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"მფლობელს შეეძლება მიებას დისტანციურ მონიტორის ზედა დონის ინტერფეისს. ჩვეულებრივ აპს ეს წესით არასოდეს უნდა დაჭირდეს."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ვიჯეტ სერვისთან დაკავშირება"</string> @@ -725,10 +714,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"აპს შეეძლება მოიძიოს, გამოიკვლიოს და წაშალოს შეტყობინებები, მათ შორის სხვა აპების მიერ გამოქვეყნებული."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"შეტყობინებების მოსმენის სერვისთან დაკავშირება"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"მფლობელს შეეძლება შეტყობინებების მსმენლის სერვისის ზედა დონის ინტერფეისთან დაკავშირება. არ უნდა მოხდეს მისი გამოყენება ჩვეუელებრივი აპებისთვის.ფ"</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"მდგომარეობის პროვაიდერის სერვისებთან შეკავშირება"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"მფლობელს შეეძლება შეკავშირდეს მდგომარეობის პროვაიდერის სერვისების ზედა დონის ინტერფეისთან. ჩვეულებრივ აპს ეს წესით არასოდეს უნდა დასჭირდეს."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ოპერატორის მიერ მოწოდებული კოფიგურაციის აპის გამოხმობა"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"საშუალებას აძლევს მფლობელს გამოიწვიოს ოპერატორის მიერ მოწოდებული კონფიგურაციის აპი. ჩვეულებრივ აპს ეს წესით არასოდეს არ უნდა დაჭირდეს."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"განხორციელდეს ქსელის მდგომარეობის მონიტორინგი"</string> @@ -1399,8 +1386,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"ფონი"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"ფონის შეცვლა"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"შეტყობინებების მსმენელი"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"მდგომარეობის პროვაიდერი"</string> <string name="vpn_title" msgid="19615213552042827">"VPN გააქტიურებულია"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN გააქტიურებულია <xliff:g id="APP">%s</xliff:g>-ის მიერ"</string> <string name="vpn_text" msgid="3011306607126450322">"შეეხეთ ქსელის სამართავად."</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index e9a021c254cf..4d6f0a318516 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"តេរ៉ាបៃ"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង <xliff:g id="MINUTES">%2$d</xliff:g> នាទី"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង <xliff:g id="MINUTES">%2$d</xliff:g> នាទី"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> នាទី"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>នាទី <xliff:g id="SECONDS">%2$d</xliff:g>វិនាទី"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>នាទី <xliff:g id="SECONDS">%2$d</xliff:g>វិនាទី"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> វិនាទី"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> វិនាទី"</string> <string name="untitled" msgid="4638956954852782576">"<គ្មានចំណងជើង>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"របៀបសុវត្ថិភាព"</string> <string name="android_system_label" msgid="6577375335728551336">"ប្រព័ន្ធ Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ផ្ទាល់ខ្លួន"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"កន្លែងធ្វើការ"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"សេវាកម្មដែលកាត់លុយរបស់អ្នក"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ធ្វើអ្វីដែលអាចកាត់លុយរបស់អ្នក។"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"សាររបស់អ្នក"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 7c6feba6c6e3..310b1f0d6fa7 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>일"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>시간"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>분"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string> <string name="untitled" msgid="4638956954852782576">"<제목 없음>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"안전 모드"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 시스템"</string> + <string name="user_owner_label" msgid="2804351898001038951">"개인"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"직장"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"요금이 부과되는 서비스"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"요금이 부과될 수 있는 작업을 수행할 수 있도록 합니다."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"메시지"</string> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index b31fbffa3e1b..08ba7e19b62b 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ <xliff:g id="MINUTES">%2$d</xliff:g> ນທ"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ <xliff:g id="MINUTES">%2$d</xliff:g> ນທ"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ <xliff:g id="SECONDS">%2$d</xliff:g> ວິ"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ <xliff:g id="SECONDS">%2$d</xliff:g> ວິ"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ວິ"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ວິ"</string> <string name="untitled" msgid="4638956954852782576">"<ບໍ່ມີຊື່>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"ລະບົບ Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ສ່ວນໂຕ"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"ບ່ອນເຮັດວຽກ"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"ບໍລິການທີ່ເຮັດໃຫ້ທ່ານເສຍເງິນ"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ເຮັດສິ່ງທີ່ທ່ານຕ້ອງເສຍຄ່າໃຊ້ຈ່າຍ."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"ຂໍ້ຄວາມຂອງທ່ານ"</string> @@ -409,10 +400,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງເຊື່ອມໂຍງກັບສ່ວນຕິດຕໍ່ລະດັບເທິງສຸດ ຂອງບໍລິການ VPN. ແອັບຯທົ່ວໄປບໍ່ຄວນຈຳເປັນຕ້ອງໃຊ້."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"ເຊື່ອມໂຍງກັບພາບພື້ນຫຼັງ"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"ອະນຸຍາດໃຫ້ຜູ່ໃຊ້ເຊື່ອມໂຍງກັບສ່ວນຕິດຕໍ່ລະດັບສູງສຸດ ຂອງພາບພື້ນຫຼັງໃດນຶ່ງ. ແອັບຯທຳມະດາບໍ່ຄວນຈຳເປັນຕ້ອງໃຊ້."</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"ເຊື່ອມໂຍງກັບຕົວຕິດຕໍ່ດ້ວຍສຽງ"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງເຊື່ອມໂຍງສ່ວນຕິດຕໍ່ລະດັບສູງສຸດຂອງບໍລິການການຕິດຕໍ່ດ້ວຍສຽງ."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"ຜູກກັນເພື່ອສະແດງຜົນທາງໄກ."</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"ອະນຸຍາດໃຫ້ຜູ່ຖືຜູກກັບສ່ວນຕິດຕໍ່ລະດັບສູງສຸດ ຂອງການສະແດງຜົນທາງໄກ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ເຊື່ອມໂຍງໄປຫາບໍລິການວິດເຈັດ"</string> @@ -725,10 +714,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ອະນຸຍາດໃຫ້ແອັບຯດຶງຂໍ້ມູນ, ກວດສອບ ແລະລຶບລ້າງການແຈ້ງເຕືອນ ຮວມທັງພວກທີ່ໂພສໂດຍແອັບຯອື່ນໆນຳ."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ເຊື່ອມໂຍງກັບບໍລິການໂຕຟັງການແຈ້ງເຕືອນ"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງເຊື່ອມໂຍງສ່ວນຕິດຕໍ່ລະດັບເທິງສຸດ ຂອງຜູ່ຟັງບໍລິການການແຈ້ງເຕືອນ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"ເຊື່ອມໂຍງກັບບໍລິການຜູ່ສະໜອງເງື່ອນໄຂ"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງເຊື່ອມໂຍງສ່ວນຕິດຕໍ່ລະດັບສູງສຸດຂອງບໍລິການສະໜອງເງື່ອນໄຂ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"ຮ້ອງຂໍແອັບຯປັບຄ່າທີ່ສະໜອງໂດຍຜູ່ໃຫ້ບໍລິການ"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ອະນຸຍາດໃຫ້ເຈົ້າຂອງຮ້ອງຂໍແອັບຯປັບຄ່າທີ່ສະໜອງໂດຍຜູ່ໃຫ້ບໍລິການ. ບໍ່ໜ້າຈະຕ້ອງການສຳລັບແອັບຯທົ່ວໄປ."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ຕິດຕາມເພື່ອສັງເກດສະພາບຂອງເຄືອຂ່າຍ"</string> @@ -1399,8 +1386,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"ພາບພື້ນຫຼັງ"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"ປ່ຽນພາບພື້ນຫຼັງ"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"ໂຕຟັງການແຈ້ງເຕືອນ"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"ຜູ່ສະໜອງເງື່ອນໄຂ"</string> <string name="vpn_title" msgid="19615213552042827">"ເປີດນຳໃຊ້ VPN ແລ້ວ"</string> <string name="vpn_title_long" msgid="6400714798049252294">"ເປີດໃຊ້ VPN ໂດຍ <xliff:g id="APP">%s</xliff:g>"</string> <string name="vpn_text" msgid="3011306607126450322">"ແຕະເພື່ອຈັດການເຄືອຂ່າຍ."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 62b6c7a02302..7250f028003c 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> val."</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> val. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> val. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> <string name="untitled" msgid="4638956954852782576">"<Be pavadinimo>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Saugos režimas"</string> <string name="android_system_label" msgid="6577375335728551336">"„Android“ sistema"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Asmeninė"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Darbo"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Paslaugos, už kurias mokėjote"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Atlikite mokamus veiksmus."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Jūsų pranešimai"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index b803e6107b7f..4c48278e8893 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez nosaukuma>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"Pārsniedz"</string> <string name="safeMode" msgid="2788228061547930246">"Drošais režīms"</string> <string name="android_system_label" msgid="6577375335728551336">"Android sistēma"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personisks"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Darba"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Maksas pakalpojumi"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Veikt darbības, par kurām, iespējams, būs jāmaksā."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Jūsu ziņojumi"</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index cc0fa7f1b737..c60974552366 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> цаг"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> цаг <xliff:g id="MINUTES">%2$d</xliff:g> минут"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> цаг <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> секунд"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> <string name="untitled" msgid="4638956954852782576">"<Гарчиггүй>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Аюулгүй горим"</string> <string name="android_system_label" msgid="6577375335728551336">"Андройд систем"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Хувийн"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Ажил"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Танаас төлбөр авдаг үйлчилгээнүүд"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Таны төлбөрт оруулах зүйлийг хийх."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Таны мессеж"</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 53c9b94f11a4..ea9ffb392762 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> jam"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minit"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> saat"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> saat"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> saat"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> saat"</string> <string name="untitled" msgid="4638956954852782576">"<Tidak bertajuk>"</string> <string name="ellipsis" msgid="7899829516048813237">"..."</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,10 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Mod selamat"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> + <!-- no translation found for user_owner_label (2804351898001038951) --> + <skip /> + <!-- no translation found for managed_profile_label (6260850669674791528) --> + <skip /> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Perkhidmatan yang anda perlu bayar"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Melakukan perkara yang boleh mengenakan bayaran kepada anda."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Mesej anda"</string> @@ -409,10 +402,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan Vpn. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"terikat pada kertas dinding"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi kertas dinding. Tidak sekali-kali diperlukan untuk apl biasa."</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"terikat kepada interaksi suara"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan interaksi suara. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"terikat kepada paparan jauh"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi paparan jauh. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"terikat kepada perkhidmatan widget"</string> @@ -725,10 +716,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Membenarkan apl untuk mendapatkan semula, memeriksa dan memadam bersih pemberitahuan, termasuk yang disiarkan oleh apl lain."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"ikat kepada perkhidmatan pendengar pemberitahuan"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan pendengar pemberitahuan. Tidak sekali-kali diperlukan untuk apl biasa."</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"terikat kepada perkhidmatan pembekal keadaan"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi bagi perkhidmatan pembekal keadaan. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"gunakan apl konfigurasi yang disediakan oleh pembawa"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Membenarkan pemegang menggunakan apl konfigurasi yang diberikan oleh pembawa. Tidak sekali-kali diperlukan untuk apl biasa."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"dengar pemerhatian mengenai keadaan rangkaian"</string> @@ -1399,8 +1388,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Kertas dinding"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Tukar kertas dinding"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Pendengar pemberitahuan"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Pembekal keadaan"</string> <string name="vpn_title" msgid="19615213552042827">"VPN diaktifkan"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN diaktifkan oleh <xliff:g id="APP">%s</xliff:g>"</string> <string name="vpn_text" msgid="3011306607126450322">"Sentuh untuk mengurus rangkaian."</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index a67cb28acb22..16c53528cc20 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dager"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> t"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string> <string name="untitled" msgid="4638956954852782576">"<Uten navn>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Sikkermodus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personlig"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Jobb"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Betaltjenester"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Gjøre ting som kan koste deg penger."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Meldinger"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 3b2391f5062f..c19adf2ea085 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagen"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> uur"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuten"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> seconden"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> seconde"</string> <string name="untitled" msgid="4638956954852782576">"<Zonder titel>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string> <string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-systeem"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Persoonlijk"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Werk"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Services waarvoor u moet betalen"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Activiteiten uitvoeren waarvoor kosten in rekening kunnen worden gebracht."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Uw berichten"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index b80c1fdff02e..949fea81f3b3 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dni"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> godz."</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> godz. <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> godz. <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez nazwy>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Tryb awaryjny"</string> <string name="android_system_label" msgid="6577375335728551336">"System Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osobiste"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Praca"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Usługi płatne"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Wykonywanie czynności, za które pobierana jest opłata."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Twoje wiadomości"</string> @@ -737,7 +728,7 @@ <string name="policydesc_limitPassword" msgid="3252114203919510394">"Kontrolowanie długości haseł odblokowania ekranu i dozwolonych w nich znaków"</string> <string name="policylab_watchLogin" msgid="914130646942199503">"Monitoruj próby odblokowania ekranu"</string> <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"Przy odblokowywaniu ekranu monitoruj, ile razy wpisano nieprawidłowe hasło i blokuj tablet lub usuń z niego wszystkie dane, jeśli nieprawidłowe hasło podano zbyt wiele razy."</string> - <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Przy odblokowywaniu ekranu monitoruje, ile razy wpisano nieprawidłowe hasło i blokuje telefon lub usuwa z niego wszystkie dane, jeśli nieprawidłowe hasło podano zbyt wiele razy."</string> + <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"Przy odblokowywaniu ekranu monitoruje, ile razy wpisano nieprawidłowe hasło, i blokuje telefon lub usuwa z niego wszystkie dane, jeśli nieprawidłowe hasło podano zbyt wiele razy"</string> <string name="policylab_resetPassword" msgid="2620077191242688955">"Zmień hasło odblokowania ekranu"</string> <string name="policydesc_resetPassword" msgid="605963962301904458">"Zmienianie hasła odblokowania ekranu"</string> <string name="policylab_forceLock" msgid="2274085384704248431">"Zablokuj ekran"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 668f9ef13765..ecec09901ec2 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> horas"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> seg."</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> seg."</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> seg."</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> seg."</string> <string name="untitled" msgid="4638956954852782576">"<Sem nome>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Pessoal"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Trabalho"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Serviços que implicam pagamento"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Efetuar ações que implicam pagamento."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"As suas mensagens"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index db493e02e1b0..93107cabc06c 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> horas"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sem título>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string> @@ -199,6 +188,10 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Modo de segurança"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> + <!-- no translation found for user_owner_label (2804351898001038951) --> + <skip /> + <!-- no translation found for managed_profile_label (6260850669674791528) --> + <skip /> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Serviços que geram gastos"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Faça coisas que podem custar dinheiro."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Suas mensagens"</string> @@ -409,10 +402,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Permite que seu proprietário sujeite a interface de alto nível de um serviço de VPN. Nunca deve ser necessário para aplicativos normais."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"sujeitar-se a um plano de fundo"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Permite que o proprietário utilize interface de nível superior de um plano de fundo. Nunca deve ser necessário para aplicativos normais."</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"associar a um interagente de voz"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Permite que o proprietário use a interface de nível superior de um serviço de interação de voz. Não deve ser necessário para aplicativos comuns."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"usar uma tela remota"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite que o proprietário use a interface de nível superior de uma tela remota. Não deve ser necessário para aplicativos comuns."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"sujeitar-se a um serviço de widget"</string> @@ -725,10 +716,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite que o aplicativo recupere, examine e limpe notificações, inclusive as postadas por outros aplicativos."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"sujeitar a um serviço ouvinte de notificações"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite que o proprietário sujeite a interface de nível superior a um serviço ouvinte de notificações. Não deve ser necessário para aplicativos comuns."</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"associar a um serviço provedor de condições"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite que o proprietário use a interface de nível superior de um serviço provedor de condições. Não deve ser necessário para aplicativos comuns."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invocar o aplicativo de configuração fornecido pela operadora"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite que o proprietário invoque o aplicativo de configuração fornecido pela operadora. Não deve ser necessário para aplicativos comuns."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"detectar observações nas condições da rede"</string> @@ -1399,8 +1388,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Plano de fundo"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Alterar plano de fundo"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Ouvinte de notificações"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Provedor de condições"</string> <string name="vpn_title" msgid="19615213552042827">"VPN ativada"</string> <string name="vpn_title_long" msgid="6400714798049252294">"A VPN está ativada por <xliff:g id="APP">%s</xliff:g>"</string> <string name="vpn_text" msgid="3011306607126450322">"Toque para gerenciar a rede."</string> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index 3103b1fbb57b..6bdaee51f622 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -246,6 +246,10 @@ <skip /> <string name="safeMode" msgid="2788228061547930246">"Modus segirà"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> + <!-- no translation found for user_owner_label (2804351898001038951) --> + <skip /> + <!-- no translation found for managed_profile_label (6260850669674791528) --> + <skip /> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servetschs che custan"</string> <!-- no translation found for permgroupdesc_costMoney (3293301903409869495) --> <skip /> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 3ee0b8af338b..568e093fb3e0 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TO"</string> <string name="petabyteShort" msgid="5637816680144990219">"PO"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> (de) zile"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> zile <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> zi <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> (de) min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> <string name="untitled" msgid="4638956954852782576">"<Fără titlu>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,10 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"˃999"</string> <string name="safeMode" msgid="2788228061547930246">"Mod sigur"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistemul Android"</string> + <!-- no translation found for user_owner_label (2804351898001038951) --> + <skip /> + <!-- no translation found for managed_profile_label (6260850669674791528) --> + <skip /> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Servicii cu plată"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Efectuează acţiuni care sunt cu plată."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Mesajele dvs."</string> @@ -409,10 +402,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Permite proprietarului să se conecteze la interfaţa de nivel superior a unui serviciu VPN. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"conectare la o imagine de fundal"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Permite proprietarului să se conecteze la interfaţa de nivel superior a unei imagini de fundal. Nu ar trebui să fie niciodată necesară pentru aplicaţiile obişnuite."</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"conectare la un serviciu de interacțiune vocală"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Permite proprietarului să se conecteze la interfața de nivel superior a unui serviciu de interacțiune vocală. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"conectare la un ecran la distanță"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite proprietarului să se conecteze la interfața de nivel superior a unui ecran la distanță. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"conectare la un serviciu widget"</string> @@ -725,10 +716,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite aplicației să recupereze, să examineze și să șteargă notificări, inclusiv pe cele postate de alte aplicații."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"conectare la un serviciu de citire a notificărilor"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite proprietarului să se conecteze la interfața de nivel superior a unui serviciu de citire a notificărilor. În mod normal aplicațiile nu ar trebui să aibă nevoie de această permisiune."</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"conectare la un serviciu furnizor de condiții"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite proprietarului să se conecteze la interfața de nivel superior a unui serviciu furnizor de condiții. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"apelarea aplicației de configurare furnizată de operator"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite proprietarului să apeleze aplicația de configurare furnizată de operator. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ascultă observații despre starea rețelei"</string> @@ -1399,8 +1388,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Imagine de fundal"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Modificaţi imaginea de fundal"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Serviciu de citire a notificărilor"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Furnizor de condiții"</string> <string name="vpn_title" msgid="19615213552042827">"VPN activat"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN este activată de <xliff:g id="APP">%s</xliff:g>"</string> <string name="vpn_text" msgid="3011306607126450322">"Atingeţi pentru a gestiona reţeaua."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 8c7a5660bfe5..8a0141a4ee45 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ч."</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с."</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> с."</string> <string name="untitled" msgid="4638956954852782576">"<Без названия>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"..."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="safeMode" msgid="2788228061547930246">"Безопасный режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Личные данные"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Работа"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Платные услуги"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Приложение сможет использовать платные услуги."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Сообщения"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index c96c661eee26..08e4c0845eb6 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hod."</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez mena>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Núdzový režim"</string> <string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osobné"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Práca"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Spoplatnené služby"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Vykonávanie činností, ktoré vás môžu stáť peniaze."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Vaše správy"</string> @@ -409,10 +400,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby VPN. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"väzba na tapetu"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania tapety. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"viazanie na hlasovú interakciu"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby hlasovej interakcie. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"viazať na vzdialený displej"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania vzdialeného displeja. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"viazať sa k službe miniaplikácie"</string> @@ -725,10 +714,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Umožňuje aplikácii načítať, zobrazovať a mazať upozornenia vrátane tých, ktoré boli uverejnené inými aplikáciami."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"naviazanie sa na službu na počúvanie upozornení"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Umožňuje držiteľovi naviazať sa na najvyššiu úroveň služby na počúvanie upozornení. Bežné aplikácie by toto nastavenie nemali nikdy požadovať."</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"viazanie na službu poskytovateľa podmienky"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby poskytovateľa podmienky. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"vyvolanie aplikácie pre konfiguráciu poskytnutú operátorom"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Umožňuje držiteľovi vyvolať aplikáciu pre konfiguráciu poskytnutú operátorom. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"zachytávať informácie o stave siete"</string> @@ -1399,8 +1386,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Tapeta"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Zmeniť tapetu"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Aplikácia na počúvanie upozornení"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Poskytovateľ podmienky"</string> <string name="vpn_title" msgid="19615213552042827">"Sieť VPN je aktivovaná"</string> <string name="vpn_title_long" msgid="6400714798049252294">"Aplikáciu <xliff:g id="APP">%s</xliff:g> aktivovala sieť VPN"</string> <string name="vpn_text" msgid="3011306607126450322">"Dotykom môžete spravovať sieť."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index ef5d8728c59f..dfa767b1a667 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"Št. dni: <xliff:g id="DAYS">%1$d</xliff:g>"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Brez naslova>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string> <string name="safeMode" msgid="2788228061547930246">"Varni način"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Osebno"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Služba"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Plačljive storitve"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Dovolite stvari, za katere bo morda treba plačati."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Vaša sporočila"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index b87bd892eaab..fb65c0253b91 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дана"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> с"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> с <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> с <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> <string name="untitled" msgid="4638956954852782576">"<Без наслова>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Безбедни режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Android систем"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Лично"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Посао"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Услуге које се плаћају"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Покреће радње које могу да се плаћају."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Поруке"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 9b4dae306ca4..ea713a68ec2c 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> timmar"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> tim <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> tim <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuter"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekunder"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sekund"</string> <string name="untitled" msgid="4638956954852782576">"<Okänd>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Säkert läge"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personligt"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Arbetet"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Tjänster som kostar pengar"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Göra saker som kan kosta pengar."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Dina meddelanden"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 558cae21e05d..8c7705025589 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"Siku <xliff:g id="DAYS">%1$d</xliff:g>"</string> + <string name="durationDayHours" msgid="2713107458736744435">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string> + <string name="durationDayHour" msgid="7293789639090958917">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string> + <string name="durationHours" msgid="4266858287167358988">"Saa <xliff:g id="HOURS">%1$d</xliff:g>"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"Saa <xliff:g id="HOURS">%1$d</xliff:g> dak <xliff:g id="MINUTES">%2$d</xliff:g>"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"Saa <xliff:g id="HOURS">%1$d</xliff:g> dak <xliff:g id="MINUTES">%2$d</xliff:g>"</string> + <string name="durationMinutes" msgid="3134226679883579347">"Dakika <xliff:g id="MINUTES">%1$d</xliff:g>"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"Dak <xliff:g id="MINUTES">%1$d</xliff:g> sek <xliff:g id="SECONDS">%2$d</xliff:g>"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"Dak <xliff:g id="MINUTES">%1$d</xliff:g> sek <xliff:g id="SECONDS">%2$d</xliff:g>"</string> + <string name="durationSeconds" msgid="8050088505238241405">"Sekunde <xliff:g id="SECONDS">%1$d</xliff:g>"</string> + <string name="durationSecond" msgid="985669622276420331">"Sekunde <xliff:g id="SECONDS">%1$d</xliff:g>"</string> <string name="untitled" msgid="4638956954852782576">"<Haina jina>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Mtindo salama"</string> <string name="android_system_label" msgid="6577375335728551336">"Mfumo wa Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Binafsi"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Kazini"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Huduma ambazo zinakugharimu pesa"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Fanya mambo ambayo yanaweza kukugharimu pesa."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Ujumbe wako"</string> @@ -409,8 +400,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Inaruhusu kishikiliaji kushurutisha kusano ya kiwango cha juu cha huduma ya Vpn. Haipaswi kuhitajika kwa programu za kawaida."</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"funga kwa mandhari"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Inaruhusu kishikiliaji kushurutisha kwa kusano ya kiwango cha juu cha mandhari. Haipaswi kamwe kuhitajika kwa programu za kawaida."</string> - <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"shurutisha kwa muingiliano wa sauti"</string> - <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Humruhusu mmiliki kushurutisha kwa kiolesura cha hali ya juu cha huduma ya muingiliano wa sauti. Kamwe isihitajike kwa programu za kawaida."</string> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"bandika kwenye mwingiliano wa sauti"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Humruhusu mmiliki kubandika kwenye kiolesura cha hali ya juu cha huduma ya muingiliano wa sauti. Isihitajike kamwe kwa programu za kawaida."</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"fungisha kwenye mwonekano wa mbali"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Huruhusu mtumiaji kujifungia kiolesura cha kiwango cha juu cha mwonekano wa mbali. Haipaswi kuhitajika kwa programu za kawaida."</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"funga kwenye huduma ya widget"</string> @@ -723,8 +714,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Huruhusu programu kurejesha, kuchunguza, na kuondoa arifa, ikiwa ni pamoja na zile zilizochapishwa na programu nyingine."</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"unganisha kwenye huduma ya kisikilizi cha arifa"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Inaruhusu kishikilizi kuunganishwa kwenye kusano cha kiwango cha juu cha huduma ya kisikilizi cha arifa. Haipaswi kuhitajika tena kwa programu za kawaida."</string> - <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"shurutisha kwa huduma ya mtoa masharti"</string> - <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Humruhusu mmiliki kushurutisha kwa kiolesura cha kiwango cha juu cha huduma ya mtoa masharti. Kamwe isihitajike kwa pogramu za kawaida."</string> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"bandika kwenye huduma ya mtoa masharti"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Humruhusu mmiliki kubandika kwenye kiolesura cha kiwango cha juu cha huduma ya mtoa masharti. Isihitajike kamwe kwa pogramu za kawaida."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"omba programu ya usakinishaji inayotolewa na mtoa huduma."</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Inaruhusu kishikiliaji kuomba programu ya usakinishaji inayotolewa na mto huduma. Haipaswi kuhitajika kwa programu za kawaida."</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"sikiliza matukio katika hali za mtandao"</string> @@ -1395,7 +1386,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"Mandhari"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Badilisha mandhari"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Kisikilizi cha arifa"</string> - <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Mtoa hali"</string> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Mtoa masharti"</string> <string name="vpn_title" msgid="19615213552042827">"VPN imewezeshwa"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN imeamilishwa na <xliff:g id="APP">%s</xliff:g>"</string> <string name="vpn_text" msgid="3011306607126450322">"Gusa ili kudhibiti mtandao."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 826fa64c9148..7f0cf610630d 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> วัน"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ชม."</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ชม. <xliff:g id="MINUTES">%2$d</xliff:g> นาที"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ชม. <xliff:g id="MINUTES">%2$d</xliff:g> นาที"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที <xliff:g id="SECONDS">%2$d</xliff:g> วิ."</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที <xliff:g id="SECONDS">%2$d</xliff:g> วิ."</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> วินาที"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> วินาที"</string> <string name="untitled" msgid="4638956954852782576">"<ไม่มีชื่อ>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"โหมดปลอดภัย"</string> <string name="android_system_label" msgid="6577375335728551336">"ระบบ Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"ส่วนตัว"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"ที่ทำงาน"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"บริการที่ต้องเสียค่าใช้จ่าย"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"ทำสิ่งที่คุณต้องเสียค่าใช้จ่าย"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"ข้อความของคุณ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 6e50517bcca4..969b651046a2 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> (na) araw"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> (na) oras"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> oras <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> oras <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> (na) min"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> (na) seg"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> (na) seg"</string> <string name="untitled" msgid="4638956954852782576">"<Walang pamagat>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Personal"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Trabaho"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Mga serbisyong ginagastusan mo"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Gumawa ng mga bagay na magpapagastos sa iyo."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Iyong mga mensahe"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index bd2f926b242b..6e6151fd4d28 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> sa."</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> sa. <xliff:g id="MINUTES">%2$d</xliff:g> dk."</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> sa. <xliff:g id="MINUTES">%2$d</xliff:g> dk."</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> dk."</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> dk. <xliff:g id="SECONDS">%2$d</xliff:g> sn."</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> dk. <xliff:g id="SECONDS">%2$d</xliff:g> sn."</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sn."</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sn."</string> <string name="untitled" msgid="4638956954852782576">"<Adsız>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Güvenli mod"</string> <string name="android_system_label" msgid="6577375335728551336">"Android Sistemi"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Kişisel"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"İş"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Size maliyet getiren hizmetler"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Size maliyet getirebilecek işlemler yapma."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Mesajlarınız"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index d01c57760bf0..63fdd154982e 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"Тб"</string> <string name="petabyteShort" msgid="5637816680144990219">"Пб"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> год"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дн. <xliff:g id="HOURS">%2$d</xliff:g> год"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> год"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> год <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> год <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> хв"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string> <string name="untitled" msgid="4638956954852782576">"<Без назви>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">".."</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Безп. режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Особистий профіль"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Службовий профіль"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Служби, які потребують оплати"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Виконувати дії, які потребують оплати."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Ваші повідомл."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 24b2db5ae9ae..545b92e07fce 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ngày"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> giờ"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> giờ <xliff:g id="MINUTES">%2$d</xliff:g> phút"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> giờ <xliff:g id="MINUTES">%2$d</xliff:g> phút"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> phút"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> phút <xliff:g id="SECONDS">%2$d</xliff:g> giây"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> phút <xliff:g id="SECONDS">%2$d</xliff:g> giây"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> giây"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> giây"</string> <string name="untitled" msgid="4638956954852782576">"<Không có tiêu đề>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Chế độ an toàn"</string> <string name="android_system_label" msgid="6577375335728551336">"Hệ thống Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Cá nhân"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Cơ quan"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Dịch vụ tính tiền của bạn"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Thực hiện những tác vụ mà bạn có thể phải trả tiền."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Tin nhắn của bạn"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 9297e3a0513d..793e5bfc5903 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>天"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>小时"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分钟"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分钟"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string> <string name="untitled" msgid="4638956954852782576">"<未命名>"</string> <string name="ellipsis" msgid="7899829516048813237">"..."</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,10 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 系统"</string> + <!-- no translation found for user_owner_label (2804351898001038951) --> + <skip /> + <!-- no translation found for managed_profile_label (6260850669674791528) --> + <skip /> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"需要您付费的服务"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"执行可能需要您付费的操作。"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"您的信息"</string> @@ -409,10 +402,8 @@ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"允许用户绑定到 VPN 服务的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_bindWallpaper" msgid="8716400279937856462">"绑定到壁纸"</string> <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"允许用户绑定到壁纸的顶级接口。普通应用绝不需要此权限。"</string> - <!-- no translation found for permlab_bindVoiceInteraction (5334852580713715068) --> - <skip /> - <!-- no translation found for permdesc_bindVoiceInteraction (2345721766501778101) --> - <skip /> + <string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"绑定到语音互动器"</string> + <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"允许应用绑定到语音互动服务的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"绑定至远程显示屏"</string> <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"允许应用绑定至远程显示屏的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"绑定到小部件服务"</string> @@ -725,10 +716,8 @@ <string name="permdesc_accessNotifications" msgid="458457742683431387">"允许该应用检索、检查并清除通知,包括其他应用发布的通知。"</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"绑定到通知侦听器服务"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"允许应用绑定到通知侦听器服务的顶级接口(普通应用绝不需要此权限)。"</string> - <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) --> - <skip /> - <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) --> - <skip /> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"绑定到条件提供方服务"</string> + <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"允许应用绑定到条件提供方服务的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"调用运营商提供的配置应用"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"允许应用调用运营商提供的配置应用。普通应用绝不需要此权限。"</string> <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"监听网络状况的观测信息"</string> @@ -1399,8 +1388,7 @@ <string name="wallpaper_binding_label" msgid="1240087844304687662">"壁纸"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"更改壁纸"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"通知侦听器"</string> - <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) --> - <skip /> + <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"条件提供方"</string> <string name="vpn_title" msgid="19615213552042827">"VPN 已激活"</string> <string name="vpn_title_long" msgid="6400714798049252294">"“<xliff:g id="APP">%s</xliff:g>”已激活 VPN"</string> <string name="vpn_text" msgid="3011306607126450322">"触摸可管理网络。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 1c8cfe822dac..fdd02a7e959d 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> 小時"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string> <string name="untitled" msgid="4638956954852782576">"<未命名>"</string> <string name="ellipsis" msgid="7899829516048813237">"..."</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string> + <string name="user_owner_label" msgid="2804351898001038951">"個人"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"公司"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"付費服務"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"執行需付費的操作或服務。"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"您的訊息"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 05e08947b05a..547ca27427aa 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> 小時"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string> <string name="untitled" msgid="4638956954852782576">"<未命名>"</string> <string name="ellipsis" msgid="7899829516048813237">"…"</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"超過 999"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string> + <string name="user_owner_label" msgid="2804351898001038951">"個人"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"公司"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"需要額外費用的服務。"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"執行需付費的作業或服務。"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"您的簡訊"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 9c8542efa4de..58fdb1c818ee 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -27,28 +27,17 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="9164292791500531949">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- no translation found for durationDays (6652371460511178259) --> - <skip /> - <!-- no translation found for durationDayHours (2713107458736744435) --> - <skip /> - <!-- no translation found for durationDayHour (7293789639090958917) --> - <skip /> - <!-- no translation found for durationHours (4266858287167358988) --> - <skip /> - <!-- no translation found for durationHourMinutes (9029176248692041549) --> - <skip /> - <!-- no translation found for durationHourMinute (2741677355177402539) --> - <skip /> - <!-- no translation found for durationMinutes (3134226679883579347) --> - <skip /> - <!-- no translation found for durationMinuteSeconds (1424656185379003751) --> - <skip /> - <!-- no translation found for durationMinuteSecond (3989228718067466680) --> - <skip /> - <!-- no translation found for durationSeconds (8050088505238241405) --> - <skip /> - <!-- no translation found for durationSecond (985669622276420331) --> - <skip /> + <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> izinsuku"</string> + <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> amahora"</string> + <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> ihora"</string> + <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> amahora"</string> + <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ihora <xliff:g id="MINUTES">%2$d</xliff:g> amaminithi"</string> + <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ihora <xliff:g id="MINUTES">%2$d</xliff:g> iminithi"</string> + <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> amaminithi"</string> + <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi <xliff:g id="SECONDS">%2$d</xliff:g> amasekhondi"</string> + <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi <xliff:g id="SECONDS">%2$d</xliff:g> isekhondi"</string> + <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> amasekhondi"</string> + <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> isekhondi"</string> <string name="untitled" msgid="4638956954852782576">"<Akunasihloko>"</string> <string name="ellipsis" msgid="7899829516048813237">"..."</string> <string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string> @@ -199,6 +188,8 @@ <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"Imodi ephephile"</string> <string name="android_system_label" msgid="6577375335728551336">"Uhlelo lwe-Android"</string> + <string name="user_owner_label" msgid="2804351898001038951">"Okomuntu siqu"</string> + <string name="managed_profile_label" msgid="6260850669674791528">"Umsebenzi"</string> <string name="permgrouplab_costMoney" msgid="5429808217861460401">"Amasevisi abiza imali"</string> <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Yenza izinto ezingakudla imali."</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Imiyalezo yakho"</string> diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index 305ba28eaf72..f01f10e48ccf 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -348,43 +348,4 @@ <item>中文 (繁體)</item> </string-array> - <!-- Used by callers to Resources.selectSystemTheme(). Defines the minimum - targetSdkVersion required for the theme style at a given index. - NOTE: Must be sorted in ascending order. --> - <integer-array name="system_theme_sdks"> - <item>0</item> - <item>11</item> - <item>14</item> - <item>21</item> - </integer-array> - - <!-- Used by Resources.selectDefaultTheme(). Defines the default theme style - for the targetSdkVersion at a given index (see system_theme_sdks). - NOTE: Must match number of entries in system_theme_sdks. --> - <array name="system_theme_styles"> - <item>@style/Theme</item> - <item>@style/Theme.Holo</item> - <item>@style/Theme.DeviceDefault</item> - <item>@style/Theme.DeviceDefault.Light.DarkActionBar</item> - </array> - - <!-- Used by ContextImpl for notifications. Defines the default dialog theme - style for the targetSdkVersion at a given index (see system_theme_sdks). - NOTE: Must match number of entries in system_theme_sdks. --> - <array name="system_theme_dialog_styles"> - <item>@style/Theme</item> - <item>@style/Theme.Holo.Dialog</item> - <item>@style/Theme.DeviceDefault.Dialog</item> - <item>@style/Theme.DeviceDefault.Light.Dialog</item> - </array> - - <!-- Used by InputMethodService.onCreate(). Defines the default IME theme - style for the targetSdkVersion at a given index (see system_theme_sdks). - NOTE: Must match number of entries in system_theme_sdks. --> - <array name="system_theme_ime_styles"> - <item>@style/Theme.InputMethod</item> - <item>@style/Theme.Holo.InputMethod</item> - <item>@style/Theme.DeviceDefault.InputMethod</item> - <item>@style/Theme.DeviceDefault.InputMethod</item> - </array> </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index e07ebd421de3..0326e18ce5ac 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -721,6 +721,7 @@ <attr name="actionBarTabBarStyle" format="reference" /> <attr name="actionBarTabTextStyle" format="reference" /> <attr name="actionOverflowButtonStyle" format="reference" /> + <attr name="actionOverflowMenuStyle" format="reference" /> <!-- Reference to a style for the Action Bar --> <attr name="actionBarStyle" format="reference" /> <!-- Reference to a style for the split Action Bar. This style @@ -3803,6 +3804,7 @@ <declare-styleable name="PopupWindow"> <attr name="popupBackground" format="reference|color" /> <attr name="popupAnimationStyle" format="reference" /> + <attr name="overlapAnchor" format="boolean" /> </declare-styleable> <declare-styleable name="ViewAnimator"> <!-- Identifier for the animation to use when a view is shown. --> @@ -5810,6 +5812,9 @@ <attr name="imeExtractExitAnimation" format="reference" /> </declare-styleable> + <declare-styleable name="VoiceInteractionSession"> + </declare-styleable> + <declare-styleable name="KeyboardView"> <!-- Default KeyboardView style. --> <attr name="keyboardViewStyle" format="reference" /> @@ -5951,11 +5956,12 @@ <flag name="vertical" value="0x2" /> </attr> <!-- Optional parameter which indicates where this widget can be shown, - ie. home screen, keyguard or both. - resized. Supports combined values using | operator. --> + ie. home screen, keyguard, recents or any combination thereof. + Supports combined values using | operator. --> <attr name="widgetCategory" format="integer"> <flag name="home_screen" value="0x1" /> <flag name="keyguard" value="0x2" /> + <flag name="recents" value="0x4" /> </attr> </declare-styleable> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index ec73b9f2357a..e88a6eeeaa42 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2168,6 +2168,7 @@ <public type="attr" name="excludeId" /> <public type="attr" name="excludeClass" /> <public type="attr" name="hideOnContentScroll" /> + <public type="attr" name="actionOverflowMenuStyle" /> <public-padding type="dimen" name="l_resource_pad" end="0x01050010" /> @@ -2307,6 +2308,7 @@ <public type="style" name="Widget.Quantum.ListView.DropDown" /> <public type="style" name="Widget.Quantum.MediaRouteButton" /> <public type="style" name="Widget.Quantum.PopupMenu" /> + <public type="style" name="Widget.Quantum.PopupMenu.Overflow" /> <public type="style" name="Widget.Quantum.PopupWindow" /> <public type="style" name="Widget.Quantum.ProgressBar" /> <public type="style" name="Widget.Quantum.ProgressBar.Horizontal" /> @@ -2366,6 +2368,7 @@ <public type="style" name="Widget.Quantum.Light.ListView.DropDown" /> <public type="style" name="Widget.Quantum.Light.MediaRouteButton" /> <public type="style" name="Widget.Quantum.Light.PopupMenu" /> + <public type="style" name="Widget.Quantum.Light.PopupMenu.Overflow" /> <public type="style" name="Widget.Quantum.Light.PopupWindow" /> <public type="style" name="Widget.Quantum.Light.ProgressBar" /> <public type="style" name="Widget.Quantum.Light.ProgressBar.Horizontal" /> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 37716f764b59..891265fe9e10 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -169,6 +169,12 @@ please see styles_device_defaults.xml. <item name="windowExitAnimation">@anim/input_method_exit</item> </style> + <!-- Window animations that are applied to voice interaction overlay windows. --> + <style name="Animation.VoiceInteractionSession"> + <item name="windowEnterAnimation">@anim/input_method_enter</item> + <item name="windowExitAnimation">@anim/input_method_exit</item> + </style> + <!-- Special optional fancy IM animations. @hide --> <style name="Animation.InputMethodFancy"> <item name="windowEnterAnimation">@anim/input_method_fancy_enter</item> diff --git a/core/res/res/values/styles_quantum.xml b/core/res/res/values/styles_quantum.xml index 767942031d57..01c3017a7a48 100644 --- a/core/res/res/values/styles_quantum.xml +++ b/core/res/res/values/styles_quantum.xml @@ -665,7 +665,8 @@ please see styles_device_defaults.xml. <style name="Widget.Quantum.ListPopupWindow" parent="Widget.ListPopupWindow"> <item name="dropDownSelector">@drawable/list_selector_quantum</item> - <item name="popupBackground">?attr/colorBackground</item> + <item name="popupBackground">@drawable/popup_background_quantum</item> + <item name="popupAnimationStyle">@style/Animation.Quantum.Popup</item> <item name="dropDownVerticalOffset">0dip</item> <item name="dropDownHorizontalOffset">0dip</item> <item name="dropDownWidth">wrap_content</item> @@ -673,6 +674,10 @@ please see styles_device_defaults.xml. <style name="Widget.Quantum.PopupMenu" parent="Widget.Quantum.ListPopupWindow"/> + <style name="Widget.Quantum.PopupMenu.Overflow"> + <item name="overlapAnchor">true</item> + </style> + <style name="Widget.Quantum.ActionButton" parent="Widget.ActionButton"> <item name="minWidth">@dimen/action_button_min_width_quantum</item> <item name="minHeight">@dimen/action_button_min_height_quantum</item> @@ -907,17 +912,9 @@ please see styles_device_defaults.xml. <style name="Widget.Quantum.Light.QuickContactBadgeSmall.WindowSmall" parent="Widget.Quantum.QuickContactBadgeSmall.WindowSmall"/> <style name="Widget.Quantum.Light.QuickContactBadgeSmall.WindowMedium" parent="Widget.Quantum.QuickContactBadgeSmall.WindowMedium"/> <style name="Widget.Quantum.Light.QuickContactBadgeSmall.WindowLarge" parent="Widget.Quantum.QuickContactBadgeSmall.WindowLarge"/> - - <style name="Widget.Quantum.Light.ListPopupWindow" parent="Widget.ListPopupWindow"> - <item name="dropDownSelector">@drawable/list_selector_quantum</item> - <item name="popupBackground">?attr/colorBackground</item> - <item name="dropDownVerticalOffset">0dip</item> - <item name="dropDownHorizontalOffset">0dip</item> - <item name="dropDownWidth">wrap_content</item> - </style> - - <style name="Widget.Quantum.Light.PopupMenu" parent="Widget.Quantum.Light.ListPopupWindow"/> - + <style name="Widget.Quantum.Light.ListPopupWindow" parent="Widget.Quantum.ListPopupWindow"/> + <style name="Widget.Quantum.Light.PopupMenu" parent="Widget.Quantum.ListPopupWindow"/> + <style name="Widget.Quantum.Light.PopupMenu.Overflow" parent="Widget.Quantum.PopupMenu.Overflow"/> <style name="Widget.Quantum.Light.ActionButton" parent="Widget.Quantum.ActionButton"/> <style name="Widget.Quantum.Light.ActionButton.Overflow" parent="Widget.Quantum.ActionButton.Overflow"/> <style name="Widget.Quantum.Light.Tab" parent="Widget.Quantum.Tab"/> @@ -961,7 +958,16 @@ please see styles_device_defaults.xml. <style name="Animation.Quantum" parent="Animation"/> <style name="Animation.Quantum.Activity" parent="Animation.Activity"/> - <style name="Animation.Quantum.Dialog" parent="Animation.Dialog"/> + + <style name="Animation.Quantum.Dialog"> + <item name="windowEnterAnimation">@anim/popup_enter_quantum</item> + <item name="windowExitAnimation">@anim/popup_exit_quantum</item> + </style> + + <style name="Animation.Quantum.Popup"> + <item name="windowEnterAnimation">@anim/popup_enter_quantum</item> + <item name="windowExitAnimation">@anim/popup_exit_quantum</item> + </style> <!-- Dialog styles --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 7c6a91a5f179..a8a4b513d730 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1198,6 +1198,7 @@ <java-symbol type="layout" name="transient_notification" /> <java-symbol type="layout" name="volume_adjust" /> <java-symbol type="layout" name="volume_adjust_item" /> + <java-symbol type="layout" name="voice_interaction_session" /> <java-symbol type="layout" name="web_text_view_dropdown" /> <java-symbol type="layout" name="webview_find" /> <java-symbol type="layout" name="webview_select_singlechoice" /> @@ -1269,6 +1270,7 @@ <java-symbol type="style" name="TextAppearance.SlidingTabNormal" /> <java-symbol type="style" name="Theme.DeviceDefault.Dialog.NoFrame" /> <java-symbol type="style" name="Theme.IconMenu" /> + <java-symbol type="style" name="Theme.DeviceDefault.VoiceInteractionSession" /> <java-symbol type="attr" name="mediaRouteButtonStyle" /> <java-symbol type="attr" name="externalRouteEnabledDrawable" /> @@ -1862,9 +1864,5 @@ <java-symbol type="id" name="icon_frame" /> <java-symbol type="style" name="Animation.VolumePanel" /> <java-symbol type="transition" name="no_transition" /> - <java-symbol type="array" name="system_theme_sdks" /> - <java-symbol type="array" name="system_theme_styles" /> - <java-symbol type="array" name="system_theme_dialog_styles" /> - <java-symbol type="array" name="system_theme_ime_styles" /> </resources> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 6f4e7d0069ba..34ef50838a57 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -336,6 +336,7 @@ please see themes_device_defaults.xml. <item name="actionDropDownStyle">@android:style/Widget.Spinner.DropDown</item> <item name="actionButtonStyle">@android:style/Widget.ActionButton</item> <item name="actionOverflowButtonStyle">@android:style/Widget.ActionButton.Overflow</item> + <item name="actionOverflowMenuStyle">?android:attr/popupMenuStyle</item> <item name="actionModeBackground">@android:drawable/cab_background_top_holo_dark</item> <item name="actionModeSplitBackground">@null</item> <item name="actionModeCloseDrawable">@android:drawable/ic_menu_close_clear_cancel</item> @@ -805,6 +806,14 @@ please see themes_device_defaults.xml. <item name="android:imeExtractExitAnimation">@android:anim/input_method_extract_exit</item> </style> + <!-- Default theme for voice interaction, which is used by the + {@link android.service.voice.VoiceInteractionSession} class. + this inherits from Theme.Panel, but sets up appropriate animations + and a few custom attributes. --> + <style name="Theme.VoiceInteractionSession" parent="Theme.Panel"> + <item name="android:windowAnimationStyle">@android:style/Animation.VoiceInteractionSession</item> + </style> + <!-- Default theme for holo style input methods, which is used by the {@link android.inputmethodservice.InputMethodService} class. this inherits from Theme.Panel, but sets up IME appropriate animations @@ -1205,6 +1214,7 @@ please see themes_device_defaults.xml. <item name="actionDropDownStyle">@android:style/Widget.Holo.Spinner.DropDown.ActionBar</item> <item name="actionButtonStyle">@android:style/Widget.Holo.ActionButton</item> <item name="actionOverflowButtonStyle">@android:style/Widget.Holo.ActionButton.Overflow</item> + <item name="actionOverflowMenuStyle">?android:attr/popupMenuStyle</item> <item name="actionModeBackground">@android:drawable/cab_background_top_holo_dark</item> <item name="actionModeSplitBackground">@android:drawable/cab_background_bottom_holo_dark</item> <item name="actionModeCloseDrawable">@android:drawable/ic_cab_done_holo_dark</item> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 80c10dd1e500..dbc3d9e39092 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -299,6 +299,11 @@ easier. {@link android.inputmethodservice.InputMethodService} class.--> <style name="Theme.DeviceDefault.InputMethod" parent="Theme.Quantum.InputMethod" /> + <!-- DeviceDefault style for input methods, which is used by the + {@link android.service.voice.VoiceInteractionSession} class.--> + <style name="Theme.DeviceDefault.VoiceInteractionSession" parent="Theme.Quantum.VoiceInteractionSession" > + + </style> <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Quantum.Dialog.Alert"> <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item> </style> diff --git a/core/res/res/values/themes_quantum.xml b/core/res/res/values/themes_quantum.xml index c0bd18b4f77a..39c8beb04163 100644 --- a/core/res/res/values/themes_quantum.xml +++ b/core/res/res/values/themes_quantum.xml @@ -291,6 +291,7 @@ please see themes_device_defaults.xml. <item name="actionDropDownStyle">@style/Widget.Quantum.Spinner.DropDown.ActionBar</item> <item name="actionButtonStyle">@style/Widget.Quantum.ActionButton</item> <item name="actionOverflowButtonStyle">@style/Widget.Quantum.ActionButton.Overflow</item> + <item name="actionOverflowMenuStyle">@android:style/Widget.Quantum.PopupMenu.Overflow</item> <item name="actionModeBackground">?attr/colorPrimaryDark</item> <item name="actionModeSplitBackground">?attr/colorPrimaryDark</item> <item name="actionModeCloseDrawable">@drawable/ic_cab_done_quantum</item> @@ -636,6 +637,7 @@ please see themes_device_defaults.xml. <item name="actionDropDownStyle">@style/Widget.Quantum.Light.Spinner.DropDown.ActionBar</item> <item name="actionButtonStyle">@style/Widget.Quantum.Light.ActionButton</item> <item name="actionOverflowButtonStyle">@style/Widget.Quantum.Light.ActionButton.Overflow</item> + <item name="actionOverflowMenuStyle">@android:style/Widget.Quantum.Light.PopupMenu.Overflow</item> <item name="actionModeBackground">@drawable/cab_background_top_holo_light</item> <item name="actionModeSplitBackground">@drawable/cab_background_bottom_holo_light</item> <item name="actionModeCloseDrawable">@drawable/ic_cab_done_quantum</item> @@ -853,6 +855,14 @@ please see themes_device_defaults.xml. <item name="imeExtractExitAnimation">@anim/input_method_extract_exit</item> </style> + <!-- Default theme for quantum style voice interaction, which is used by the + {@link android.service.voice.VoiceInteractionSession} class. + this inherits from Theme.Panel, but sets up appropriate animations + and a few custom attributes. --> + <style name="Theme.Quantum.VoiceInteractionSession" parent="Theme.Quantum.Light.Panel"> + <item name="android:windowAnimationStyle">@android:style/Animation.VoiceInteractionSession</item> + </style> + <!-- Theme for the search input bar. --> <style name="Theme.Quantum.SearchBar" parent="Theme.Quantum.Panel"> diff --git a/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeSwitchingControllerTest.java b/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeSwitchingControllerTest.java index 6d335295637b..23b6780a21dc 100644 --- a/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeSwitchingControllerTest.java +++ b/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeSwitchingControllerTest.java @@ -73,7 +73,6 @@ public class InputMethodSubtypeSwitchingControllerTest extends InstrumentationTe DUMMY_FORCE_DEFAULT, supportsSwitchingToNextInputMethod); for (int i = 0; i < subtypes.size(); ++i) { final String subtypeLocale = subtypeLocales.get(i); - final InputMethodSubtype subtype = subtypes.get(i); items.add(new ImeSubtypeListItem(imeName, subtypeLocale, imi, i, subtypeLocale, SYSTEM_LOCALE)); } @@ -116,36 +115,37 @@ public class InputMethodSubtypeSwitchingControllerTest extends InstrumentationTe imList, ONLY_CURRENT_IME, currentIme.mImi, createDummySubtype( currentIme.mSubtypeName.toString())); assertEquals(imList.get(2), nextIme); - // "switchAwareLatinIme/fr" -> "nonSwitchAwareLatinIme/en_UK + // "switchAwareLatinIme/fr" -> "switchAwareJapaneseIme/ja_JP" currentIme = imList.get(2); nextIme = InputMethodSubtypeSwitchingController.getNextInputMethodImpl( imList, ONLY_CURRENT_IME, currentIme.mImi, createDummySubtype( currentIme.mSubtypeName.toString())); - assertEquals(imList.get(3), nextIme); + assertEquals(imList.get(5), nextIme); + // "switchAwareJapaneseIme/ja_JP" -> "switchAwareLatinIme/en_US" + currentIme = imList.get(5); + nextIme = InputMethodSubtypeSwitchingController.getNextInputMethodImpl( + imList, ONLY_CURRENT_IME, currentIme.mImi, createDummySubtype( + currentIme.mSubtypeName.toString())); + assertEquals(imList.get(0), nextIme); + // "nonSwitchAwareLatinIme/en_UK" -> "nonSwitchAwareLatinIme/hi" currentIme = imList.get(3); nextIme = InputMethodSubtypeSwitchingController.getNextInputMethodImpl( imList, ONLY_CURRENT_IME, currentIme.mImi, createDummySubtype( currentIme.mSubtypeName.toString())); assertEquals(imList.get(4), nextIme); - // "nonSwitchAwareLatinIme/hi" -> "switchAwareJapaneseIme/ja_JP" + // "nonSwitchAwareLatinIme/hi" -> "nonSwitchAwareJapaneseIme/ja_JP" currentIme = imList.get(4); nextIme = InputMethodSubtypeSwitchingController.getNextInputMethodImpl( imList, ONLY_CURRENT_IME, currentIme.mImi, createDummySubtype( currentIme.mSubtypeName.toString())); - assertEquals(imList.get(5), nextIme); - // "switchAwareJapaneseIme/ja_JP" -> "nonSwitchAwareJapaneseIme/ja_JP" - currentIme = imList.get(5); - nextIme = InputMethodSubtypeSwitchingController.getNextInputMethodImpl( - imList, ONLY_CURRENT_IME, currentIme.mImi, createDummySubtype( - currentIme.mSubtypeName.toString())); assertEquals(imList.get(6), nextIme); - // "nonSwitchAwareJapaneseIme/ja_JP" -> "switchAwareLatinIme/en_US" + // "nonSwitchAwareJapaneseIme/ja_JP" -> "nonSwitchAwareLatinIme/en_UK" currentIme = imList.get(6); nextIme = InputMethodSubtypeSwitchingController.getNextInputMethodImpl( imList, ONLY_CURRENT_IME, currentIme.mImi, createDummySubtype( currentIme.mSubtypeName.toString())); - assertEquals(imList.get(0), nextIme); + assertEquals(imList.get(3), nextIme); } @SmallTest diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index 0992717fd4ef..77712b66f023 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -182,28 +182,14 @@ public class VectorDrawable extends Drawable { public VectorDrawable() { mVectorState = new VectorDrawableState(null); - mVectorState.mBasicAnimator = ObjectAnimator.ofFloat(this, "AnimationFraction", 0, 0); - - setDuration(DEFAULT_DURATION); } private VectorDrawable(VectorDrawableState state, Resources res, Theme theme) { mVectorState = new VectorDrawableState(state); - mVectorState.mBasicAnimator = ObjectAnimator.ofFloat(this, "AnimationFraction", 0, 0); if (theme != null && canApplyTheme()) { applyTheme(theme); } - - long duration = mVectorState.mVAnimatedPath.getTotalAnimationDuration(); - if (duration == -1) { - // If duration is infinite, set to 1 hour. - // TODO: Define correct approach for infinite. - duration = DEFAULT_INFINITE_DURATION; - mVectorState.mBasicAnimator.setFloatValues(0, duration / 1000); - mVectorState.mBasicAnimator.setInterpolator(new LinearInterpolator()); - } - setDuration(duration); } @Override @@ -212,118 +198,6 @@ public class VectorDrawable extends Drawable { } @Override - public void jumpToCurrentState() { - stop(); - } - - /** - * Starts the animation. - */ - public void start() { - mVectorState.mBasicAnimator.start(); - } - - /** - * Stops the animation and moves to the end state. - */ - public void stop() { - mVectorState.mBasicAnimator.end(); - } - - /** - * Returns the current completion value for the animation. - * - * @return the current point on the animation, typically between 0 and 1 - */ - public float geAnimationFraction() { - return mVectorState.mVAnimatedPath.getValue(); - } - - /** - * Set the current completion value for the animation. - * - * @param value the point along the animation, typically between 0 and 1 - */ - public void setAnimationFraction(float value) { - mVectorState.mVAnimatedPath.setAnimationFraction(value); - invalidateSelf(); - } - - /** - * set the amount of time the animation will take - * - * @param duration amount of time in milliseconds - */ - public void setDuration(long duration) { - mVectorState.mBasicAnimator.setDuration(duration); - } - - /** - * Defines what this animation should do when it reaches the end. This - * setting is applied only when the repeat count is either greater than 0 or - * {@link ValueAnimator#INFINITE}. - * - * @param mode the animation mode, either {@link ValueAnimator#RESTART} or - * {@link ValueAnimator#REVERSE} - */ - public void setRepeatMode(int mode) { - mVectorState.mBasicAnimator.setRepeatMode(mode); - } - - /** - * Sets animation to repeat - * - * @param repeat True if this drawable repeats its animation - */ - public void setRepeatCount(int repeat) { - mVectorState.mBasicAnimator.setRepeatCount(repeat); - } - - /** - * @return the animation repeat count, either a value greater than 0 or - * {@link ValueAnimator#INFINITE} - */ - public int getRepeatCount() { - return mVectorState.mBasicAnimator.getRepeatCount(); - } - - @Override - public boolean isStateful() { - return true; - } - - @Override - protected boolean onStateChange(int[] state) { - super.onStateChange(state); - - mVectorState.mVAnimatedPath.setState(state); - - final int direction = mVectorState.mVAnimatedPath.getTrigger(state); - if (direction > 0) { - animateForward(); - } else if (direction < 0) { - animateBackward(); - } - - invalidateSelf(); - return true; - } - - private void animateForward() { - if (!mVectorState.mBasicAnimator.isStarted()) { - mVectorState.mBasicAnimator.setFloatValues(0, 1); - start(); - } - } - - private void animateBackward() { - if (!mVectorState.mBasicAnimator.isStarted()) { - mVectorState.mBasicAnimator.setFloatValues(1, 0); - start(); - } - } - - @Override public void draw(Canvas canvas) { final int saveCount = canvas.save(); final Rect bounds = getBounds(); @@ -432,7 +306,6 @@ public class VectorDrawable extends Drawable { final VectorDrawable drawable = new VectorDrawable(); drawable.inflate(resources, xpp, attrs); - drawable.setAnimationFraction(0); return drawable; } catch (XmlPullParserException e) { @@ -536,35 +409,10 @@ public class VectorDrawable extends Drawable { private void setAnimatedPath(VAnimatedPath animatedPath) { mVectorState.mVAnimatedPath = animatedPath; - - long duration = mVectorState.mVAnimatedPath.getTotalAnimationDuration(); - if (duration == -1) { // if it set to infinite set to 1 hour - duration = DEFAULT_INFINITE_DURATION; // TODO define correct - // approach for infinite - mVectorState.mBasicAnimator.setFloatValues(0, duration / 1000); - mVectorState.mBasicAnimator.setInterpolator(new LinearInterpolator()); - } - - setDuration(duration); - setAnimationFraction(0); - } - - @Override - public boolean setVisible(boolean visible, boolean restart) { - boolean changed = super.setVisible(visible, restart); - if (visible) { - if (changed || restart) { - setAnimationFraction(0); - } - } else { - stop(); - } - return changed; } private static class VectorDrawableState extends ConstantState { int mChangingConfigurations; - ValueAnimator mBasicAnimator; VAnimatedPath mVAnimatedPath; Rect mPadding; diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index d324439dbc56..eb0cac8944df 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -59,7 +59,8 @@ ifeq ($(USE_OPENGL_RENDERER),true) renderthread/DrawFrameTask.cpp \ renderthread/RenderProxy.cpp \ renderthread/RenderTask.cpp \ - renderthread/RenderThread.cpp + renderthread/RenderThread.cpp \ + renderthread/TimeLord.cpp intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,) diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index b52003c0a51b..647c281780f6 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -737,30 +737,34 @@ void FontRenderer::blurImage(uint8_t** image, int32_t width, int32_t height, int // a null path is OK because there are no custom kernels used // hence nothing gets cached by RS if (!mRs->init("", RSC::RS_INIT_LOW_LATENCY | RSC::RS_INIT_SYNCHRONOUS)) { + mRs.clear(); ALOGE("blur RS failed to init"); + } else { + mRsElement = RSC::Element::A_8(mRs); + mRsScript = RSC::ScriptIntrinsicBlur::create(mRs, mRsElement); } - - mRsElement = RSC::Element::A_8(mRs); - mRsScript = RSC::ScriptIntrinsicBlur::create(mRs, mRsElement); } + if (mRs != 0) { + RSC::sp<const RSC::Type> t = RSC::Type::create(mRs, mRsElement, width, height, 0); + RSC::sp<RSC::Allocation> ain = RSC::Allocation::createTyped(mRs, t, + RS_ALLOCATION_MIPMAP_NONE, + RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED, + *image); + RSC::sp<RSC::Allocation> aout = RSC::Allocation::createTyped(mRs, t, + RS_ALLOCATION_MIPMAP_NONE, + RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED, + outImage); + + mRsScript->setRadius(radius); + mRsScript->setInput(ain); + mRsScript->forEach(aout); + + // replace the original image's pointer, avoiding a copy back to the original buffer + free(*image); + *image = outImage; - RSC::sp<const RSC::Type> t = RSC::Type::create(mRs, mRsElement, width, height, 0); - RSC::sp<RSC::Allocation> ain = RSC::Allocation::createTyped(mRs, t, - RS_ALLOCATION_MIPMAP_NONE, RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED, - *image); - RSC::sp<RSC::Allocation> aout = RSC::Allocation::createTyped(mRs, t, - RS_ALLOCATION_MIPMAP_NONE, RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED, - outImage); - - mRsScript->setRadius(radius); - mRsScript->setInput(ain); - mRsScript->forEach(aout); - - // replace the original image's pointer, avoiding a copy back to the original buffer - free(*image); - *image = outImage; - - return; + return; + } } #endif diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 2c29985d2937..9902ff14d173 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -160,13 +160,13 @@ void RenderNode::evaluateAnimations(TreeInfo& info) { newEnd = std::remove_if(mAnimators.begin(), mAnimators.end(), functor); mAnimators.erase(newEnd, mAnimators.end()); mProperties.updateMatrix(); - info.hasAnimations |= mAnimators.size(); + info.out.hasAnimations |= mAnimators.size(); } void RenderNode::prepareSubTree(TreeInfo& info, DisplayListData* subtree) { if (subtree) { TextureCache& cache = Caches::getInstance().textureCache; - info.hasFunctors |= subtree->functorCount; + info.out.hasFunctors |= subtree->functorCount; // TODO: Fix ownedBitmapResources to not require disabling prepareTextures // and thus falling out of async drawing path. if (subtree->ownedBitmapResources.size()) { diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h index a383fbff3c56..fc5994cac5c7 100644 --- a/libs/hwui/TreeInfo.h +++ b/libs/hwui/TreeInfo.h @@ -34,25 +34,33 @@ protected: struct TreeInfo { // The defaults here should be safe for everyone but DrawFrameTask to use as-is. TreeInfo() - : hasFunctors(false) - , prepareTextures(false) - , performStagingPush(true) - , frameTimeMs(0) - , evaluateAnimations(false) - , hasAnimations(false) - , animationHook(0) + : frameTimeMs(0) + , animationHook(NULL) + , prepareTextures(false) + , performStagingPush(true) + , evaluateAnimations(false) {} - bool hasFunctors; + nsecs_t frameTimeMs; + AnimationHook* animationHook; bool prepareTextures; bool performStagingPush; - - // Animations - nsecs_t frameTimeMs; bool evaluateAnimations; - // This is only updated if evaluateAnimations is true - bool hasAnimations; - AnimationHook* animationHook; + + struct Out { + Out() + : hasFunctors(false) + , hasAnimations(false) + , requiresUiRedraw(false) + {} + bool hasFunctors; + // This is only updated if evaluateAnimations is true + bool hasAnimations; + // This is set to true if there is an animation that RenderThread cannot + // animate itself, such as if hasFunctors is true + // This is only set if hasAnimations is true + bool requiresUiRedraw; + } out; // TODO: Damage calculations }; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 63f4b9538741..fc3548ca5899 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -391,10 +391,20 @@ void CanvasContext::makeCurrent() { mHaveNewSurface |= mGlobalContext->makeCurrent(mEglSurface); } -void CanvasContext::processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters, +void CanvasContext::prepareDraw(const Vector<DeferredLayerUpdater*>* layerUpdaters, TreeInfo& info) { - LOG_ALWAYS_FATAL_IF(!mCanvas, "Cannot process layer updates without a canvas!"); + LOG_ALWAYS_FATAL_IF(!mCanvas, "Cannot prepareDraw without a canvas!"); makeCurrent(); + + processLayerUpdates(layerUpdaters, info); + if (info.out.hasAnimations) { + // TODO: Uh... crap? + } + prepareTree(info); +} + +void CanvasContext::processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters, + TreeInfo& info) { for (size_t i = 0; i < layerUpdaters->size(); i++) { DeferredLayerUpdater* update = layerUpdaters->itemAt(i); bool success = update->apply(info); @@ -406,11 +416,19 @@ void CanvasContext::processLayerUpdates(const Vector<DeferredLayerUpdater*>* lay } void CanvasContext::prepareTree(TreeInfo& info) { + mRenderThread.removeFrameCallback(this); + + info.frameTimeMs = mRenderThread.timeLord().frameTimeMs(); mRootRenderNode->prepareTree(info); - if (info.hasAnimations && !info.hasFunctors) { - // TODO: Functors - mRenderThread.postFrameCallback(this); + if (info.out.hasAnimations) { + if (info.out.hasFunctors) { + info.out.requiresUiRedraw = true; + } else if (!info.out.requiresUiRedraw) { + // If animationsNeedsRedraw is set don't bother posting for an RT anim + // as we will just end up fighting the UI thread. + mRenderThread.postFrameCallback(this); + } } } @@ -449,12 +467,11 @@ void CanvasContext::draw(Rect* dirty) { } // Called by choreographer to do an RT-driven animation -void CanvasContext::doFrame(nsecs_t frameTimeNanos) { +void CanvasContext::doFrame() { ATRACE_CALL(); TreeInfo info; info.evaluateAnimations = true; - info.frameTimeMs = nanoseconds_to_milliseconds(frameTimeNanos); info.performStagingPush = false; info.prepareTextures = false; diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 0873ad4f9017..a95e27aebcac 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -53,13 +53,12 @@ public: void pauseSurface(EGLNativeWindowType window); void setup(int width, int height); void makeCurrent(); - void processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters, TreeInfo& info); - void prepareTree(TreeInfo& info); + void prepareDraw(const Vector<DeferredLayerUpdater*>* layerUpdaters, TreeInfo& info); void draw(Rect* dirty); void destroyCanvasAndSurface(); // IFrameCallback, Chroreographer-driven frame callback entry point - virtual void doFrame(nsecs_t frameTimeNanos); + virtual void doFrame(); bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap); @@ -71,6 +70,9 @@ public: Layer* createTextureLayer(); private: + void processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters, TreeInfo& info); + void prepareTree(TreeInfo& info); + void setSurface(EGLNativeWindowType window); void swapBuffers(); void requireSurface(); diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index 45f5cb057ee4..3b8786c3fb94 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -30,13 +30,18 @@ namespace android { namespace uirenderer { namespace renderthread { -DrawFrameTask::DrawFrameTask() : mContext(0) { +DrawFrameTask::DrawFrameTask() + : mRenderThread(NULL) + , mContext(NULL) + , mFrameTimeNanos(0) + , mSyncResult(kSync_OK) { } DrawFrameTask::~DrawFrameTask() { } -void DrawFrameTask::setContext(CanvasContext* context) { +void DrawFrameTask::setContext(RenderThread* thread, CanvasContext* context) { + mRenderThread = thread; mContext = context; } @@ -59,18 +64,23 @@ void DrawFrameTask::setDirty(int left, int top, int right, int bottom) { mDirty.set(left, top, right, bottom); } -void DrawFrameTask::drawFrame(RenderThread* renderThread) { +int DrawFrameTask::drawFrame(nsecs_t frameTimeNanos) { LOG_ALWAYS_FATAL_IF(!mContext, "Cannot drawFrame with no CanvasContext!"); - postAndWait(renderThread); + mSyncResult = kSync_OK; + mFrameTimeNanos = frameTimeNanos; + postAndWait(); // Reset the single-frame data + mFrameTimeNanos = 0; mDirty.setEmpty(); + + return mSyncResult; } -void DrawFrameTask::postAndWait(RenderThread* renderThread) { +void DrawFrameTask::postAndWait() { AutoMutex _lock(mLock); - renderThread->queue(this); + mRenderThread->queue(this); mSignal.wait(mLock); } @@ -99,25 +109,25 @@ static void initTreeInfo(TreeInfo& info) { info.prepareTextures = true; info.performStagingPush = true; info.evaluateAnimations = true; - // TODO: Get this from Choreographer - nsecs_t frameTimeNs = systemTime(CLOCK_MONOTONIC); - info.frameTimeMs = nanoseconds_to_milliseconds(frameTimeNs); } bool DrawFrameTask::syncFrameState() { ATRACE_CALL(); + mRenderThread->timeLord().vsyncReceived(mFrameTimeNanos); mContext->makeCurrent(); Caches::getInstance().textureCache.resetMarkInUse(); TreeInfo info; initTreeInfo(info); - mContext->processLayerUpdates(&mLayers, info); - mContext->prepareTree(info); - if (info.hasAnimations) { + mContext->prepareDraw(&mLayers, info); + if (info.out.hasAnimations) { // TODO: dirty calculations, for now just do a full-screen inval mDirty.setEmpty(); + if (info.out.requiresUiRedraw) { + mSyncResult |= kSync_UIRedrawRequired; + } } // If prepareTextures is false, we ran out of texture cache space - return !info.hasFunctors && info.prepareTextures; + return !info.out.hasFunctors && info.prepareTextures; } void DrawFrameTask::unblockUiThread() { diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h index c2808686f369..b9307e194d4e 100644 --- a/libs/hwui/renderthread/DrawFrameTask.h +++ b/libs/hwui/renderthread/DrawFrameTask.h @@ -37,6 +37,11 @@ namespace renderthread { class CanvasContext; class RenderThread; +enum SyncResult { + kSync_OK = 0, + kSync_UIRedrawRequired = 1 << 1, +}; + /* * This is a special Super Task. It is re-used multiple times by RenderProxy, * and contains state (such as layer updaters & new DisplayListDatas) that is @@ -48,30 +53,34 @@ public: DrawFrameTask(); virtual ~DrawFrameTask(); - void setContext(CanvasContext* context); + void setContext(RenderThread* thread, CanvasContext* context); void addLayer(DeferredLayerUpdater* layer); void removeLayer(DeferredLayerUpdater* layer); void setDirty(int left, int top, int right, int bottom); - void drawFrame(RenderThread* renderThread); + int drawFrame(nsecs_t frameTimeNanos); virtual void run(); private: - void postAndWait(RenderThread* renderThread); + void postAndWait(); bool syncFrameState(); void unblockUiThread(); Mutex mLock; Condition mSignal; + RenderThread* mRenderThread; CanvasContext* mContext; /********************************************* * Single frame data *********************************************/ Rect mDirty; + nsecs_t mFrameTimeNanos; + + int mSyncResult; /********************************************* * Multi frame data diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 87886e6dc697..c2806fa690cd 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -62,7 +62,7 @@ RenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode) args->translucent = translucent; args->rootRenderNode = rootRenderNode; mContext = (CanvasContext*) postAndWait(task); - mDrawFrameTask.setContext(mContext); + mDrawFrameTask.setContext(&mRenderThread, mContext); } RenderProxy::~RenderProxy() { @@ -79,13 +79,38 @@ void RenderProxy::destroyContext() { SETUP_TASK(destroyContext); args->context = mContext; mContext = 0; - mDrawFrameTask.setContext(0); + mDrawFrameTask.setContext(NULL, NULL); // This is also a fence as we need to be certain that there are no // outstanding mDrawFrame tasks posted before it is destroyed postAndWait(task); } } +CREATE_BRIDGE2(setFrameInterval, RenderThread* thread, nsecs_t frameIntervalNanos) { + args->thread->timeLord().setFrameInterval(args->frameIntervalNanos); + return NULL; +} + +void RenderProxy::setFrameInterval(nsecs_t frameIntervalNanos) { + SETUP_TASK(setFrameInterval); + args->thread = &mRenderThread; + args->frameIntervalNanos = frameIntervalNanos; + post(task); +} + +CREATE_BRIDGE0(loadSystemProperties) { + bool needsRedraw = false; + if (Caches::hasInstance()) { + needsRedraw = Caches::getInstance().initProperties(); + } + return (void*) needsRedraw; +} + +bool RenderProxy::loadSystemProperties() { + SETUP_TASK(loadSystemProperties); + return (bool) postAndWait(task); +} + CREATE_BRIDGE2(initialize, CanvasContext* context, EGLNativeWindowType window) { return (void*) args->context->initialize(args->window); } @@ -134,10 +159,10 @@ void RenderProxy::setup(int width, int height) { post(task); } -void RenderProxy::syncAndDrawFrame( +int RenderProxy::syncAndDrawFrame(nsecs_t frameTimeNanos, int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom) { mDrawFrameTask.setDirty(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); - mDrawFrameTask.drawFrame(&mRenderThread); + return mDrawFrameTask.drawFrame(frameTimeNanos); } CREATE_BRIDGE1(destroyCanvasAndSurface, CanvasContext* context) { diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index eab139528eab..013c3bdc53f3 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -25,6 +25,7 @@ #include <utils/Condition.h> #include <utils/Functor.h> #include <utils/Mutex.h> +#include <utils/Timers.h> #include <utils/StrongPointer.h> #include <utils/Vector.h> @@ -59,11 +60,14 @@ public: ANDROID_API RenderProxy(bool translucent, RenderNode* rootNode); ANDROID_API virtual ~RenderProxy(); + ANDROID_API void setFrameInterval(nsecs_t frameIntervalNanos); + ANDROID_API bool loadSystemProperties(); + ANDROID_API bool initialize(const sp<ANativeWindow>& window); ANDROID_API void updateSurface(const sp<ANativeWindow>& window); ANDROID_API void pauseSurface(const sp<ANativeWindow>& window); ANDROID_API void setup(int width, int height); - ANDROID_API void syncAndDrawFrame( + ANDROID_API int syncAndDrawFrame(nsecs_t frameTimeNanos, int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom); ANDROID_API void destroyCanvasAndSurface(); diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index e95707a396f2..35a3eabce925 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -129,8 +129,7 @@ RenderThread::RenderThread() : Thread(true), Singleton<RenderThread>() , mDisplayEventReceiver(0) , mVsyncRequested(false) , mFrameCallbackTaskPending(false) - , mFrameCallbackTask(0) - , mFrameTime(0) { + , mFrameCallbackTask(0) { mFrameCallbackTask = new DispatchFrameCallbacks(this); mLooper = new Looper(false); run("RenderThread"); @@ -193,7 +192,7 @@ void RenderThread::drainDisplayEventQueue() { nsecs_t vsyncEvent = latestVsyncEvent(mDisplayEventReceiver); if (vsyncEvent > 0) { mVsyncRequested = false; - mFrameTime = vsyncEvent; + mTimeLord.vsyncReceived(vsyncEvent); if (!mFrameCallbackTaskPending) { mFrameCallbackTaskPending = true; //queueDelayed(mFrameCallbackTask, DISPATCH_FRAME_CALLBACKS_DELAY); @@ -209,7 +208,7 @@ void RenderThread::dispatchFrameCallbacks() { mFrameCallbacks.swap(callbacks); for (std::set<IFrameCallback*>::iterator it = callbacks.begin(); it != callbacks.end(); it++) { - (*it)->doFrame(mFrameTime); + (*it)->doFrame(); } } diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h index b93dfd65fb34..215d29413f68 100644 --- a/libs/hwui/renderthread/RenderThread.h +++ b/libs/hwui/renderthread/RenderThread.h @@ -28,6 +28,8 @@ #include <utils/Singleton.h> #include <utils/Thread.h> +#include "TimeLord.h" + namespace android { class DisplayEventReceiver; @@ -53,7 +55,7 @@ private: // Mimics android.view.Choreographer.FrameCallback class IFrameCallback { public: - virtual void doFrame(nsecs_t frameTimeNanos) = 0; + virtual void doFrame() = 0; protected: ~IFrameCallback() {} @@ -71,6 +73,8 @@ public: void postFrameCallback(IFrameCallback* callback); void removeFrameCallback(IFrameCallback* callback); + TimeLord& timeLord() { return mTimeLord; } + protected: virtual bool threadLoop(); @@ -102,7 +106,8 @@ private: std::set<IFrameCallback*> mFrameCallbacks; bool mFrameCallbackTaskPending; DispatchFrameCallbacks* mFrameCallbackTask; - nsecs_t mFrameTime; + + TimeLord mTimeLord; }; } /* namespace renderthread */ diff --git a/libs/hwui/renderthread/TimeLord.cpp b/libs/hwui/renderthread/TimeLord.cpp new file mode 100644 index 000000000000..758d96e96043 --- /dev/null +++ b/libs/hwui/renderthread/TimeLord.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "TimeLord.h" + +namespace android { +namespace uirenderer { +namespace renderthread { + +TimeLord::TimeLord() + : mFrameIntervalNanos(0) + , mFrameTimeNanos(0) { +} + +void TimeLord::vsyncReceived(nsecs_t vsync) { + if (vsync > mFrameTimeNanos) { + mFrameTimeNanos = vsync; + } +} + +nsecs_t TimeLord::frameTimeMs() { + // Logic copied from Choreographer.java + nsecs_t now = systemTime(CLOCK_MONOTONIC); + nsecs_t jitterNanos = now - mFrameTimeNanos; + if (jitterNanos >= mFrameIntervalNanos) { + nsecs_t lastFrameOffset = jitterNanos % mFrameIntervalNanos; + mFrameTimeNanos = now - lastFrameOffset; + } + return nanoseconds_to_milliseconds(mFrameTimeNanos); +} + +} /* namespace renderthread */ +} /* namespace uirenderer */ +} /* namespace android */ diff --git a/libs/hwui/renderthread/TimeLord.h b/libs/hwui/renderthread/TimeLord.h new file mode 100644 index 000000000000..52c6d9ef7448 --- /dev/null +++ b/libs/hwui/renderthread/TimeLord.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef TIMELORD_H +#define TIMELORD_H + +#include <utils/Timers.h> + +namespace android { +namespace uirenderer { +namespace renderthread { + +class RenderThread; + +// This class serves as a helper to filter & manage frame times from multiple sources +// ensuring that time flows linearly and smoothly +class TimeLord { +public: + void setFrameInterval(nsecs_t intervalNanos) { mFrameIntervalNanos = intervalNanos; } + void vsyncReceived(nsecs_t vsync); + nsecs_t frameTimeMs(); + +private: + friend class RenderThread; + + TimeLord(); + ~TimeLord() {} + + nsecs_t mFrameIntervalNanos; + nsecs_t mFrameTimeNanos; +}; + +} /* namespace renderthread */ +} /* namespace uirenderer */ +} /* namespace android */ + +#endif /* TIMELORD_H */ diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index ad0d45951be7..6b524b5a0849 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -139,4 +139,19 @@ public class AudioFormat { public static final int CHANNEL_IN_FRONT_BACK = CHANNEL_IN_FRONT | CHANNEL_IN_BACK; // CHANNEL_IN_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_IN_ALL + /** @hide */ + public static int getBytesPerSample(int audioFormat) + { + switch (audioFormat) { + case ENCODING_PCM_8BIT: + return 1; + case ENCODING_PCM_16BIT: + case ENCODING_DEFAULT: + return 2; + case ENCODING_INVALID: + default: + throw new IllegalArgumentException("Bad audio format " + audioFormat); + } + } + } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index a4891f81d13b..384e1205421f 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -319,7 +319,7 @@ public class AudioRecord // NB: this section is only valid with PCM data. // To update when supporting compressed formats int frameSizeInBytes = mChannelCount - * (mAudioFormat == AudioFormat.ENCODING_PCM_8BIT ? 1 : 2); + * (AudioFormat.getBytesPerSample(mAudioFormat)); if ((audioBufferSize % frameSizeInBytes != 0) || (audioBufferSize < 1)) { throw new IllegalArgumentException("Invalid audio buffer size."); } diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 17840f29881c..1899685712a3 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -518,7 +518,7 @@ public class AudioTrack // NB: this section is only valid with PCM data. // To update when supporting compressed formats int frameSizeInBytes = mChannelCount - * (mAudioFormat == AudioFormat.ENCODING_PCM_8BIT ? 1 : 2); + * (AudioFormat.getBytesPerSample(mAudioFormat)); if ((audioBufferSize % frameSizeInBytes != 0) || (audioBufferSize < 1)) { throw new IllegalArgumentException("Invalid audio buffer size."); } diff --git a/media/java/android/media/JetPlayer.java b/media/java/android/media/JetPlayer.java index bd91fc55cd7c..7735e785a7ca 100644 --- a/media/java/android/media/JetPlayer.java +++ b/media/java/android/media/JetPlayer.java @@ -169,9 +169,11 @@ public class JetPlayer native_setup(new WeakReference<JetPlayer>(this), JetPlayer.getMaxTracks(), - // bytes to frame conversion: sample format is ENCODING_PCM_16BIT, 2 channels + // bytes to frame conversion: // 1200 == minimum buffer size in frames on generation 1 hardware - Math.max(1200, buffSizeInBytes / 4)); + Math.max(1200, buffSizeInBytes / + (AudioFormat.getBytesPerSample(AudioFormat.ENCODING_PCM_16BIT) * + 2 /*channels*/))); } } diff --git a/packages/Keyguard/res/layout/keyguard_bouncer.xml b/packages/Keyguard/res/layout/keyguard_bouncer.xml index 8716ebcf1aeb..975a1393b81a 100644 --- a/packages/Keyguard/res/layout/keyguard_bouncer.xml +++ b/packages/Keyguard/res/layout/keyguard_bouncer.xml @@ -19,7 +19,7 @@ android:layout_height="match_parent"> <View android:id="@+id/bouncer_background" - android:background="#aa000000" + android:background="#cc000000" android:clickable="true" android:layout_width="match_parent" android:layout_height="match_parent"/> diff --git a/packages/SystemUI/res/drawable-hdpi/ic_camera_alt_24dp.png b/packages/SystemUI/res/drawable-hdpi/ic_camera_alt_24dp.png Binary files differnew file mode 100644 index 000000000000..253c73792a72 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_camera_alt_24dp.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-hdpi/ic_phone_24dp.png Binary files differnew file mode 100644 index 000000000000..a6a644888d22 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_phone_24dp.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_camera.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_camera.png Binary files differdeleted file mode 100644 index c6f03c495e07..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_camera.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_camera_alt_24dp.png b/packages/SystemUI/res/drawable-mdpi/ic_camera_alt_24dp.png Binary files differnew file mode 100644 index 000000000000..ee1187bfe2e9 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_camera_alt_24dp.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-mdpi/ic_phone_24dp.png Binary files differnew file mode 100644 index 000000000000..2286bb4cfca1 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_phone_24dp.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_camera.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_camera.png Binary files differdeleted file mode 100644 index 1c2d7aa3c480..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_camera.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_camera_alt_24dp.png b/packages/SystemUI/res/drawable-xhdpi/ic_camera_alt_24dp.png Binary files differnew file mode 100644 index 000000000000..268eba0dde54 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_camera_alt_24dp.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-xhdpi/ic_phone_24dp.png Binary files differnew file mode 100644 index 000000000000..cd9ff60b4321 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_phone_24dp.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_camera.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_camera.png Binary files differdeleted file mode 100644 index fbd4d6b02ca4..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_camera.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_camera_alt_24dp.png b/packages/SystemUI/res/drawable-xxhdpi/ic_camera_alt_24dp.png Binary files differnew file mode 100644 index 000000000000..9175118fad0f --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_camera_alt_24dp.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-xxhdpi/ic_phone_24dp.png Binary files differnew file mode 100644 index 000000000000..3c546e575324 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_phone_24dp.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_camera.png b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_camera.png Binary files differdeleted file mode 100644 index 86df881d4142..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_camera.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxxhdpi/ic_camera_alt_24dp.png b/packages/SystemUI/res/drawable-xxxhdpi/ic_camera_alt_24dp.png Binary files differnew file mode 100644 index 000000000000..20e26b8291f5 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxxhdpi/ic_camera_alt_24dp.png diff --git a/packages/SystemUI/res/drawable-xxxhdpi/ic_phone_24dp.png b/packages/SystemUI/res/drawable-xxxhdpi/ic_phone_24dp.png Binary files differnew file mode 100644 index 000000000000..4f7da0a9f14c --- /dev/null +++ b/packages/SystemUI/res/drawable-xxxhdpi/ic_phone_24dp.png diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index 809adcd2ff23..ec5acba54b8d 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -22,15 +22,29 @@ android:layout_height="match_parent" android:layout_width="match_parent" > - <com.android.systemui.statusbar.policy.KeyButtonView + <com.android.systemui.statusbar.phone.SwipeAffordanceView android:id="@+id/camera_button" - android:layout_height="80dp" - android:layout_width="80dp" - android:layout_gravity="bottom|right" - android:src="@drawable/ic_sysbar_camera" + android:layout_height="64dp" + android:layout_width="64dp" + android:layout_gravity="bottom|end" + android:tint="#ffffffff" + android:src="@drawable/ic_camera_alt_24dp" android:scaleType="center" android:contentDescription="@string/accessibility_camera_button" - systemui:glowBackground="@drawable/ic_sysbar_highlight_land" /> + systemui:glowBackground="@drawable/ic_sysbar_highlight_land" + systemui:swipeDirection="start"/> + + <com.android.systemui.statusbar.phone.SwipeAffordanceView + android:id="@+id/phone_button" + android:layout_height="64dp" + android:layout_width="64dp" + android:layout_gravity="bottom|start" + android:tint="#ffffffff" + android:src="@drawable/ic_phone_24dp" + android:scaleType="center" + android:contentDescription="@string/accessibility_phone_button" + systemui:glowBackground="@drawable/ic_sysbar_highlight_land" + systemui:swipeDirection="end"/> <com.android.systemui.statusbar.phone.KeyguardIndicationTextView android:id="@+id/keyguard_indication_text" diff --git a/packages/SystemUI/res/values-sw720dp/config.xml b/packages/SystemUI/res/values-sw720dp/config.xml index bf01a8d5ae5d..7cf711a45b73 100644 --- a/packages/SystemUI/res/values-sw720dp/config.xml +++ b/packages/SystemUI/res/values-sw720dp/config.xml @@ -32,5 +32,8 @@ <!-- Min alpha % that recent items will fade to while being dismissed --> <integer name="config_recent_item_min_alpha">0</integer> + + <!-- Transposes the search bar layout in landscape --> + <bool name="recents_transpose_search_layout_with_orientation">false</bool> </resources> diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index 734abdc8e147..f5674d296c2e 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -45,6 +45,12 @@ <declare-styleable name="BatteryMeterView"> <attr name="frameColor" format="color" /> </declare-styleable> + <declare-styleable name="SwipeAffordanceView"> + <attr name="swipeDirection" format="enum"> + <enum name="start" value="0" /> + <enum name="end" value="1" /> + </attr> + </declare-styleable> <attr name="orientation"> <enum name="horizontal" value="0" /> <enum name="vertical" value="1" /> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 024f1ebf79a4..c3ccb59c4028 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -123,6 +123,8 @@ <integer name="recents_animate_task_view_info_pane_duration">150</integer> <!-- The minimum alpha for the dim applied to cards that go deeper into the stack. --> <integer name="recents_max_task_stack_view_dim">96</integer> + <!-- Transposes the search bar layout in landscape --> + <bool name="recents_transpose_search_layout_with_orientation">true</bool> <!-- Whether to enable KeyguardService or not --> <bool name="config_enableKeyguardService">true</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 1900fea1b7ff..28de6ac32d97 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -258,8 +258,8 @@ <!-- Width of the zen mode interstitial dialog. --> <dimen name="zen_mode_dialog_width">320dp</dimen> - <!-- Camera affordance drag distance --> - <dimen name="camera_drag_distance">100dp</dimen> + <!-- Lockscreen affordance drag distance for camera and phone. --> + <dimen name="affordance_drag_distance">100dp</dimen> <dimen name="quick_settings_tmp_scrim_stroke_width">8dp</dimen> <dimen name="quick_settings_tmp_scrim_text_size">30dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index b4a13d40fbcd..3f0a60f4ba35 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -196,6 +196,8 @@ <string name="accessibility_search_light">Search</string> <!-- Content description of the camera button for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_camera_button">Camera</string> + <!-- Content description of the phone button for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_phone_button">Phone</string> <!-- Content description of the switch input method button for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_ime_switch_button">Switch input method button.</string> diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java index 5a1dc8d01d15..23a01790b186 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java @@ -37,6 +37,7 @@ public class RecentsConfiguration { public Rect displayRect = new Rect(); boolean isLandscape; + boolean transposeSearchLayoutWithOrientation; int searchBarAppWidgetId = -1; public float animationPxMovementPerSecond; @@ -83,6 +84,8 @@ public class RecentsConfiguration { isLandscape = res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; + transposeSearchLayoutWithOrientation = + res.getBoolean(R.bool.recents_transpose_search_layout_with_orientation); Console.log(Constants.DebugFlags.UI.MeasureAndLayout, "[RecentsConfiguration|orientation]", isLandscape ? "Landscape" : "Portrait", Console.AnsiGreen); @@ -148,7 +151,7 @@ public class RecentsConfiguration { if (hasSearchBarAppWidget()) { Rect searchBarBounds = new Rect(); getSearchBarBounds(width, height, searchBarBounds); - if (isLandscape) { + if (isLandscape && transposeSearchLayoutWithOrientation) { // In landscape, the search bar appears on the left, so shift the task rect right taskStackBounds.set(searchBarBounds.width(), 0, width, height); } else { @@ -171,7 +174,7 @@ public class RecentsConfiguration { return; } - if (isLandscape) { + if (isLandscape && transposeSearchLayoutWithOrientation) { // In landscape, the search bar appears on the left searchBarSpaceBounds.set(0, 0, searchBarSpaceHeightPx, height); } else { diff --git a/packages/SystemUI/src/com/android/systemui/recents/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/SystemServicesProxy.java index 68af6635ce7b..c3b8a20743ca 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/SystemServicesProxy.java @@ -55,6 +55,7 @@ public class SystemServicesProxy { UserManager mUm; SearchManager mSm; String mPackage; + ComponentName mAssistComponent; Bitmap mDummyIcon; @@ -68,6 +69,12 @@ public class SystemServicesProxy { mSm = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE); mPackage = context.getPackageName(); + // Resolve the assist intent + Intent assist = mSm.getAssistIntent(context, false); + if (assist != null) { + mAssistComponent = assist.getComponent(); + } + if (Constants.DebugFlags.App.EnableSystemServicesProxy) { // Create a dummy icon mDummyIcon = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); @@ -236,30 +243,14 @@ public class SystemServicesProxy { */ public Pair<Integer, AppWidgetProviderInfo> bindSearchAppWidget(AppWidgetHost host) { if (mAwm == null) return null; + if (mAssistComponent == null) return null; - // Ensure we have a global search activity - ComponentName globalSearchActivity = mSm.getGlobalSearchActivity(); - if (globalSearchActivity == null) return null; - - // Resolve the search widget provider from the search activity - ActivityInfo searchActivityInfo = getActivityInfo(globalSearchActivity); - if (searchActivityInfo == null) return null; - - String key = "com.android.recents.search_widget_provider"; - ComponentName searchWidgetCn = null; - Bundle searchMetaData = searchActivityInfo.metaData; - String searchWidgetProvider = searchMetaData.getString(key, ""); - if (searchWidgetProvider.length() != 0) { - searchWidgetCn = ComponentName.unflattenFromString(searchWidgetProvider); - } else { - return null; - } - - // Find the first Recents widget from the same package as the global search activity - List<AppWidgetProviderInfo> widgets = mAwm.getInstalledProviders(); + // Find the first Recents widget from the same package as the global assist activity + List<AppWidgetProviderInfo> widgets = mAwm.getInstalledProviders( + AppWidgetProviderInfo.WIDGET_CATEGORY_RECENTS); AppWidgetProviderInfo searchWidgetInfo = null; for (AppWidgetProviderInfo info : widgets) { - if (info.provider.equals(searchWidgetCn)) { + if (info.provider.getPackageName().equals(mAssistComponent.getPackageName())) { searchWidgetInfo = info; break; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index edf54d1d3986..2c7464ad810d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -773,8 +773,8 @@ public abstract class BaseStatusBar extends SystemUI implements PendingIntent contentIntent = sbn.getNotification().contentIntent; if (contentIntent != null) { - final View.OnClickListener listener = makeClicker(contentIntent, - sbn.getPackageName(), sbn.getTag(), sbn.getId(), isHeadsUp, sbn.getUserId()); + final View.OnClickListener listener = makeClicker(contentIntent, sbn.getKey(), + isHeadsUp); row.setOnClickListener(listener); } else { row.setOnClickListener(null); @@ -884,27 +884,20 @@ public abstract class BaseStatusBar extends SystemUI implements return true; } - public NotificationClicker makeClicker(PendingIntent intent, String pkg, String tag, - int id, boolean forHun, int userId) { - return new NotificationClicker(intent, pkg, tag, id, forHun, userId); + public NotificationClicker makeClicker(PendingIntent intent, String notificationKey, + boolean forHun) { + return new NotificationClicker(intent, notificationKey, forHun); } protected class NotificationClicker implements View.OnClickListener { private PendingIntent mIntent; - private String mPkg; - private String mTag; - private int mId; + private final String mNotificationKey; private boolean mIsHeadsUp; - private int mUserId; - public NotificationClicker(PendingIntent intent, String pkg, String tag, int id, - boolean forHun, int userId) { + public NotificationClicker(PendingIntent intent, String notificationKey, boolean forHun) { mIntent = intent; - mPkg = pkg; - mTag = tag; - mId = id; + mNotificationKey = notificationKey; mIsHeadsUp = forHun; - mUserId = userId; } public void onClick(View v) { @@ -940,7 +933,7 @@ public abstract class BaseStatusBar extends SystemUI implements if (mIsHeadsUp) { mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP); } - mBarService.onNotificationClick(mPkg, mTag, mId, mUserId); + mBarService.onNotificationClick(mNotificationKey); } catch (RemoteException ex) { // system process is dead if we're here. } @@ -1344,9 +1337,8 @@ public abstract class BaseStatusBar extends SystemUI implements // update the contentIntent final PendingIntent contentIntent = notification.getNotification().contentIntent; if (contentIntent != null) { - final View.OnClickListener listener = makeClicker(contentIntent, - notification.getPackageName(), notification.getTag(), notification.getId(), - isHeadsUp, notification.getUserId()); + final View.OnClickListener listener = makeClicker(contentIntent, notification.getKey(), + isHeadsUp); entry.row.setOnClickListener(listener); } else { entry.row.setOnClickListener(null); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java new file mode 100644 index 000000000000..5bc7e5a6e67d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import android.content.Intent; + +/** + * An interface to start activities. This is used to as a callback from the views to + * {@link PhoneStatusBar} to allow custom handling for starting the activity, i.e. dismissing the + * Keyguard. + */ +public interface ActivityStarter { + public void startActivity(Intent intent); +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 3cc22efee2c0..58b3f2e3d6b7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -22,6 +22,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; @@ -42,14 +43,18 @@ import com.android.systemui.R; * Implementation for the bottom area of the Keyguard, including camera/phone affordance and status * text. */ -public class KeyguardBottomAreaView extends FrameLayout { +public class KeyguardBottomAreaView extends FrameLayout + implements SwipeAffordanceView.AffordanceListener { final static String TAG = "PhoneStatusBar/KeyguardBottomAreaView"; - private View mCameraButton; - private float mCameraDragDistance; + private static final Intent PHONE_INTENT = new Intent(Intent.ACTION_DIAL); + + private SwipeAffordanceView mCameraButton; + private SwipeAffordanceView mPhoneButton; + private PowerManager mPowerManager; - private int mScaledTouchSlop; + private ActivityStarter mActivityStarter; public KeyguardBottomAreaView(Context context) { super(context); @@ -71,20 +76,37 @@ public class KeyguardBottomAreaView extends FrameLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mCameraButton = findViewById(R.id.camera_button); + mCameraButton = (SwipeAffordanceView) findViewById(R.id.camera_button); + mPhoneButton = (SwipeAffordanceView) findViewById(R.id.phone_button); + mCameraButton.setAffordanceListener(this); + mPhoneButton.setAffordanceListener(this); watchForDevicePolicyChanges(); watchForAccessibilityChanges(); updateCameraVisibility(); - mCameraDragDistance = getResources().getDimension(R.dimen.camera_drag_distance); - mScaledTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); + updatePhoneVisibility(); mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); } + public void setActivityStarter(ActivityStarter activityStarter) { + mActivityStarter = activityStarter; + } + private void updateCameraVisibility() { boolean visible = !isCameraDisabledByDpm(); mCameraButton.setVisibility(visible ? View.VISIBLE : View.GONE); } + private void updatePhoneVisibility() { + boolean visible = isPhoneVisible(); + mPhoneButton.setVisibility(visible ? View.VISIBLE : View.GONE); + } + + private boolean isPhoneVisible() { + PackageManager pm = mContext.getPackageManager(); + return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY) + && pm.resolveActivity(PHONE_INTENT, 0) != null; + } + private boolean isCameraDisabledByDpm() { final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService(Context.DEVICE_POLICY_SERVICE); @@ -136,15 +158,8 @@ public class KeyguardBottomAreaView extends FrameLayout { } private void enableAccessibility(boolean touchExplorationEnabled) { - - // Add a touch handler or accessibility click listener for camera button. - if (touchExplorationEnabled) { - mCameraButton.setOnTouchListener(null); - mCameraButton.setOnClickListener(mCameraClickListener); - } else { - mCameraButton.setOnTouchListener(mCameraTouchListener); - mCameraButton.setOnClickListener(null); - } + mCameraButton.enableAccessibility(touchExplorationEnabled); + mPhoneButton.enableAccessibility(touchExplorationEnabled); } private void launchCamera() { @@ -153,80 +168,21 @@ public class KeyguardBottomAreaView extends FrameLayout { UserHandle.CURRENT); } - private final OnClickListener mCameraClickListener = new OnClickListener() { - @Override - public void onClick(View v) { + private void launchPhone() { + mActivityStarter.startActivity(PHONE_INTENT); + } + + @Override + public void onUserActivity(long when) { + mPowerManager.userActivity(when, false); + } + + @Override + public void onActionPerformed(SwipeAffordanceView view) { + if (view == mCameraButton) { launchCamera(); + } else if (view == mPhoneButton) { + launchPhone(); } - }; - - private final OnTouchListener mCameraTouchListener = new OnTouchListener() { - private float mStartX; - private boolean mTouchSlopReached; - private boolean mSkipCancelAnimation; - - @Override - public boolean onTouch(final View cameraButtonView, MotionEvent event) { - float realX = event.getRawX(); - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - mStartX = realX; - mTouchSlopReached = false; - mSkipCancelAnimation = false; - break; - case MotionEvent.ACTION_MOVE: - if (realX > mStartX) { - realX = mStartX; - } - if (realX < mStartX - mCameraDragDistance) { - cameraButtonView.setPressed(true); - mPowerManager.userActivity(event.getEventTime(), false); - } else { - cameraButtonView.setPressed(false); - } - if (realX < mStartX - mScaledTouchSlop) { - mTouchSlopReached = true; - } - cameraButtonView.setTranslationX(Math.max(realX - mStartX, - -mCameraDragDistance)); - break; - case MotionEvent.ACTION_UP: - if (realX < mStartX - mCameraDragDistance) { - launchCamera(); - cameraButtonView.animate().x(-cameraButtonView.getWidth()) - .setInterpolator(new AccelerateInterpolator(2f)).withEndAction( - new Runnable() { - @Override - public void run() { - cameraButtonView.setTranslationX(0); - } - }); - mSkipCancelAnimation = true; - } - if (realX < mStartX - mScaledTouchSlop) { - mTouchSlopReached = true; - } - if (!mTouchSlopReached) { - mSkipCancelAnimation = true; - cameraButtonView.animate().translationX(-mCameraDragDistance / 2). - setInterpolator(new DecelerateInterpolator()).withEndAction( - new Runnable() { - @Override - public void run() { - cameraButtonView.animate().translationX(0). - setInterpolator(new AccelerateInterpolator()); - } - }); - } - case MotionEvent.ACTION_CANCEL: - cameraButtonView.setPressed(false); - if (!mSkipCancelAnimation) { - cameraButtonView.animate().translationX(0) - .setInterpolator(new AccelerateInterpolator(2f)); - } - break; - } - return true; - } - }; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 328a1728c3ed..0cdca660c5e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -623,9 +623,7 @@ public class PanelView extends FrameLayout { mExpandedHeight = mMaxPanelHeight; } } - heightMeasureSpec = MeasureSpec.makeMeasureSpec( - getDesiredMeasureHeight(), MeasureSpec.AT_MOST); - setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); + setMeasuredDimension(getMeasuredWidth(), getDesiredMeasureHeight()); } protected int getDesiredMeasureHeight() { @@ -705,11 +703,6 @@ public class PanelView extends FrameLayout { * @return the default implementation simply returns the maximum height. */ protected int getMaxPanelHeight() { - if (mMaxPanelHeight <= 0) { - if (DEBUG) logf("Forcing measure() since mMaxPanelHeight=" + mMaxPanelHeight); - measure(MeasureSpec.makeMeasureSpec(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY)); - } return mMaxPanelHeight; } 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 0db691414e6d..f945c792b620 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -124,7 +124,7 @@ import java.util.Collection; import java.util.Collections; public class PhoneStatusBar extends BaseStatusBar implements DemoMode, - DragDownHelper.OnDragDownListener { + DragDownHelper.OnDragDownListener, ActivityStarter { static final String TAG = "PhoneStatusBar"; public static final boolean DEBUG = BaseStatusBar.DEBUG; public static final boolean SPEW = false; @@ -236,7 +236,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // top bar View mNotificationPanelHeader; View mKeyguardStatusView; - View mKeyguardBottomArea; + KeyguardBottomAreaView mKeyguardBottomArea; boolean mLeaveOpenOnKeyguardHide; KeyguardIndicationTextView mKeyguardIndicationTextView; @@ -639,7 +639,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mNotificationPanelHeader = mStatusBarWindow.findViewById(R.id.header); mKeyguardStatusView = mStatusBarWindow.findViewById(R.id.keyguard_status_view); - mKeyguardBottomArea = mStatusBarWindow.findViewById(R.id.keyguard_bottom_area); + mKeyguardBottomArea = + (KeyguardBottomAreaView) mStatusBarWindow.findViewById(R.id.keyguard_bottom_area); + mKeyguardBottomArea.setActivityStarter(this); mKeyguardIndicationTextView = (KeyguardIndicationTextView) mStatusBarWindow.findViewById( R.id.keyguard_indication_text); mClearButton = mStatusBarWindow.findViewById(R.id.clear_all_button); @@ -1578,6 +1580,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return new PhoneStatusBar.H(); } + @Override + public void startActivity(Intent intent) { + startActivityDismissingKeyguard(intent, false); + } + /** * All changes to the status bar and notifications funnel through here and are batched. */ @@ -1668,6 +1675,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } public void animateCollapsePanels(int flags) { + if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) { + return; + } if (SPEW) { Log.d(TAG, "animateCollapse():" + " mExpandedVisible=" + mExpandedVisible diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 554892c24c52..e24ddd9f5af7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -205,10 +205,12 @@ public class StatusBarKeyguardViewManager { } else { mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK); } - if (!(mShowing && !mOccluded) || mBouncer.isShowing()) { - mPhoneStatusBar.getNavigationBarView().setVisibility(View.VISIBLE); - } else { - mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE); + if (mPhoneStatusBar.getNavigationBarView() != null) { + if (!(mShowing && !mOccluded) || mBouncer.isShowing()) { + mPhoneStatusBar.getNavigationBarView().setVisibility(View.VISIBLE); + } else { + mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE); + } } mPhoneStatusBar.setBouncerShowing(mBouncer.isShowing()); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index acc3a0b6e8d8..4c9264dc02db 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -108,7 +108,9 @@ public class StatusBarWindowView extends FrameLayout { boolean intercept = false; if (mNotificationPanel.isFullyExpanded() && mStackScrollLayout.getVisibility() == View.VISIBLE - && mService.getBarState() != StatusBarState.KEYGUARD) { + && (mService.getBarState() == StatusBarState.SHADE + || (mService.getBarState() == StatusBarState.SHADE_LOCKED + && !mService.isBouncerShowing()))) { intercept = mExpandHelper.onInterceptTouchEvent(ev); } else if (mNotificationPanel.isFullyExpanded() && mStackScrollLayout.getVisibility() == View.VISIBLE diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SwipeAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SwipeAffordanceView.java new file mode 100644 index 000000000000..049c5fc5786d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SwipeAffordanceView.java @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import android.content.Context; +import android.content.res.TypedArray; +import android.os.SystemClock; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.DecelerateInterpolator; +import android.widget.Button; + +import com.android.systemui.R; +import com.android.systemui.statusbar.policy.KeyButtonView; + +/** + * A swipeable button for affordances on the lockscreen. This is used for the camera and phone + * affordance. + */ +public class SwipeAffordanceView extends KeyButtonView { + + private static final int SWIPE_DIRECTION_START = 0; + private static final int SWIPE_DIRECTION_END = 1; + + private static final int SWIPE_DIRECTION_LEFT = 0; + private static final int SWIPE_DIRECTION_RIGHT = 1; + + private AffordanceListener mListener; + private int mScaledTouchSlop; + private float mDragDistance; + private int mResolvedSwipeDirection; + private int mSwipeDirection; + + public SwipeAffordanceView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SwipeAffordanceView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray a = context.getTheme().obtainStyledAttributes( + attrs, + R.styleable.SwipeAffordanceView, + 0, 0); + try { + mSwipeDirection = a.getInt(R.styleable.SwipeAffordanceView_swipeDirection, 0); + } finally { + a.recycle(); + } + } + + @Override + public void onRtlPropertiesChanged(int layoutDirection) { + super.onRtlPropertiesChanged(layoutDirection); + if (!isLayoutRtl()) { + mResolvedSwipeDirection = mSwipeDirection; + } else { + mResolvedSwipeDirection = mSwipeDirection == SWIPE_DIRECTION_START + ? SWIPE_DIRECTION_RIGHT + : SWIPE_DIRECTION_LEFT; + } + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mDragDistance = getResources().getDimension(R.dimen.affordance_drag_distance); + mScaledTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); + } + + public void enableAccessibility(boolean touchExplorationEnabled) { + + // Add a touch handler or accessibility click listener for camera button. + if (touchExplorationEnabled) { + setOnTouchListener(null); + setOnClickListener(mClickListener); + } else { + setOnTouchListener(mTouchListener); + setOnClickListener(null); + } + } + + public void setAffordanceListener(AffordanceListener listener) { + mListener = listener; + } + + private void onActionPerformed() { + if (mListener != null) { + mListener.onActionPerformed(this); + } + } + + private void onUserActivity(long when) { + if (mListener != null) { + mListener.onUserActivity(when); + } + } + + private final OnClickListener mClickListener = new OnClickListener() { + @Override + public void onClick(View v) { + onActionPerformed(); + } + }; + + private final OnTouchListener mTouchListener = new OnTouchListener() { + private float mStartX; + private boolean mTouchSlopReached; + private boolean mSkipCancelAnimation; + + @Override + public boolean onTouch(final View view, MotionEvent event) { + float realX = event.getRawX(); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mStartX = realX; + mTouchSlopReached = false; + mSkipCancelAnimation = false; + break; + case MotionEvent.ACTION_MOVE: + if (mResolvedSwipeDirection == SWIPE_DIRECTION_LEFT + ? realX > mStartX + : realX < mStartX) { + realX = mStartX; + } + if (mResolvedSwipeDirection == SWIPE_DIRECTION_LEFT + ? realX < mStartX - mDragDistance + : realX > mStartX + mDragDistance) { + view.setPressed(true); + onUserActivity(event.getEventTime()); + } else { + view.setPressed(false); + } + if (mResolvedSwipeDirection == SWIPE_DIRECTION_LEFT + ? realX < mStartX - mScaledTouchSlop + : realX > mStartX + mScaledTouchSlop) { + mTouchSlopReached = true; + } + view.setTranslationX(mResolvedSwipeDirection == SWIPE_DIRECTION_LEFT + ? Math.max(realX - mStartX, -mDragDistance) + : Math.min(realX - mStartX, mDragDistance)); + break; + case MotionEvent.ACTION_UP: + if (mResolvedSwipeDirection == SWIPE_DIRECTION_LEFT + ? realX < mStartX - mDragDistance + : realX > mStartX + mDragDistance) { + onActionPerformed(); + view.animate().x(mResolvedSwipeDirection == SWIPE_DIRECTION_LEFT + ? -view.getWidth() + : ((View) view.getParent()).getWidth() + view.getWidth()) + .setInterpolator(new AccelerateInterpolator(2f)).withEndAction( + new Runnable() { + @Override + public void run() { + view.setTranslationX(0); + } + }); + mSkipCancelAnimation = true; + } + if (mResolvedSwipeDirection == SWIPE_DIRECTION_LEFT + ? realX < mStartX - mScaledTouchSlop + : realX > mStartX + mScaledTouchSlop) { + mTouchSlopReached = true; + } + if (!mTouchSlopReached) { + mSkipCancelAnimation = true; + view.animate().translationX(mResolvedSwipeDirection == SWIPE_DIRECTION_LEFT + ? -mDragDistance / 2 + : mDragDistance / 2). + setInterpolator(new DecelerateInterpolator()).withEndAction( + new Runnable() { + @Override + public void run() { + view.animate().translationX(0). + setInterpolator(new AccelerateInterpolator()); + } + }); + } + case MotionEvent.ACTION_CANCEL: + view.setPressed(false); + if (!mSkipCancelAnimation) { + view.animate().translationX(0) + .setInterpolator(new AccelerateInterpolator(2f)); + } + break; + } + return true; + } + }; + + public interface AffordanceListener { + + /** + * Called when the view would like to report user activity. + * + * @param when The timestamp of the user activity in {@link SystemClock#uptimeMillis} time + * base. + */ + void onUserActivity(long when); + + /** + * Called when the action of the affordance has been performed. + */ + void onActionPerformed(SwipeAffordanceView view); + } +} diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 50e2a2ea1b5d..b1fea03e5a31 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -3560,15 +3560,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { swipeDismiss.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() { @Override public void onDismissed(SwipeDismissLayout layout) { - Callback cb = getCallback(); - if (cb != null) { - try { - cb.onWindowDismissed(); - } catch (AbstractMethodError e) { - Log.e(TAG, "onWindowDismissed not implemented in " + - cb.getClass().getSimpleName(), e); - } - } + dispatchOnWindowDismissed(); } }); swipeDismiss.setOnSwipeProgressChangedListener( diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags index 5083d44d2d82..6fab37c27515 100644 --- a/services/core/java/com/android/server/EventLogTags.logtags +++ b/services/core/java/com/android/server/EventLogTags.logtags @@ -65,6 +65,8 @@ option java_package com.android.server 27501 notification_panel_hidden # when notifications are newly displayed on screen, or disappear from screen 27510 notification_visibility_changed (newlyVisibleKeys|3),(noLongerVisibleKeys|3) +# when a notification has been clicked +27520 notification_clicked (key|3) # --------------------------- # Watchdog.java diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index 6fc3e7706c0e..7ed1cc7b1f0f 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -1548,7 +1548,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mImeSwitcherNotification.setLatestEventInfo( mContext, title, summary, mImeSwitchPendingIntent); - if (mNotificationManager != null) { + if ((mNotificationManager != null) + && !mWindowManagerService.hasNavigationBar()) { if (DEBUG) { Slog.d(TAG, "--- show notification: label = " + summary); } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index f506eab6bbdf..7c3f28874ff3 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -480,7 +480,7 @@ final class ActivityRecord { void setTask(TaskRecord newTask, ThumbnailHolder newThumbHolder, boolean isRoot) { if (task != null && task.removeActivity(this)) { if (task != newTask) { - task.stack.removeTask(task); + task.stack.removeTask(task, false); } else { Slog.d(TAG, "!!! REMOVE THIS LOG !!! setTask: nearly removed stack=" + (newTask == null ? null : newTask.stack)); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index d5ab277559bc..ee39b67dfc2b 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2841,7 +2841,7 @@ final class ActivityStack { if (mStackSupervisor.isFrontStack(this) && task == topTask() && task.mOnTopOfHome) { mStackSupervisor.moveHomeToTop(); } - removeTask(task); + removeTask(task, false); } cleanUpActivityServicesLocked(r); r.removeUriPermissionsLocked(); @@ -3717,7 +3717,7 @@ final class ActivityStack { return starting; } - void removeTask(TaskRecord task) { + void removeTask(TaskRecord task, boolean moving) { mStackSupervisor.endLockTaskModeIfTaskEnding(task); mWindowManager.removeTask(task.taskId); final ActivityRecord r = mResumedActivity; @@ -3731,9 +3731,13 @@ final class ActivityStack { mTaskHistory.get(taskNdx + 1).mOnTopOfHome = true; } mTaskHistory.remove(task); - if (task.voiceInteractor != null) { + if (!moving && task.voiceSession != null) { // This task was a voice interaction, so it should not remain on the // recent tasks list. + try { + task.voiceSession.taskFinished(task.intent, task.taskId); + } catch (RemoteException e) { + } mService.mRecentTasks.remove(task); } @@ -3753,7 +3757,7 @@ final class ActivityStack { IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, boolean toTop) { TaskRecord task = new TaskRecord(taskId, info, intent, voiceSession, voiceInteractor); - addTask(task, toTop); + addTask(task, toTop, false); return task; } @@ -3761,13 +3765,19 @@ final class ActivityStack { return new ArrayList<TaskRecord>(mTaskHistory); } - void addTask(final TaskRecord task, final boolean toTop) { + void addTask(final TaskRecord task, final boolean toTop, boolean moving) { task.stack = this; if (toTop) { insertTaskAtTop(task); } else { mTaskHistory.add(0, task); } + if (!moving && task.voiceSession != null) { + try { + task.voiceSession.taskStarted(task.intent, task.taskId); + } catch (RemoteException e) { + } + } } public int getStackId() { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 9107cb6d9eae..2e979d28cc7b 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2237,8 +2237,8 @@ public final class ActivityStackSupervisor implements DisplayListener { Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); return; } - task.stack.removeTask(task); - stack.addTask(task, toTop); + task.stack.removeTask(task, true); + stack.addTask(task, toTop, true); mWindowManager.addTask(taskId, stackId, toTop); resumeTopActivitiesLocked(); } @@ -3119,7 +3119,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } } ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, null, userId); - if ((aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) { + if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) { throw new SecurityException( "Attempt to embed activity that has not set allowEmbedded=\"true\""); } @@ -3238,9 +3238,9 @@ public final class ActivityStackSupervisor implements DisplayListener { } else { mContainerState = CONTAINER_STATE_NO_SURFACE; ((VirtualActivityDisplay) mActivityDisplay).setSurface(null); -// if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) { -// mStack.startPausingLocked(false, true); -// } + if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) { + mStack.startPausingLocked(false, true); + } } setSurfaceIfReady(); @@ -3250,6 +3250,11 @@ public final class ActivityStackSupervisor implements DisplayListener { } @Override + boolean isAttached() { + return mSurface != null && super.isAttached(); + } + + @Override void setDrawn() { synchronized (mService) { mDrawn = true; diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 83e8a4ba1122..dd12a659e3e6 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -230,10 +230,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub { } } - public void noteScreenOn() { + public void noteScreenState(int state) { enforceCallingPermission(); synchronized (mStats) { - mStats.noteScreenOnLocked(); + mStats.noteScreenStateLocked(state); } } @@ -244,22 +244,17 @@ public final class BatteryStatsService extends IBatteryStats.Stub { } } - public void noteScreenOff() { + public void noteUserActivity(int uid, int event) { enforceCallingPermission(); synchronized (mStats) { - mStats.noteScreenOffLocked(); + mStats.noteUserActivityLocked(uid, event); } } - - public void noteInputEvent() { - enforceCallingPermission(); - mStats.noteInputEventAtomic(); - } - public void noteUserActivity(int uid, int event) { + public void noteInteractive(boolean interactive) { enforceCallingPermission(); synchronized (mStats) { - mStats.noteUserActivityLocked(uid, event); + mStats.noteInteractiveLocked(interactive); } } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 1f38eb67bfe2..3ae0fd54ab9f 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -393,11 +393,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Initialize screen state for battery stats. try { - if (mPowerState.getScreenState() != Display.STATE_OFF) { - mBatteryStats.noteScreenOn(); - } else { - mBatteryStats.noteScreenOff(); - } + mBatteryStats.noteScreenState(mPowerState.getScreenState()); mBatteryStats.noteScreenBrightness(mPowerState.getScreenBrightness()); } catch (RemoteException ex) { // same process @@ -641,11 +637,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mPowerState.getScreenState() != state) { mPowerState.setScreenState(state); try { - if (state != Display.STATE_OFF) { - mBatteryStats.noteScreenOn(); - } else { - mBatteryStats.noteScreenOff(); - } + mBatteryStats.noteScreenState(state); } catch (RemoteException ex) { // same process } diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 91afec7c9b77..7f43e43dd8a9 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -21,6 +21,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.SystemProperties; +import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.DisplayEventReceiver; @@ -47,8 +48,6 @@ final class LocalDisplayAdapter extends DisplayAdapter { new SparseArray<LocalDisplayDevice>(); private HotplugDisplayEventReceiver mHotplugReceiver; - private final SurfaceControl.PhysicalDisplayInfo mTempPhys = new SurfaceControl.PhysicalDisplayInfo(); - // Called with SyncRoot lock held. public LocalDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener) { @@ -68,14 +67,31 @@ final class LocalDisplayAdapter extends DisplayAdapter { private void tryConnectDisplayLocked(int builtInDisplayId) { IBinder displayToken = SurfaceControl.getBuiltInDisplay(builtInDisplayId); - if (displayToken != null && SurfaceControl.getDisplayInfo(displayToken, mTempPhys)) { + if (displayToken != null) { + SurfaceControl.PhysicalDisplayInfo[] configs = + SurfaceControl.getDisplayConfigs(displayToken); + if (configs == null) { + // There are no valid configs for this device, so we can't use it + Slog.w(TAG, "No valid configs found for display device " + + builtInDisplayId); + return; + } + int activeConfig = SurfaceControl.getActiveConfig(displayToken); + if (activeConfig < 0) { + // There is no active config, and for now we don't have the + // policy to set one. + Slog.w(TAG, "No active config found for display device " + + builtInDisplayId); + return; + } LocalDisplayDevice device = mDevices.get(builtInDisplayId); if (device == null) { // Display was added. - device = new LocalDisplayDevice(displayToken, builtInDisplayId, mTempPhys); + device = new LocalDisplayDevice(displayToken, builtInDisplayId, + configs[activeConfig]); mDevices.put(builtInDisplayId, device); sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED); - } else if (device.updatePhysicalDisplayInfoLocked(mTempPhys)) { + } else if (device.updatePhysicalDisplayInfoLocked(configs[activeConfig])) { // Display properties changed. sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED); } @@ -228,4 +244,4 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } } -}
\ No newline at end of file +} diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java index a165f26248ad..14ef5a9162b4 100644 --- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java +++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java @@ -146,9 +146,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter { @Override public void performTraversalInTransactionLocked() { - if (mSurface != null) { - setSurfaceInTransactionLocked(mSurface); - } + setSurfaceInTransactionLocked(mSurface); } public void setSurfaceLocked(Surface surface) { diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java index ce4c1ed98e37..b41b47815c73 100644 --- a/services/core/java/com/android/server/notification/NotificationDelegate.java +++ b/services/core/java/com/android/server/notification/NotificationDelegate.java @@ -21,8 +21,7 @@ import android.os.IBinder; public interface NotificationDelegate { void onSetDisabled(int status); void onClearAll(int callingUid, int callingPid, int userId); - void onNotificationClick(int callingUid, int callingPid, - String pkg, String tag, int id, int userId); + void onNotificationClick(int callingUid, int callingPid, String key); void onNotificationClear(int callingUid, int callingPid, String pkg, String tag, int id, int userId); void onNotificationError(int callingUid, int callingPid, diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 6ceee5c1114c..7aa5d7907960 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -602,10 +602,20 @@ public class NotificationManagerService extends SystemService { } @Override - public void onNotificationClick(int callingUid, int callingPid, - String pkg, String tag, int id, int userId) { - cancelNotification(callingUid, callingPid, pkg, tag, id, Notification.FLAG_AUTO_CANCEL, - Notification.FLAG_FOREGROUND_SERVICE, false, userId, REASON_DELEGATE_CLICK, null); + public void onNotificationClick(int callingUid, int callingPid, String key) { + synchronized (mNotificationList) { + EventLogTags.writeNotificationClicked(key); + NotificationRecord r = mNotificationsByKey.get(key); + if (r == null) { + Log.w(TAG, "No notification with key: " + key); + return; + } + StatusBarNotification sbn = r.sbn; + cancelNotification(callingUid, callingPid, sbn.getPackageName(), sbn.getTag(), + sbn.getId(), Notification.FLAG_AUTO_CANCEL, + Notification.FLAG_FOREGROUND_SERVICE, false, r.getUserId(), + REASON_DELEGATE_CLICK, null); + } } @Override diff --git a/services/core/java/com/android/server/pm/ForwardingIntentFilter.java b/services/core/java/com/android/server/pm/ForwardingIntentFilter.java index aba796b230ca..85bde9835ae4 100644 --- a/services/core/java/com/android/server/pm/ForwardingIntentFilter.java +++ b/services/core/java/com/android/server/pm/ForwardingIntentFilter.java @@ -32,22 +32,29 @@ import android.os.UserHandle; */ class ForwardingIntentFilter extends IntentFilter { private static final String ATTR_USER_ID_DEST = "userIdDest"; + private static final String ATTR_REMOVABLE = "removable"; private static final String ATTR_FILTER = "filter"; private static final String TAG = "ForwardingIntentFilter"; // If the intent matches the IntentFilter, then it can be forwarded to this userId. final int mUserIdDest; + boolean mRemovable; - ForwardingIntentFilter(IntentFilter filter, int userIdDest) { + ForwardingIntentFilter(IntentFilter filter, boolean removable, int userIdDest) { super(filter); mUserIdDest = userIdDest; + mRemovable = removable; } public int getUserIdDest() { return mUserIdDest; } + public boolean isRemovable() { + return mRemovable; + } + ForwardingIntentFilter(XmlPullParser parser) throws XmlPullParserException, IOException { String userIdDestString = parser.getAttributeValue(null, ATTR_USER_ID_DEST); if (userIdDestString == null) { @@ -58,6 +65,10 @@ class ForwardingIntentFilter extends IntentFilter { } else { mUserIdDest = Integer.parseInt(userIdDestString); } + String removableString = parser.getAttributeValue(null, ATTR_REMOVABLE); + if (removableString != null) { + mRemovable = Boolean.parseBoolean(removableString); + } int outerDepth = parser.getDepth(); String tagName = parser.getName(); int type; @@ -89,6 +100,7 @@ class ForwardingIntentFilter extends IntentFilter { public void writeToXml(XmlSerializer serializer) throws IOException { serializer.attribute(null, ATTR_USER_ID_DEST, Integer.toString(mUserIdDest)); + serializer.attribute(null, ATTR_REMOVABLE, Boolean.toString(mRemovable)); serializer.startTag(null, ATTR_FILTER); super.writeToXml(serializer); serializer.endTag(null, ATTR_FILTER); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a133d427c661..6a843a8d99f7 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -11112,42 +11112,32 @@ public class PackageManagerService extends IPackageManager.Stub { } } - /* - * For filters that are added with this method: - * if an intent for the user whose id is userIdOrig matches the filter, then this intent can - * also be resolved in the user whose id is userIdDest. - */ @Override - public void addForwardingIntentFilter(IntentFilter filter, int userIdOrig, int userIdDest) { - int callingUid = Binder.getCallingUid(); - if (callingUid != Process.SYSTEM_UID) { - throw new SecurityException( - "addForwardingIntentFilter can only be run by the system"); - } + public void addForwardingIntentFilter(IntentFilter filter, boolean removable, int userIdOrig, + int userIdDest) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); if (filter.countActions() == 0) { Slog.w(TAG, "Cannot set a forwarding intent filter with no filter actions"); return; } synchronized (mPackages) { mSettings.editForwardingIntentResolverLPw(userIdOrig).addFilter( - new ForwardingIntentFilter(filter, userIdDest)); + new ForwardingIntentFilter(filter, removable, userIdDest)); mSettings.writePackageRestrictionsLPr(userIdOrig); } } @Override public void clearForwardingIntentFilters(int userIdOrig) { - int callingUid = Binder.getCallingUid(); - if (callingUid != Process.SYSTEM_UID) { - throw new SecurityException( - "clearForwardingIntentFilter can only be run by the system"); - } + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); synchronized (mPackages) { ForwardingIntentResolver fir = mSettings.editForwardingIntentResolverLPw(userIdOrig); HashSet<ForwardingIntentFilter> set = new HashSet<ForwardingIntentFilter>(fir.filterSet()); for (ForwardingIntentFilter fif : set) { - fir.removeFilter(fif); + if (fif.isRemovable()) fir.removeFilter(fif); } mSettings.writePackageRestrictionsLPr(userIdOrig); } diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index d9e95c7595e5..2d6cc7c97c63 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -132,6 +132,11 @@ final class Notifier { mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF); mScreenOffIntent.addFlags( Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); + + // Initialize interactive state for battery stats. + try { + mBatteryStats.noteInteractive(true); + } catch (RemoteException ex) { } } /** @@ -259,7 +264,14 @@ final class Notifier { // Going to sleep... mLastGoToSleepReason = reason; } - mInputManagerInternal.setInteractive(interactive); + } + + mInputManagerInternal.setInteractive(interactive); + + if (interactive) { + try { + mBatteryStats.noteInteractive(true); + } catch (RemoteException ex) { } } } @@ -289,6 +301,12 @@ final class Notifier { } } } + + if (!interactive) { + try { + mBatteryStats.noteInteractive(false); + } catch (RemoteException ex) { } + } } /** diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 91f796be2b67..022bdae3997a 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -546,13 +546,13 @@ public class StatusBarManagerService extends IStatusBarService.Stub } @Override - public void onNotificationClick(String pkg, String tag, int id, int userId) { + public void onNotificationClick(String key) { enforceStatusBarService(); final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); long identity = Binder.clearCallingIdentity(); try { - mNotificationDelegate.onNotificationClick(callingUid, callingPid, pkg, tag, id, userId); + mNotificationDelegate.onNotificationClick(callingUid, callingPid, key); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index d0a6db143fe3..7a0d1c7c05fd 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -3082,7 +3082,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - public void forwardMatchingIntents(ComponentName who, IntentFilter filter, int flags) { + public void addForwardingIntentFilter(ComponentName who, IntentFilter filter, int flags) { int callingUserId = UserHandle.getCallingUserId(); synchronized (this) { if (who == null) { @@ -3094,10 +3094,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = Binder.clearCallingIdentity(); try { if ((flags & DevicePolicyManager.FLAG_TO_PRIMARY_USER) != 0) { - pm.addForwardingIntentFilter(filter, callingUserId, UserHandle.USER_OWNER); + pm.addForwardingIntentFilter(filter, true /*removable*/, callingUserId, + UserHandle.USER_OWNER); } if ((flags & DevicePolicyManager.FLAG_TO_MANAGED_PROFILE) != 0) { - pm.addForwardingIntentFilter(filter, UserHandle.USER_OWNER, callingUserId); + pm.addForwardingIntentFilter(filter, true /*removable*/, UserHandle.USER_OWNER, + callingUserId); } } catch (RemoteException re) { // Shouldn't happen diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 045c0f648e76..16afc8fb0961 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -28,6 +28,8 @@ import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.Parcel; +import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.service.voice.IVoiceInteractionService; @@ -88,6 +90,21 @@ public class VoiceInteractionManagerService extends SystemService { private boolean mSafeMode; private int mCurUser; + @Override + public boolean onTransact(int code, Parcel data, Parcel reply, int flags) + throws RemoteException { + try { + return super.onTransact(code, data, reply, flags); + } catch (RuntimeException e) { + // The activity manager only throws security exceptions, so let's + // log all others. + if (!(e instanceof SecurityException)) { + Slog.wtf(TAG, "VoiceInteractionManagerService Crash", e); + } + throw e; + } + } + public void systemRunning(boolean safeMode) { mSafeMode = safeMode; @@ -97,18 +114,18 @@ public class VoiceInteractionManagerService extends SystemService { synchronized (this) { mCurUser = ActivityManager.getCurrentUser(); - switchImplementationIfNeededLocked(); + switchImplementationIfNeededLocked(false); } } public void switchUser(int userHandle) { synchronized (this) { mCurUser = userHandle; - switchImplementationIfNeededLocked(); + switchImplementationIfNeededLocked(false); } } - void switchImplementationIfNeededLocked() { + void switchImplementationIfNeededLocked(boolean force) { if (!mSafeMode) { String curService = Settings.Secure.getStringForUser( mResolver, Settings.Secure.VOICE_INTERACTION_SERVICE, mCurUser); @@ -121,7 +138,7 @@ public class VoiceInteractionManagerService extends SystemService { serviceComponent = null; } } - if (mImpl == null || mImpl.mUser != mCurUser + if (force || mImpl == null || mImpl.mUser != mCurUser || !mImpl.mComponent.equals(serviceComponent)) { if (mImpl != null) { mImpl.shutdownLocked(); @@ -138,10 +155,10 @@ public class VoiceInteractionManagerService extends SystemService { } @Override - public void startVoiceActivity(Intent intent, String resolvedType, - IVoiceInteractionService service, Bundle args) { + public void startSession(IVoiceInteractionService service, Bundle args) { synchronized (this) { - if (mImpl == null || service.asBinder() != mImpl.mService.asBinder()) { + if (mImpl == null || mImpl.mService == null + || service.asBinder() != mImpl.mService.asBinder()) { throw new SecurityException( "Caller is not the current voice interaction service"); } @@ -149,8 +166,7 @@ public class VoiceInteractionManagerService extends SystemService { final int callingUid = Binder.getCallingUid(); final long caller = Binder.clearCallingIdentity(); try { - mImpl.startVoiceActivityLocked(callingPid, callingUid, - intent, resolvedType, args); + mImpl.startSessionLocked(callingPid, callingUid, args); } finally { Binder.restoreCallingIdentity(caller); } @@ -158,12 +174,12 @@ public class VoiceInteractionManagerService extends SystemService { } @Override - public int deliverNewSession(IBinder token, IVoiceInteractionSession session, + public boolean deliverNewSession(IBinder token, IVoiceInteractionSession session, IVoiceInteractor interactor) { synchronized (this) { if (mImpl == null) { - Slog.w(TAG, "deliverNewSession without running voice interaction service"); - return ActivityManager.START_CANCELED; + throw new SecurityException( + "deliverNewSession without running voice interaction service"); } final int callingPid = Binder.getCallingPid(); final int callingUid = Binder.getCallingUid(); @@ -175,7 +191,43 @@ public class VoiceInteractionManagerService extends SystemService { Binder.restoreCallingIdentity(caller); } } + } + @Override + public int startVoiceActivity(IBinder token, Intent intent, String resolvedType) { + synchronized (this) { + if (mImpl == null) { + Slog.w(TAG, "startVoiceActivity without running voice interaction service"); + return ActivityManager.START_CANCELED; + } + final int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); + final long caller = Binder.clearCallingIdentity(); + try { + return mImpl.startVoiceActivityLocked(callingPid, callingUid, token, + intent, resolvedType); + } finally { + Binder.restoreCallingIdentity(caller); + } + } + } + + @Override + public void finish(IBinder token) { + synchronized (this) { + if (mImpl == null) { + Slog.w(TAG, "finish without running voice interaction service"); + return; + } + final int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); + final long caller = Binder.clearCallingIdentity(); + try { + mImpl.finishLocked(callingPid, callingUid, token); + } finally { + Binder.restoreCallingIdentity(caller); + } + } } @Override @@ -207,7 +259,7 @@ public class VoiceInteractionManagerService extends SystemService { @Override public void onChange(boolean selfChange) { synchronized (VoiceInteractionManagerServiceStub.this) { - switchImplementationIfNeededLocked(); + switchImplementationIfNeededLocked(false); } } } @@ -220,27 +272,25 @@ public class VoiceInteractionManagerService extends SystemService { @Override public void onHandleUserStop(Intent intent, int userHandle) { - super.onHandleUserStop(intent, userHandle); } @Override public void onPackageDisappeared(String packageName, int reason) { - super.onPackageDisappeared(packageName, reason); } @Override public void onPackageAppeared(String packageName, int reason) { - super.onPackageAppeared(packageName, reason); + if (mImpl != null && packageName.equals(mImpl.mComponent.getPackageName())) { + switchImplementationIfNeededLocked(true); + } } @Override public void onPackageModified(String packageName) { - super.onPackageModified(packageName); } @Override public void onSomePackagesChanged() { - super.onSomePackagesChanged(); } }; } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 6bbd1c198e20..9b6daad47717 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -19,9 +19,11 @@ package com.android.server.voiceinteraction; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.IActivityManager; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; @@ -30,6 +32,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UserHandle; import android.service.voice.IVoiceInteractionService; import android.service.voice.IVoiceInteractionSession; @@ -37,6 +40,8 @@ import android.service.voice.IVoiceInteractionSessionService; import android.service.voice.VoiceInteractionService; import android.service.voice.VoiceInteractionServiceInfo; import android.util.Slog; +import android.view.IWindowManager; +import android.view.WindowManager; import com.android.internal.app.IVoiceInteractor; import java.io.FileDescriptor; @@ -55,11 +60,28 @@ class VoiceInteractionManagerServiceImpl { final IActivityManager mAm; final VoiceInteractionServiceInfo mInfo; final ComponentName mSessionComponentName; + final IWindowManager mIWindowManager; boolean mBound = false; IVoiceInteractionService mService; SessionConnection mActiveSession; + final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { + synchronized (mLock) { + if (mActiveSession != null && mActiveSession.mSession != null) { + try { + mActiveSession.mSession.closeSystemDialogs(); + } catch (RemoteException e) { + } + } + } + } + } + }; + final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { @@ -76,23 +98,26 @@ class VoiceInteractionManagerServiceImpl { final class SessionConnection implements ServiceConnection { final IBinder mToken = new Binder(); - final Intent mIntent; - final String mResolvedType; final Bundle mArgs; boolean mBound; IVoiceInteractionSessionService mService; IVoiceInteractionSession mSession; IVoiceInteractor mInteractor; - SessionConnection(Intent intent, String resolvedType, Bundle args) { - mIntent = intent; - mResolvedType = resolvedType; + SessionConnection(Bundle args) { mArgs = args; Intent serviceIntent = new Intent(VoiceInteractionService.SERVICE_INTERFACE); serviceIntent.setComponent(mSessionComponentName); mBound = mContext.bindServiceAsUser(serviceIntent, this, Context.BIND_AUTO_CREATE, new UserHandle(mUser)); - if (!mBound) { + if (mBound) { + try { + mIWindowManager.addWindowToken(mToken, + WindowManager.LayoutParams.TYPE_INPUT_METHOD); + } catch (RemoteException e) { + Slog.w(TAG, "Failed adding window token", e); + } + } else { Slog.w(TAG, "Failed binding to voice interaction session service " + mComponent); } } @@ -105,7 +130,7 @@ class VoiceInteractionManagerServiceImpl { try { mService.newSession(mToken, mArgs); } catch (RemoteException e) { - Slog.w(TAG, "Failed making new session", e); + Slog.w(TAG, "Failed adding window token", e); } } } @@ -118,7 +143,19 @@ class VoiceInteractionManagerServiceImpl { public void cancel() { if (mBound) { + if (mSession != null) { + try { + mSession.destroy(); + } catch (RemoteException e) { + Slog.w(TAG, "Voice interation session already dead"); + } + } mContext.unbindService(this); + try { + mIWindowManager.removeWindowToken(mToken); + } catch (RemoteException e) { + Slog.w(TAG, "Failed removing window token", e); + } mBound = false; mService = null; mSession = null; @@ -128,8 +165,6 @@ class VoiceInteractionManagerServiceImpl { public void dump(String prefix, PrintWriter pw) { pw.print(prefix); pw.print("mToken="); pw.println(mToken); - pw.print(prefix); pw.print("mIntent="); pw.println(mIntent); - pw.print(" mResolvedType="); pw.println(mResolvedType); pw.print(prefix); pw.print("mArgs="); pw.println(mArgs); pw.print(prefix); pw.print("mBound="); pw.println(mBound); if (mBound) { @@ -155,6 +190,7 @@ class VoiceInteractionManagerServiceImpl { Slog.w(TAG, "Voice interaction service not found: " + service); mInfo = null; mSessionComponentName = null; + mIWindowManager = null; mValid = false; return; } @@ -162,43 +198,67 @@ class VoiceInteractionManagerServiceImpl { if (mInfo.getParseError() != null) { Slog.w(TAG, "Bad voice interaction service: " + mInfo.getParseError()); mSessionComponentName = null; + mIWindowManager = null; mValid = false; return; } mValid = true; mSessionComponentName = new ComponentName(service.getPackageName(), mInfo.getSessionService()); + mIWindowManager = IWindowManager.Stub.asInterface( + ServiceManager.getService(Context.WINDOW_SERVICE)); + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + mContext.registerReceiver(mBroadcastReceiver, filter, null, handler); } - public void startVoiceActivityLocked(int callingPid, int callingUid, Intent intent, - String resolvedType, Bundle args) { + public void startSessionLocked(int callingPid, int callingUid, Bundle args) { if (mActiveSession != null) { mActiveSession.cancel(); mActiveSession = null; } - mActiveSession = new SessionConnection(intent, resolvedType, args); - intent.addCategory(Intent.CATEGORY_VOICE); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + mActiveSession = new SessionConnection(args); } - public int deliverNewSessionLocked(int callingPid, int callingUid, IBinder token, + public boolean deliverNewSessionLocked(int callingPid, int callingUid, IBinder token, IVoiceInteractionSession session, IVoiceInteractor interactor) { + if (mActiveSession == null || token != mActiveSession.mToken) { + Slog.w(TAG, "deliverNewSession does not match active session"); + return false; + } + mActiveSession.mSession = session; + mActiveSession.mInteractor = interactor; + return true; + } + + public int startVoiceActivityLocked(int callingPid, int callingUid, IBinder token, + Intent intent, String resolvedType) { try { if (mActiveSession == null || token != mActiveSession.mToken) { - Slog.w(TAG, "deliverNewSession does not match active session"); + Slog.w(TAG, "startVoiceActivity does not match active session"); return ActivityManager.START_CANCELED; } - mActiveSession.mSession = session; - mActiveSession.mInteractor = interactor; + intent = new Intent(intent); + intent.addCategory(Intent.CATEGORY_VOICE); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); return mAm.startVoiceActivity(mComponent.getPackageName(), callingPid, callingUid, - mActiveSession.mIntent, mActiveSession.mResolvedType, - mActiveSession.mSession, mActiveSession.mInteractor, + intent, resolvedType, mActiveSession.mSession, mActiveSession.mInteractor, 0, null, null, null, mUser); } catch (RemoteException e) { throw new IllegalStateException("Unexpected remote error", e); } } + + public void finishLocked(int callingPid, int callingUid, IBinder token) { + if (mActiveSession == null || token != mActiveSession.mToken) { + Slog.w(TAG, "finish does not match active session"); + return; + } + mActiveSession.cancel(); + mActiveSession = null; + } + public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) { if (!mValid) { pw.print(" NOT VALID: "); @@ -234,5 +294,8 @@ class VoiceInteractionManagerServiceImpl { mContext.unbindService(mConnection); mBound = false; } + if (mValid) { + mContext.unregisterReceiver(mBroadcastReceiver); + } } } diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 992ef4b6f7da..a016933c079a 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -701,4 +701,21 @@ public class MockPackageManager extends PackageManager { VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) { throw new UnsupportedOperationException(); } + + /** + * @hide + */ + @Override + public void addForwardingIntentFilter(IntentFilter filter, boolean removable, int userIdOrig, + int userIdDest) { + throw new UnsupportedOperationException(); + } + + /** + * @hide + */ + @Override + public void clearForwardingIntentFilters(int userIdOrig) { + throw new UnsupportedOperationException(); + } } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java index f060bc848a01..5c273de13346 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/CirclePropActivity.java @@ -27,6 +27,9 @@ import android.os.Trace; import android.view.HardwareCanvas; import android.view.RenderNodeAnimator; import android.view.View; +import android.webkit.WebChromeClient; +import android.webkit.WebView; +import android.webkit.WebViewClient; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.ProgressBar; @@ -43,6 +46,12 @@ public class CirclePropActivity extends Activity { ProgressBar spinner = new ProgressBar(this, null, android.R.attr.progressBarStyleLarge); layout.addView(spinner, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + // For testing with a functor in the tree +// WebView wv = new WebView(this); +// wv.setWebViewClient(new WebViewClient()); +// wv.setWebChromeClient(new WebChromeClient()); +// wv.loadUrl("http://theverge.com"); +// layout.addView(wv, new LayoutParams(LayoutParams.MATCH_PARENT, 100)); layout.addView(new CircleView(this), new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); diff --git a/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawable01.java b/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawable01.java index 88ae398ad9f6..7ba01b1359e0 100644 --- a/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawable01.java +++ b/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawable01.java @@ -22,7 +22,7 @@ import android.widget.Button; import android.widget.GridLayout; @SuppressWarnings({"UnusedDeclaration"}) -public class VectorDrawable01 extends Activity implements View.OnClickListener { +public class VectorDrawable01 extends Activity { private static final String LOGCAT = "VectorDrawable1"; int[] icon = { R.drawable.vector_drawable01, @@ -61,28 +61,10 @@ public class VectorDrawable01 extends Activity implements View.OnClickListener { button.setWidth(200); button.setBackgroundResource(icon[i]); container.addView(button); - button.setOnClickListener(this); } - Button b = new Button(this); - b.setText("Run All"); - b.setOnClickListener(new View.OnClickListener(){ - @Override - public void onClick(View v) { - for (int i = 0; i < bArray.length; i++) { - VectorDrawable d = (VectorDrawable) bArray[i].getBackground(); - d.start(); - } - }}); - container.addView(b); setContentView(container); } - @Override - public void onClick(View v) { - VectorDrawable d = (VectorDrawable) v.getBackground(); - d.start(); - } - } diff --git a/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawablePerformance.java b/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawablePerformance.java index 39292980d86c..b918cdd6016d 100644 --- a/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawablePerformance.java +++ b/tests/VectorDrawableTest/src/com/android/test/dynamic/VectorDrawablePerformance.java @@ -25,7 +25,7 @@ import android.widget.ScrollView; import java.text.DecimalFormat; @SuppressWarnings({"UnusedDeclaration"}) -public class VectorDrawablePerformance extends Activity implements View.OnClickListener { +public class VectorDrawablePerformance extends Activity { private static final String LOGCAT = "VectorDrawable1"; protected int[] icon = { R.drawable.vector_drawable01, @@ -76,7 +76,6 @@ public class VectorDrawablePerformance extends Activity implements View.OnClickL button.setWidth(200); button.setBackgroundResource(icon[i]); container.addView(button); - button.setOnClickListener(this); } setContentView(scrollView); time = android.os.SystemClock.elapsedRealtimeNanos()-time; @@ -85,10 +84,4 @@ public class VectorDrawablePerformance extends Activity implements View.OnClickL t.setBackgroundColor(0xFF000000); container.addView(t); } - - @Override - public void onClick(View v) { - VectorDrawable d = (VectorDrawable) v.getBackground(); - d.start(); - } } diff --git a/tests/VoiceInteraction/res/layout/voice_interaction_session.xml b/tests/VoiceInteraction/res/layout/voice_interaction_session.xml new file mode 100644 index 000000000000..9fcbf3e2d9ee --- /dev/null +++ b/tests/VoiceInteraction/res/layout/voice_interaction_session.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:background="#ffffffff" + > + + <TextView android:id="@+id/text" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="32dp" + /> + + <Button android:id="@+id/start" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/start" + /> + +</LinearLayout> + + diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java index 008d97b67622..d40b05f15cb0 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java @@ -17,6 +17,7 @@ package com.android.test.voiceinteraction; import android.content.Intent; +import android.os.Bundle; import android.service.voice.VoiceInteractionService; import android.util.Log; @@ -31,7 +32,9 @@ public class MainInteractionService extends VoiceInteractionService { @Override public int onStartCommand(Intent intent, int flags, int startId) { - startVoiceActivity(new Intent(this, TestInteractionActivity.class), null); + Bundle args = new Bundle(); + args.putParcelable("intent", new Intent(this, TestInteractionActivity.class)); + startSession(args); stopSelf(startId); return START_NOT_STICKY; } diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java index 0fc563b38a35..a3af28494c60 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java @@ -17,18 +17,59 @@ package com.android.test.voiceinteraction; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.service.voice.VoiceInteractionSession; import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; -public class MainInteractionSession extends VoiceInteractionSession { +public class MainInteractionSession extends VoiceInteractionSession + implements View.OnClickListener { static final String TAG = "MainInteractionSession"; - final Bundle mArgs; + Intent mStartIntent; + View mContentView; + TextView mText; + Button mStartButton; - MainInteractionSession(Context context, Bundle args) { + Request mPendingRequest; + boolean mPendingConfirm; + + MainInteractionSession(Context context) { super(context); - mArgs = args; + } + + @Override + public void onCreate(Bundle args) { + super.onCreate(args); + showWindow(); + mStartIntent = args.getParcelable("intent"); + } + + @Override + public View onCreateContentView() { + mContentView = getLayoutInflater().inflate(R.layout.voice_interaction_session, null); + mText = (TextView)mContentView.findViewById(R.id.text); + mStartButton = (Button)mContentView.findViewById(R.id.start); + mStartButton.setOnClickListener(this); + return mContentView; + } + + public void onClick(View v) { + if (mPendingRequest == null) { + mStartButton.setEnabled(false); + startVoiceActivity(mStartIntent); + } else { + if (mPendingConfirm) { + mPendingRequest.sendConfirmResult(true, null); + } else { + mPendingRequest.sendCommandResult(true, null); + } + mPendingRequest = null; + mStartButton.setText("Start"); + } } @Override @@ -38,14 +79,22 @@ public class MainInteractionSession extends VoiceInteractionSession { @Override public void onConfirm(Caller caller, Request request, String prompt, Bundle extras) { - Log.i(TAG, "onConform: prompt=" + prompt + " extras=" + extras); - request.sendConfirmResult(true, null); + Log.i(TAG, "onConfirm: prompt=" + prompt + " extras=" + extras); + mText.setText(prompt); + mStartButton.setEnabled(true); + mStartButton.setText("Confirm"); + mPendingRequest = request; + mPendingConfirm = true; } @Override public void onCommand(Caller caller, Request request, String command, Bundle extras) { Log.i(TAG, "onCommand: command=" + command + " extras=" + extras); - request.sendCommandResult(true, null); + mText.setText("Command: " + command); + mStartButton.setEnabled(true); + mStartButton.setText("Finish Command"); + mPendingRequest = request; + mPendingConfirm = false; } @Override diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSessionService.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSessionService.java index 8864d7167371..7cf81788cb6e 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSessionService.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSessionService.java @@ -23,6 +23,6 @@ import android.service.voice.VoiceInteractionSessionService; public class MainInteractionSessionService extends VoiceInteractionSessionService { @Override public VoiceInteractionSession onNewSession(Bundle args) { - return new MainInteractionSession(this, args); + return new MainInteractionSession(this); } } diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index d0581f687d16..1348be356bf8 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -1261,12 +1261,13 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets) while ((err=it.next()) == NO_ERROR) { String8 src = it.getFile()->getPrintableSource(); err = compileXmlFile(assets, it.getFile(), &table, xmlFlags); - if (err != NO_ERROR) { + if (err == NO_ERROR) { + ResXMLTree block; + block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true); + checkForIds(src, block); + } else { hasErrors = true; } - ResXMLTree block; - block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true); - checkForIds(src, block); } if (err < NO_ERROR) { diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index b445b8aa16d0..6eab65b86118 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -865,6 +865,21 @@ status_t compileResourceFile(Bundle* bundle, pseudoBidiParams.country[0] = 'X'; pseudoBidiParams.country[1] = 'B'; + // We should skip resources for pseudolocales if they were + // already added automatically. This is a fix for a transition period when + // manually pseudolocalized resources may be expected. + // TODO: remove this check after next SDK version release. + if ((bundle->getPseudolocalize() & PSEUDO_ACCENTED && + curParams.locale == pseudoParams.locale) || + (bundle->getPseudolocalize() & PSEUDO_BIDI && + curParams.locale == pseudoBidiParams.locale)) { + SourcePos(in->getPrintableSource(), 0).warning( + "Resource file %s is skipped as pseudolocalization" + " was done automatically.", + in->getPrintableSource().string()); + return NO_ERROR; + } + while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::START_TAG) { const String16* curTag = NULL; |