summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/anim/paged_view_click_feedback.xml24
-rw-r--r--res/drawable/button_bg.xml21
-rw-r--r--res/layout-land/folder_icon.xml1
-rw-r--r--res/layout-land/search_bar.xml1
-rw-r--r--res/layout-port/folder_icon.xml1
-rw-r--r--res/layout-port/launcher.xml9
-rw-r--r--res/layout-sw720dp/launcher.xml1
-rw-r--r--res/layout-sw720dp/market_button.xml2
-rw-r--r--res/layout-sw720dp/search_bar.xml4
-rw-r--r--res/layout/apps_customize_progressbar.xml1
-rw-r--r--res/layout/market_button.xml1
-rw-r--r--res/layout/qsb_bar.xml1
-rw-r--r--res/layout/scroll_indicator.xml3
-rw-r--r--res/layout/workspace_divider.xml3
-rw-r--r--res/values-af/strings.xml22
-rw-r--r--res/values-am/strings.xml20
-rw-r--r--res/values-ar/strings.xml20
-rw-r--r--res/values-be/strings.xml20
-rw-r--r--res/values-bg/strings.xml23
-rw-r--r--res/values-ca/strings.xml20
-rw-r--r--res/values-cs/strings.xml20
-rw-r--r--res/values-da/strings.xml20
-rw-r--r--res/values-de/strings.xml20
-rw-r--r--res/values-el/strings.xml20
-rw-r--r--res/values-en-rGB/strings.xml20
-rw-r--r--res/values-es-rUS/strings.xml20
-rw-r--r--res/values-es/strings.xml20
-rw-r--r--res/values-et/strings.xml20
-rw-r--r--res/values-fa/strings.xml23
-rw-r--r--res/values-fi/strings.xml22
-rw-r--r--res/values-fr/strings.xml20
-rw-r--r--res/values-hi/strings.xml20
-rw-r--r--res/values-hr/strings.xml20
-rw-r--r--res/values-hu/strings.xml22
-rw-r--r--res/values-in/strings.xml20
-rw-r--r--res/values-it/strings.xml20
-rw-r--r--res/values-iw/strings.xml20
-rw-r--r--res/values-ja/strings.xml20
-rw-r--r--res/values-ko/strings.xml20
-rw-r--r--res/values-land/dimens.xml4
-rw-r--r--res/values-lt/strings.xml20
-rw-r--r--res/values-lv/strings.xml20
-rw-r--r--res/values-ms/strings.xml23
-rw-r--r--res/values-nb/strings.xml24
-rw-r--r--res/values-nl/strings.xml20
-rw-r--r--res/values-pl/strings.xml22
-rw-r--r--res/values-pt-rPT/strings.xml20
-rw-r--r--res/values-pt/strings.xml20
-rw-r--r--res/values-rm/strings.xml42
-rw-r--r--res/values-ro/strings.xml23
-rw-r--r--res/values-ru/strings.xml22
-rw-r--r--res/values-sk/strings.xml20
-rw-r--r--res/values-sl/strings.xml20
-rw-r--r--res/values-sr/strings.xml20
-rw-r--r--res/values-sv/strings.xml23
-rw-r--r--res/values-sw/strings.xml25
-rw-r--r--res/values-th/strings.xml20
-rw-r--r--res/values-tl/strings.xml20
-rw-r--r--res/values-tr/strings.xml23
-rw-r--r--res/values-uk/strings.xml20
-rw-r--r--res/values-vi/strings.xml20
-rw-r--r--res/values-zh-rCN/strings.xml23
-rw-r--r--res/values-zh-rTW/strings.xml23
-rw-r--r--res/values-zu/strings.xml20
-rw-r--r--res/values/attrs.xml7
-rw-r--r--res/values/colors.xml3
-rw-r--r--res/values/config.xml29
-rw-r--r--res/values/dimens.xml16
-rw-r--r--res/values/strings.xml20
-rw-r--r--src/com/android/launcher2/AppWidgetResizeFrame.java2
-rw-r--r--src/com/android/launcher2/AppsCustomizePagedView.java324
-rw-r--r--src/com/android/launcher2/AppsCustomizeTabHost.java115
-rw-r--r--src/com/android/launcher2/BubbleTextView.java15
-rw-r--r--src/com/android/launcher2/ButtonDropTarget.java27
-rw-r--r--src/com/android/launcher2/CellLayout.java230
-rw-r--r--src/com/android/launcher2/CheckLongPressHelper.java61
-rw-r--r--src/com/android/launcher2/DeleteDropTarget.java32
-rw-r--r--src/com/android/launcher2/DragController.java82
-rw-r--r--src/com/android/launcher2/DragLayer.java172
-rw-r--r--src/com/android/launcher2/DragView.java124
-rw-r--r--src/com/android/launcher2/DrawableStateProxyView.java66
-rw-r--r--src/com/android/launcher2/DropTarget.java3
-rw-r--r--src/com/android/launcher2/Folder.java112
-rw-r--r--src/com/android/launcher2/FolderIcon.java50
-rw-r--r--src/com/android/launcher2/HandleView.java3
-rw-r--r--src/com/android/launcher2/HolographicPagedViewIcon.java55
-rw-r--r--src/com/android/launcher2/InfoDropTarget.java8
-rw-r--r--src/com/android/launcher2/InstallShortcutReceiver.java63
-rw-r--r--src/com/android/launcher2/InstallWidgetReceiver.java2
-rw-r--r--src/com/android/launcher2/ItemInfo.java9
-rw-r--r--src/com/android/launcher2/Launcher.java536
-rw-r--r--src/com/android/launcher2/LauncherAppWidgetHostView.java48
-rw-r--r--src/com/android/launcher2/LauncherApplication.java6
-rw-r--r--src/com/android/launcher2/LauncherViewPropertyAnimator.java255
-rw-r--r--src/com/android/launcher2/PagedView.java185
-rw-r--r--src/com/android/launcher2/PagedViewGridLayout.java1
-rw-r--r--src/com/android/launcher2/PagedViewIcon.java167
-rw-r--r--src/com/android/launcher2/PagedViewWidget.java187
-rw-r--r--src/com/android/launcher2/PagedViewWithDraggableItems.java8
-rw-r--r--src/com/android/launcher2/PendingAddItemInfo.java26
-rw-r--r--src/com/android/launcher2/RocketLauncher.java4
-rw-r--r--src/com/android/launcher2/SearchDropTargetBar.java12
-rw-r--r--src/com/android/launcher2/SpringLoadedDragController.java2
-rw-r--r--src/com/android/launcher2/Workspace.java814
104 files changed, 2846 insertions, 2157 deletions
diff --git a/res/anim/paged_view_click_feedback.xml b/res/anim/paged_view_click_feedback.xml
deleted file mode 100644
index eb7ecef15..000000000
--- a/res/anim/paged_view_click_feedback.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:valueFrom="1.0"
- android:valueTo="0.5"
- android:valueType="floatType"
- android:duration="100"
- android:propertyName="alpha"
- android:repeatCount="1"
- android:repeatMode="reverse"/>
diff --git a/res/drawable/button_bg.xml b/res/drawable/button_bg.xml
deleted file mode 100644
index e7b1bcd5a..000000000
--- a/res/drawable/button_bg.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="true" android:drawable="@drawable/tab_unselected_focused_holo" />
- <item android:state_pressed="true" android:drawable="@drawable/tab_unselected_focused_holo" />
- <item android:drawable="@android:color/transparent" />
-</selector>
diff --git a/res/layout-land/folder_icon.xml b/res/layout-land/folder_icon.xml
index 4c92fcaba..808ff5e7b 100644
--- a/res/layout-land/folder_icon.xml
+++ b/res/layout-land/folder_icon.xml
@@ -16,7 +16,6 @@
<com.android.launcher2.FolderIcon
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
diff --git a/res/layout-land/search_bar.xml b/res/layout-land/search_bar.xml
index c606173fd..3352fbbc5 100644
--- a/res/layout-land/search_bar.xml
+++ b/res/layout-land/search_bar.xml
@@ -15,7 +15,6 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
style="@style/SearchDropTargetBar"
android:layout_width="@dimen/qsb_bar_height"
android:layout_height="match_parent">
diff --git a/res/layout-port/folder_icon.xml b/res/layout-port/folder_icon.xml
index 0df16b88c..5ee1327a3 100644
--- a/res/layout-port/folder_icon.xml
+++ b/res/layout-port/folder_icon.xml
@@ -16,7 +16,6 @@
<com.android.launcher2.FolderIcon
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
index a50b69686..f6ff2e820 100644
--- a/res/layout-port/launcher.xml
+++ b/res/layout-port/launcher.xml
@@ -70,6 +70,15 @@
android:id="@+id/qsb_bar"
layout="@layout/qsb_bar" />
+ <com.android.launcher2.DrawableStateProxyView
+ android:id="@+id/voice_button_proxy"
+ android:layout_width="@dimen/qsb_bar_height"
+ android:layout_height="@dimen/qsb_bar_height"
+ android:layout_gravity="right"
+ android:clickable="true"
+ android:onClick="onClickVoiceButton"
+ launcher:sourceViewId="@+id/voice_button" />
+
<include layout="@layout/apps_customize_pane"
android:id="@+id/apps_customize_pane"
android:layout_width="match_parent"
diff --git a/res/layout-sw720dp/launcher.xml b/res/layout-sw720dp/launcher.xml
index 94c69a683..65149f29a 100644
--- a/res/layout-sw720dp/launcher.xml
+++ b/res/layout-sw720dp/launcher.xml
@@ -16,7 +16,6 @@
<com.android.launcher2.DragLayer
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
android:id="@+id/drag_layer"
android:layout_width="match_parent"
diff --git a/res/layout-sw720dp/market_button.xml b/res/layout-sw720dp/market_button.xml
index 4ccecd92c..7eaeafac3 100644
--- a/res/layout-sw720dp/market_button.xml
+++ b/res/layout-sw720dp/market_button.xml
@@ -15,13 +15,13 @@
-->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
style="@style/MarketButton"
android:onClick="onClickAppMarketButton"
android:gravity="center"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:drawablePadding="10dp"
+ android:background="@drawable/tab_widget_indicator_selector"
android:text="@string/market"
android:contentDescription="@string/market"
android:textColor="@color/workspace_all_apps_and_delete_zone_text_color"
diff --git a/res/layout-sw720dp/search_bar.xml b/res/layout-sw720dp/search_bar.xml
index ebaf96001..55ec959de 100644
--- a/res/layout-sw720dp/search_bar.xml
+++ b/res/layout-sw720dp/search_bar.xml
@@ -15,7 +15,6 @@
-->
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
style="@style/SearchDropTargetBar"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -63,7 +62,6 @@
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
- android:layout_toLeftOf="@+id/all_apps_divider"
android:paddingLeft="@dimen/toolbar_button_horizontal_padding"
android:paddingRight="@dimen/toolbar_button_horizontal_padding"
android:paddingTop="@dimen/all_apps_button_vertical_padding"
@@ -73,4 +71,4 @@
android:focusable="true"
android:clickable="true"
android:contentDescription="@string/accessibility_all_apps_button" />
-</RelativeLayout> \ No newline at end of file
+</RelativeLayout>
diff --git a/res/layout/apps_customize_progressbar.xml b/res/layout/apps_customize_progressbar.xml
index 6a8010f0a..6aa90999c 100644
--- a/res/layout/apps_customize_progressbar.xml
+++ b/res/layout/apps_customize_progressbar.xml
@@ -15,7 +15,6 @@
-->
<ProgressBar
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
style="?android:attr/progressBarStyleLarge"
android:id="@+id/apps_customize_progress_bar"
android:layout_width="wrap_content"
diff --git a/res/layout/market_button.xml b/res/layout/market_button.xml
index 27eb3fd36..41e6ec7cc 100644
--- a/res/layout/market_button.xml
+++ b/res/layout/market_button.xml
@@ -15,7 +15,6 @@
-->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
style="@style/MarketButton"
android:onClick="onClickAppMarketButton"
android:gravity="center"
diff --git a/res/layout/qsb_bar.xml b/res/layout/qsb_bar.xml
index 9daf7bff7..ad9027f9d 100644
--- a/res/layout/qsb_bar.xml
+++ b/res/layout/qsb_bar.xml
@@ -15,7 +15,6 @@
-->
<com.android.launcher2.SearchDropTargetBar
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
style="@style/QSBBar"
android:focusable="false">
diff --git a/res/layout/scroll_indicator.xml b/res/layout/scroll_indicator.xml
index 33eed8bc5..4ea312b6d 100644
--- a/res/layout/scroll_indicator.xml
+++ b/res/layout/scroll_indicator.xml
@@ -15,8 +15,7 @@
-->
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
android:visibility="gone"
android:alpha="0"
android:scaleType="fitXY"
- android:src="@drawable/hotseat_scrubber_holo" /> \ No newline at end of file
+ android:src="@drawable/hotseat_scrubber_holo" />
diff --git a/res/layout/workspace_divider.xml b/res/layout/workspace_divider.xml
index 257ea7c90..c9cbca65e 100644
--- a/res/layout/workspace_divider.xml
+++ b/res/layout/workspace_divider.xml
@@ -15,10 +15,9 @@
-->
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
-xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
android:paddingLeft="@dimen/workspace_divider_padding_left"
android:paddingRight="@dimen/workspace_divider_padding_right"
android:paddingTop="@dimen/workspace_divider_padding_top"
android:paddingBottom="@dimen/workspace_divider_padding_bottom"
android:scaleType="fitXY"
- android:src="@drawable/hotseat_track_holo" /> \ No newline at end of file
+ android:src="@drawable/hotseat_track_holo" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 2cd55df7a..60888d373 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Legstukke"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Raak en hou in om \'n legstuk op te tel."</string>
<string name="market" msgid="2652226429823445833">"Winkel"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Kon nie item op hierdie Tuisskerm plaas nie."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Kan nie item op hierdie Tuis-skerm laat los nie."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Kies legstuk om te skep"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Vouernaam"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Hernoem vouer"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Kortpad \"<xliff:g id="NAME">%s</xliff:g>\" is geskep."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Kortpad \"<xliff:g id="NAME">%s</xliff:g>\" is verwyder."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Kortpad \"<xliff:g id="NAME">%s</xliff:g>\" bestaan reeds."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Kies kortpad"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Kies kortpad"</string>
<string name="title_select_application" msgid="1793455815754848652">"Kies program"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Programme"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Tuis"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"installeer kortpaaie"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Stel \'n program in staat om kortpaaie by te voeg sonder gebruikerhandeling."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"deïnstalleer kortpaaie"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Stel \'n program in staat om kortpaaie te verwyder sonder gebruikerhandeling."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Laat die program toe om kortpaaie te sonder gebruikerhandeling te verwyder."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"lees Tuis-instellings en -kortpaaie"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Stel \'n program in staat om die instellings en kortpaaie in Tuis te lees."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Laat die program toe om die instellings en kortpaaie in Tuis te lees."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"skryf Tuis-instellings en -kortpaaie"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Stel program in staat om die instellings en kortpaaie in Tuis te verander."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Laat die program toe om die instellings en kortpaaie in Tuis te verander."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Kon nie legstuk laai nie"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Hierdie is \'n stelselprogram en kan nie gedeïnstalleer word nie."</string>
<string name="dream_name" msgid="2847171357608437154">"Vuurpyllanseerder"</string>
@@ -89,7 +89,7 @@
<string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"Programme-bladsy %1$d van %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"Legstukke-bladsy %1$d van %2$d"</string>
<string name="workspace_cling_title" msgid="738396473989890567">"Maak jouself tuis"</string>
- <string name="workspace_cling_move_item" msgid="791013895761065070">"Jy kan jou gunsteling-apps hier berg."</string>
+ <string name="workspace_cling_move_item" msgid="791013895761065070">"Jy kan jou gunsteling programme hier berg."</string>
<string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"Om al jou programme te sien, raak die sirkel."</string>
<string name="all_apps_cling_title" msgid="2559734712581447107">"Kies \'n paar programme"</string>
<string name="all_apps_cling_add_item" msgid="5665035103260318891">"Om \'n program by jou Tuisskerm te voeg, raak en hou dit."</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Om \'n program te skuif, raak en hou dit."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Om \'n nuwe vouer op jou Tuisskerm te maak, stapel een program bo-op \'n ander."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Vouer oopgemaak, %1$d van %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Tik om die vouer toe te maak"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tik om herbenoeming te bevestig"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Vouer oopgemaak, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Raak om vouer toe te maak"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Raak om stoor te hernoem"</string>
<string name="folder_closed" msgid="3130534551370511932">"Vouer is gesluit"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Vouer hernoem na %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Vouer: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Vouer hernoem na <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Vouer: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index bba4123f7..416518973 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">" ፍርግሞች"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"ፍርግም ለማንሳት ንካ &amp; በመጫን ያዝ"</string>
<string name="market" msgid="2652226429823445833">"ሸምት"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"እዚህ የመነሻ ማያ ላይ አይነት ማኖር አልተቻለም።"</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"እዚህ የመነሻ ማያ ላይ ንጥል ማኖር አልተቻለም።"</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"ለመፍጠር ምግብር ምረጥ"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"አቃፊ ስም"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"አቃፊእንደገና ሰይም"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"አቋራጭ\"<xliff:g id="NAME">%s</xliff:g> \"ተፈጥሯል።"</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"አቋራጭ \"<xliff:g id="NAME">%s</xliff:g>\" ተወግዶ ነበር።"</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"አቋራጭ \"<xliff:g id="NAME">%s</xliff:g>\" አስቀድሞ አለ።"</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"አቋራጭ ምረጥ"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"አቋራጭ ምረጥ"</string>
<string name="title_select_application" msgid="1793455815754848652">"መተግበሪያ ምረጥ"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"ትግበራ"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"መነሻ"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"አቋራጮችን ጫን።"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"መተግበሪያ ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ ለማከል ይፈቅዳል።"</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"አቋራጮችን አራግፍ"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"ያለተጠቃሚ ጣልቃ ገብነት መተግበሪያ አቋራጭ ለማስወገድ ይፈቅዳል።"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ ለማስወገድ ለመተግበሪያ ይፈቅዳል።"</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"የመነሻቅንብሮች እና አቋራጮችን አንብብ"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለማንበብ ትግበራ ይፈቅዳል።"</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለማንበብ ለትግበራ ይፈቅዳል።"</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"መነሻ ቅንብሮች እና አቋራጮች ፃፍ"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለመለወጥ መተግበሪያ ይፈቅዳል።"</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለመለወጥ ለመተግበሪያ ይፈቅዳል።"</string>
<string name="gadget_error_text" msgid="8359351016167075858">"ፍርግም የመጫን ችግር"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"ይህ የስርዓት ትግበራ ነው እና አለማራገፍ አይቻልም።"</string>
<string name="dream_name" msgid="2847171357608437154">"የሮኬት ማስነሻ"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"መተግበሪያ ለማንቀሳቀስ፣ ንካው እና &amp; ያዘው::"</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"በመነሻ ማያህ ላይ አዲስ ዓቃፊ ለመፍጠር፣ አንዱን መተግበሪያ በሌላው ላይ ቆልል፡፡"</string>
<string name="cling_dismiss" msgid="2780907108735868381">"እሺ"</string>
- <string name="folder_opened" msgid="4129072635480822768">"አቃፊ ተከፍቷል, %1$d በ %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"አቃፊን ለመዝጋት ምታ"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"ዳግም ሰይምን ለማስፈፀም ምታ"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"አቃፊ ተከፍቷል፣ <xliff:g id="WIDTH">%1$d</xliff:g> በ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"አቃፊን ለመዝጋት ንካ"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"ዳግም ሰይምን ለማስቀመጥ ንካ"</string>
<string name="folder_closed" msgid="3130534551370511932">"አቃፊ ተዘግቷል"</string>
- <string name="folder_renamed" msgid="781234745487414781">"አቃፊ ዳግም ተሰይሟል ለ %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"አቃፊ: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"አቃፊ ዳግም ወደ <xliff:g id="NAME">%1$s</xliff:g> ተሰይሟል"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"አቃፊ ስም፦<xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 109f26ab3..16ba2bffc 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"الأدوات"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"المس مع الاستمرار لاختيار إحدى الأدوات."</string>
<string name="market" msgid="2652226429823445833">"تسوق"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"تعذر إسقاط العنصر في هذه الشاشة الرئيسية."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"تعذر إسقاط العنصر في هذه الشاشة الرئيسية."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"اختيار أداة لإنشائها"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"اسم المجلد"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"إعادة تسمية المجلد"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"تم إنشاء الاختصار \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"تمت إزالة الاختصار \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"الاختصار \"<xliff:g id="NAME">%s</xliff:g>\" موجود فعلاً."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"تحديد اختصار"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"اختيار اختصار"</string>
<string name="title_select_application" msgid="1793455815754848652">"اختيار تطبيق"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"التطبيقات"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"الرئيسية"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"اختصارات التثبيت"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"للسماح لتطبيق ما بإضافة اختصارات بدون تدخل المستخدم."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"إزالة الاختصارات"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"للسماح لتطبيق بإزالة الاختصارات بدون تدخل المستخدم."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"للسماح للتطبيق بإزالة الاختصارات بدون تدخل المستخدم."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"قراءة إعدادات الشاشة الرئيسية والاختصارات"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"للسماح لتطبيق ما بقراءة الإعدادات والاختصارات في الشاشة الرئيسية."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"للسماح للتطبيق بقراءة الإعدادات والاختصارات في الصفحة الرئيسية."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"كتابة إعدادات الشاشة الرئيسية والاختصارات"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"للسماح لتطبيق ما بتغيير الإعدادات والاختصارات في الشاشة الرئيسية."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"للسماح للتطبيق بتغيير الإعدادات والاختصارات في الصفحة الرئيسية."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"حدثت مشكلة أثناء تحميل الأداة"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"هذا تطبيق نظام وتتعذر إزالته."</string>
<string name="dream_name" msgid="2847171357608437154">"راجمة"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"لنقل التطبيق، المسه مع الاستمرار."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"لإنشاء مجلد جديد على الشاشة الرئيسية، يمكنك تكديس أحد التطبيقات فوق تطبيق آخر."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"موافق"</string>
- <string name="folder_opened" msgid="4129072635480822768">"تم فتح المجلد، %1$d × %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"انقر لإغلاق المجلد"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"انقر لحفظ إعادة التسمية"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"تم فتح المجلد، بحجم <xliff:g id="WIDTH">%1$d</xliff:g> في <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"المس لإغلاق المجلد"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"المس لحفظ إعادة التسمية"</string>
<string name="folder_closed" msgid="3130534551370511932">"تم إغلاق المجلد"</string>
- <string name="folder_renamed" msgid="781234745487414781">"تمت إعادة تسمية المجلد إلى %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"المجلد: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"تمت إعادة تسمية المجلد إلى <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"المجلد: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 1cd2a2f77..60ecc26f7 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Віджэты"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Націсніце і ўтрымлiвайце віджэт, каб дадаць яго."</string>
<string name="market" msgid="2652226429823445833">"Крама"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Немагчыма выдаліць элемент на галоўным экране."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Немагчыма выдалiць элемент на галоўным экране."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Выберыце віджэт для стварэння"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Назва тэчкі"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Пераназваць тэчку"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Створаны цэтлік \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Цэтлік \"<xliff:g id="NAME">%s</xliff:g>\" быў выдалены."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Цэтлік \"<xliff:g id="NAME">%s</xliff:g>\" ужо існуе."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Выбраць хуткі доступ"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Выберыце шлях хуткага доступу"</string>
<string name="title_select_application" msgid="1793455815754848652">"Выберыце прыкладанне"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Прыкладанні"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Галоўная старонка"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"усталяваць хуткі доступ"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Дазваляе прыкладанням дадаваць цэтлікі без умяшання карыстальніка."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"выдаліць хуткі доступ"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Дазваляе прыкладанням выдаляць шляхi хуткага доступу без умяшання карыстальнiка."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Дазваляе прыкладанням выдаляць шляхi хуткага доступу без умяшання карыстальнiка."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"чытаць налады і спосабы хуткага доступу на Галоўнай старонцы"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Дазваляе прыкладанню чытаць налады і шляхі хуткага доступу на галоўнай старонцы."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Дазваляе прыкладанню чытаць налады і шляхі хуткага доступу на галоўнай старонцы."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"напісаць налады і спосабы хуткага доступа на Галоўнай старонцы"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Дазваляе прыкладанню змяняць налады і шляхi хуткага доступу на галоўнай старонцы."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Дазваляе прыкладанню змяняць налады і шляхi хуткага доступу на галоўнай старонцы."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Праблема пры загрузцы віджэта"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Гэта сістэмнае прыкладанне, і яго нельга выдаліць."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Каб перамясціць прыкладанне, дакраніцеся дя яго і ўтрымлівайце."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Каб зрабіць новую тэчку на працоўным стале, перасуньце адно прыкладанне на другое."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"ОК"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Тэчка адкрыта, %1$d ад %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Націсніце, каб закрыць тэчку"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Націсніце, каб перайменаваць"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Тэчка адкрыта, <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Нацiснiце, каб закрыць тэчку"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Краніце, каб захаваць новую назву"</string>
<string name="folder_closed" msgid="3130534551370511932">"Тэчка закрыта"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Тэчка перайменавана: %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Тэчка: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Тэчка перайменавана ў <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Тэчка <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 5b429b784..15e2d46a1 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Приспособления"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Докоснете и задръжте за избор на приспособление"</string>
<string name="market" msgid="2652226429823445833">"Магазин"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Не можа да се премести на началния екран."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Не можа да се премести на началния екран."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Избор на приспособл. за създаване"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Име на папка"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Преименуване на папка"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Прекият път за „<xliff:g id="NAME">%s</xliff:g>“ бе създаден."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Прекият път към „<xliff:g id="NAME">%s</xliff:g>“ бе премахнат."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Прекият път за „<xliff:g id="NAME">%s</xliff:g>“ вече съществува."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Избор на пряк път"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Избор на пряк път"</string>
<string name="title_select_application" msgid="1793455815754848652">"Избор на приложение"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Приложения"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Начало"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"инсталиране на преки пътища"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Разрешава на приложението да добавя преки пътища без намеса на потребителя."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"деинсталиране на преките пътища"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Разрешава на приложението да премахва преките пътища без намеса на потребителя."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Разрешава на приложението да премахва преките пътища без намеса на потребителя."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"прочетете настройките за „Начало“ и преки пътища"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Разрешава на приложението да прочете настройките и преките пътища в Начало."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Разрешава на приложението да чете настройките и преките пътища в Начало."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"въведете настройките за „Начало“ и преки пътища"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Разрешава на приложението да променя настройките и преките пътища в Начало."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Разрешава на приложението да променя настройките и преките пътища в Начало."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Проблем при зареждане на приспособление"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Това е системно приложение и не може да се деинсталира."</string>
<string name="dream_name" msgid="2847171357608437154">"Ракетна площадка"</string>
@@ -97,10 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"За да преместите приложение, го докоснете и задръжте."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"За да създадете нова папка на началния си екран, поставете едно приложение върху друго."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Папката е отворена %1$d на %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Докоснете, за да затворите папката"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Докоснете, за да преименувате"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Докоснете, за да затворите папката"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Докоснете, за да запазите преименуването"</string>
<string name="folder_closed" msgid="3130534551370511932">"Папката бе затворена"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Папката е преименувана на „%1$s“"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Папка: %1$s"</string>
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
+ <skip />
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 5a6063fd0..b525dcf29 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Mantén premut un widget per triar-lo."</string>
<string name="market" msgid="2652226429823445833">"Botiga"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"No s\'ha pogut deixar anar aquest element a la pantalla d\'inici."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"No s\'ha pogut deixar anar aquest element a la pantalla d\'inici."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Selecciona el widget que vulguis crear"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nom de la carpeta"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Canvi de nom de carpeta"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"S\'ha creat la drecera \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"S\'ha eliminat la drecera \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"La drecera \"<xliff:g id="NAME">%s</xliff:g>\" ja existeix."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Selecció d\'una drecera"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Tria una drecera"</string>
<string name="title_select_application" msgid="1793455815754848652">"Tria una aplicació"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplicacions"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Pàgina d\'inici"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"instal·lar dreceres"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permet a una aplicació afegir dreceres sense intervenció de l\'usuari."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstal·lar dreceres"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permet que una aplicació elimini dreceres sense intervenció de l\'usuari."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permet que l\'aplicació elimini dreceres sense la intervenció de l\'usuari."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"llegir la configuració i les dreceres de la pantalla Inici"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Permet que una aplicació llegeixi la configuració i les dreceres de la pàgina d\'inici."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Permet que una aplicació llegeixi la configuració i les dreceres de la pàgina d\'inici."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"escriure la configuració i les dreceres de la pantalla Inici"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Permet que una aplicació canviï la configuració i les dreceres de la pàgina d\'inici."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Permet que una aplicació canviï la configuració i les dreceres de la pàgina d\'inici."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"S\'ha produït un problema en carregar el widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Això és una aplicació del sistema i no es pot desinstal·lar."</string>
<string name="dream_name" msgid="2847171357608437154">"Llançamíssils"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Per moure una aplicació, mantén-la premuda."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Per fer una carpeta nova a la pàgina d\'inici, apila una aplicació sobre una altra."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"D\'acord"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Carpeta oberta, %1$d de %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Toca per tancar la carpeta"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toca per fer el canvi de nom"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"S\'ha obert la carpeta, <xliff:g id="WIDTH">%1$d</xliff:g> per <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Toca per tancar la carpeta"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toca per desar el canvi de nom"</string>
<string name="folder_closed" msgid="3130534551370511932">"Carpeta tancada"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Canvi de nom de la carpeta de %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Carpeta: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"S\'ha canviat el nom de la carpeta a <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 2658900dc..f2d972a67 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgety"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Widget vyberete dotykem a podržením."</string>
<string name="market" msgid="2652226429823445833">"Obchod"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Na tuto plochu položku nelze přesunout."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Na tuto plochu položku nelze přesunout."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Vyberte widget k vytvoření"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Název složky"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Přejmenovat složku"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Zástupce <xliff:g id="NAME">%s</xliff:g> byl vytvořen."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Zástupce <xliff:g id="NAME">%s</xliff:g> byl odebrán."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Zástupce <xliff:g id="NAME">%s</xliff:g> již existuje."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Vyberte zástupce"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Výběr zástupce"</string>
<string name="title_select_application" msgid="1793455815754848652">"Vybrat aplikaci"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplikace"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Plocha"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"instalovat zástupce"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Umožňuje aplikaci přidat zástupce bez zásahu uživatele."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"odinstalace zástupců"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Umožňuje aplikaci odstranit zástupce bez zásahu uživatele."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Umožňuje aplikaci odstranit zástupce bez zásahu uživatele."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"čtení nastavení a odkazů plochy"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Umožňuje aplikaci číst nastavení a odkazy na ploše."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Umožňuje aplikaci číst nastavení a odkazy na ploše."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"zápis nastavení a odkazů plochy"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Umožňuje aplikaci změnit nastavení a odkazy na ploše."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Umožňuje aplikaci změnit nastavení a odkazy na ploše."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problém s načtením widgetu"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Toto je systémová aplikace a nelze ji odinstalovat."</string>
<string name="dream_name" msgid="2847171357608437154">"Raketomet"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Chcete-li aplikaci přesunout, dotkněte se jí a podržte ji."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Chcete-li na ploše vytvořit novou složku, přesuňte jednu aplikaci na druhou."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Složka otevřena, %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Klepnutím zavřete složku"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Klepnutím přejmenování potvrdíte"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Složka otevřena, rozměry <xliff:g id="WIDTH">%1$d</xliff:g> × <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Dotykem složku zavřete"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dotykem uložíte změnu názvu"</string>
<string name="folder_closed" msgid="3130534551370511932">"Složka je uzavřena"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Složka přejmenována na %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Složka: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Složka přejmenována na <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Složka: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 742788b12..43e0be010 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Tryk og hold nede for at vælge en widget."</string>
<string name="market" msgid="2652226429823445833">"Butik"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Elementet kunne ikke trækkes til startskærmen."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Elementet kunne ikke trækkes til startskærmen."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Vælg en widget for at oprette"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Mappenavn"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Omdøb mappe"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Genvejen \"<xliff:g id="NAME">%s</xliff:g>\" blev oprettet."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Genvejen \"<xliff:g id="NAME">%s</xliff:g>\" blev fjernet."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Genvejen \"<xliff:g id="NAME">%s</xliff:g>\" findes allerede."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Vælg genvej"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Vælg genvej"</string>
<string name="title_select_application" msgid="1793455815754848652">"Vælg app"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Applikationer"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Start"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"installer genveje"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Tillader, at en app tilføjer genveje uden brugerens indgriben."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"afinstaller genveje"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Tillader, at en app fjerner genveje uden brugerens indgriben."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Tillader, at appen fjerner genveje uden brugerens indgriben."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"læs indstillinger og genveje for Start"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Tillader, at en app læser indstillingerne og genvejene på startskærmen."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Tillader, at appen læser indstillingerne og genvejene på startskærmen."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"skriv indstillinger og genveje for Start"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Tillader, at en app ændrer indstillingerne og genvejene på startskærmen."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Tillader, at appen ændrer indstillingerne og genvejene på startskærmen."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Der er problemer med indlæsning af widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Dette er en systemapp, som ikke kan afinstalleres."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Tryk på en app, og hold den nede for at flytte den."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Du kan oprette en ny mappe på din startskærm ved at stable apps oven på hinanden."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Mappen blev åbnet, %1$d af %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Tryk for at lukke mappen"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tryk for at omdøbe"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Åben mappe, <xliff:g id="WIDTH">%1$d</xliff:g> gange <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Tryk for at lukke mappen"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Tryk for at gemme det nye navn"</string>
<string name="folder_closed" msgid="3130534551370511932">"Mappen er lukket"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Mappen blev omdøbt til %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Mappe: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Mappen er omdøbt til <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index a12552433..f4cece036 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Zum Hinzufügen Widget berühren und halten"</string>
<string name="market" msgid="2652226429823445833">"Shop"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Symbol wurde nicht auf Startbildschirm abgelegt."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Element wurde nicht auf Startbildschirm abgelegt."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Widget zum Erstellen auswählen"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Ordnername"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Ordner umbenennen"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"\"<xliff:g id="NAME">%s</xliff:g>\"-Verknüpfung wurde erstellt."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"\"<xliff:g id="NAME">%s</xliff:g>\"-Verknüpfung wurde entfernt."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"\"<xliff:g id="NAME">%s</xliff:g>\"-Verknüpfung ist bereits vorhanden."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Tastenkürzel auswählen"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Verknüpfung auswählen"</string>
<string name="title_select_application" msgid="1793455815754848652">"App wählen"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Startseite"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"Verknüpfungen installieren"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Ermöglicht einer App das Hinzufügen von Verknüpfungen ohne Eingriff des Nutzers"</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"Verknüpfungen deinstallieren"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Ermöglicht einer App das Entfernen von Verknüpfungen ohne Eingriff des Nutzers"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Ermöglicht einer App das Entfernen von Verknüpfungen ohne Eingriff des Nutzers"</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"Einstellungen und Shortcuts für Startseite lesen"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu lesen"</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu lesen"</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"Einstellungen und Shortcuts für Startseite schreiben"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu ändern"</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu ändern"</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Fehler beim Laden des Widgets"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Dies ist eine Systemanwendung, die nicht deinstalliert werden kann."</string>
<string name="dream_name" msgid="2847171357608437154">"Raketenstartgerät"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Berühren und halten Sie eine App, um sie zu verschieben."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Stapeln Sie Apps übereinander, um einen neuen Ordner auf Ihrem Startbildschirm zu erstellen."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Ordner geöffnet, %1$d von %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Ordner durch Berühren schließen"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Umbenennung durch Berühren bestätigen"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Ordner geöffnet, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Ordner durch Berühren schließen"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Umbenennung durch Berühren speichern"</string>
<string name="folder_closed" msgid="3130534551370511932">"Ordner wurde geschlossen"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Ordner umbenannt in %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Ordner: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Ordner umbenannt in <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Ordner: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index dc4c536bc..9eb1e9ad0 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Γραφικά στοιχεία"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ."</string>
<string name="market" msgid="2652226429823445833">"Αγορές"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Αδύνατη η τοποθ. του στοιχείου στην αρχική οθόνη."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Αδυναμία τοποθέτησης στοιχείου στην Αρχική οθόνη."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Επιλ. γραφ. στοιχείο για δημιουργία"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Όνομα φακέλου"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Μετονομασία φακέλου"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Δημιουργήθηκε η συντόμευση \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Η συντόμευση \"<xliff:g id="NAME">%s</xliff:g>\" καταργήθηκε."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Η συντόμευση \"<xliff:g id="NAME">%s</xliff:g>\" υπάρχει ήδη."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Επιλογή συντόμευσης"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Επιλέξτε συντόμευση"</string>
<string name="title_select_application" msgid="1793455815754848652">"Επιλογή εφαρμογής"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Εφαρμογές"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Αρχική σελίδα"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"εγκατάσταση συντομεύσεων"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Επιτρέπει σε μια εφαρμογή την προσθήκη συντομεύσεων χωρίς την παρέμβαση του χρήστη."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"κατάργηση εγκατάστασης συντομεύσεων"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Επιτρέπει σε μια εφαρμογή την κατάργηση συντομεύσεων χωρίς την παρέμβαση του χρήστη."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Επιτρέπει στην εφαρμογή την κατάργηση συντομεύσεων χωρίς την παρέμβαση του χρήστη."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"ανάγνωση ρυθμίσεων και συντομεύσεων αρχικής οθόνης"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των ρυθμίσεων και των συντομεύσεων στην αρχική οθόνη."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Επιτρέπει στην εφαρμογή την ανάγνωση των ρυθμίσεων και των συντομεύσεων στην Αρχική οθόνη."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"εγγραφή ρυθμίσεων και συντομεύσεων αρχικής οθόνης"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Επιτρέπει σε μια εφαρμογή την αλλαγή των ρυθμίσεων και των συντομεύσεων στην αρχική οθόνη."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Επιτρέπει στην εφαρμογή την αλλαγή των ρυθμίσεων και των συντομεύσεων στην Αρχική οθόνη."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Παρουσιάστηκε πρόβλημα στη φόρτωση του γραφικού στοιχείου"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Αυτή είναι μια εφαρμογή συστήματος και δεν είναι δυνατή η κατάργηση της εγκατάστασής της."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Για να μετακινήσετε μια εφαρμογή, αγγίξτε την παρατεταμένα."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Για να δημιουργήσετε ένα νέο φάκελο στην αρχική οθόνη, τοποθετήστε μια εφαρμογή πάνω σε μια άλλη."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Ο φάκελος άνοιξε, %1$d από %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Πατήστε για να κλείσετε τον φάκελο"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Πατήστε για να πραγματοποιήσετε μετονομασία"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Άνοιγμα φακέλου, <xliff:g id="WIDTH">%1$d</xliff:g> επί <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Αγγίξτε για να κλείσετε τον φάκελο"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Αγγίξτε για να αποθηκεύσετε το νέο όνομα"</string>
<string name="folder_closed" msgid="3130534551370511932">"Ο φάκελος έκλεισε"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Ο φάκελος μετονομάστηκε σε %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Φάκελος: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Ο φάκελος μετονομάστηκε σε <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Φάκελος: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 22d98047c..8eeb9d54e 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Touch &amp; hold to pick up a widget."</string>
<string name="market" msgid="2652226429823445833">"Shop"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Couldn\'t drop item onto this Home screen."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Couldn\'t drop item on this Home screen."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Choose widget to create"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Folder name"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Rename folder"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"<xliff:g id="NAME">%s</xliff:g>Shortcut \"\" created."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"<xliff:g id="NAME">%s</xliff:g>Shortcut \"\" was removed."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"<xliff:g id="NAME">%s</xliff:g>Shortcut \"\" already exists."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Select shortcut"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Choose shortcut"</string>
<string name="title_select_application" msgid="1793455815754848652">"Choose app"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Home"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"install shortcuts"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Allows an app to add shortcuts without user intervention."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"uninstall shortcuts"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Allows an app to remove shortcuts without user intervention."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Allows the app to remove shortcuts without user intervention."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"read Home settings and short cuts"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Allows an app to read the settings and shortcuts in Home."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Allows an app to read the settings and shortcuts in Home."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"write Home settings and shortcuts"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Allows an app to change the settings and shortcuts in Home."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Allows the app to change the settings and shortcuts in Home."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problem loading widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"This is a system application and cannot be uninstalled."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"To move an app, touch &amp; hold it."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"To make a new folder on your Home screen, stack one app on top of another."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Folder opened, %1$d by %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Tap to close folder"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tap to commit rename"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Folder opened, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Touch to close folder"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Touch to save rename"</string>
<string name="folder_closed" msgid="3130534551370511932">"Folder closed"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Folder renamed to %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Folder: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Folder renamed to <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 72dd21716..23b266f7d 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Mantén presionado el widget que deseas elegir."</string>
<string name="market" msgid="2652226429823445833">"Comprar"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"El elemento no se soltó en la pantalla principal."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Error al soltar elemento en la pantalla principal"</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Elegir los widgets para crear"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nombre de carpeta"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Cambiar nombre de carpeta"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Acceso directo \"<xliff:g id="NAME">%s</xliff:g>\" creado."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"El acceso directo \"<xliff:g id="NAME">%s</xliff:g>\" ha sido eliminado."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"El acceso directo \"<xliff:g id="NAME">%s</xliff:g>\" ya existe."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Seleccionar acceso directo"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Elegir acceso directo"</string>
<string name="title_select_application" msgid="1793455815754848652">"Elegir una aplicación"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplicaciones"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Página principal"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"instalar accesos directos"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite que una aplicación agregue accesos directos sin que el usuario intervenga."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstalar papel tapiz"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite que una aplicación elimine accesos directos sin que el usuario intervenga."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite que la aplicación elimine accesos directos sin que el usuario intervenga."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"leer configuración y accesos directos de la página principal"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite que una aplicación lea la configuración y los accesos directos de la página principal."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite que la aplicación lea la configuración y los accesos directos de la página principal."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"escribir configuración y accesos directos de la página principal"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite que una aplicación cambie la configuración y los accesos directos de la página principal."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite que la aplicación cambie la configuración y los accesos directos de la página principal."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problema al cargar el widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Esta es una aplicación del sistema y no se puede desinstalar."</string>
<string name="dream_name" msgid="2847171357608437154">"Lanzacohetes"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Para mover una aplicación, tócala &amp; mantenla presionada."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Para crear una carpeta nueva en tu pantalla principal, coloca una aplicación encima de la otra."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"Aceptar"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Se abrió la carpeta, %1$d por %2$d."</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Toca para cerrar la carpeta."</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toca para cambiar el nombre de la carpeta."</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Carpeta abierta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Toca para cerrar la carpeta."</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toca para guardar el nuevo nombre."</string>
<string name="folder_closed" msgid="3130534551370511932">"Se cerró la carpeta."</string>
- <string name="folder_renamed" msgid="781234745487414781">"Se cambió el nombre de la carpeta a %1$s."</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Carpeta: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"El nombre de la carpeta se cambió a <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 46645a7d8..4458782c5 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Mantén pulsado el widget que quieras seleccionar."</string>
<string name="market" msgid="2652226429823445833">"Tienda"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"No se ha podido añadir el elemento en este escritorio."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Error al arrastrar elemento a este escritorio"</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Selecciona el widget que quieres añadir"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nombre de carpeta"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Cambiar nombre de carpeta"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Se ha creado el acceso directo \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Se ha eliminado el acceso directo \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"El acceso directo \"<xliff:g id="NAME">%s</xliff:g>\" ya existe."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Seleccionar acceso directo"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Elegir acceso directo"</string>
<string name="title_select_application" msgid="1793455815754848652">"Selecciona una aplicación"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplicaciones"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Inicio"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"instalar accesos directos"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite que una aplicación añada accesos directos sin intervención del usuario."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstalar accesos directos"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite que una aplicación elimine accesos directos sin intervención del usuario."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite que la aplicación elimine accesos directos sin intervención del usuario."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"leer información de accesos directos y de configuración del escritorio"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite que una aplicación lea los ajustes y accesos directos del escritorio."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite que la aplicación lea los ajustes y los accesos directos del escritorio."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"escribir información de accesos directos y de configuración del escritorio"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite que las aplicaciones cambien los ajustes y los accesos directos del escritorio."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite que las aplicaciones cambien los ajustes y los accesos directos del escritorio."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problema al cargar el widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Esta aplicación es del sistema y no se puede desinstalar."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Para mover una aplicación, solo tienes que mantenerla pulsada."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Para crear una carpeta nueva en el escritorio, coloca una aplicación encima de otra."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"Aceptar"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Carpeta abierta de %1$d por %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Toca para cerrar la carpeta."</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toca para cambiar el nombre."</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Carpeta abierta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Toca para cerrar la carpeta."</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toca para cambiar el nuevo nombre."</string>
<string name="folder_closed" msgid="3130534551370511932">"Carpeta cerrada"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Se ha cambiado el nombre de la carpeta a %1$s."</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Carpeta: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Se ha cambiado el nombre de la carpeta a <xliff:g id="NAME">%1$s</xliff:g>."</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index f8e7cc8c0..719314927 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Vidinad"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Vidina valimiseks puudutage seda pikalt."</string>
<string name="market" msgid="2652226429823445833">"Pood"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Üksust ei saa sellele avakuvale tuua."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Üksust ei saa sellele avaekraanile tuua."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Valige loomiseks vidin"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Kausta nimi"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Nimeta kaust ümber"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Otsetee „<xliff:g id="NAME">%s</xliff:g>” loodud."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Otsetee „<xliff:g id="NAME">%s</xliff:g>” eemaldatud."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Otsetee „<xliff:g id="NAME">%s</xliff:g>” on juba olemas."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Valige otsetee"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Otsetee valimine"</string>
<string name="title_select_application" msgid="1793455815754848652">"Rakenduse valimine"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Rakendused"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Kodu"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"otseteede installimine"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Võimaldab rakendusel lisada otseteid kasutaja sekkumiseta."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"otseteede desinstallimine"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Võimaldab rakendusel eemaldada otseteid kasutaja sekkumiseta."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Võimaldab rakendusel eemaldada otseteid kasutaja sekkumiseta."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"avalehe seadete ja otseteede lugemine"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Võimaldab rakendusel lugeda avalehe seadeid ja otseteid."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Võimaldab rakendusel lugeda avalehe seadeid ja otseteid."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"avalehe seadete ja otseteede kirjutamine"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Võimaldab rakendusel muuta avalehe seadeid ja otseteid."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Võimaldab rakendusel muuta avalehel seadeid ja otseteid."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Probleem vidina laadimisel"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"See on süsteemirakendus ja seda ei saa desinstallida."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Rakenduse liigutamiseks pange sõrm rakendusele ja hoidke seda."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Avakuval uue kausta tegemiseks virnastage üks rakendus teisele."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Kaust avatud %1$d, %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Puudutage kausta sulgemiseks"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Puudutage ümbernimetamise kinnitamiseks"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Kaust on avatud, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Puudutage kausta sulgemiseks"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Puudutage uue nime salvestamiseks"</string>
<string name="folder_closed" msgid="3130534551370511932">"Kaust suletud"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Kausta uus nimi %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Kaust: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Kausta uus nimi: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"<xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 46c70197a..66c274f33 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"ابزارک ها"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"برای انتخاب یک ابزارک لمس کنید و نگه دارید."</string>
<string name="market" msgid="2652226429823445833">"فروشگاه"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"این مورد را نمی‌توان در این صفحه اصلی رها کرد."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"این مورد را نمی‌توان در این صفحه اصلی رها کرد."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"انتخاب ابزارک برای ایجاد"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"نام پوشه"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"تغییر نام پوشه"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"میانبر \"<xliff:g id="NAME">%s</xliff:g>\" ایجاد شد."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"میانبر \"<xliff:g id="NAME">%s</xliff:g>\" حذف شد."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"میانبر \"<xliff:g id="NAME">%s</xliff:g>\" در حال حاضر وجود دارد."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"انتخاب میانبر"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"انتخاب میانبر"</string>
<string name="title_select_application" msgid="1793455815754848652">"انتخاب برنامه"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"برنامه های کاربردی"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"صفحه اصلی"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"نصب میانبرها"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"به یک برنامه اجازه می‌دهد میانبرها را بدون دخالت کاربر اضافه کند."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"حذف نصب میانبرها"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"به یک برنامه اجازه می‌دهد میانبرها را بدون دخالت کاربر حذف کند."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"به یک برنامه اجازه می‌دهد میانبرها را بدون دخالت کاربر حذف کند."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"خواندن تنظیمات صفحه اصلی و میانبرها"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"به یک برنامه اجازه خواندن تنظیمات و میانبرها را در صفحه اصلی می‌دهد."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"به برنامه اجازه خواندن تنظیمات و میانبرها را در صفحه اصلی می‌دهد."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"نوشتن تنظیمات صفحه اصلی و میانبرها"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"به یک برنامه برای تغییر تنظیمات و میانبرها در صفحه اصلی اجازه می‌دهد."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"به برنامه اجازه تغییر تنظیمات و میانبرها را در صفحه اصلی می‌دهد."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"مشکل در بارگیری ابزارک"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"این یک برنامه سیستمی است و حذف نصب نمی‌شود."</string>
<string name="dream_name" msgid="2847171357608437154">"پرتاب کننده موشک"</string>
@@ -97,10 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"برای جابجا کردن یک برنامه، آن را لمس کرده و نگهدارید."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"برای ایجاد یک پوشه جدید در صفحه اصلی خود، یک برنامه را در بالای دیگری قرار دهید."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"تأیید"</string>
- <string name="folder_opened" msgid="4129072635480822768">"پوشه باز شد، %1$d در %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"برای بستن پوشه، ضربه بزنید"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"برای تأیید تغییرنام، ضربه بزنید"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"برای بستن پوشه لمس کنید"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"برای ذخیره تغییر نام لمس کنید"</string>
<string name="folder_closed" msgid="3130534551370511932">"پوشه بسته شد"</string>
- <string name="folder_renamed" msgid="781234745487414781">"نام پوشه به %1$s تغییر کرد"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"پوشه: %1$s"</string>
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
+ <skip />
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 656fca12b..c1670d8a7 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgetit"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Valitse widget painamalla sitä pitkään."</string>
<string name="market" msgid="2652226429823445833">"Myymälä"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Kohdetta ei voi lisätä aloitusruutuun."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Kohteen lisääminen tähän aloitusruutuun epäonnistui."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Valitse luotava widget"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Kansion nimi"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Nimeä kansio uudelleen"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Pikakuvake <xliff:g id="NAME">%s</xliff:g> luotu"</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Pikakuvake <xliff:g id="NAME">%s</xliff:g> poistettiin."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Pikakuvake <xliff:g id="NAME">%s</xliff:g> on jo olemassa."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Valitse pikakuvake"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Valitse pikakuvake"</string>
<string name="title_select_application" msgid="1793455815754848652">"Valitse sovellus"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Sovellukset"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Etusivu"</string>
@@ -55,7 +55,7 @@
<string name="delete_target_uninstall_label" msgid="748894921183769150">"Poista"</string>
<string name="info_target_label" msgid="4019495079517426980">"Sovelluksen tiedot"</string>
<string name="accessibility_search_button" msgid="816822994629942611">"Haku"</string>
- <string name="accessibility_voice_search_button" msgid="3938249215065842475">"Äänihaku"</string>
+ <string name="accessibility_voice_search_button" msgid="3938249215065842475">"Puhehaku"</string>
<string name="accessibility_all_apps_button" msgid="8803738611398979849">"Sovellukset"</string>
<string name="accessibility_delete_button" msgid="3628162007991023603">"Poista"</string>
<string name="delete_zone_label_all_apps_system_app" msgid="3683920959591819044">"Poista päivitys"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"asentaa pikakuvakkeita"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Antaa sovelluksen lisätä pikakuvakkeita itsenäisesti ilman käyttäjän valintaa."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"poistaa pikakuvakkeita"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Antaa sovelluksen poistaa pikakuvakkeita itsenäisesti ilman käyttäjän valintaa."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Antaa sovelluksen poistaa pikakuvakkeita ilman käyttäjän valintaa."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"lukea etusivun asetuksia ja pikakuvakkeita"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Antaa sovelluksen lukea aloitusruudun asetuksia ja pikakuvakkeita."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Antaa sovelluksen lukea aloitusruudun asetukset ja pikakuvakkeet."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"kirjoittaa etusivun asetuksia ja pikakuvakkeita"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Antaa sovelluksen muuttaa aloitusruudun asetuksia ja pikakuvakkeita."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Antaa sovelluksen muuttaa aloitusruudun asetuksia ja pikakuvakkeita."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Ongelma ladattaessa widgetiä"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Tämä on järjestelmäsovellus, eikä sitä voi poistaa."</string>
<string name="dream_name" msgid="2847171357608437154">"Sinko"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Voit siirtää sovelluksia koskettamalla sovellusta pitkään."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Voit luoda uuden kansion aloitusruutuun pinoamalla yhden sovelluksen toisen päälle."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Kansio avattu, %1$d avaaja: %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Sulje kansio napauttamalla"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Aseta uusi nimi napauttamalla"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Kansio avattu, koko <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Sulje kansio koskettamalla"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Tallenna uudella nimellä koskettamalla"</string>
<string name="folder_closed" msgid="3130534551370511932">"Kansio on suljettu"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Kansio nimetty uudelleen: %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Kansio: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Kansion nimeksi vaihdettiin <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Kansio: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 284bbdfe2..6fe108344 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Appuyez de manière prolongée pour ajouter widget."</string>
<string name="market" msgid="2652226429823445833">"Acheter"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Impossible de déposer élément sur écran d\'accueil."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Impossible de déposer élément sur écran d\'accueil."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Sélectionnez le widget à créer"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nom du dossier"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Renommer le dossier"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Le raccourci \"<xliff:g id="NAME">%s</xliff:g>\" a été créé."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Le raccourci \"<xliff:g id="NAME">%s</xliff:g>\" a été supprimé."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Le raccourci \"<xliff:g id="NAME">%s</xliff:g>\" existe déjà."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Sélectionner un raccourci"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Sélectionner un raccourci"</string>
<string name="title_select_application" msgid="1793455815754848652">"Sélectionner une application"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Applications"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Page d\'accueil"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"installer des raccourcis"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"désinstaller les raccourcis"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permet à une application de supprimer des raccourcis sans l\'intervention de l\'utilisateur."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permet à l\'application de supprimer des raccourcis sans l\'intervention de l\'utilisateur."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"Lire les paramètres et les raccourcis de la page d\'accueil"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Permet à une application de lire les paramètres et les raccourcis de l\'écran d\'accueil."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Permet à l\'application de lire les paramètres et les raccourcis de l\'écran d\'accueil."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"Enregistrer les paramètres de la page d\'accueil et des raccourcis"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Permet à une application de modifier les paramètres et les raccourcis de l\'écran d\'accueil."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Permet à l\'application de modifier les paramètres et les raccourcis de l\'écran d\'accueil."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problème lors du chargement du widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Impossible de désinstaller cette application, car il s\'agit d\'une application système."</string>
<string name="dream_name" msgid="2847171357608437154">"Lance-missile"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Pour déplacer une application, appuyez dessus de manière prolongée."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Pour créer un dossier sur votre écran d\'accueil, superposez les applications les unes sur les autres."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Dossier ouvert, %1$d par %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Appuyez pour fermer le dossier."</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Appuyez pour confirmer le nouveau nom."</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Dossier ouvert, <xliff:g id="WIDTH">%1$d</xliff:g> par <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Appuyez pour fermer le dossier."</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Appuyez pour enregistrer le nouveau nom."</string>
<string name="folder_closed" msgid="3130534551370511932">"Dossier fermé"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Nouveau nom du dossier : %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Dossier : %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Nouveau nom du dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index a37ee5adb..d44f9c8e8 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"विजेट"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"किसी विजेट को चुनने के लिए स्‍पर्श करके रखें."</string>
<string name="market" msgid="2652226429823445833">"दुकान"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"इस मुखपृष्ठ स्‍क्रीन पर आइटम को नहीं छोड़ सका."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"इस मुखपृष्ठ स्‍क्रीन पर आइटम को नहीं छोड़ा जा सका."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"बनाने के लिए विजेट चुनें"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"फ़ोल्‍डर का नाम"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"फ़ोल्‍डर का नाम बदलें"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"\"<xliff:g id="NAME">%s</xliff:g>\" शार्टकट बना दिया गया."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"\"<xliff:g id="NAME">%s</xliff:g>\" शॉर्टकट हटाया गया."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"शार्टकट \"<xliff:g id="NAME">%s</xliff:g>\" पहले से मौजूद है."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"शॉर्टकट का चयन करें"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"शॉर्टकट चुनें"</string>
<string name="title_select_application" msgid="1793455815754848652">"एप्‍लिकेशन चुनें"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"एप्लिकेशन"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"होम"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"शॉर्टकट स्‍थापित करें"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"एप्लिकेशन को उपयोगकर्ता के हस्‍तक्षेप के बिना शॉर्टकट जोड़ने देता है."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"शॉर्टकट अनइंस्टॉल करें"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"एप्लिकेशन को उपयोगकर्ता के हस्‍तक्षेप के बिना शॉर्टकट निकालने देता है."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"एप्लिकेशन को उपयोगकर्ता के हस्‍तक्षेप के बिना शॉर्टकट निकालने देता है."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"होम सेटिंग और शॉर्टकट पढ़ें"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"एप्लिकेशन को मुखपृष्ठ पर सेटिंग और शॉर्टकट पढ़ने देता है."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"एप्लिकेशन को मुखपृष्ठ पर सेटिंग और शॉर्टकट पढ़ने देता है."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"होम सेटिंग और शॉर्टकट लिखें"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"एप्लिकेशन को मुखपृष्ठ पर सेटिंग और शॉर्टकट बदलने देता है."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"एप्लिकेशन को मुखपृष्ठ पर सेटिंग और शॉर्टकट बदलने देता है."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"विजेट लोड करने में समस्‍या"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"यह सिस्‍टम एप्लिकेशन है और इसे अनइंस्‍टॉल नहीं किया जा सकता."</string>
<string name="dream_name" msgid="2847171357608437154">"रॉकेट लॉन्‍चर"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"किसी एप्लिकेशन को ले जाने के लिए, उसे स्‍पर्श करके रखें."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"अपनी मुखपृष्ठ स्‍क्रीन पर कोई नया फ़ोल्डर बनाने के लिए, एक एप्लिकेशन को दूसरे के शीर्ष पर स्‍टैक करें."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"ठीक"</string>
- <string name="folder_opened" msgid="4129072635480822768">"फ़ोल्डर खोला गया, %2$d द्वारा %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"फ़ोल्डर बंद करने के लिए टैप करें"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"नाम बदलना सुनिश्चित करने के लिए टैप करें"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"फ़ोल्डर खोला गया, <xliff:g id="WIDTH">%1$d</xliff:g> गुणा <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"फ़ोल्‍डर बंद करने के लिए स्‍पर्श करें"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"परिवर्तित नाम सहेजने के लिए स्पर्श करें"</string>
<string name="folder_closed" msgid="3130534551370511932">"फ़ोल्डर बंद किया गया"</string>
- <string name="folder_renamed" msgid="781234745487414781">"फ़ोल्डर का नाम बदलकर %1$s कर दिया गया"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"फ़ोल्डर: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"फ़ोल्डर का नाम बदलकर <xliff:g id="NAME">%1$s</xliff:g> किया गया"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"फ़ोल्डर: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 9eb2aed8a..a588d5cfd 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgeti"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Dodirnite i držite kako biste preuzeli widget."</string>
<string name="market" msgid="2652226429823445833">"Trgovina"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Nije bilo moguće spustiti stavku na početni zaslon"</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Nije bilo moguće spustiti stavku na početni zaslon."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Odabir widgeta za stvaranje"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Naziv mape"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Preimenuj mapu"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Izrađen je prečac za \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Prečac za \"<xliff:g id="NAME">%s</xliff:g>\" je uklonjen."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Prečac za \"<xliff:g id="NAME">%s</xliff:g>\" već postoji."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Odaberite prečac"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Odabir prečaca"</string>
<string name="title_select_application" msgid="1793455815754848652">"Odabir aplikacije"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplikacije"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Početna"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"instaliraj prečace"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Omogućuje aplikaciji dodavanje prečaca bez intervencije korisnika."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"deinstaliraj prečace"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Dopušta aplikaciji uklanjanje prečaca bez intervencije korisnika."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Dopušta aplikaciji uklanjanje prečaca bez intervencije korisnika."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"pročitaj postavke početnog zaslona i prečaca"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Dopušta aplikaciji čitanje postavki i prečaca na početnom zaslonu."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Dopušta aplikaciji čitanje postavki i prečaca na početnom zaslonu."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"zapiši postavke početnog zaslona i prečaca"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Dopušta aplikaciji promjenu postavki i prečaca na početnom zaslonu."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Dopušta aplikaciji promjenu postavki i prečaca na početnom zaslonu."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problem pri učitavanju widgeta"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Ovo je aplikacija sustava i ne može se ukloniti."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Da biste premjestili aplikaciju, dodirnite je i zadržite."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Da biste napravili novu mapu na početnom zaslonu, stavite jednu aplikaciju na drugu."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"U redu"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Mapa je otvorena, %1$d s %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Dotaknite za zatvaranje mape"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Dotaknite za izvršavanje preimenovanja"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Mapa je otvorena, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Dodirnite za zatvaranje mape"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dodirnite da biste spremili preimenovanje"</string>
<string name="folder_closed" msgid="3130534551370511932">"Mapa zatvorena"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Mapa je preimenovana u %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Mapa: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Mapa je preimenovana u <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 6d4b63e56..1faa884e1 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -23,13 +23,13 @@
<string name="uid_name" msgid="3371120195364560632">"Alap Android-alkalmazások"</string>
<string name="folder_name" msgid="8551881338202938211"></string>
<string name="chooser_wallpaper" msgid="6063168087625352235">"Válasszon tapétát innen:"</string>
- <string name="wallpaper_instructions" msgid="4215640646180727542">"Háttérkép beállítása"</string>
+ <string name="wallpaper_instructions" msgid="4215640646180727542">"Háttérkép kiválasztása"</string>
<string name="pick_wallpaper" msgid="5630222540525626723">"Háttérképek"</string>
<string name="activity_not_found" msgid="217823393239365967">"Az alkalmazás nincs telepítve."</string>
<string name="widgets_tab_label" msgid="9145860100000983599">"Modulok"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Modul felvételéhez érintse meg, és tartsa lenyomva"</string>
<string name="market" msgid="2652226429823445833">"Bolt"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Nem lehet elemeket dobni erre a Kezdőképernyőre."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Nem lehet elemeket dobni erre a Kezdőképernyőre."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"A létrehozáshoz válasszon modult"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Mappa neve"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Mappa átnevezése"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"\"<xliff:g id="NAME">%s</xliff:g>\" parancsikon létrehozva."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"A(z) \"<xliff:g id="NAME">%s</xliff:g>\" parancsikon eltávolításra került."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"\"<xliff:g id="NAME">%s</xliff:g>\" parancsikon már létezik."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Parancsikon kiválasztása"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Parancsikon választása"</string>
<string name="title_select_application" msgid="1793455815754848652">"Válasszon alkalmazást"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Alkalmazások"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Főoldal"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"parancsikonok telepítése"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Lehetővé teszi egy alkalmazás számára, hogy felhasználói beavatkozás nélkül adjon hozzá parancsikonokat."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"parancsikonok eltávolítása"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Lehetővé teszi egy alkalmazás számára, hogy felhasználói beavatkozás nélkül távolítson el parancsikonokat."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Lehetővé teszi egy alkalmazás számára, hogy felhasználói beavatkozás nélkül távolítson el parancsikonokat."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"Főoldal beállításainak és parancsikonjainak beolvasása"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Lehetővé teszi egy alkalmazás számára, hogy beolvassa a Kezdőképernyő beállításait és parancsikonjait."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Lehetővé teszi az alkalmazás számára, hogy beolvassa a Kezdőképernyő beállításait és parancsikonjait."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"Főoldal beállításainak és parancsikonjainak írása"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Lehetővé teszi egy alkalmazás számára, hogy módosítsa a Kezdőképernyő beállításait és parancsikonjait."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Lehetővé teszi az alkalmazás számára, hogy módosítsa a Kezdőképernyő beállításait és parancsikonjait."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Probléma történt a modul betöltésekor"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Ez egy rendszeralkalmazás, és nem lehet eltávolítani."</string>
<string name="dream_name" msgid="2847171357608437154">"Aknavető"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Ha egy alkalmazást át szeretne helyezni, érintse meg, és tartsa lenyomva."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Ha egy új mappát szeretne létrehozni a kezdőképernyőn, helyezzen egymásra két alkalmazást."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Megnyitott mappa: %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Érintse meg a mappa bezárásához"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Átnevezéshez érintse meg"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Mappa megnyitva -- szélesség: <xliff:g id="WIDTH">%1$d</xliff:g>; magasság: <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Érintse meg a mappa bezárásához"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Érintse meg az átnevezés mentéséhez"</string>
<string name="folder_closed" msgid="3130534551370511932">"Mappa lezárva"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Mappa átnevezve a következőre: %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Mappa: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Mappa új neve: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Mappa: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index a7214d803..0e4e33a56 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widget"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Sentuh &amp; tahan untuk memilih gawit."</string>
<string name="market" msgid="2652226429823445833">"Belanja"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Tidak dapat melepas item ke layar Utama ini."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Tidak dapat melepas item ke layar Utama ini."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pilih gawit untuk membuat"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nama map"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Ubah nama map"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" sudah dibuat."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" telah dihapus."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" sudah ada."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Pilih pintasan"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Pilih pintasan"</string>
<string name="title_select_application" msgid="1793455815754848652">"Pilih apl"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Rumah"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"pasang pintasan"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Mengizinkan apl menambahkan pintasan tanpa campur tangan pengguna."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"copot pemasangan pintasan"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Mengizinkan apl menghapus pintasan tanpa campur tangan pengguna."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Mengizinkan apl menghapus pintasan tanpa campur tangan pengguna."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"baca setelan dan pintasan Beranda"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Mengizinkan aplikasi membaca setelan dan pintasan di layar Utama."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Mengizinkan apl membaca setelan dan pintasan di layar Utama."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"tuliskan setelan dan pintasan Beranda"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Mengizinkan apl mengubah setelan dan pintasan di layar Utama."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Mengizinkan apl mengubah setelan dan pintasan di layar Utama."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Masalah memuat widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Ini adalah apl sistem dan tidak dapat dicopot pemasangannya."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Untuk memindahkan apl, sentuh &amp; tahan apl tersebut."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Untuk membuat map baru di layar Utama Anda, tumpuk satu apl di atas apl yang lain."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Map dibuka, %1$d kali %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Ketuk untuk menutup map"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Ketuk untuk mengubah nama"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Map dibuka, <xliff:g id="WIDTH">%1$d</xliff:g> kali <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Sentuh untuk menutup map"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Sentuh untuk menyimpan pengubahan nama"</string>
<string name="folder_closed" msgid="3130534551370511932">"Map ditutup"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Map diubah namanya menjadi %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Map: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Map diubah namanya menjadi <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Map: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index f9353034f..0fab2e230 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widget"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Tocca e tieni premuto per scegliere un widget."</string>
<string name="market" msgid="2652226429823445833">"Acquista"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Rilascio elemento in schermata Home non riuscito."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Rilascio elemento in schermata Home non riuscito."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Scegli il widget da creare"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nome cartella"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Rinomina cartella"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" creata."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"La scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" è stata rimossa."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" già presente."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Seleziona scorciatoia"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Scegli scorciatoia"</string>
<string name="title_select_application" msgid="1793455815754848652">"Scegli applicazione"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Applicazioni"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Home"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"aggiungere scorciatoie"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Consente a un\'applicazione di aggiungere scorciatoie automaticamente."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"eliminare scorciatoie"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Consente a un\'applicazione di rimuovere scorciatoie automaticamente."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Consente all\'applicazione di rimuovere scorciatoie automaticamente."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"leggere impostazioni e scorciatoie in Home"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Consente a un\'applicazione di leggere le impostazioni e le scorciatoie in Home."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Consente all\'applicazione di leggere le impostazioni e le scorciatoie in Home."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"creare impostazioni e scorciatoie in Home"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Consente a un\'applicazione di modificare le impostazioni e le scorciatoie in Home."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Consente all\'applicazione di modificare le impostazioni e le scorciatoie in Home."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Errore durante il caricamento del widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Questa è un\'applicazione di sistema e non può essere disinstallata."</string>
<string name="dream_name" msgid="2847171357608437154">"Lanciamissili"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Per spostare un\'applicazione, tocca e tieni premuto."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Per creare una nuova cartella sulla schermata Home, impila un\'applicazione su un\'altra."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Cartella aperta, %1$d per %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Tocca per chiudere la cartella"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tocca per applicare nuovo nome"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Cartella aperta, <xliff:g id="WIDTH">%1$d</xliff:g> per <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Tocca per chiudere la cartella"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Tocca per salvare nuovo nome"</string>
<string name="folder_closed" msgid="3130534551370511932">"Cartella chiusa"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Nome della cartella sostituito con %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Cartella: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Nome della cartella sostituito con <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Cartella: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index d6f18fdc7..75cda09d2 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"רכיבי Widget"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"גע בפריט והחזק בו כדי לבחור Widget."</string>
<string name="market" msgid="2652226429823445833">"קנה"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"לא ניתן לשחרר את הפריט במסך דף הבית הזה."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"לא ניתן לשחרר את הפריט במסך דף בית זה."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"בחר Widget ליצירה"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"שם תיקיה"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"שנה את שם התיקיה"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"הקיצור \'<xliff:g id="NAME">%s</xliff:g>\' נוצר."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"הקיצור \'<xliff:g id="NAME">%s</xliff:g>\' הוסר."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"הקיצור \'<xliff:g id="NAME">%s</xliff:g>\' כבר קיים."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"בחר קיצור דרך"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"בחר קיצור דרך"</string>
<string name="title_select_application" msgid="1793455815754848652">"בחר יישום"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"יישומים"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"בית"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"התקן קיצורי דרך"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"מאפשר ליישום להוסיף קיצורי דרך ללא התערבות המשתמש."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"הסר קיצורי דרך"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"מאפשר ליישום להסיר קיצורי דרך ללא התערבות המשתמש."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"מאפשר ליישום להסיר קיצורי דרך ללא התערבות המשתמש."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"קרא הגדרות וקיצורי דרך של דף הבית"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"מאפשר ליישום לקרוא את ההגדרות וקיצורי הדרך בדף הבית."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"מאפשר ליישום לקרוא את ההגדרות וקיצורי הדרך בדף הבית."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"כתוב הגדרות וקיצורי דרך של דף הבית"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"מאפשר ליישום לשנות את ההגדרות וקיצורי הדרך בדף הבית."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"מאפשר ליישום לשנות את ההגדרות וקיצורי הדרך בדף הבית."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"בעיה בטעינת Widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"זהו יישום מערכת ולא ניתן להסיר את התקנתו."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"כדי להעביר יישום, גע בו והחזק אותו."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"כדי ליצור תיקיה חדשה במסך דף הבית, הצב יישום אחד בערימה מעל יישום אחר."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"בסדר"</string>
- <string name="folder_opened" msgid="4129072635480822768">"התיקייה נפתחה, %1$d על %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"הקש כדי לסגור את התיקייה"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"הקש כדי לבצע שינוי שם"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"תיקיה פתוחה, <xliff:g id="WIDTH">%1$d</xliff:g> על <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"גע כדי לסגור את התיקייה"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"גע כדי לשמור שינוי שם"</string>
<string name="folder_closed" msgid="3130534551370511932">"התיקייה נסגרה"</string>
- <string name="folder_renamed" msgid="781234745487414781">"שם התיקייה שונה ל-%1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"תיקייה: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"שם התיקיה שונה ל-<xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"תיקיה: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index c172fa023..87ef7c8d4 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"ウィジェット"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"ウィジェットを追加するには押し続けます。"</string>
<string name="market" msgid="2652226429823445833">"ショップ"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"このホーム画面にアイテムをドロップできませんでした"</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"このホーム画面にアイテムをドロップできませんでした。"</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"作成するウィジェットの選択"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"フォルダ名"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"フォルダ名を変更"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"ショートカット「<xliff:g id="NAME">%s</xliff:g>」を作成しました。"</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"ショートカット「<xliff:g id="NAME">%s</xliff:g>」を削除しました。"</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"ショートカット「<xliff:g id="NAME">%s</xliff:g>」は既に存在します。"</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"ショートカットを選択"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"ショートカットを選択"</string>
<string name="title_select_application" msgid="1793455815754848652">"アプリの選択"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"アプリ"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"ホーム"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"ショートカットのインストール"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"ユーザー操作なしでショートカットを追加することをアプリに許可します。"</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"ショートカットのアンインストール"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"ユーザー操作なしでショートカットを削除することをアプリに許可します。"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"ユーザー操作なしでショートカットを削除することをアプリに許可します。"</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"ホーム設定とショートカットの読み取り"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"ホームの設定とショートカットの読み取りをアプリに許可します。"</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"ホームの設定とショートカットの読み取りをアプリに許可します。"</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"ホームの設定とショートカットの書き込み"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"ホームの設定とショートカットの変更をアプリに許可します。"</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"ホームの設定とショートカットの変更をアプリに許可します。"</string>
<string name="gadget_error_text" msgid="8359351016167075858">"ウィジェットを表示できません"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"このシステムアプリはアンインストールできません。"</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"アプリを移動するにはアプリを押し続けます。"</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"ホーム画面に新しいフォルダを作成するには、アプリを他のアプリの上に重ねます。"</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"フォルダが開いています。%1$dx%2$dの大きさです"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"タップしてフォルダを閉じます"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"タップして名前の変更を確定"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"フォルダが開いています。<xliff:g id="WIDTH">%1$d</xliff:g>x<xliff:g id="HEIGHT">%2$d</xliff:g>の大きさです"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"タップしてフォルダを閉じます"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"タップして名前の変更を保存します"</string>
<string name="folder_closed" msgid="3130534551370511932">"フォルダは閉じています"</string>
- <string name="folder_renamed" msgid="781234745487414781">"フォルダの名前を「%1$s」に変更しました"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"フォルダ: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"フォルダの名前を「<xliff:g id="NAME">%1$s</xliff:g>」に変更しました"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"フォルダ: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 34657e8d4..662811e4a 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"위젯"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"위젯을 선택하려면 길게 터치하세요."</string>
<string name="market" msgid="2652226429823445833">"쇼핑"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"홈 화면에 항목을 놓을 수 없습니다."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"홈 화면에 항목을 놓을 수 없습니다."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"만들 위젯 선택"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"폴더 이름"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"폴더 이름 바꾸기"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"바로가기(\'<xliff:g id="NAME">%s</xliff:g>\')가 생성되었습니다."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"바로가기(\'<xliff:g id="NAME">%s</xliff:g>\')가 삭제되었습니다."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"바로가기(\'<xliff:g id="NAME">%s</xliff:g>\')가 이미 있습니다."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"바로가기 선택"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"바로가기 선택"</string>
<string name="title_select_application" msgid="1793455815754848652">"앱 선택"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"애플리케이션"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"홈"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"바로가기 설치"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"앱이 사용자의 작업 없이 바로가기를 추가할 수 있도록 합니다."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"바로가기 제거"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"앱이 사용자의 작업 없이 바로가기를 삭제할 수 있도록 합니다."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"앱이 사용자의 작업 없이 바로가기를 삭제할 수 있도록 합니다."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"홈 설정 및 바로가기 읽기"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"앱이 홈에 있는 설정 및 바로가기를 읽을 수 있도록 합니다."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"앱이 홈에 있는 설정 및 바로가기를 읽을 수 있도록 합니다."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"홈 설정 및 바로가기 쓰기"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"앱이 홈에 있는 설정 및 바로가기를 변경할 수 있도록 합니다."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"앱이 홈에 있는 설정 및 바로가기를 변경할 수 있도록 합니다."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"위젯을 로드하는 중 문제가 발생했습니다."</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"시스템 앱은 제거할 수 없습니다."</string>
<string name="dream_name" msgid="2847171357608437154">"로켓 실행기"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"앱을 이동하려면 길게 터치합니다."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"홈 화면에 새로운 폴더를 만들려면 앱 하나를 다른 앱 위에 겹쳐 놓습니다."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"확인"</string>
- <string name="folder_opened" msgid="4129072635480822768">"폴더 열림, %1$d 곱하기 %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"탭하여 폴더를 닫음"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"탭하여 이름을 바꿈"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"폴더 열림(<xliff:g id="WIDTH">%1$d</xliff:g>X<xliff:g id="HEIGHT">%2$d</xliff:g>)"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"터치하여 폴더를 닫음"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"터치하여 바꾼 이름을 저장"</string>
<string name="folder_closed" msgid="3130534551370511932">"폴더 닫음"</string>
- <string name="folder_renamed" msgid="781234745487414781">"%1$s(으)로 폴더 이름 바꿈"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"폴더: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"<xliff:g id="NAME">%1$s</xliff:g>(으)로 폴더 이름 바꿈"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"폴더: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 6d0261f89..b4ddc0058 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -69,10 +69,6 @@
<integer name="apps_customize_cling_focused_x">2</integer>
<integer name="apps_customize_cling_focused_y">1</integer>
- <!-- Padding applied to AppWidgets -->
- <dimen name="app_widget_padding_top">8dp</dimen>
- <dimen name="app_widget_padding_bottom">8dp</dimen>
-
<!-- Folders -->
<!-- The size of the image which sits behind the preview of the folder contents -->
<dimen name="folder_preview_size">58dp</dimen>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 2b1298146..cb1d91fc5 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Valdikliai"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Kad pasirinkt. valdiklį, palieskite ir laikykite."</string>
<string name="market" msgid="2652226429823445833">"Parduotuvė"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Nepavyko palikti elemento šiame pagrind. ekrane."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Nepavyko nuvilkti elemento į šį pagrind. ekraną."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pasirinkite norimą kurti valdiklį"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Aplanko pavadinimas"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Sukurti aplankui naują pavadinimą"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Sukurtas „<xliff:g id="NAME">%s</xliff:g>“ spartusis klavišas."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Spartusis klavišas „<xliff:g id="NAME">%s</xliff:g>“ pašalintas."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Spartusis klavišas „<xliff:g id="NAME">%s</xliff:g>“ jau yra."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Pasirinkti spartųjį klavišą"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Pasirinkite spartųjį klavišą"</string>
<string name="title_select_application" msgid="1793455815754848652">"Pasirinkite programą"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Pagrindinis"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"įdiegti sparčiuosius klavišus"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Leidžiama programai pridėti sparčiuosius klavišus be naudotojo įsikišimo."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"pašalinti sparčiuosius klavišus"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Leidžiama programai pašalinti sparčiuosius klavišus be naudotojo įsikišimo."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Programai leidžiama pašalinti sparčiuosius klavišus be naudotojo įsikišimo."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"skaityti pagrindinio puslapio nustatymus ir sparčiuosius klavišus"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Leidžiama programai skaityti pagrindinio puslapio nustatymus ir sparčiuosius klavišus."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Programai leidžiama skaityti pagrindinio puslapio nustatymus ir sparčiuosius klavišus."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"rašyti pagrindinio puslapio nustatymus ir sparčiuosius klavišus"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Leidžiama programai keisti pagrindinio puslapio nustatymus ir sparčiuosius klavišus."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Programai leidžiama keisti pagrindinio puslapio nustatymus ir sparčiuosius klavišus."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problema įkeliant valdiklį"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Tai sistemos programa ir jos negalima pašalinti."</string>
<string name="dream_name" msgid="2847171357608437154">"Raketinis prieštankinis šautuvas"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Jei norite perkelti programą, palieskite ją ir laikykite."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Jei pagrindiniame ekrane norite sukurti naują aplanką, uždėkite vieną programą ant kitos."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"Gerai"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Aplankas atidarytas, %1$d ir %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Palieskite, kad uždarytumėte aplanką"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Palieskite, kad pervardytumėte"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Atidarytas aplankas, <xliff:g id="WIDTH">%1$d</xliff:g> ir <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Palieskite, kad uždarytumėte aplanką"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Palieskite, kad išsaugotumėte naują pavadinimą"</string>
<string name="folder_closed" msgid="3130534551370511932">"Aplankas uždarytas"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Aplankas pervardytas į %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Aplankas: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Aplankas pervardintas kaip „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Aplankas: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 96686c3c9..90850ae08 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Logrīki"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Lai izvēlētos logrīku, pieskarieties tam un turiet to."</string>
<string name="market" msgid="2652226429823445833">"Iepirkties"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Nevarēja nomest vienumu šajā sākuma ekrānā."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Nevarēja nomest vienumu šajā sākuma ekrānā."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Izveidojamā logrīka izvēlēšanās"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Mapes nosaukums"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Mapes pārdēvēšana"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Saīsne “<xliff:g id="NAME">%s</xliff:g>” tika izveidota."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Saīsne “<xliff:g id="NAME">%s</xliff:g>” tika noņemta."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Saīsne “<xliff:g id="NAME">%s</xliff:g>” jau pastāv."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Saīsnes atlase"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Saīsnes izvēle"</string>
<string name="title_select_application" msgid="1793455815754848652">"Lietotnes izvēlēšanās"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Lietotnes"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Sākums"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"ievietot saīsnes"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Ļauj lietotnei pievienot saīsnes, nejautājot lietotājam."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"atinstalēt saīsnes"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Ļauj lietotnei noņemt saīsnes, nejautājot lietotājam."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Ļauj lietotnei noņemt saīsnes, nejautājot lietotājam."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"lasīt sākuma ekrāna iestatījumus un saīsnes"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Ļauj lietotnei lasīt iestatījumus un saīsnes sākuma ekrānā."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Ļauj lietotnei lasīt iestatījumus un saīsnes sākuma ekrānā."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"rakstīt sākuma ekrāna iestatījumus un saīsnes"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Ļauj lietotnei mainīt iestatījumus un saīsnes sākuma ekrānā."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Ļauj lietotnei mainīt iestatījumus un saīsnes sākuma ekrānā."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Radās problēma, ielādējot logrīku"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Šī ir sistēmas lietotne, un to nevar atinstalēt."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Lai pārvietotu lietotni, pieskarieties tai un turiet to nospiestu."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Lai sākuma ekrānā izveidotu jaunu mapi, novietojiet vienu lietotni virs citas lietotnes."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"Labi"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Mape atvērta, %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Pieskarieties, lai aizvērtu mapi."</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Pieskarieties, lai pārdēvētu"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Atvērta mape: <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Pieskarieties, lai aizvērtu mapi."</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Pieskarieties, lai saglabātu pārdēvēto nosaukumu."</string>
<string name="folder_closed" msgid="3130534551370511932">"Mape aizvērta"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Mape pārdēvēta par: %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Mape: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Mape pārdēvēta par: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Mape: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 44f38d117..1b34fdb20 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widget"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Sentuh &amp; tahan untuk mengambil widget."</string>
<string name="market" msgid="2652226429823445833">"Kedai"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Tidak dapat melepaskan item pada skrin Utama ini."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Tidak dapat melepaskan item pada skrin Utama ini."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pilih widget untuk dibuat"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nama folder"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Namakan semula folder"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" diwujudkan."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" telah dialih keluar."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" sudah pun wujud."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Pilih pintasan"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Pilih pintasan"</string>
<string name="title_select_application" msgid="1793455815754848652">"Pilih aplikasi"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apl"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Laman Utama"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"pasang pintasan"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Membenarkan aplikasi menambah pintasan tanpa campur tangan pengguna."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"nyahpasang pintasan"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Membenarkan aplikasi mengalih keluar pintasan tanpa campur tangan pengguna."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Membenarkan apl mengalih keluar pintasan tanpa campur tangan pengguna."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"membaca tetapan dan pintasan Laman Utama"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Membenarkan aplikasi untuk membaca tetapan dan pintasan di Laman Utama."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Membenarkan apl membaca tetapan dan pintasan di Laman Utama."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"menulis tetapan dan pintasan Laman Utama"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Membenarkan aplikasi untuk menukar tetapan dan pintasan di Laman Utama."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Membenarkan apl menukar tetapan dan pintasan di Laman Utama."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Masalah memuatkan widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Ini adalah aplikasi sistem dan tidak boleh dinyahpasang."</string>
<string name="dream_name" msgid="2847171357608437154">"Pelancar Roket"</string>
@@ -97,12 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Untuk memindahkan aplikasi, sentuh &amp; tahankannya."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Untuk membuat folder baharu pada skrin Utama anda, tindihkan satu aplikasi di atas yang lain."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Folder dibuka, %1$d daripada %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Ketik untuk tutup folder"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Ketik untuk melakukan menamakan semula"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Sentuh untuk menutup folder"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Sentuh untuk menyimpan penamaan semula"</string>
<string name="folder_closed" msgid="3130534551370511932">"Folder ditutup"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for folder_renamed (781234745487414781) -->
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
<skip />
- <string name="folder_name_format" msgid="4513766553514769310">"Folder: %1$s"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 4b6065c47..01ae1da96 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -23,13 +23,13 @@
<string name="uid_name" msgid="3371120195364560632">"Android-kjerneapplikasjoner"</string>
<string name="folder_name" msgid="8551881338202938211"></string>
<string name="chooser_wallpaper" msgid="6063168087625352235">"Velg bakgrunnsbilde fra"</string>
- <string name="wallpaper_instructions" msgid="4215640646180727542">"Velg bakgrunnsbilde"</string>
+ <string name="wallpaper_instructions" msgid="4215640646180727542">"Velg som bakgrunnsbilde"</string>
<string name="pick_wallpaper" msgid="5630222540525626723">"Bakgrunner"</string>
<string name="activity_not_found" msgid="217823393239365967">"Appen er ikke installert."</string>
<string name="widgets_tab_label" msgid="9145860100000983599">"Moduler"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Trykk og hold inne for å plukke opp en modul."</string>
<string name="market" msgid="2652226429823445833">"Butikk"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Kunne ikke slippe elementet på denne startsiden."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Kunne ikke slippe elementet på denne startsiden."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Velg modul for oppretting"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Mappenavn"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Gi nytt navn til mappe"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Opprettet snarveien «<xliff:g id="NAME">%s</xliff:g>»."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Fjernet snarveien «<xliff:g id="NAME">%s</xliff:g>»."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Snarveien «<xliff:g id="NAME">%s</xliff:g>» fins allerede."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Velg snarvei"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Valg av snarvei"</string>
<string name="title_select_application" msgid="1793455815754848652">"Velg app"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apper"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Startsiden"</string>
@@ -73,13 +73,13 @@
<string name="cab_folder_selection_text" msgid="8916111874189565067">"1 mappe valgt"</string>
<string name="cab_shortcut_selection_text" msgid="8115847384500412878">"1 snarvei valgt"</string>
<string name="permlab_install_shortcut" msgid="1201690825493376489">"installere snarveier"</string>
- <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Gir en app tillatelse til å legge til snarveier uten innblanding fra brukeren."</string>
+ <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Gir apper tillatelse til å legge til snarveier uten innblanding fra brukeren."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"avinstallere snarveier"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Gir en app tillatelse til å fjerne snarveier uten innblanding fra brukeren."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"La appen fjerne snarveier uten innblanding fra brukeren."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"lese skrivebordsinnstillinger og -snarveier"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Gir en app tillatelse til å lese innstillingene og snarveiene på startsiden."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Lar appen lese innstillingene og snarveiene på startsiden."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"skrive skrivebordsinnstillinger og -snarveier"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Gir en app tillatelse til å endre innstillingene og snarveiene på startsiden."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Lar appen endre innstillingene og snarveiene på startsiden."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problem under lasting av gadget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Dette er en systemapp som ikke kan avinstalleres."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Berør og hold nede en app for å flytte den."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Du kan lage en ny mappe på startsiden ved å stable én app oppå en annen."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Mappe åpnet, %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Trykk for å lukke mappen"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Trykk for gjennomføre navnebytte"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Mappen er åpnet – <xliff:g id="WIDTH">%1$d</xliff:g> ganger <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Trykk for å lukke mappen"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Trykk for å lagre nytt navn"</string>
<string name="folder_closed" msgid="3130534551370511932">"Mappen ble lukket"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Mappen har endret navn til %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Mappe: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Mappen har endret navn til <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 157743a63..28edf4782 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Blijf aanraken om een widget toe te voegen"</string>
<string name="market" msgid="2652226429823445833">"Winkel"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Kan item niet neerzetten op dit startscherm."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Kan item niet neerzetten in dit startscherm."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Widget selecteren om te maken"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Mapnaam"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Naam van map wijzigen"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Snelkoppeling \'<xliff:g id="NAME">%s</xliff:g>\' is gemaakt."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Snelkoppeling \'<xliff:g id="NAME">%s</xliff:g>\' is verwijderd."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Snelkoppeling \'<xliff:g id="NAME">%s</xliff:g>\' bestaat al."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Snelkoppeling selecteren"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Snelkoppeling selecteren"</string>
<string name="title_select_application" msgid="1793455815754848652">"App selecteren"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Startpagina"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"snelkoppelingen installeren"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Een app toestaan snelkoppelingen toe te voegen zonder tussenkomst van de gebruiker."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"snelkoppelingen verwijderen"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Een app toestaan snelkoppelingen te verwijderen zonder tussenkomst van de gebruiker."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Toestaan dat de app snelkoppelingen verwijdert zonder tussenkomst van de gebruiker."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"instellingen en snelkoppelingen voor de startpagina lezen"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Hiermee kan een app de instellingen en snelkoppelingen op de startpagina lezen."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Toestaan dat de app de instellingen en snelkoppelingen op de startpagina leest."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"instellingen en snelkoppelingen voor de startpagina schrijven"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Hiermee kan een app de instellingen en snelkoppelingen op de startpagina wijzigen."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Toestaan dat de app de instellingen en snelkoppelingen op de startpagina wijzigt."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Probleem bij het laden van widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Dit is een systeemapp die niet kan worden verwijderd."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Als u een app wilt verplaatsen, blijft u de app aanraken."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Als u een nieuwe map op het startscherm wilt maken, stapelt u een app boven op een andere app."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Map geopend, %1$d door %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Tik om de map te sluiten"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tik om wijzigen van naam toe te passen"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Map geopend, <xliff:g id="WIDTH">%1$d</xliff:g> bij <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Raak dit aan om de map te sluiten"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Raak dit aan om naam wijzigen op te slaan"</string>
<string name="folder_closed" msgid="3130534551370511932">"Map gesloten"</string>
- <string name="folder_renamed" msgid="781234745487414781">"De naam van de map is gewijzigd in %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Map: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"De naam van de map is gewijzigd in <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Map: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 7433c55ed..3340fa31a 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widżety"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Aby dodać widżet, dotknij go i przytrzymaj."</string>
<string name="market" msgid="2652226429823445833">"Sklep"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Nie można upuścić elementu na tym ekranie głównym."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Nie można upuścić elementu na tym ekranie głównym."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Wybierz widżet, który chcesz dodać"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nazwa folderu"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Zmień nazwę folderu"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Skrót „<xliff:g id="NAME">%s</xliff:g>” został utworzony."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Skrót „<xliff:g id="NAME">%s</xliff:g>” został usunięty."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Skrót „<xliff:g id="NAME">%s</xliff:g>” już istnieje."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Wybierz skrót"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Wybierz skrót"</string>
<string name="title_select_application" msgid="1793455815754848652">"Wybierz aplikację"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplikacje"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Ekran główny"</string>
@@ -53,7 +53,7 @@
<string name="delete_zone_label_all_apps" msgid="6664588234817475108">"Odinstaluj"</string>
<string name="delete_target_label" msgid="665300185123139530">"Usuń"</string>
<string name="delete_target_uninstall_label" msgid="748894921183769150">"Odinstaluj"</string>
- <string name="info_target_label" msgid="4019495079517426980">"Informacje o aplikacji"</string>
+ <string name="info_target_label" msgid="4019495079517426980">"O aplikacji"</string>
<string name="accessibility_search_button" msgid="816822994629942611">"Szukaj"</string>
<string name="accessibility_voice_search_button" msgid="3938249215065842475">"Wyszukiwanie głosowe"</string>
<string name="accessibility_all_apps_button" msgid="8803738611398979849">"Aplikacje"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"zainstaluj skróty"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Pozwala aplikacji dodawać skróty bez interwencji użytkownika."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"odinstaluj skróty"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Pozwala aplikacji usuwać skróty bez interwencji użytkownika."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Pozwala aplikacji usuwać skróty bez interwencji użytkownika."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"odczytywanie ustawień i skrótów strony głównej"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Pozwala aplikacji na odczyt ustawień i skrótów na ekranie głównym."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Umożliwia aplikacji odczytywanie ustawień i skrótów na ekranie głównym."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"zapisywanie ustawień i skrótów strony głównej"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Umożliwia aplikacji zmianę ustawień i skrótów na ekranie głównym."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Umożliwia aplikacji zmianę ustawień i skrótów na ekranie głównym."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problem podczas ładowania widżetu"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"To jest aplikacja systemowa, której nie możesz odinstalować."</string>
<string name="dream_name" msgid="2847171357608437154">"Wyrzutnia rakiet"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Dotknij i przytrzymaj, aby przenieść aplikację."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Aby utworzyć nowy folder na ekranie głównym, ułóż aplikacje jedna na drugiej."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Folder otwarty, %1$d na %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Dotknij, aby zamknąć folder."</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Dotknij, aby zmienić nazwę."</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Folder otwarty, <xliff:g id="WIDTH">%1$d</xliff:g> na <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Dotknij, aby zamknąć folder"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dotknij, aby zapisać zmianę nazwy"</string>
<string name="folder_closed" msgid="3130534551370511932">"Folder zamknięty"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Nazwa folderu zmieniona na %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Folder: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Nazwa folderu zmieniona na <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index db7419852..ea407b7d3 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Prima sem soltar para escolher um widget."</string>
<string name="market" msgid="2652226429823445833">"Loja"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Não foi possível largar o item neste Ecrã inicial."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Não foi possível largar o item neste Ecrã Principal."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Escolher um widget para criar"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nome da pasta"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Mudar o nome da pasta"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" foi criado."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" foi removido."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" já existe."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Seleccione o atalho"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Escolher atalho"</string>
<string name="title_select_application" msgid="1793455815754848652">"Escolher aplicação"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplicações"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Página inicial"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"instalar atalhos"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite que uma aplicação adicione atalhos sem a intervenção do utilizador."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstalar atalhos"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite que uma aplicação remova atalhos sem a intervenção do utilizador."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite que a aplicação remova atalhos sem intervenção do utilizador."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"ler definições e atalhos do ecrã principal"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite que uma aplicação leia as definições e os atalhos do Ecrã principal."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite que a aplicação leia as definições e os atalhos no Ecrã Principal."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"escrever definições e atalhos do ecrã principal"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite que uma aplicação altere as definições e os atalhos do Ecrã principal."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite que uma aplicação altere as definições e os atalhos no Ecrã Principal."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Erro ao carregar o widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"É uma aplicação de sistema e não pode ser desinstalada."</string>
<string name="dream_name" msgid="2847171357608437154">"Lança-mísseis"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Para mover uma aplicação, toque na mesma sem largar."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Para criar uma nova pasta no Ecrã principal, empilhe uma aplicação por cima de outra."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Pasta aberta, %1$d por %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Toque para fechar a pasta"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toque para mudar o nome"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Pasta aberta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Toque para fechar a pasta"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toque para guardar o nome novo"</string>
<string name="folder_closed" msgid="3130534551370511932">"Pasta fechada"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Nome da pasta alterado para %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Pasta: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Nome de pasta alterado para <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index f1e5d6f8a..a623510b4 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Toque e pressione para selecionar um widget."</string>
<string name="market" msgid="2652226429823445833">"Comprar"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Não foi possível soltar este item na tela inicial."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Não foi possível soltar este item na tela inicial."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Selecione um widget para criar"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nome da pasta"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Renomear pasta"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Atalho \"<xliff:g id="NAME">%s</xliff:g>\" criado."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" foi removido."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" já existe."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Selecionar atalho"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Escolher atalho"</string>
<string name="title_select_application" msgid="1793455815754848652">"Selecione um aplicativo"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplicativos"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Página inicial"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"instalar atalhos"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite que um aplicativo adicione atalhos sem intervenção do usuário."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstalar atalhos"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite que um aplicativo remova os atalhos sem a intervenção do usuário."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite que o aplicativo remova atalhos sem a intervenção do usuário."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"ler configurações e atalhos da Página inicial"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite que um aplicativo leia as configurações e os atalhos na Página inicial."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite que o aplicativo leia as configurações e os atalhos na Página inicial."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"gravar configurações e atalhos da Página inicial"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite que um aplicativo altere as configurações e os atalhos na Página inicial."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite que o aplicativo altere as configurações e os atalhos na Página inicial."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problema ao carregar o widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Este é um aplicativo do sistema e não pode ser desinstalado."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Para mover um aplicativo, toque e mantenha-o pressionado."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Para criar uma nova pasta em sua tela inicial, coloque um aplicativo em cima do outro."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Pasta aberta, %1$d por %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Toque para fechar a pasta"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toque para confirmar renomeação"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Pasta aberta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Toque para fechar a pasta"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toque para salvar o novo nome"</string>
<string name="folder_closed" msgid="3130534551370511932">"Pasta fechada"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Pasta renomeada para %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Pasta: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Pasta renomeada para <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index 4d6c18727..f8f849244 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -22,17 +22,19 @@
<string name="application_name" msgid="8424725141379931883">"Lantschader"</string>
<string name="uid_name" msgid="3371120195364560632">"Applicaziuns da basa dad Android"</string>
<string name="folder_name" msgid="8551881338202938211"></string>
- <!-- outdated translation 5988031014201479733 --> <string name="chooser_wallpaper" msgid="6063168087625352235">"Tscherner in fund davos"</string>
+ <!-- no translation found for chooser_wallpaper (6063168087625352235) -->
+ <skip />
<string name="wallpaper_instructions" msgid="4215640646180727542">"Definir in fund davos"</string>
<string name="pick_wallpaper" msgid="5630222540525626723">"Maletgs da fund davos"</string>
- <!-- outdated translation 3571057450431950427 --> <string name="activity_not_found" msgid="217823393239365967">"L\'applicaziun n\'è betg installada sin quest telefonin."</string>
+ <!-- no translation found for activity_not_found (217823393239365967) -->
+ <skip />
<!-- no translation found for widgets_tab_label (9145860100000983599) -->
<skip />
<!-- no translation found for long_press_widget_to_add (7395697462851217506) -->
<skip />
<!-- no translation found for market (2652226429823445833) -->
<skip />
- <!-- no translation found for external_drop_widget_error (127440783198670829) -->
+ <!-- no translation found for external_drop_widget_error (2285187188524172774) -->
<skip />
<!-- no translation found for external_drop_widget_pick_title (7040647073452295370) -->
<skip />
@@ -41,7 +43,8 @@
<string name="rename_action" msgid="6016003384693240896">"OK"</string>
<string name="cancel_action" msgid="3811860427489435048">"Interrumper"</string>
<string name="menu_item_add_item" msgid="6233177331075781114">"Agiuntar al visur da partenza"</string>
- <!-- outdated translation 4118484163419674240 --> <string name="group_applications" msgid="2103752818818161976">"Applicaziuns"</string>
+ <!-- no translation found for group_applications (2103752818818161976) -->
+ <skip />
<string name="group_shortcuts" msgid="9133529424900391877">"Scursanidas"</string>
<string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
<string name="group_wallpapers" msgid="1568191644272224858">"Funds davos"</string>
@@ -51,10 +54,12 @@
<string name="shortcut_installed" msgid="7071557296331322355">"\"Creà ina scursanida \"\"<xliff:g id="NAME">%s</xliff:g>\"\".\""</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"\"La scursanida \"\"<xliff:g id="NAME">%s</xliff:g>\"\" è vegnida stizzada.\""</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"\"La scursanida \"\"<xliff:g id="NAME">%s</xliff:g>\"\" exista gia.\""</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Tscherner ina cumbinaziun da tastas"</string>
+ <!-- no translation found for title_select_shortcut (1873670208166882222) -->
+ <skip />
<!-- no translation found for title_select_application (1793455815754848652) -->
<skip />
- <!-- outdated translation 3953036962111614813 --> <string name="all_apps_button_label" msgid="2578400570124163469">"Tut las applicaziuns"</string>
+ <!-- no translation found for all_apps_button_label (2578400570124163469) -->
+ <skip />
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Pagina da partenza"</string>
<!-- no translation found for delete_zone_label_workspace (7153615831493049150) -->
<skip />
@@ -82,7 +87,8 @@
<string name="menu_wallpaper" msgid="5837429080911269832">"Fund davos"</string>
<string name="menu_search" msgid="4826514464423239041">"Tschertgar"</string>
<string name="menu_notifications" msgid="6424587053194766192">"Avis"</string>
- <!-- outdated translation 6233960148378443661 --> <string name="menu_settings" msgid="3946232973327980394">"Parameters"</string>
+ <!-- no translation found for menu_settings (3946232973327980394) -->
+ <skip />
<!-- no translation found for menu_help (4901160661634590633) -->
<skip />
<!-- no translation found for cab_menu_delete_app (4089398025537640349) -->
@@ -98,13 +104,17 @@
<!-- no translation found for cab_shortcut_selection_text (8115847384500412878) -->
<skip />
<string name="permlab_install_shortcut" msgid="1201690825493376489">"Installar scursanidas"</string>
- <!-- outdated translation 7429365847558984148 --> <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Pussibilitescha ch\'ina applicaziun agiunta scursanidas senza l\'intervenziun da l\'utilisader."</string>
+ <!-- no translation found for permdesc_install_shortcut (8634424803272077038) -->
+ <skip />
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"deinstallar scursanidas"</string>
- <!-- outdated translation 959972195916090900 --> <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Pussibilitescha ch\'ina applicaziun possia stizzar scursanidas senza ina intervenziun da l\'utilisader."</string>
+ <!-- no translation found for permdesc_uninstall_shortcut (274355570620220977) -->
+ <skip />
<string name="permlab_read_settings" msgid="3452408290738106747">"Leger ils parameters e las scursanidas da la pagina da partenza"</string>
- <!-- outdated translation 8377434937176025492 --> <string name="permdesc_read_settings" msgid="1836104524215167383">"Pussibilitescha ch\'ina applicaziun possia leger ils parameters e las scursanidas da la pagina da partenza."</string>
+ <!-- no translation found for permdesc_read_settings (5788109303585403679) -->
+ <skip />
<string name="permlab_write_settings" msgid="1360567537236705628">"Definir ils parameters e las scursanidas per la pagina da partenza"</string>
- <!-- outdated translation 1098648778383349818 --> <string name="permdesc_write_settings" msgid="6763846563231494591">"Pussibilitescha ch\'ina applicaziun possia midar ils parameters e las scursanidas sin la pagina da partenza."</string>
+ <!-- no translation found for permdesc_write_settings (8530105489115785531) -->
+ <skip />
<string name="gadget_error_text" msgid="8359351016167075858">"Problems cun chargiar il widget"</string>
<!-- no translation found for uninstall_system_app_text (6429814133777046491) -->
<skip />
@@ -138,16 +148,16 @@
<skip />
<!-- no translation found for cling_dismiss (2780907108735868381) -->
<skip />
- <!-- no translation found for folder_opened (4129072635480822768) -->
+ <!-- no translation found for folder_opened (1262064100943801533) -->
<skip />
- <!-- no translation found for folder_tap_to_close (4076794242530255812) -->
+ <!-- no translation found for folder_tap_to_close (1335478160661137579) -->
<skip />
- <!-- no translation found for folder_tap_to_rename (2125528923948315223) -->
+ <!-- no translation found for folder_tap_to_rename (5201612989905472442) -->
<skip />
<!-- no translation found for folder_closed (3130534551370511932) -->
<skip />
- <!-- no translation found for folder_renamed (781234745487414781) -->
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
<skip />
- <!-- no translation found for folder_name_format (4513766553514769310) -->
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
<skip />
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 67d536d03..5aadf48a5 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Obiecte widget"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Atingeţi/menţineţi apăsat un widget pt. a-l alege."</string>
<string name="market" msgid="2652226429823445833">"Cumpăraţi"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Nu am putut plasa articolul pe ecranul de pornire."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Nu am putut plasa articolul pe ecranul de pornire."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Alegeţi widgetul de creare"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Nume dosar"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Redenumiţi dosarul"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>”·a fost creată."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>” a fost eliminată."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>” deja există."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Selectaţi comanda rapidă"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Alegeţi o comandă rapidă"</string>
<string name="title_select_application" msgid="1793455815754848652">"Alegeţi aplicaţia"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplicaţii"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Domiciliu"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"instalaţi comenzi rapide"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite unei aplicaţii să adauge comenzi rapide, fără intervenţia utilizatorului."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"dezinstalaţi comenzile rapide"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite unei aplicaţii să elimine comenzile rapide, fără intervenţia utilizatorului."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite aplicaţiei să elimine comenzile rapide, fără intervenţia utilizatorului."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"citiţi setările Paginii de pornire şi comenzile rapide"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite unei aplicaţii să citească setările şi comenzile rapide din ecranul de pornire."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite aplicaţiei să citească setările şi comenzile rapide din ecranul de pornire."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"scrieţi setări şi comenzi rapide pentru Ecranul de pornire"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite unei aplicaţii să modifice setările şi comenzile rapide din ecranul de pornire."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite aplicaţiei să modifice setările şi comenzile rapide din ecranul de pornire."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Probleme la încărcarea obiectului widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Aceasta este o aplicaţie de sistem şi nu poate fi dezinstalată."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Pentru a muta o aplicaţie, atingeţi şi ţineţi apăsat."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Pentru a crea un dosar nou pe ecranul de pornire, plasaţi o aplicaţie deasupra alteia."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Dosar deschis, %1$d - %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Apăsaţi pentru a închide dosarul"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Apăsaţi pentru a finaliza redenumirea"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Atingeţi pentru a închide dosarul"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Atingeţi pentru a salva redenumirea"</string>
<string name="folder_closed" msgid="3130534551370511932">"Dosar închis"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Dosar redenumit „%1$s”"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Dosar: %1$s"</string>
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
+ <skip />
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index c0abcbf56..cf92bf2a6 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Виджеты"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Чтобы выбрать виджет, нажмите на значок и удерживайте его."</string>
<string name="market" msgid="2652226429823445833">"Маркет"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Не удалось добавить элемент на главный экран."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Не удалось добавить элемент на главный экран."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Выберите виджет"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Название папки"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Переименовать папку"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Ярлык \"<xliff:g id="NAME">%s</xliff:g>\" создан"</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Ярлык \"<xliff:g id="NAME">%s</xliff:g>\" удален."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Ярлык \"<xliff:g id="NAME">%s</xliff:g>\" уже существует."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Выберите ярлык"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Выбор ярлыка"</string>
<string name="title_select_application" msgid="1793455815754848652">"Выберите приложение"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Приложения"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Главная"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"устанавливать ярлыки"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Приложение сможет самостоятельно добавлять ярлыки."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"удалять ярлыки"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Приложение сможет самостоятельно удалять ярлыки."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Приложение сможет самостоятельно удалять ярлыки."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"считывать настройки и ярлыки главного экрана"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Приложение получит доступ к данным о настройках и ярлыках на главном экране."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Приложение получит доступ к данным о настройках и ярлыках на главном экране."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"изменять настройки и ярлыки главного экрана"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Приложение сможет изменять настройки и ярлыки на главном экране."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Приложение сможет изменять настройки и ярлыки на главном экране."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Не удалось загрузить виджет"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Это системное приложение, его нельзя удалить."</string>
<string name="dream_name" msgid="2847171357608437154">"Фейерверк"</string>
@@ -88,7 +88,7 @@
<string name="workspace_scroll_format" msgid="7911126267695001437">"Рабочая область %1$d из %2$d"</string>
<string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"Приложения: стр. %1$d из %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"Виджеты: стр. %1$d из %2$d"</string>
- <string name="workspace_cling_title" msgid="738396473989890567">"Чувствуйте себя как дома"</string>
+ <string name="workspace_cling_title" msgid="738396473989890567">"Будьте как дома"</string>
<string name="workspace_cling_move_item" msgid="791013895761065070">"Добавляйте сюда любимые приложения."</string>
<string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"Чтобы открыть список приложений, нажмите на круг."</string>
<string name="all_apps_cling_title" msgid="2559734712581447107">"Выберите приложения"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Чтобы переместить значок приложения, нажмите на него и удерживайте."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Чтобы создать папку на главном экране, перенесите одно приложение на другое."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"ОК"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Папка открыта, %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Нажмите, чтобы закрыть папку."</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Нажмите, чтобы переименовать."</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Папка открыта, <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Нажмите, чтобы закрыть папку"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Нажмите, чтобы подтвердить переименование"</string>
<string name="folder_closed" msgid="3130534551370511932">"Папка закрыта"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Новое название папки: %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Папка: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Папка переименована в \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Папка: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 80c8a3c0a..b5f881455 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Miniaplikácie"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Miniaplikáciu pridáte stlačením a podržaním."</string>
<string name="market" msgid="2652226429823445833">"Obchod"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Položku sa nepodarilo pretiahnuť na túto plochu."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Položku sa nepodarilo presunúť na túto plochu."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Zvoľte miniaplikáciu na vytvorenie"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Názov priečinka"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Premenovať priečinok"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Odkaz <xliff:g id="NAME">%s</xliff:g> bol vytvorený."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Odkaz <xliff:g id="NAME">%s</xliff:g> bol odstránený."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Odkaz <xliff:g id="NAME">%s</xliff:g> už existuje."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Vyberte odkaz"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Vyberte odkaz"</string>
<string name="title_select_application" msgid="1793455815754848652">"Vyberte aplikáciu"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Aplikácie"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Domovská stránka"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"inštalovať odkazy"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Povoľuje aplikácii pridať odkazy bez zásahu používateľa."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"odinštalovať odkazy"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Povoľuje aplikácii odstrániť odkazy bez zásahu používateľa."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Povoľuje aplikácii odstrániť odkazy bez zásahu používateľa."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"čítanie nastavení a odkazov plochy"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Povoľuje aplikácii čítať nastavenia a odkazy na ploche."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Povoľuje aplikácii čítať nastavenia a odkazy na ploche."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"zápis nastavení a odkazov plochy"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Povoľuje aplikácii zmeniť nastavenia a odkazy na ploche."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Povoľuje aplikácii zmeniť nastavenia a odkazy na ploche."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problém s načítaním miniaplikácií"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Toto je systémová aplikácia a nedá sa odinštalovať."</string>
<string name="dream_name" msgid="2847171357608437154">"Raketomet"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Ak chcete presunúť aplikáciu, dotknite sa jej a podržte ju."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Ak chcete vytvoriť nový priečinok na ploche, presuňte jednu aplikáciu na inú."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Priečinok je otvorený, %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Klepnutím zavrite priečinok"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Klepnutím potvrďte premenovanie"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Otvorený priečinok, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Dotykom zavriete priečinok"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dotykom premenovanie uložíte"</string>
<string name="folder_closed" msgid="3130534551370511932">"Priečinok je uzavretý"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Priečinok bol premenovaný na %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Priečinok: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Priečinok bol premenovaný na <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Priečinok: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 88442c5dd..c9b2e043e 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Pripomočki"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Za izbiro pripomočka se ga dotaknite in pridržite."</string>
<string name="market" msgid="2652226429823445833">"Nakup"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Elemen. ni bilo mogoče spustiti na začetni zaslon."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Elemen. ni bilo mogoče spustiti na začetni zaslon."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Izberite pripomoček za ustvarjanje"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Ime mape"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Preimenuj mapo"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Bližnjica »<xliff:g id="NAME">%s</xliff:g>« je bila ustvarjena."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Bližnjica »<xliff:g id="NAME">%s</xliff:g>« je bila odstranjena."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Bližnjica »<xliff:g id="NAME">%s</xliff:g>« že obstaja."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Izberi bližnjico"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Izbira bližnjice"</string>
<string name="title_select_application" msgid="1793455815754848652">"Izberite program"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Programi"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Začetni zaslon"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"namesti bližnjice"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Programu omogoča dodajanje bližnjic brez posredovanja uporabnika."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"odstrani bližnjice"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Programu omogoča odstranjevanje bližnjic brez posredovanja uporabnika."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Programu omogoča odstranjevanje bližnjic brez posredovanja uporabnika."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"branje nastavitev in bližnjic začetnega zaslona"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Dovoli programu branje nastavitev in bližnjic na začetnem zaslonu."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Dovoli programu branje nastavitev in bližnjic na začetnem zaslonu."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"zapis nastavitev in bližnjic začetnega zaslona"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Dovoli programu spreminjanje nastavitev in bližnjic na začetnem zaslonu."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Dovoli programu spreminjanje nastavitev in bližnjic na začetnem zaslonu."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Težave pri nalaganju pripomočka"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"To je sistemski program in ga ni mogoče odstraniti."</string>
<string name="dream_name" msgid="2847171357608437154">"Raketno izstrelišče"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Če želite premakniti program, se ga dotaknite in ga pridržite."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Če želite na začetnem zaslonu ustvariti novo mapo, postavite en program na drugega."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"V redu"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Mapa je odprta, %1$d krat %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Tapnite, da zaprete mapo"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tapnite, da potrdite preimenovanje"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Mapa je odprta, <xliff:g id="WIDTH">%1$d</xliff:g> krat <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Dotaknite se, da zaprete mapo"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dotaknite se, da shranite preimenovanje"</string>
<string name="folder_closed" msgid="3130534551370511932">"Mapa je zaprta"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Mapa je bila preimenovana v %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Mapa: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Mapa je preimenovana v <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 32b79dd96..5dbfeab18 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Виџети"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Додирните и задржите да бисте узели виџет."</string>
<string name="market" msgid="2652226429823445833">"Куповина"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Није могуће испустити ставку на почетни екран."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Није могуће отпустити ставку на почетни екран."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Избор виџета за прављење"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Име директоријума"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Преименовање директоријума"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Пречица „<xliff:g id="NAME">%s</xliff:g>“ је направљена."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Пречица „<xliff:g id="NAME">%s</xliff:g>“ је уклоњена."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Пречица „<xliff:g id="NAME">%s</xliff:g>“ већ постоји."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Избор пречице"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Избор пречице"</string>
<string name="title_select_application" msgid="1793455815754848652">"Избор апликације"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Почетна"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"инсталирај пречице"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Дозвољава апликацији да додаје пречице без интервенције корисника."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"деинсталирај пречице"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Дозвољава апликацији да уклања пречице без интервенције корисника."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Дозвољава апликацији да уклања пречице без интервенције корисника."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"читај подешавања и пречице на почетном екрану"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Дозвољава апликацији да чита подешавања и пречице на Почетној."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Дозвољава апликацији да чита подешавања и пречице на почетном екрану."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"уписивање подешавања и пречица на почетном екрану"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Дозвољава апликацији да мења подешавања и пречице на Почетној."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Дозвољава апликацији да мења подешавања и пречице на почетном екрану."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Проблем приликом учитавања виџета"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Ово је системска апликација и не може да се деинсталира."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Да бисте преместили апликацију, додирните је и задржите."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Да бисте направили нови директоријум на почетном екрану, поређајте апликације једну на другу."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"Потврди"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Директоријум је отворен, %1$d пута %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Додирните да бисте затворили директоријум"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Додирните да бисте применили преименовање"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Директоријум је отворен, <xliff:g id="WIDTH">%1$d</xliff:g> пута <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Додирните да бисте затворили директоријум"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Додирните да бисте сачували промену имена"</string>
<string name="folder_closed" msgid="3130534551370511932">"Директоријум је затворен"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Директоријум је преименован у %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Директоријум: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Директоријум је преименован у <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Директоријум: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 5ed8d7c76..e15037715 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widgetar"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Tryck länge om du vill flytta en widget."</string>
<string name="market" msgid="2652226429823445833">"Butik"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Objektet kunde inte släppas på den här startsidan."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Objektet kunde inte släppas på den här startsidan."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Ange vilken widget du vill använda"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Mappnamn"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Byt namn på mapp"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Genvägen \"<xliff:g id="NAME">%s</xliff:g>\" har skapats."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Genvägen \"<xliff:g id="NAME">%s</xliff:g>\" har tagits bort."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Genvägen \"<xliff:g id="NAME">%s</xliff:g>\" finns redan."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Välj genväg"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Välj genväg"</string>
<string name="title_select_application" msgid="1793455815754848652">"Välj app"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Appar"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Startsida"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"installera genvägar"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Tillåter att en app lägger till genvägar utan åtgärd från användaren."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"avinstallera genvägar"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Tillåter att en app tar bort genvägar utan åtgärd från användaren."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Tillåter att appen tar bort genvägar utan åtgärd från användaren."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"läsa inställningar och genvägar för startsidan"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Tillåter att en app läser inställningar och genvägar på startsidan."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Tillåter att appen läser inställningar och genvägar på startsidan."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"skriva inställningar och genvägar för startsidan"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Tillåter att en app ändrar inställningar och genvägar på startsidan."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Tillåter att appen ändrar inställningar och genvägar på startsidan."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Det gick inte att läsa in widgeten"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Det här är en systemapp som inte kan avinstalleras."</string>
<string name="dream_name" msgid="2847171357608437154">"Raketavfyringsramp"</string>
@@ -97,10 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Om du vill flytta en app trycker du på den länge."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Om du vill skapa en ny mapp på startskärmen placerar du en app på en annan."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Mappen har öppnats, %1$d av %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Stäng mappen genom att knacka lätt"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Byt namn genom att knacka lätt"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Tryck om du vill stänga mappen"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Tryck om du vill spara det nya namnet"</string>
<string name="folder_closed" msgid="3130534551370511932">"Mappen är stängd"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Mappen döptes om till %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Mappen: %1$s"</string>
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
+ <skip />
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 490979e9b..c55ff39f3 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Wijeti"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Gusa &amp; ushikilie ili kuteua wijeti."</string>
<string name="market" msgid="2652226429823445833">"Duka"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Hakuweza kuachilia kipengee kwenye skrini hii ya Nyumbani."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Haikuweza kudondosha kipengee kwenye skrini hii ya Nyumbani."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Chagua wijeti ili uunde"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Jina la folda"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Ipe jina jipya folda"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" imeundwa."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" iliondolewa."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" tayari ipo."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Chagua njia ya mkato"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Chagua njia ya mkato"</string>
<string name="title_select_application" msgid="1793455815754848652">"Chagua programu"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Programu"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Nyumbani"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"njia mikato za moja kwa moja"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Huruhusu programu kuongeza njia za mkato bila mtumiaji kuhusika."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"Sakunua mikato"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Huruhusu programu kuondoa njia za mkato bila mtumiaji kuhusika."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Inaruhusu programu kuondoa njia za mikato bila juhudi za mtumiaji."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"soma mipangilio ya Nyumbani na njia za mkato"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Huruhusu programu kusoma mipangilio na njia za mkato katika Nyumbani."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Inaruhusu programu kusoma mipangilio na njia za mikato katika Nyumbani."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"andika mipangilio ya Nyumbani na njia za mkato"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Huruhusu programu kubadilisha mipangilio na njia za mkato katika Nyumbani."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Huruhusu programu kubadilisha mipangilio na njia za mkato katika Nyumbani."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Tatizo la kupakia wijeti"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Hii ni programu ya mfumo na haiwezi kusaniduliwa."</string>
<string name="dream_name" msgid="2847171357608437154">"Kizinduzi cha Roketi"</string>
@@ -89,7 +89,7 @@
<string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"Ukurasa wa programu %1$d ya %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"Ukurasa wa wijeti %1$d ya %2$d"</string>
<string name="workspace_cling_title" msgid="738396473989890567">"Jisikie huru"</string>
- <string name="workspace_cling_move_item" msgid="791013895761065070">"Unaweza kuweka programu unazozipenda zaidi hapa."</string>
+ <string name="workspace_cling_move_item" msgid="791013895761065070">"Unaweza kuweka prog zako uzipendazo hapa."</string>
<string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"Kutazama programu zako zote, gusa duara."</string>
<string name="all_apps_cling_title" msgid="2559734712581447107">"Chagua programu kadhaa"</string>
<string name="all_apps_cling_add_item" msgid="5665035103260318891">"Ili kuongeza programu kwa skrini yako ya Nyumbani, iguse na uishikilie."</string>
@@ -97,10 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Kuhamisha programu, gusa na; uishikilie."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Kuunda folda mpya katika skrini yako ya nyumbani, rundika programu moja juu ya nyingine."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"Sawa"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Folda imefunguliwa,%1$d na %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Gonga ili kufunga folda"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Gonga ili kukubali jina"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Gusa ili ufunge folda"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Gusa kuhifadhi upaji jina jipya"</string>
<string name="folder_closed" msgid="3130534551370511932">"Folda imefungwa"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Folda imebadilishwa jina hadi %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Folda: %1$s"</string>
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
+ <skip />
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 509dc815b..3bcc1444e 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"วิดเจ็ต"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"แตะค้างเพื่อรับวิดเจ็ต"</string>
<string name="market" msgid="2652226429823445833">"ร้าน"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"ไม่สามารถวางรายการลงในหน้าจอหลักนี้ได้"</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"ไม่สามารถวางรายการลงในหน้าจอหลักนี้"</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"เลือกวิดเจ็ตที่จะสร้าง"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"ชื่อโฟลเดอร์"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"เปลี่ยนชื่อโฟลเดอร์"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"สร้างทางลัด \"<xliff:g id="NAME">%s</xliff:g>\" แล้ว"</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"ทางลัด \"<xliff:g id="NAME">%s</xliff:g>\" ถูกนำออกแล้ว"</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"ทางลัด \"<xliff:g id="NAME">%s</xliff:g>\" มีอยู่แล้ว"</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"เลือกทางลัด"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"เลือกทางลัด"</string>
<string name="title_select_application" msgid="1793455815754848652">"เลือกแอปพลิเคชัน"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"แอปพลิเคชัน"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"บ้าน"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"ติดตั้งทางลัด"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"อนุญาตให้แอปพลิเคชันเพิ่มทางลัดโดยไม่ต้องให้ผู้ใช้จัดการ"</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"ถอนการติดตั้งทางลัด"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"อนุญาตให้แอปพลิเคชันนำทางลัดออกโดยไม่ต้องให้ผู้ใช้จัดการ"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"อนุญาตให้แอปพลิเคชันนำทางลัดออกโดยไม่ต้องให้ผู้ใช้จัดการ"</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"อ่านการตั้งค่าและทางลัดหน้าแรกแล้ว"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"อนุญาตให้แอปพลิเคชันอ่านการตั้งค่าและทางลัดในหน้าแรก"</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"อนุญาตให้แอปพลิเคชันอ่านการตั้งค่าและทางลัดในหน้าหลัก"</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"เขียนการตั้งค่าและทางลัดหน้าแรกแล้ว"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"อนุญาตให้แอปพลิเคชันเปลี่ยนการตั้งค่าและทางลัดในหน้าแรก"</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"อนุญาตให้แอปพลิเคชันเปลี่ยนการตั้งค่าและทางลัดในหน้าหลัก"</string>
<string name="gadget_error_text" msgid="8359351016167075858">"มีปัญหาขณะโหลดวิดเจ็ต"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"นี่เป็นแอปพลิเคชันระบบและไม่สามารถถอนการติดตั้งได้"</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"หากต้องการย้ายแอปพลิเคชัน ให้แตะแอปพลิเคชันนั้นค้างไว้"</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"หากต้องการสร้างโฟลเดอร์ใหม่บนหน้าจอหลัก ให้วางแอปพลิเคชันหนึ่งซ้อนบนแอปพลิเคชันอื่น"</string>
<string name="cling_dismiss" msgid="2780907108735868381">"ตกลง"</string>
- <string name="folder_opened" msgid="4129072635480822768">"โฟลเดอร์เปิดอยู่, %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"แตะเพื่อปิดโฟลเดอร์"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"แตะเพื่อยอมรับการเปลี่ยนชื่อ"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"เปิดโฟลเดอร์ <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"แตะเพื่อปิดโฟลเดอร์"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"แตะเพื่อบัน​​ทึกการเปลี่ยนชื่อ"</string>
<string name="folder_closed" msgid="3130534551370511932">"โฟลเดอร์ปิดอยู่"</string>
- <string name="folder_renamed" msgid="781234745487414781">"เปลี่ยนชื่อโฟลเดอร์เป็น %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"โฟลเดอร์: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"เปลี่ยนชื่อโฟลเดอร์เป็น <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"โฟลเดอร์: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index f7239e99e..e315cd854 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Mga Widget"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Pindutin nang matagal upang kumuha ng widget."</string>
<string name="market" msgid="2652226429823445833">"Mamili"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Hindi ma-drop ang item sa Home screen na ito."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Hindi ma-drop ang item sa Home screen na ito."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pumili ng widget na lilikhain"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Pangalan ng folder"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Palitan ng pangalan ang folder"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Nalikha ang shortcut na \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Inalis ang shortcut na \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Umiiral na ang shortcut na \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Pumili ng shortcut"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Pumili ng shortcut"</string>
<string name="title_select_application" msgid="1793455815754848652">"Pumili ng app"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Home"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"i-install ang mga shortcut"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Binibigyang-daan ang isang app na magdagdag ng mga shortcut nang walang panghihimasok ng user."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"huwag i-install ang mga shortcut"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Bibigyang-daan ang isang app na mag-alis ng mga shortcut nang walang panghihimasok ng user."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Binibigyang-daan ang app na mag-alis ng mga shortcut nang walang panghihimasok ng user."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"basahin ang mga setting ng Home at shortcut"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Binibigyang-daan ang isang app na basahin ang mga setting at shortcut sa Home."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Binibigyang-daan ang app na basahin ang mga setting at shortcut sa Home."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"magsulat ng mga setting ng Home at mga shortcut"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Binibigyang-daan ang isang app na baguhin ang mga setting at shortcut sa Home."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Binibigyang-daan ang app na baguhin ang mga setting at shortcut sa Home."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Problema sa pag-load ng widget"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Isa itong app ng system at hindi maaaring i-uninstall."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Upang ilipat ang isang app, pindutin ito nang matagal."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Upang gumawa ng bagong folder sa iyong home screen, magpatong ng isang app sa ibabaw ng isa pa."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Binuksan ang folder, %1$d by %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Tapikin upang isara ang folder"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tapikin upang kumpirmahin ang pagpapalit ng pangalan"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Binuksan ang folder, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Pindutin upang isara ang folder"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Pindutin upang i-save ang pagpapalit ng pangalan"</string>
<string name="folder_closed" msgid="3130534551370511932">"Nakasara ang folder"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Pinangalanan ang folder na %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Folder: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Binago ang pangalan ng folder patungong <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index a9b844ada..b9e2d3594 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Widget\'lar"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Widget seçmek için dokunun ve basılı tutun."</string>
<string name="market" msgid="2652226429823445833">"Alışveriş"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Öğe bu Ana Ekrana bırakılamadı."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Öğe bu Ana Ekrana bırakılamadı."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Oluşturmak için widget seçin"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Klasör adı"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Klasörü yeniden adlandır"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu oluşturuldu."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu kaldırıldı."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu zaten var."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Kısayolu seçin"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Kısayolu seçin"</string>
<string name="title_select_application" msgid="1793455815754848652">"Uygulama seçin"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Uygulamalar"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Ana Sayfa"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"kısayolları yükle"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Uygulamaya, kullanıcı müdahalesi olmadan kısayol ekleme izni verir."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"kısayolları kaldır"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Uygulamaya, kullanıcı müdahalesi olmadan kısayolları kaldırma izni verir."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Uygulamaya kullanıcı müdahalesi olmadan kısayolları kaldırma izni verir."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"Ana Sayfa ayarlarını ve kısayollarını oku"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Uygulamaya, Ana Ekrandaki ayarları ve kısayolları okuma izni verir."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Uygulamaya Ana Ekrandaki ayarları ve kısayolları okuma izni verir."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"Ana Sayfa ayarlarını ve kısayollarını yaz"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Uygulamaya, Ana Ekrandaki ayarları ve kısayolları değiştirme izni verir."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Uygulamaya Ana Ekrandaki ayarları ve kısayolları değiştirme izni verir."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Widget yüklenirken sorun oluştu"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Bu bir sistem uygulamasıdır ve kaldırılamaz."</string>
<string name="dream_name" msgid="2847171357608437154">"Roket Fırlatıcı"</string>
@@ -97,10 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Bir uygulamayı taşımak için, uygulamaya dokunun ve basılı tutun."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Ana Ekranınızda yeni bir klasör oluşturmak için, bir uygulamayı diğerinin üzerine getirin."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"Tamam"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Klasör açıldı, boyutları %1$d ve %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Klasörü kapatmak için hafifçe dokunun"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Yeniden adlandırmayı uygulamak için hafifçe dokunun"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Klasörü kapatmak için dokunun"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Yeni adı kaydetmek için dokunun"</string>
<string name="folder_closed" msgid="3130534551370511932">"Klasör kapatıldı"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Klasör %1$s olarak yeniden adlandırıldı"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Klasör: %1$s"</string>
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
+ <skip />
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index bd54fd40a..0ee152920 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Віджети"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Торкніться й утримуйте, щоб вибрати віджет."</string>
<string name="market" msgid="2652226429823445833">"Магазин"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Не вдалося помістити елемент на цей головний екран"</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Не вдалося помістити елемент на цей головний екран"</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Вибрати віджет для створення"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Назва папки"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Переймен. папку"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" створено."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" видалено."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" уже існує."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Вибрати ярлик"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Вибрати ярлик"</string>
<string name="title_select_application" msgid="1793455815754848652">"Вибрати програму"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Прогр."</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Головна"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"установити ярлики"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Дозволяє програмі додавати ярлики без втручання користувача."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"видалити ярлики"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Дозволяє програмі видаляти ярлики без втручання користувача."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Дозволяє програмі видаляти ярлики без втручання користувача."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"читати налашт-ня Головної та ярлики"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Дозволяє програмі читати налаштування та ярлики на головному екрані."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Дозволяє програмі читати налаштування та ярлики на головному екрані."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"писати налашт-ня Головної та ярлики"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Дозволяє програмі змінювати налаштування та ярлики на головному екрані."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Дозволяє програмі змінювати налаштування та ярлики на головному екрані."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Пробл із завантаж. віджета"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Це системна програма, її неможливо видалити."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Щоб перемістити програму, торкніться й утримуйте її."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Щоб створити нову папку на головному екрані, помістіть одну програму на іншу."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"ОК"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Папку відкрито, %1$d–%2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Натисніть, щоб закрити папку"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Натисніть, щоб перейменувати"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Папку відкрито: <xliff:g id="WIDTH">%1$d</xliff:g> х <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Торкніться, щоб закрити папку"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Торкніться, щоб зберегти перейменування"</string>
<string name="folder_closed" msgid="3130534551370511932">"Папку закрито"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Папку перейменовано на %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Папка: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Папку перейменовано на <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Папка: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 73896b422..544c8a4fa 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Tiện ích"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Chạm &amp; giữ để chọn tiện ích con."</string>
<string name="market" msgid="2652226429823445833">"Mua hàng"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Không thể thả mục vào Màn hình chính này."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Không thể thả mục vào Màn hình chính này."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Chọn tiện ích con để tạo"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Tên thư mục"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Đổi tên thư mục"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Lối tắt \"<xliff:g id="NAME">%s</xliff:g>\" đã được tạo."</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Lối tắt \"<xliff:g id="NAME">%s</xliff:g>\" đã bị xóa."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Lối tắt \"<xliff:g id="NAME">%s</xliff:g>\" đã tồn tại."</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Chọn lối tắt"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Chọn lối tắt"</string>
<string name="title_select_application" msgid="1793455815754848652">"Chọn ứng dụng"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Ứng dụng"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Màn hình trang chủ"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"cài đặt lối tắt"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Cho phép ứng dụng thêm lối tắt mà không cần sự can thiệp của người dùng."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"gỡ cài đặt lối tắt"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Cho phép ứng dụng xóa lối tắt mà không cần sự can thiệp của người dùng."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Cho phép ứng dụng xóa lối tắt mà không cần sự can thiệp của người dùng."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"đọc cài đặt Màn hình trang chủ và lối tắt"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Cho phép ứng dụng đọc cài đặt và lối tắt trên Màn hình chính."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Cho phép ứng dụng đọc cài đặt và lối tắt trên Màn hình chính."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"ghi cài đặt Màn hình trang chủ và lối tắt"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Cho phép ứng dụng thay đổi cài đặt và lối tắt trên Màn hình chính."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Cho phép ứng dụng thay đổi cài đặt và lối tắt trên Màn hình chính."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Sự cố khi tải tiện ích"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Đây là ứng dụng hệ thống và không thể gỡ cài đặt."</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Để di chuyển ứng dụng, chạm &amp; giữ ứng dụng đó."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Để tạo thư mục mới trên Màn hình chính của bạn, xếp ứng dụng này lên trên ứng dụng khác."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Đã mở thư mục, %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Chạm để đóng thư mục"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Chạm để cho phép đổi tên"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Đã mở thư mục, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Chạm để đóng thư mục"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Chạm để lưu tên mới"</string>
<string name="folder_closed" msgid="3130534551370511932">"Đã đóng thư mục"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Thư mục được đổi tên thành %1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Thư mục: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Đã đổi tên thư mục thành <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Thư mục: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 5058d2ef8..c20a852f0 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"窗口小部件"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"触摸并按住可选取窗口小部件。"</string>
<string name="market" msgid="2652226429823445833">"购买"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"无法将该项拖放到此主屏幕上。"</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"无法将项拖放到此主屏幕上。"</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"选择要处理拖放操作的窗口小部件"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"文件夹名称"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"重命名文件夹"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"已创建“<xliff:g id="NAME">%s</xliff:g>”快捷方式。"</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"已删除“<xliff:g id="NAME">%s</xliff:g>”快捷方式。"</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"“<xliff:g id="NAME">%s</xliff:g>”快捷方式已存在。"</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"选择快捷方式"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"选择快捷方式"</string>
<string name="title_select_application" msgid="1793455815754848652">"选择应用程序"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"应用程序"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"主屏幕"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"安装快捷方式"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"允许应用程序自行添加快捷方式。"</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"卸载快捷方式"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"允许应用程序自行删除快捷方式。"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"允许应用程序自行删除快捷方式,而无需用户干预。"</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"读取主屏幕的设置和快捷方式"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"允许应用程序读取主屏幕中的设置和快捷方式。"</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"允许应用程序读取主屏幕中的设置和快捷方式。"</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"写入主屏幕的设置和快捷方式"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"允许应用程序更改主屏幕中的设置和快捷方式。"</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"允许应用程序更改主屏幕中的设置和快捷方式。"</string>
<string name="gadget_error_text" msgid="8359351016167075858">"载入窗口小部件时出现问题"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"这是系统应用程序,无法卸载。"</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"要移动应用程序,请触摸并按住该应用程序。"</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"要在主屏幕上创建新文件夹,请将一个应用程序叠放到另一个上。"</string>
<string name="cling_dismiss" msgid="2780907108735868381">"确定"</string>
- <string name="folder_opened" msgid="4129072635480822768">"文件夹已打开,尺寸为 %1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"点按可关闭文件夹"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"点按即可重命名"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"触摸可关闭文件夹"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"触摸可保存重命名"</string>
<string name="folder_closed" msgid="3130534551370511932">"文件夹已关闭"</string>
- <string name="folder_renamed" msgid="781234745487414781">"已将文件夹重命名为“%1$s”"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"文件夹:%1$s"</string>
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
+ <skip />
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index baaf1e2b4..495c63861 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"小工具"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"輕觸並按住小工具即可選取。"</string>
<string name="market" msgid="2652226429823445833">"商店"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"無法將項目拖放至主螢幕上。"</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"無法將項目拖放至這個主螢幕上。"</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"選擇要建立的小工具"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"資料夾名稱"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"重新命名資料夾"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"已建立「<xliff:g id="NAME">%s</xliff:g>」捷徑。"</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"已移除「<xliff:g id="NAME">%s</xliff:g>」捷徑。"</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"「<xliff:g id="NAME">%s</xliff:g>」捷徑已經存在。"</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"選取捷徑"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"選擇捷徑"</string>
<string name="title_select_application" msgid="1793455815754848652">"選擇應用程式"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"應用程式"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"主螢幕"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"安裝捷徑"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"允許應用程式自動新增捷徑。"</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"解除安裝捷徑"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"允許應用程式自動移除捷徑。"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"允許應用程式自動移除捷徑。"</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"讀取主螢幕設定和捷徑"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"允許應用程式讀取主螢幕的設定與捷徑。"</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"允許應用程式讀取主螢幕中的設定與捷徑。"</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"寫入主螢幕設定和捷徑"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"允許應用程式變更主螢幕中的設定與捷徑。"</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"允許應用程式變更主螢幕中的設定與捷徑。"</string>
<string name="gadget_error_text" msgid="8359351016167075858">"載入小工具時發生問題"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"這是系統應用程式,不可解除安裝。"</string>
<string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +97,13 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"如要移動應用程式,請輕觸並按住目標。"</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"如要在主螢幕建立新資料夾,請將應用程式一個個堆疊起來。"</string>
<string name="cling_dismiss" msgid="2780907108735868381">"確定"</string>
- <string name="folder_opened" msgid="4129072635480822768">"已開啟資料夾,%1$d x %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"輕按即可關閉資料夾"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"輕按即可重新命名"</string>
+ <!-- no translation found for folder_opened (1262064100943801533) -->
+ <skip />
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"輕觸即可關閉資料夾"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"輕觸即可儲存重新命名後的名稱"</string>
<string name="folder_closed" msgid="3130534551370511932">"已關閉資料夾"</string>
- <string name="folder_renamed" msgid="781234745487414781">"已將資料夾重新命名為「%1$s」"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"資料夾:%1$s"</string>
+ <!-- no translation found for folder_renamed (7951233572858053642) -->
+ <skip />
+ <!-- no translation found for folder_name_format (3051680259794759037) -->
+ <skip />
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 799c06428..7e71289b8 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -29,7 +29,7 @@
<string name="widgets_tab_label" msgid="9145860100000983599">"Amawijethi"</string>
<string name="long_press_widget_to_add" msgid="7395697462851217506">"Thinta &amp; bamba ukuthatha iwijethi"</string>
<string name="market" msgid="2652226429823445833">"Thenga"</string>
- <string name="external_drop_widget_error" msgid="127440783198670829">"Ayikwazanga ukubeka into kulesi sikrini sasekhaya."</string>
+ <string name="external_drop_widget_error" msgid="2285187188524172774">"Ayikwazanga ukubeka into kulesi sikrini sasekhaya."</string>
<string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Khetha i-wijethi ongayidala"</string>
<string name="rename_folder_label" msgid="5646236631298452787">"Igama lefolda"</string>
<string name="rename_folder_title" msgid="4544573104191526550">"Qamba kabusha ifolda"</string>
@@ -45,7 +45,7 @@
<string name="shortcut_installed" msgid="7071557296331322355">"Isinqamuleli \"<xliff:g id="NAME">%s</xliff:g>\" senziwe"</string>
<string name="shortcut_uninstalled" msgid="2129499669449749995">"Isinqamuleli \"<xliff:g id="NAME">%s</xliff:g>\" sikhishiwe."</string>
<string name="shortcut_duplicate" msgid="4757756326465060694">"Isinqamuleli \"<xliff:g id="NAME">%s</xliff:g>\" sivele sikhona"</string>
- <string name="title_select_shortcut" msgid="2858897527672831763">"Khetha isinqamuleli"</string>
+ <string name="title_select_shortcut" msgid="1873670208166882222">"Khetha isinqamulelo"</string>
<string name="title_select_application" msgid="1793455815754848652">"Khetha i-app"</string>
<string name="all_apps_button_label" msgid="2578400570124163469">"Izinhlelo zokusebenza"</string>
<string name="all_apps_home_button_label" msgid="1022222300329398558">"Ekhaya"</string>
@@ -75,11 +75,11 @@
<string name="permlab_install_shortcut" msgid="1201690825493376489">"engeza izinqamuleli"</string>
<string name="permdesc_install_shortcut" msgid="8634424803272077038">"Ivumela uhlelo lokusebenza ukufaka izinqamuleli ngaphandle kokungenela komsebenzisi."</string>
<string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"khipha izinqamuleli"</string>
- <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Ivumela uhlelo lokusebenza ukukhipha izinqamuleli ngaphandle kokungenela komsebenzisi."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Vumela i-app ukususa izinqamuleli ngaphandle kukubandakanyeka komsebenzisi."</string>
<string name="permlab_read_settings" msgid="3452408290738106747">"funda izilungiselelo zaseKhaya nezinqamuleli"</string>
- <string name="permdesc_read_settings" msgid="1836104524215167383">"Ivumela uhlelo lokusebenza ukufunda izilungiselelo nezinqamuleli Ekhaya."</string>
+ <string name="permdesc_read_settings" msgid="5788109303585403679">"Vumela ama-app ukufunda izilungiselelo nezinqamulelo eKhaya."</string>
<string name="permlab_write_settings" msgid="1360567537236705628">"bhala izilungiselelo zaseKhaya nezinqamuleli"</string>
- <string name="permdesc_write_settings" msgid="6763846563231494591">"Ivumela izinhlelo ukushintsha izilungiselelo nezinqamuleli Ekhaya."</string>
+ <string name="permdesc_write_settings" msgid="8530105489115785531">"Vumela ama-app ukushintsha izilungiselelo nezinqamulelo eKhaya."</string>
<string name="gadget_error_text" msgid="8359351016167075858">"Inkinga yokulayisha iwijethi"</string>
<string name="uninstall_system_app_text" msgid="6429814133777046491">"Lolu uhlelo lokusebenza lwesistimu futhi alikwazi ukukhishwa."</string>
<string name="dream_name" msgid="2847171357608437154">"Isiqalisi se-Rocket"</string>
@@ -97,10 +97,10 @@
<string name="folder_cling_move_item" msgid="270598675060435169">"Ukususa insiza, thinta &amp; uyibambe."</string>
<string name="folder_cling_create_folder" msgid="8352867485656129478">"Ukwenza ifolda entsha eskrinini sakho sasekhaya, beka insiza eyodwa phezulu kwenye."</string>
<string name="cling_dismiss" msgid="2780907108735868381">"KULUNGILE"</string>
- <string name="folder_opened" msgid="4129072635480822768">"Ifolda ivulekile, %1$d ngo %2$d"</string>
- <string name="folder_tap_to_close" msgid="4076794242530255812">"Qhofoza ukuvala ifolda"</string>
- <string name="folder_tap_to_rename" msgid="2125528923948315223">"Qhofoza ukuqamba kabusha"</string>
+ <string name="folder_opened" msgid="1262064100943801533">"Ifolda ivulwe, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1335478160661137579">"Thinta ukuze uvale ifolda"</string>
+ <string name="folder_tap_to_rename" msgid="5201612989905472442">"Thinta ukuze ulondoloze ukuqamba kabusha"</string>
<string name="folder_closed" msgid="3130534551370511932">"Ifolda ivaliwe"</string>
- <string name="folder_renamed" msgid="781234745487414781">"Ifolda iqanjwe kabusha ku-%1$s"</string>
- <string name="folder_name_format" msgid="4513766553514769310">"Ifolda: %1$s"</string>
+ <string name="folder_renamed" msgid="7951233572858053642">"Ifolda ishintshwe kabusha ku-<xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="3051680259794759037">"Ifolda: <xliff:g id="NAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 125856287..9ed824b44 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -27,6 +27,13 @@
<skip />
+ <!-- DrawableStateProxyView specific attributes. These attributes are used to customize
+ a DrawableStateProxyView view in XML files. -->
+ <declare-styleable name="DrawableStateProxyView">
+ <!-- The source view to delegate touch presses events to. -->
+ <attr name="sourceViewId" format="integer" />
+ </declare-styleable>
+
<!-- Cling specific attributes. These attributes are used to customize
the cling in XML files. -->
<declare-styleable name="Cling">
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 9c1206902..c2e1e7b4d 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -23,9 +23,6 @@
<color name="delete_target_hover_tint">#DAFF0000</color>
<color name="info_target_hover_tint">#DA0099CC</color>
- <!-- The alpha/color to apply to the drag image -->
- <color name="drag_view_multiply_color">#CCFFFFFF</color>
-
<color name="bubble_dark_background">#20000000</color>
<color name="appwidget_error_color">#FCCC</color>
diff --git a/res/values/config.xml b/res/values/config.xml
index 9ea7b9ad3..31ef18a13 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -6,21 +6,9 @@
<!-- AllApps/Customize/AppsCustomize -->
<!-- The alpha of the AppsCustomize bg in spring loaded mode -->
<integer name="config_appsCustomizeSpringLoadedBgAlpha">45</integer>
- <!-- Fade in/out duration of icons being dragged from the trays -->
- <integer name="config_dragAppsCustomizeIconFadeInDuration">150</integer>
- <integer name="config_dragAppsCustomizeIconFadeOutDuration">200</integer>
- <integer name="config_dragAppsCustomizeIconFadeAlpha">100</integer>
<integer name="config_workspaceUnshrinkTime">300</integer>
<!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
<integer name="config_workspaceSpringLoadShrinkPercentage">80</integer>
- <!-- When items are dropped on the mini screens in customize mode, we have a bounce animation
- of the bright green hover outline, and then fade out the outline at the end. These are
- the values used in that animation -->
- <integer name="config_screenOnDropScalePercent">120</integer>
- <integer name="config_screenOnDropScaleUpDuration">200</integer>
- <integer name="config_screenOnDropScaleDownDuration">200</integer>
- <integer name="config_screenOnDropAlphaFadeDelay">350</integer>
- <integer name="config_screenOnDropAlphaFadeDuration">50</integer>
<!-- Fade/zoom in/out duration & scale in the AllApps transition.
Note: This should be less than the workspaceShrinkTime as they happen together. -->
@@ -55,11 +43,6 @@
<integer name="config_crosshairsFadeInTime">600</integer>
- <!-- When dragging an item on the workspace, how much bigger (in pixels) the dragged view
- should be, as compared to the original view. If 0, it will not be scaled at all.
- Should be an even number, for pixel alignment. -->
- <integer name="config_dragViewExtraPixels">40</integer>
-
<!-- The duration (in ms) of the fade animation on the object outlines, used when
we are dragging objects around on the home screen. -->
<integer name="config_dragOutlineFadeTime">900</integer>
@@ -69,6 +52,7 @@
<!-- Parameters controlling the animation for when an item is dropped on the home screen,
and it animates from its old position to the new one. -->
+ <integer name="config_dropAnimMinDuration">100</integer>
<integer name="config_dropAnimMaxDuration">500</integer>
<!-- The duration of the UserFolder opening and closing animation -->
@@ -77,14 +61,9 @@
<!-- The distance at which the animation should take the max duration -->
<integer name="config_dropAnimMaxDist">800</integer>
- <!-- Workspace screens are cached to bitmaps only when they're smaller than a certain size
- (maxScaleForUsingWorkspaceScreenBitmapCache), since the bitmap cache itself is smaller
- than the view itself (workspaceScreenBitmapCacheScale) -->
- <integer name="config_workspaceScreenBitmapCacheScale">20</integer>
- <integer name="config_maxScaleForUsingWorkspaceScreenBitmapCache">50</integer>
-
- <!-- When shrinking the workspace, this is the percentage of its original size. -->
- <integer name="config_workspaceShrinkPercent">17</integer>
+ <!-- Properties controlling the workspace fade-out during dragging -->
+ <integer name="config_dragFadeOutAlpha">80</integer>
+ <integer name="config_dragFadeOutDuration">250</integer>
<!-- Folder max bounds and max number of items. Note: folder_max_count_x * folder_max_count_y
>= folder_max_num_items. When these are set to -1, they are automatically determined. -->
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 4ed16893e..890e2167a 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -73,7 +73,6 @@
<dimen name="apps_customize_max_gap">18dp</dimen>
<dimen name="apps_customize_widget_cell_width_gap">10dp</dimen>
<dimen name="apps_customize_widget_cell_height_gap">8dp</dimen>
- <dimen name="title_texture_width">120px</dimen>
<!-- height of the bottom row of controls -->
<dimen name="button_bar_height">62dip</dimen>
@@ -85,21 +84,9 @@
<dimen name="button_bar_width_right_padding">0dp</dimen>
<dimen name="button_bar_height_plus_padding">70dp</dimen>
- <!-- extra horizontal spacing between mini screen thumbnails ie. in all
- apps and in customization mode -->
- <dimen name="smallScreenExtraSpacing">0dip</dimen>
-
- <!-- Vertical spacing between edge of screen and mini cell layouts when they
- are minimized to the bottom in all apps -->
- <dimen name="allAppsSmallScreenVerticalMarginLandscape">30dip</dimen>
- <dimen name="allAppsSmallScreenVerticalMarginPortrait">60dip</dimen>
-
<!-- Drag padding to add to the bottom of drop targets -->
<dimen name="drop_target_drag_padding">14dp</dimen>
- <!-- padding between the delete zone drawable and text -->
- <dimen name="delete_zone_drawable_padding">8dip</dimen>
-
<!-- roughly a status bar (for vertically centering the all apps
home icon in landscape) -->
<dimen name="status_bar_height">25dip</dimen>
@@ -113,6 +100,9 @@
the drag view should be offset from the position of the original view. -->
<dimen name="dragViewOffsetX">0dp</dimen>
<dimen name="dragViewOffsetY">-8dp</dimen>
+ <!-- When dragging an item, how much bigger (fixed dps) the dragged view
+ should be. If 0, it will not be scaled at all. -->
+ <dimen name="dragViewScale">8dp</dimen>
<!-- Padding applied to AppWidgets -->
<dimen name="app_widget_preview_padding_left">8dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 72a915d78..a9b14d05a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -51,7 +51,7 @@
<!-- External-drop widget error string. This is the error that is shown
when you drag and item into the homescreen and it is unable to fit,
or an error is encountered. [CHAR_LIMIT=50] -->
- <string name="external_drop_widget_error">Couldn\'t drop item onto this Home screen.</string>
+ <string name="external_drop_widget_error">Couldn\'t drop item on this Home screen.</string>
<!-- External-drop widget pick title. This is shown as the title of the
dialog which allows you to pick which widgets to handle a particular
drop if there are multiple choices. [CHAR_LIMIT=35] -->
@@ -93,7 +93,7 @@ s -->
<string name="shortcut_duplicate">Shortcut \"<xliff:g id="name" example="Browser">%s</xliff:g>\" already exists.</string>
<!-- Title of dialog when user is selecting shortcut to add to homescreen -->
- <string name="title_select_shortcut">Select shortcut</string>
+ <string name="title_select_shortcut">Choose shortcut</string>
<!-- Title of dialog when user is selecting an application to add to homescreen -->
<string name="title_select_application">Choose app</string>
@@ -176,17 +176,17 @@ s -->
<!-- Permission short label -->
<string name="permlab_uninstall_shortcut">uninstall shortcuts</string>
<!-- Permission description -->
- <string name="permdesc_uninstall_shortcut">Allows an app to remove
+ <string name="permdesc_uninstall_shortcut">Allows the app to remove
shortcuts without user intervention.</string>
<!-- Permission short label -->
<string name="permlab_read_settings">read Home settings and shortcuts</string>
<!-- Permission description -->
- <string name="permdesc_read_settings">Allows an app to read the settings and
+ <string name="permdesc_read_settings">Allows the app to read the settings and
shortcuts in Home.</string>
<!-- Permission short label -->
<string name="permlab_write_settings">write Home settings and shortcuts</string>
<!-- Permission description -->
- <string name="permdesc_write_settings">Allows an app to change the settings and
+ <string name="permdesc_write_settings">Allows the app to change the settings and
shortcuts in Home.</string>
<!-- Widgets: -->
@@ -239,16 +239,16 @@ s -->
<!-- Folder accessibility -->
<!-- The format string for when a folder is opened, speaks the dimensions -->
- <string name="folder_opened">Folder opened, %1$d by %2$d</string>
+ <string name="folder_opened">Folder opened, <xliff:g id="width" example="5">%1$d</xliff:g> by <xliff:g id="height" example="3">%2$d</xliff:g></string>
<!-- Instruction that clicking outside will close folder -->
- <string name="folder_tap_to_close">Tap to close folder</string>
+ <string name="folder_tap_to_close">Touch to close folder</string>
<!-- Instruction that clicking outside will commit folder rename -->
- <string name="folder_tap_to_rename">Tap to commit rename</string>
+ <string name="folder_tap_to_rename">Touch to save rename</string>
<!-- Indication that folder closed -->
<string name="folder_closed">Folder closed</string>
<!-- Folder renamed format -->
- <string name="folder_renamed">Folder renamed to %1$s</string>
+ <string name="folder_renamed">Folder renamed to <xliff:g id="name" example="Games">%1$s</xliff:g></string>
<!-- Folder name format -->
- <string name="folder_name_format">Folder: %1$s</string>
+ <string name="folder_name_format">Folder: <xliff:g id="name" example="Games">%1$s</xliff:g></string>
</resources>
diff --git a/src/com/android/launcher2/AppWidgetResizeFrame.java b/src/com/android/launcher2/AppWidgetResizeFrame.java
index 6d132ebf0..c01a882cb 100644
--- a/src/com/android/launcher2/AppWidgetResizeFrame.java
+++ b/src/com/android/launcher2/AppWidgetResizeFrame.java
@@ -80,7 +80,7 @@ public class AppWidgetResizeFrame extends FrameLayout {
mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
final AppWidgetProviderInfo info = widgetView.getAppWidgetInfo();
- int[] result = mLauncher.getMinResizeSpanForWidget(info, null);
+ int[] result = mLauncher.getMinSpanForWidget(info, null);
mMinHSpan = result[0];
mMinVSpan = result[1];
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index 7f0edde75..3fcff726f 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -19,6 +19,7 @@ package com.android.launcher2;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
+import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
@@ -31,11 +32,13 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.MaskFilter;
+import android.graphics.Matrix;
import android.graphics.Paint;
-import android.graphics.PorterDuff;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.graphics.TableMaskFilter;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
@@ -75,8 +78,7 @@ interface AsyncTaskCallback {
*/
class AsyncTaskPageData {
enum Type {
- LoadWidgetPreviewData,
- LoadHolographicIconsData
+ LoadWidgetPreviewData
}
AsyncTaskPageData(int p, ArrayList<Object> l, ArrayList<Bitmap> si, AsyncTaskCallback bgR,
@@ -167,7 +169,8 @@ class AppsCustomizeAsyncTask extends AsyncTask<AsyncTaskPageData, Void, AsyncTas
* The Apps/Customize page that displays all the applications, widgets, and shortcuts.
*/
public class AppsCustomizePagedView extends PagedViewWithDraggableItems implements
- AllAppsView, View.OnClickListener, View.OnKeyListener, DragSource {
+ AllAppsView, View.OnClickListener, View.OnKeyListener, DragSource,
+ PagedViewIcon.PressedCallback, PagedViewWidget.ShortPressListener {
static final String LOG_TAG = "AppsCustomizePagedView";
/**
@@ -186,6 +189,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
// Save and Restore
private int mSaveInstanceStateItemIndex = -1;
+ private PagedViewIcon mPressedIcon;
// Content
private ArrayList<ApplicationInfo> mApps;
@@ -200,7 +204,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
private Canvas mCanvas;
private Drawable mDefaultWidgetBackground;
private IconCache mIconCache;
- private int mDragViewMultiplyColor;
// Dimens
private int mContentWidth;
@@ -226,9 +229,18 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
// Previews & outlines
ArrayList<AppsCustomizeAsyncTask> mRunningTasks;
- private HolographicOutlineHelper mHolographicOutlineHelper;
private static final int sPageSleepDelay = 200;
+ private Runnable mInflateWidgetRunnable = null;
+ private Runnable mBindWidgetRunnable = null;
+ static final int WIDGET_NO_CLEANUP_REQUIRED = -1;
+ static final int WIDGET_BOUND = 0;
+ static final int WIDGET_INFLATED = 1;
+ int mWidgetCleanupState = WIDGET_NO_CLEANUP_REQUIRED;
+ int mWidgetLoadingId = -1;
+ PendingAddWidgetInfo mCreateWidgetInfo = null;
+ private boolean mDraggingWidget = false;
+
public AppsCustomizePagedView(Context context, AttributeSet attrs) {
super(context, attrs);
mLayoutInflater = LayoutInflater.from(context);
@@ -236,7 +248,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
mApps = new ArrayList<ApplicationInfo>();
mWidgets = new ArrayList<Object>();
mIconCache = ((LauncherApplication) context.getApplicationContext()).getIconCache();
- mHolographicOutlineHelper = new HolographicOutlineHelper();
mCanvas = new Canvas();
mRunningTasks = new ArrayList<AppsCustomizeAsyncTask>();
@@ -244,7 +255,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
Resources resources = context.getResources();
mDefaultWidgetBackground = resources.getDrawable(R.drawable.default_widget_preview_holo);
mAppIconSize = resources.getDimensionPixelSize(R.dimen.app_icon_size);
- mDragViewMultiplyColor = resources.getColor(R.color.drag_view_multiply_color);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AppsCustomizePagedView, 0, 0);
mMaxAppCellCountX = a.getInt(R.styleable.AppsCustomizePagedView_maxAppCellCountX, -1);
@@ -495,12 +505,12 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
if (v instanceof PagedViewIcon) {
// Animate some feedback to the click
final ApplicationInfo appInfo = (ApplicationInfo) v.getTag();
- animateClickFeedback(v, new Runnable() {
- @Override
- public void run() {
- mLauncher.startActivitySafely(appInfo.intent, appInfo);
- }
- });
+ mLauncher.startActivitySafely(appInfo.intent, appInfo);
+
+ // Lock the drawable state to pressed until we return to Launcher
+ if (mPressedIcon != null) {
+ mPressedIcon.lockDrawableState();
+ }
} else if (v instanceof PagedViewWidget) {
// Let the user know that they have to long press to add a widget
Toast.makeText(getContext(), R.string.long_press_widget_to_add,
@@ -537,7 +547,72 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
mLauncher.getWorkspace().beginDragShared(v, this);
}
+ private void loadWidgetInBackground(final PendingAddWidgetInfo info) {
+ final AppWidgetProviderInfo pInfo = info.info;
+ if (pInfo.configure != null) {
+ return;
+ }
+
+ mBindWidgetRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mWidgetLoadingId = mLauncher.getAppWidgetHost().allocateAppWidgetId();
+ AppWidgetManager.getInstance(mLauncher).bindAppWidgetId(mWidgetLoadingId,
+ info.componentName);
+ mWidgetCleanupState = WIDGET_BOUND;
+ }
+ };
+ post(mBindWidgetRunnable);
+
+ mInflateWidgetRunnable = new Runnable() {
+ @Override
+ public void run() {
+ AppWidgetHostView hostView =
+ mLauncher.getAppWidgetHost().createView(mContext, mWidgetLoadingId, pInfo);
+ info.boundWidget = hostView;
+ mWidgetCleanupState = WIDGET_INFLATED;
+ hostView.setVisibility(INVISIBLE);
+ mLauncher.getDragLayer().addView(hostView);
+ }
+ };
+ post(mInflateWidgetRunnable);
+ }
+
+ @Override
+ public void onShortPress(View v) {
+ // We are anticipating a long press, and we use this time to load bind and instantiate
+ // the widget. This will need to be cleaned up if it turns out no long press occurs.
+ mCreateWidgetInfo = new PendingAddWidgetInfo((PendingAddWidgetInfo) v.getTag());
+ loadWidgetInBackground(mCreateWidgetInfo);
+ }
+
+ private void cleanupWidgetPreloading() {
+ PendingAddWidgetInfo info = mCreateWidgetInfo;
+ mCreateWidgetInfo = null;
+ if (mWidgetCleanupState >= 0 && mWidgetLoadingId != -1) {
+ mLauncher.getAppWidgetHost().deleteAppWidgetId(mWidgetLoadingId);
+ }
+ if (mWidgetCleanupState == WIDGET_BOUND) {
+ removeCallbacks(mInflateWidgetRunnable);
+ } else if (mWidgetCleanupState == WIDGET_INFLATED) {
+ AppWidgetHostView widget = info.boundWidget;
+ int widgetId = widget.getAppWidgetId();
+ mLauncher.getAppWidgetHost().deleteAppWidgetId(widgetId);
+ mLauncher.getDragLayer().removeView(widget);
+ }
+ mWidgetCleanupState = WIDGET_NO_CLEANUP_REQUIRED;
+ mWidgetLoadingId = -1;
+ }
+
+ @Override
+ public void cleanUpShortPress(View v) {
+ if (!mDraggingWidget) {
+ cleanupWidgetPreloading();
+ }
+ }
+
private void beginDraggingWidget(View v) {
+ mDraggingWidget = true;
// Get the widget preview as the drag representation
ImageView image = (ImageView) v.findViewById(R.id.widget_preview);
PendingAddItemInfo createItemInfo = (PendingAddItemInfo) v.getTag();
@@ -545,16 +620,37 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
// Compose the drag image
Bitmap preview;
Bitmap outline;
+ float scale = 1f;
if (createItemInfo instanceof PendingAddWidgetInfo) {
- PendingAddWidgetInfo createWidgetInfo = (PendingAddWidgetInfo) createItemInfo;
+ PendingAddWidgetInfo createWidgetInfo = mCreateWidgetInfo;
+ createItemInfo = createWidgetInfo;
int[] spanXY = mLauncher.getSpanForWidget(createWidgetInfo, null);
+ int[] size = mLauncher.getWorkspace().estimateItemSize(spanXY[0],
+ spanXY[1], createWidgetInfo, true);
createItemInfo.spanX = spanXY[0];
createItemInfo.spanY = spanXY[1];
-
- int[] maxSize = mLauncher.getWorkspace().estimateItemSize(spanXY[0], spanXY[1],
- createWidgetInfo, true);
+ int[] minSpanXY = mLauncher.getMinSpanForWidget(createWidgetInfo, null);
+ createWidgetInfo.minSpanX = minSpanXY[0];
+ createWidgetInfo.minSpanY = minSpanXY[1];
+
+ FastBitmapDrawable previewDrawable = (FastBitmapDrawable) image.getDrawable();
+ float minScale = 1.25f;
+ int minWidth, minHeight;
+ minWidth = Math.max((int) (previewDrawable.getIntrinsicWidth() * minScale), size[0]);
+ minHeight = Math.max((int) (previewDrawable.getIntrinsicHeight() * minScale), size[1]);
preview = getWidgetPreview(createWidgetInfo.componentName, createWidgetInfo.previewImage,
- createWidgetInfo.icon, spanXY[0], spanXY[1], maxSize[0], maxSize[1]);
+ createWidgetInfo.icon, spanXY[0], spanXY[1], minWidth, minHeight);
+
+ // Determine the image view drawable scale relative to the preview
+ float[] mv = new float[9];
+ Matrix m = new Matrix();
+ m.setRectToRect(
+ new RectF(0f, 0f, (float) preview.getWidth(), (float) preview.getHeight()),
+ new RectF(0f, 0f, (float) previewDrawable.getIntrinsicWidth(),
+ (float) previewDrawable.getIntrinsicHeight()),
+ Matrix.ScaleToFit.START);
+ m.getValues(mv);
+ scale = (float) mv[0];
} else {
// Workaround for the fact that we don't keep the original ResolveInfo associated with
// the shortcut around. To get the icon, we just render the preview image (which has
@@ -581,36 +677,49 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
// Save the preview for the outline generation, then dim the preview
outline = Bitmap.createScaledBitmap(preview, preview.getWidth(), preview.getHeight(),
false);
- mCanvas.setBitmap(preview);
- mCanvas.drawColor(mDragViewMultiplyColor, PorterDuff.Mode.MULTIPLY);
- mCanvas.setBitmap(null);
// Start the drag
alphaClipPaint = null;
mLauncher.lockScreenOrientationOnLargeUI();
mLauncher.getWorkspace().onDragStartedWithItem(createItemInfo, outline, alphaClipPaint);
mDragController.startDrag(image, preview, this, createItemInfo,
- DragController.DRAG_ACTION_COPY, null);
+ DragController.DRAG_ACTION_COPY, null, scale);
outline.recycle();
preview.recycle();
}
- @Override
- protected boolean beginDragging(View v) {
- // Dismiss the cling
- mLauncher.dismissAllAppsCling(null);
+ @Override
+ protected boolean beginDragging(final View v) {
if (!super.beginDragging(v)) return false;
- // Go into spring loaded mode (must happen before we startDrag())
- mLauncher.enterSpringLoadedDragMode();
-
if (v instanceof PagedViewIcon) {
beginDraggingApplication(v);
} else if (v instanceof PagedViewWidget) {
beginDraggingWidget(v);
}
+
+ // We delay entering spring-loaded mode slightly to make sure the UI
+ // thready is free of any work.
+ postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ // We don't enter spring-loaded mode if the drag has been cancelled
+ if (mLauncher.getDragController().isDragging()) {
+ // Dismiss the cling
+ mLauncher.dismissAllAppsCling(null);
+
+ // Reset the alpha on the dragged icon before we drag
+ resetDrawableState();
+
+ // Go into spring loaded mode (must happen before we startDrag())
+ mLauncher.enterSpringLoadedDragMode();
+ }
+ }
+ }, 150);
+
return true;
}
+
private void endDragging(View target, boolean success) {
mLauncher.getWorkspace().onDragStopped(success);
if (!success || (target != mLauncher.getWorkspace() &&
@@ -620,7 +729,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
mLauncher.exitSpringLoadedDragMode();
}
mLauncher.unlockScreenOrientationOnLargeUI();
-
}
@Override
@@ -645,7 +753,11 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
if (showOutOfSpaceMessage) {
mLauncher.showOutOfSpaceMessage();
}
+
+ d.deferDragViewCleanupPostAnimation = false;
+ cleanupWidgetPreloading();
}
+ mDraggingWidget = false;
}
@Override
@@ -759,7 +871,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
ApplicationInfo info = mApps.get(i);
PagedViewIcon icon = (PagedViewIcon) mLayoutInflater.inflate(
R.layout.apps_customize_application, layout, false);
- icon.applyFromApplicationInfo(info, true, mHolographicOutlineHelper);
+ icon.applyFromApplicationInfo(info, true, this);
icon.setOnClickListener(this);
icon.setOnLongClickListener(this);
icon.setOnTouchListener(this);
@@ -775,12 +887,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
}
layout.createHardwareLayers();
-
- /* TEMPORARILY DISABLE HOLOGRAPHIC ICONS
- if (mFadeInAdjacentScreens) {
- prepareGenerateHoloOutlinesTask(page, items, images);
- }
- */
}
/**
@@ -883,79 +989,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
t.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pageData);
mRunningTasks.add(t);
}
- /**
- * Creates and executes a new AsyncTask to load the outlines for a page of content.
- */
- private void prepareGenerateHoloOutlinesTask(int page, ArrayList<Object> items,
- ArrayList<Bitmap> images) {
- // Prune old tasks for this page
- Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
- while (iter.hasNext()) {
- AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
- int taskPage = task.page;
- if ((taskPage == page) &&
- (task.dataType == AsyncTaskPageData.Type.LoadHolographicIconsData)) {
- task.cancel(false);
- iter.remove();
- }
- }
-
- AsyncTaskPageData pageData = new AsyncTaskPageData(page, items, images,
- new AsyncTaskCallback() {
- @Override
- public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) {
- try {
- // Ensure that this task starts running at the correct priority
- task.syncThreadPriority();
-
- ArrayList<Bitmap> images = data.generatedImages;
- ArrayList<Bitmap> srcImages = data.sourceImages;
- int count = srcImages.size();
- Canvas c = new Canvas();
- for (int i = 0; i < count && !task.isCancelled(); ++i) {
- // Before work on each item, ensure that this task is running at the correct
- // priority
- task.syncThreadPriority();
-
- Bitmap b = srcImages.get(i);
- Bitmap outline = Bitmap.createBitmap(b.getWidth(), b.getHeight(),
- Bitmap.Config.ARGB_8888);
-
- c.setBitmap(outline);
- c.save();
- c.drawBitmap(b, 0, 0, null);
- c.restore();
- c.setBitmap(null);
-
- images.add(outline);
- }
- } finally {
- if (task.isCancelled()) {
- data.cleanup(true);
- }
- }
- }
- },
- new AsyncTaskCallback() {
- @Override
- public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) {
- try {
- mRunningTasks.remove(task);
- if (task.isCancelled()) return;
- onHolographicPageItemsLoaded(data);
- } finally {
- data.cleanup(task.isCancelled());
- }
- }
- });
-
- // Ensure that the outline task always runs in the background, serially
- AppsCustomizeAsyncTask t =
- new AppsCustomizeAsyncTask(page, AsyncTaskPageData.Type.LoadHolographicIconsData);
- t.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
- t.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, pageData);
- mRunningTasks.add(t);
- }
/*
* Widgets PagedView implementation
@@ -985,9 +1018,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
d.setBounds(x, y, x + w, y + h);
d.draw(c);
d.setBounds(oldBounds); // Restore the bounds
- if (multiplyColor != 0xFFFFFFFF) {
- c.drawColor(mDragViewMultiplyColor, PorterDuff.Mode.MULTIPLY);
- }
c.setBitmap(null);
}
}
@@ -1025,10 +1055,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
if (widgetPreviewExists) {
bitmapWidth = drawable.getIntrinsicWidth();
bitmapHeight = drawable.getIntrinsicHeight();
-
- // Cap the size so widget previews don't appear larger than the actual widget
- maxWidth = Math.min(maxWidth, mWidgetSpacingLayout.estimateCellWidth(cellHSpan));
- maxHeight = Math.min(maxHeight, mWidgetSpacingLayout.estimateCellHeight(cellVSpan));
} else {
// Determine the size of the bitmap for the preview image we will generate
// TODO: This actually uses the apps customize cell layout params, where as we make want
@@ -1120,9 +1146,9 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
AppWidgetProviderInfo info = (AppWidgetProviderInfo) rawInfo;
createItemInfo = new PendingAddWidgetInfo(info, null, null);
int[] cellSpans = mLauncher.getSpanForWidget(info, null);
- widget.applyFromAppWidgetProviderInfo(info, -1, cellSpans,
- mHolographicOutlineHelper);
+ widget.applyFromAppWidgetProviderInfo(info, -1, cellSpans);
widget.setTag(createItemInfo);
+ widget.setShortPressListener(this);
} else if (rawInfo instanceof ResolveInfo) {
// Fill in the shortcuts information
ResolveInfo info = (ResolveInfo) rawInfo;
@@ -1130,7 +1156,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
createItemInfo.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
createItemInfo.componentName = new ComponentName(info.activityInfo.packageName,
info.activityInfo.name);
- widget.applyFromResolveInfo(mPackageManager, info, mHolographicOutlineHelper);
+ widget.applyFromResolveInfo(mPackageManager, info);
widget.setTag(createItemInfo);
}
widget.setOnClickListener(this);
@@ -1204,8 +1230,13 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
if (rawInfo instanceof AppWidgetProviderInfo) {
AppWidgetProviderInfo info = (AppWidgetProviderInfo) rawInfo;
int[] cellSpans = mLauncher.getSpanForWidget(info, null);
+
+ int maxWidth = Math.min(data.maxImageWidth,
+ mWidgetSpacingLayout.estimateCellWidth(cellSpans[0]));
+ int maxHeight = Math.min(data.maxImageHeight,
+ mWidgetSpacingLayout.estimateCellHeight(cellSpans[1]));
Bitmap b = getWidgetPreview(info.provider, info.previewImage, info.icon,
- cellSpans[0], cellSpans[1], data.maxImageWidth, data.maxImageHeight);
+ cellSpans[0], cellSpans[1], maxWidth, maxHeight);
images.add(b);
} else if (rawInfo instanceof ResolveInfo) {
// Fill in the shortcuts information
@@ -1231,12 +1262,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
layout.createHardwareLayer();
invalidate();
- /* TEMPORARILY DISABLE HOLOGRAPHIC ICONS
- if (mFadeInAdjacentScreens) {
- prepareGenerateHoloOutlinesTask(data.page, data.items, data.generatedImages);
- }
- */
-
// Update all thread priorities
Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
while (iter.hasNext()) {
@@ -1245,29 +1270,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
task.setThreadPriority(getThreadPriorityForPage(pageIndex));
}
}
- private void onHolographicPageItemsLoaded(AsyncTaskPageData data) {
- // Invalidate early to short-circuit children invalidates
- invalidate();
-
- int page = data.page;
- ViewGroup layout = (ViewGroup) getPageAt(page);
- if (layout instanceof PagedViewCellLayout) {
- PagedViewCellLayout cl = (PagedViewCellLayout) layout;
- int count = cl.getPageChildCount();
- if (count != data.generatedImages.size()) return;
- for (int i = 0; i < count; ++i) {
- PagedViewIcon icon = (PagedViewIcon) cl.getChildOnPageAt(i);
- icon.setHolographicOutline(data.generatedImages.get(i));
- }
- } else {
- int count = layout.getChildCount();
- if (count != data.generatedImages.size()) return;
- for (int i = 0; i < count; ++i) {
- View v = layout.getChildAt(i);
- ((PagedViewWidget) v).setHolographicOutline(data.generatedImages.get(i));
- }
- }
- }
@Override
public void syncPages() {
@@ -1490,6 +1492,9 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
@Override
public void reset() {
+ // If we have reset, then we should not continue to restore the previous state
+ mSaveInstanceStateItemIndex = -1;
+
AppsCustomizeTabHost tabHost = getTabHost();
String tag = tabHost.getCurrentTabTag();
if (tag != null) {
@@ -1497,6 +1502,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
tabHost.setCurrentTabFromContent(ContentType.Applications);
}
}
+
if (mCurrentPage != 0) {
invalidatePageData(0);
}
@@ -1540,6 +1546,22 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
cancelAllTasks();
}
+ @Override
+ public void iconPressed(PagedViewIcon icon) {
+ // Reset the previously pressed icon and store a reference to the pressed icon so that
+ // we can reset it on return to Launcher (in Launcher.onResume())
+ if (mPressedIcon != null) {
+ mPressedIcon.resetDrawableState();
+ }
+ mPressedIcon = icon;
+ }
+
+ public void resetDrawableState() {
+ if (mPressedIcon != null) {
+ mPressedIcon.resetDrawableState();
+ mPressedIcon = null;
+ }
+ }
/*
* We load an extra page on each side to prevent flashes from scrolling and loading of the
diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java
index 2963240fa..7108c9f53 100644
--- a/src/com/android/launcher2/AppsCustomizeTabHost.java
+++ b/src/com/android/launcher2/AppsCustomizeTabHost.java
@@ -53,12 +53,19 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
private LinearLayout mContent;
private boolean mInTransition;
+ private boolean mTransitioningToWorkspace;
private boolean mResetAfterTransition;
- private Animator mLauncherTransition;
+ private Runnable mRelayoutAndMakeVisible;
public AppsCustomizeTabHost(Context context, AttributeSet attrs) {
super(context, attrs);
mLayoutInflater = LayoutInflater.from(context);
+ mRelayoutAndMakeVisible = new Runnable() {
+ public void run() {
+ mTabs.requestLayout();
+ mTabsContainer.setAlpha(1f);
+ }
+ };
}
/**
@@ -144,19 +151,29 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
if (contentWidth > 0 && mTabs.getLayoutParams().width != contentWidth) {
// Set the width and show the tab bar
mTabs.getLayoutParams().width = contentWidth;
- post(new Runnable() {
- public void run() {
- mTabs.requestLayout();
- mTabsContainer.setAlpha(1f);
- }
- });
+ post(mRelayoutAndMakeVisible);
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ // If we are mid transition then intercept touch events here so we can ignore them
+ if (mInTransition) {
+ return true;
+ }
+ return super.onInterceptTouchEvent(ev);
+ };
+
@Override
public boolean onTouchEvent(MotionEvent event) {
+ // Allow touch events to fall through if we are transitioning to the workspace
+ if (mInTransition) {
+ if (mTransitioningToWorkspace) {
+ return super.onTouchEvent(event);
+ }
+ }
+
// Intercept all touch events up to the bottom of the AppsCustomizePane so they do not fall
// through to the workspace and trigger showWorkspace()
if (event.getY() < mAppsCustomizePane.getBottom()) {
@@ -341,58 +358,62 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
}
}
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- if (mLauncherTransition != null) {
- enableAndBuildHardwareLayer();
- mLauncherTransition.start();
- mLauncherTransition = null;
- }
+ @Override
+ public View getContent() {
+ return mContent;
}
/* LauncherTransitionable overrides */
@Override
- public boolean onLauncherTransitionStart(Launcher l, Animator animation, boolean toWorkspace) {
+ public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) {
mInTransition = true;
- boolean delayLauncherTransitionUntilLayout = false;
- boolean animated = (animation != null);
- mLauncherTransition = null;
-
- // if the content wasn't visible before, delay the launcher animation until after a call
- // to layout -- this prevents a blip
- if (animated && mContent.getVisibility() == GONE) {
- mLauncherTransition = animation;
- delayLauncherTransitionUntilLayout = true;
- }
- mContent.setVisibility(VISIBLE);
+ mTransitioningToWorkspace = toWorkspace;
+
+ if (toWorkspace) {
+ // Going from All Apps -> Workspace
+ setVisibilityOfSiblingsWithLowerZOrder(VISIBLE);
+ // Stop the scrolling indicator - we don't want All Apps to be invalidating itself
+ // during the transition, especially since it has a hardware layer set on it
+ mAppsCustomizePane.cancelScrollingIndicatorAnimations();
+ } else {
+ // Going from Workspace -> All Apps
+ mContent.setVisibility(VISIBLE);
- if (!toWorkspace) {
// Make sure the current page is loaded (we start loading the side pages after the
// transition to prevent slowing down the animation)
mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage(), true);
- }
- if (animated && !delayLauncherTransitionUntilLayout) {
- enableAndBuildHardwareLayer();
- }
- if (!toWorkspace && !LauncherApplication.isScreenLarge()) {
- mAppsCustomizePane.showScrollingIndicator(false);
+ if (!LauncherApplication.isScreenLarge()) {
+ mAppsCustomizePane.showScrollingIndicator(true);
+ }
}
+
if (mResetAfterTransition) {
mAppsCustomizePane.reset();
mResetAfterTransition = false;
}
- return delayLauncherTransitionUntilLayout;
+
+ if (animated) {
+ enableAndBuildHardwareLayer();
+ }
+ }
+
+ @Override
+ public void onLauncherTransitionStep(Launcher l, float t) {
+ // Do nothing
}
@Override
- public void onLauncherTransitionEnd(Launcher l, Animator animation, boolean toWorkspace) {
+ public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) {
mInTransition = false;
- if (animation != null) {
+ if (animated) {
setLayerType(LAYER_TYPE_NONE, null);
}
if (!toWorkspace) {
+ // Going from Workspace -> All Apps
+ setVisibilityOfSiblingsWithLowerZOrder(INVISIBLE);
+
// Dismiss the workspace cling and show the all apps cling (if not already shown)
l.dismissWorkspaceCling(null);
mAppsCustomizePane.showAllAppsCling();
@@ -406,7 +427,27 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
}
}
- public void onResume() {
+ private void setVisibilityOfSiblingsWithLowerZOrder(int visibility) {
+ ViewGroup parent = (ViewGroup) getParent();
+ final int count = parent.getChildCount();
+ if (!isChildrenDrawingOrderEnabled()) {
+ for (int i = 0; i < count; i++) {
+ final View child = parent.getChildAt(i);
+ if (child == this) {
+ break;
+ } else {
+ if (child.getVisibility() == GONE) {
+ continue;
+ }
+ child.setVisibility(visibility);
+ }
+ }
+ } else {
+ throw new RuntimeException("Failed; can't get z-order of views");
+ }
+ }
+
+ public void onWindowVisible() {
if (getVisibility() == VISIBLE) {
mContent.setVisibility(VISIBLE);
// We unload the widget previews when the UI is hidden, so need to reload pages
diff --git a/src/com/android/launcher2/BubbleTextView.java b/src/com/android/launcher2/BubbleTextView.java
index ad3954124..b41a02e1e 100644
--- a/src/com/android/launcher2/BubbleTextView.java
+++ b/src/com/android/launcher2/BubbleTextView.java
@@ -65,6 +65,7 @@ public class BubbleTextView extends TextView {
private Drawable mBackground;
private boolean mStayPressed;
+ private CheckLongPressHelper mLongPressHelper;
public BubbleTextView(Context context) {
super(context);
@@ -82,6 +83,7 @@ public class BubbleTextView extends TextView {
}
private void init() {
+ mLongPressHelper = new CheckLongPressHelper(this);
mBackground = getBackground();
final Resources res = getContext().getResources();
@@ -134,7 +136,7 @@ public class BubbleTextView extends TextView {
mPressedOrFocusedBackground = null;
}
if (isFocused()) {
- if (mLayout == null) {
+ if (getLayout() == null) {
// In some cases, we get focus before we have been layed out. Set the
// background to null so that it will get created when the view is drawn.
mPressedOrFocusedBackground = null;
@@ -223,6 +225,8 @@ public class BubbleTextView extends TextView {
} else {
mDidInvalidateForPressedState = false;
}
+
+ mLongPressHelper.postCheckForLongPress();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
@@ -231,6 +235,8 @@ public class BubbleTextView extends TextView {
if (!isPressed()) {
mPressedOrFocusedBackground = null;
}
+
+ mLongPressHelper.cancelLongPress();
break;
}
return result;
@@ -327,4 +333,11 @@ public class BubbleTextView extends TextView {
}
return true;
}
+
+ @Override
+ public void cancelLongPress() {
+ super.cancelLongPress();
+
+ mLongPressHelper.cancelLongPress();
+ }
}
diff --git a/src/com/android/launcher2/ButtonDropTarget.java b/src/com/android/launcher2/ButtonDropTarget.java
index 4ff7c9669..dc34d8828 100644
--- a/src/com/android/launcher2/ButtonDropTarget.java
+++ b/src/com/android/launcher2/ButtonDropTarget.java
@@ -19,6 +19,7 @@ package com.android.launcher2;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Paint;
+import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;
@@ -41,7 +42,7 @@ public class ButtonDropTarget extends TextView implements DropTarget, DragContro
protected boolean mActive;
/** The paint applied to the drag view on hover */
- protected final Paint mHoverPaint = new Paint();
+ protected int mHoverColor = 0;
public ButtonDropTarget(Context context, AttributeSet attrs) {
this(context, attrs, 0);
@@ -71,7 +72,7 @@ public class ButtonDropTarget extends TextView implements DropTarget, DragContro
}
public void onDragEnter(DragObject d) {
- d.dragView.setPaint(mHoverPaint);
+ d.dragView.setColor(mHoverColor);
}
public void onDragOver(DragObject d) {
@@ -79,7 +80,7 @@ public class ButtonDropTarget extends TextView implements DropTarget, DragContro
}
public void onDragExit(DragObject d) {
- d.dragView.setPaint(null);
+ d.dragView.setColor(0);
}
public void onDragStart(DragSource source, Object info, int dragAction) {
@@ -100,6 +101,26 @@ public class ButtonDropTarget extends TextView implements DropTarget, DragContro
outRect.bottom += mBottomDragPadding;
}
+ Rect getIconRect(int itemWidth, int itemHeight, int drawableWidth, int drawableHeight) {
+ DragLayer dragLayer = mLauncher.getDragLayer();
+
+ // Find the rect to animate to (the view is center aligned)
+ Rect to = new Rect();
+ dragLayer.getViewRectRelativeToSelf(this, to);
+ int width = drawableWidth;
+ int height = drawableHeight;
+ int left = to.left + getPaddingLeft();
+ int top = to.top + (getMeasuredHeight() - height) / 2;
+ to.set(left, top, left + width, top + height);
+
+ // Center the destination rect about the trash icon
+ int xOffset = (int) -(itemWidth - width) / 2;
+ int yOffset = (int) -(itemHeight - height) / 2;
+ to.offset(xOffset, yOffset);
+
+ return to;
+ }
+
@Override
public DropTarget getDropTargetDelegate(DragObject d) {
return null;
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index a6c2c5f75..bbb0d7f9f 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -35,7 +35,6 @@ import android.graphics.PointF;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
-import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
@@ -54,6 +53,7 @@ import com.android.launcher2.FolderIcon.FolderRingAnimator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Stack;
public class CellLayout extends ViewGroup {
static final String TAG = "CellLayout";
@@ -110,7 +110,7 @@ public class CellLayout extends ViewGroup {
// These arrays are used to implement the drag visualization on x-large screens.
// They are used as circular arrays, indexed by mDragOutlineCurrent.
- private Point[] mDragOutlines = new Point[4];
+ private Rect[] mDragOutlines = new Rect[4];
private float[] mDragOutlineAlphas = new float[mDragOutlines.length];
private InterruptibleInOutAnimator[] mDragOutlineAnims =
new InterruptibleInOutAnimator[mDragOutlines.length];
@@ -204,7 +204,7 @@ public class CellLayout extends ViewGroup {
mDragCell[0] = mDragCell[1] = -1;
for (int i = 0; i < mDragOutlines.length; i++) {
- mDragOutlines[i] = new Point(-1, -1);
+ mDragOutlines[i] = new Rect(-1, -1, -1, -1);
}
// When dragging things around the home screens, we show a green outline of
@@ -238,10 +238,7 @@ public class CellLayout extends ViewGroup {
animation.cancel();
} else {
mDragOutlineAlphas[thisIndex] = (Float) animation.getAnimatedValue();
- final int left = mDragOutlines[thisIndex].x;
- final int top = mDragOutlines[thisIndex].y;
- CellLayout.this.invalidate(left, top,
- left + outline.getWidth(), top + outline.getHeight());
+ CellLayout.this.invalidate(mDragOutlines[thisIndex]);
}
}
});
@@ -425,10 +422,10 @@ public class CellLayout extends ViewGroup {
for (int i = 0; i < mDragOutlines.length; i++) {
final float alpha = mDragOutlineAlphas[i];
if (alpha > 0) {
- final Point p = mDragOutlines[i];
+ final Rect r = mDragOutlines[i];
final Bitmap b = (Bitmap) mDragOutlineAnims[i].getTag();
paint.setAlpha((int)(alpha + .5f));
- canvas.drawBitmap(b, p.x, p.y, paint);
+ canvas.drawBitmap(b, null, r, paint);
}
}
@@ -973,10 +970,6 @@ public class CellLayout extends ViewGroup {
return mBackgroundAlpha;
}
- public void setFastBackgroundAlpha(float alpha) {
- mBackgroundAlpha = alpha;
- }
-
public void setBackgroundAlphaMultiplier(float multiplier) {
mBackgroundAlphaMultiplier = multiplier;
}
@@ -986,8 +979,10 @@ public class CellLayout extends ViewGroup {
}
public void setBackgroundAlpha(float alpha) {
- mBackgroundAlpha = alpha;
- invalidate();
+ if (mBackgroundAlpha != alpha) {
+ mBackgroundAlpha = alpha;
+ invalidate();
+ }
}
// Need to return true to let the view system know we know how to handle alpha-- this is
@@ -998,16 +993,12 @@ public class CellLayout extends ViewGroup {
return true;
}
+ @Override
public void setAlpha(float alpha) {
setChildrenAlpha(alpha);
super.setAlpha(alpha);
}
- public void setFastAlpha(float alpha) {
- setFastChildrenAlpha(alpha);
- super.setFastAlpha(alpha);
- }
-
private void setChildrenAlpha(float alpha) {
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
@@ -1015,13 +1006,6 @@ public class CellLayout extends ViewGroup {
}
}
- private void setFastChildrenAlpha(float alpha) {
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; i++) {
- getChildAt(i).setFastAlpha(alpha);
- }
- }
-
public View getChildAt(int x, int y) {
return mChildren.getChildAt(x, y);
}
@@ -1121,11 +1105,16 @@ public class CellLayout extends ViewGroup {
}
void visualizeDropLocation(View v, Bitmap dragOutline, int originX, int originY,
- int spanX, int spanY, Point dragOffset, Rect dragRegion) {
+ int minSpanX, int minSpanY, int spanX, int spanY, Point dragOffset, Rect dragRegion) {
final int oldDragCellX = mDragCell[0];
final int oldDragCellY = mDragCell[1];
- final int[] nearest = findNearestVacantArea(originX, originY, spanX, spanY, v, mDragCell);
+ int[] resultSpan = new int[2];
+ final int[] nearest = findNearestVacantArea(originX, originY, minSpanX, minSpanY,
+ spanX, spanY, v, mDragCell, resultSpan);
+ boolean resize = spanX > resultSpan[0] || spanY > resultSpan[1];
+ spanX = resultSpan[0];
+ spanY = resultSpan[1];
if (v != null && dragOffset == null) {
mDragCenter.set(originX + (v.getWidth() / 2), originY + (v.getHeight() / 2));
} else {
@@ -1176,12 +1165,15 @@ public class CellLayout extends ViewGroup {
- dragOutline.getHeight()) / 2;
}
}
-
final int oldIndex = mDragOutlineCurrent;
mDragOutlineAnims[oldIndex].animateOut();
mDragOutlineCurrent = (oldIndex + 1) % mDragOutlines.length;
+ Rect r = mDragOutlines[mDragOutlineCurrent];
+ r.set(left, top, left + dragOutline.getWidth(), top + dragOutline.getHeight());
+ if (resize) {
+ cellToRect(nearest[0], nearest[1], spanX, spanY, r);
+ }
- mDragOutlines[mDragOutlineCurrent].set(left, top);
mDragOutlineAnims[mDragOutlineCurrent].setTag(dragOutline);
mDragOutlineAnims[mDragOutlineCurrent].animateIn();
}
@@ -1195,8 +1187,7 @@ public class CellLayout extends ViewGroup {
public void clearDragOutlines() {
final int oldIndex = mDragOutlineCurrent;
mDragOutlineAnims[oldIndex].animateOut();
- mDragCell[0] = -1;
- mDragCell[1] = -1;
+ mDragCell[0] = mDragCell[1] = -1;
}
/**
@@ -1212,8 +1203,8 @@ public class CellLayout extends ViewGroup {
* @return The X, Y cell of a vacant area that can contain this object,
* nearest the requested location.
*/
- int[] findNearestVacantArea(
- int pixelX, int pixelY, int spanX, int spanY, int[] result) {
+ int[] findNearestVacantArea(int pixelX, int pixelY, int spanX, int spanY,
+ int[] result) {
return findNearestVacantArea(pixelX, pixelY, spanX, spanY, null, result);
}
@@ -1223,6 +1214,27 @@ public class CellLayout extends ViewGroup {
*
* @param pixelX The X location at which you want to search for a vacant area.
* @param pixelY The Y location at which you want to search for a vacant area.
+ * @param minSpanX The minimum horizontal span required
+ * @param minSpanY The minimum vertical span required
+ * @param spanX Horizontal span of the object.
+ * @param spanY Vertical span of the object.
+ * @param result Array in which to place the result, or null (in which case a new array will
+ * be allocated)
+ * @return The X, Y cell of a vacant area that can contain this object,
+ * nearest the requested location.
+ */
+ int[] findNearestVacantArea(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX,
+ int spanY, int[] result, int[] resultSpan) {
+ return findNearestVacantArea(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, null,
+ result, resultSpan);
+ }
+
+ /**
+ * Find a vacant area that will fit the given bounds nearest the requested
+ * cell location. Uses Euclidean distance to score multiple vacant areas.
+ *
+ * @param pixelX The X location at which you want to search for a vacant area.
+ * @param pixelY The Y location at which you want to search for a vacant area.
* @param spanX Horizontal span of the object.
* @param spanY Vertical span of the object.
* @param ignoreOccupied If true, the result can be an occupied cell
@@ -1233,6 +1245,43 @@ public class CellLayout extends ViewGroup {
*/
int[] findNearestArea(int pixelX, int pixelY, int spanX, int spanY, View ignoreView,
boolean ignoreOccupied, int[] result) {
+ return findNearestArea(pixelX, pixelY, spanX, spanY,
+ spanX, spanY, ignoreView, ignoreOccupied, result, null);
+ }
+
+ private final Stack<Rect> mTempRectStack = new Stack<Rect>();
+ private void lazyInitTempRectStack() {
+ if (mTempRectStack.isEmpty()) {
+ for (int i = 0; i < mCountX * mCountY; i++) {
+ mTempRectStack.push(new Rect());
+ }
+ }
+ }
+ private void recycleTempRects(Stack<Rect> used) {
+ while (!used.isEmpty()) {
+ mTempRectStack.push(used.pop());
+ }
+ }
+
+ /**
+ * Find a vacant area that will fit the given bounds nearest the requested
+ * cell location. Uses Euclidean distance to score multiple vacant areas.
+ *
+ * @param pixelX The X location at which you want to search for a vacant area.
+ * @param pixelY The Y location at which you want to search for a vacant area.
+ * @param minSpanX The minimum horizontal span required
+ * @param minSpanY The minimum vertical span required
+ * @param spanX Horizontal span of the object.
+ * @param spanY Vertical span of the object.
+ * @param ignoreOccupied If true, the result can be an occupied cell
+ * @param result Array in which to place the result, or null (in which case a new array will
+ * be allocated)
+ * @return The X, Y cell of a vacant area that can contain this object,
+ * nearest the requested location.
+ */
+ int[] findNearestArea(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX, int spanY,
+ View ignoreView, boolean ignoreOccupied, int[] result, int[] resultSpan) {
+ lazyInitTempRectStack();
// mark space take by ignoreView as available (method checks if ignoreView is null)
markCellsAsUnoccupiedForView(ignoreView);
@@ -1245,35 +1294,99 @@ public class CellLayout extends ViewGroup {
// Keep track of best-scoring drop area
final int[] bestXY = result != null ? result : new int[2];
double bestDistance = Double.MAX_VALUE;
+ final Rect bestRect = new Rect(-1, -1, -1, -1);
+ final Stack<Rect> validRegions = new Stack<Rect>();
final int countX = mCountX;
final int countY = mCountY;
final boolean[][] occupied = mOccupied;
- for (int y = 0; y < countY - (spanY - 1); y++) {
+ if (minSpanX <= 0 || minSpanY <= 0 || spanX <= 0 || spanY <= 0 ||
+ spanX < minSpanX || spanY < minSpanY) {
+ return bestXY;
+ }
+
+ for (int y = 0; y < countY - (minSpanY - 1); y++) {
inner:
- for (int x = 0; x < countX - (spanX - 1); x++) {
+ for (int x = 0; x < countX - (minSpanX - 1); x++) {
+ int ySize = -1;
+ int xSize = -1;
if (ignoreOccupied) {
- for (int i = 0; i < spanX; i++) {
- for (int j = 0; j < spanY; j++) {
+ // First, let's see if this thing fits anywhere
+ for (int i = 0; i < minSpanX; i++) {
+ for (int j = 0; j < minSpanY; j++) {
if (occupied[x + i][y + j]) {
- // small optimization: we can skip to after the column we
- // just found an occupied cell
- x += i;
continue inner;
}
}
}
+ xSize = minSpanX;
+ ySize = minSpanY;
+
+ // We know that the item will fit at _some_ acceptable size, now let's see
+ // how big we can make it. We'll alternate between incrementing x and y spans
+ // until we hit a limit.
+ boolean incX = true;
+ boolean hitMaxX = xSize >= spanX;
+ boolean hitMaxY = ySize >= spanY;
+ while (!(hitMaxX && hitMaxY)) {
+ if (incX && !hitMaxX) {
+ for (int j = 0; j < ySize; j++) {
+ if (x + xSize > countX -1 || occupied[x + xSize][y + j]) {
+ // We can't move out horizontally
+ hitMaxX = true;
+ }
+ }
+ if (!hitMaxX) {
+ xSize++;
+ }
+ } else if (!hitMaxY) {
+ for (int i = 0; i < xSize; i++) {
+ if (y + ySize > countY - 1 || occupied[x + i][y + ySize]) {
+ // We can't move out vertically
+ hitMaxY = true;
+ }
+ }
+ if (!hitMaxY) {
+ ySize++;
+ }
+ }
+ hitMaxX |= xSize >= spanX;
+ hitMaxY |= ySize >= spanY;
+ incX = !incX;
+ }
+ incX = true;
+ hitMaxX = xSize >= spanX;
+ hitMaxY = ySize >= spanY;
}
final int[] cellXY = mTmpXY;
cellToCenterPoint(x, y, cellXY);
+ // We verify that the current rect is not a sub-rect of any of our previous
+ // candidates. In this case, the current rect is disqualified in favour of the
+ // containing rect.
+ Rect currentRect = mTempRectStack.pop();
+ currentRect.set(x, y, x + xSize, y + ySize);
+ boolean contained = false;
+ for (Rect r : validRegions) {
+ if (r.contains(currentRect)) {
+ contained = true;
+ break;
+ }
+ }
+ validRegions.push(currentRect);
double distance = Math.sqrt(Math.pow(cellXY[0] - pixelX, 2)
+ Math.pow(cellXY[1] - pixelY, 2));
- if (distance <= bestDistance) {
+ if ((distance <= bestDistance && !contained) ||
+ currentRect.contains(bestRect)) {
bestDistance = distance;
bestXY[0] = x;
bestXY[1] = y;
+ if (resultSpan != null) {
+ resultSpan[0] = xSize;
+ resultSpan[1] = ySize;
+ }
+ bestRect.set(currentRect);
}
}
}
@@ -1285,6 +1398,7 @@ public class CellLayout extends ViewGroup {
bestXY[0] = -1;
bestXY[1] = -1;
}
+ recycleTempRects(validRegions);
return bestXY;
}
@@ -1307,6 +1421,27 @@ public class CellLayout extends ViewGroup {
}
/**
+ * Find a vacant area that will fit the given bounds nearest the requested
+ * cell location. Uses Euclidean distance to score multiple vacant areas.
+ *
+ * @param pixelX The X location at which you want to search for a vacant area.
+ * @param pixelY The Y location at which you want to search for a vacant area.
+ * @param minSpanX The minimum horizontal span required
+ * @param minSpanY The minimum vertical span required
+ * @param spanX Horizontal span of the object.
+ * @param spanY Vertical span of the object.
+ * @param ignoreView Considers space occupied by this view as unoccupied
+ * @param result Previously returned value to possibly recycle.
+ * @return The X, Y cell of a vacant area that can contain this object,
+ * nearest the requested location.
+ */
+ int[] findNearestVacantArea(int pixelX, int pixelY, int minSpanX, int minSpanY,
+ int spanX, int spanY, View ignoreView, int[] result, int[] resultSpan) {
+ return findNearestArea(pixelX, pixelY, minSpanX, minSpanY,
+ spanX, spanY, ignoreView, true, result, resultSpan);
+ }
+
+ /**
* Find a starting cell position that will fit the given bounds nearest the requested
* cell location. Uses Euclidean distance to score multiple vacant areas.
*
@@ -1473,8 +1608,7 @@ public class CellLayout extends ViewGroup {
}
// Invalidate the drag data
- mDragCell[0] = -1;
- mDragCell[1] = -1;
+ mDragCell[0] = mDragCell[1] = -1;
mDragOutlineAnims[mDragOutlineCurrent].animateOut();
mDragOutlineCurrent = (mDragOutlineCurrent + 1) % mDragOutlineAnims.length;
@@ -1505,7 +1639,7 @@ public class CellLayout extends ViewGroup {
* @param cellVSpan Height in cells
* @param resultRect Rect into which to put the results
*/
- public void cellToRect(int cellX, int cellY, int cellHSpan, int cellVSpan, RectF resultRect) {
+ public void cellToRect(int cellX, int cellY, int cellHSpan, int cellVSpan, Rect resultRect) {
final int cellWidth = mCellWidth;
final int cellHeight = mCellHeight;
final int widthGap = mWidthGap;
@@ -1680,10 +1814,10 @@ out: for (int i = x; i < x + spanX - 1 && x < xCount; i++) {
}
}
- public void onMove(View view, int newCellX, int newCellY) {
+ public void onMove(View view, int newCellX, int newCellY, int newSpanX, int newSpanY) {
LayoutParams lp = (LayoutParams) view.getLayoutParams();
markCellsAsUnoccupiedForView(view);
- markCellsForView(newCellX, newCellY, lp.cellHSpan, lp.cellVSpan, true);
+ markCellsForView(newCellX, newCellY, newSpanX, newSpanY, true);
}
public void markCellsAsOccupiedForView(View view) {
diff --git a/src/com/android/launcher2/CheckLongPressHelper.java b/src/com/android/launcher2/CheckLongPressHelper.java
new file mode 100644
index 000000000..3ccda2635
--- /dev/null
+++ b/src/com/android/launcher2/CheckLongPressHelper.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 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.launcher2;
+
+import android.view.View;
+
+public class CheckLongPressHelper {
+ private View mView;
+ private boolean mHasPerformedLongPress;
+ private CheckForLongPress mPendingCheckForLongPress;
+
+ class CheckForLongPress implements Runnable {
+ public void run() {
+ if ((mView.getParent() != null) && mView.hasWindowFocus()
+ && !mHasPerformedLongPress) {
+ if (mView.performLongClick()) {
+ mHasPerformedLongPress = true;
+ }
+ }
+ }
+ }
+
+ public CheckLongPressHelper(View v) {
+ mView = v;
+ }
+
+ public void postCheckForLongPress() {
+ mHasPerformedLongPress = false;
+
+ if (mPendingCheckForLongPress == null) {
+ mPendingCheckForLongPress = new CheckForLongPress();
+ }
+ mView.postDelayed(mPendingCheckForLongPress, LauncherApplication.getLongPressTimeout());
+ }
+
+ public void cancelLongPress() {
+ mHasPerformedLongPress = false;
+ if (mPendingCheckForLongPress != null) {
+ mView.removeCallbacks(mPendingCheckForLongPress);
+ mPendingCheckForLongPress = null;
+ }
+ }
+
+ public boolean hasPerformedLongPress() {
+ return mHasPerformedLongPress;
+ }
+}
diff --git a/src/com/android/launcher2/DeleteDropTarget.java b/src/com/android/launcher2/DeleteDropTarget.java
index f19970823..4621dea85 100644
--- a/src/com/android/launcher2/DeleteDropTarget.java
+++ b/src/com/android/launcher2/DeleteDropTarget.java
@@ -20,22 +20,21 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.drawable.TransitionDrawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
+import android.view.animation.LinearInterpolator;
import com.android.launcher.R;
public class DeleteDropTarget extends ButtonDropTarget {
- private static int DELETE_ANIMATION_DURATION = 250;
+ private static int DELETE_ANIMATION_DURATION = 300;
private ColorStateList mOriginalTextColor;
- private int mHoverColor = 0xFFFF0000;
private TransitionDrawable mUninstallDrawable;
private TransitionDrawable mRemoveDrawable;
private TransitionDrawable mCurrentDrawable;
@@ -58,8 +57,6 @@ public class DeleteDropTarget extends ButtonDropTarget {
// Get the hover color
Resources r = getResources();
mHoverColor = r.getColor(R.color.delete_target_hover_tint);
- mHoverPaint.setColorFilter(new PorterDuffColorFilter(
- mHoverColor, PorterDuff.Mode.SRC_ATOP));
mUninstallDrawable = (TransitionDrawable)
r.getDrawable(R.drawable.uninstall_target_selector);
mRemoveDrawable = (TransitionDrawable) r.getDrawable(R.drawable.remove_target_selector);
@@ -162,25 +159,19 @@ public class DeleteDropTarget extends ButtonDropTarget {
if (!d.dragComplete) {
mCurrentDrawable.resetTransition();
setTextColor(mOriginalTextColor);
+ } else {
+ // Restore the hover color if we are deleting
+ d.dragView.setColor(mHoverColor);
}
}
private void animateToTrashAndCompleteDrop(final DragObject d) {
DragLayer dragLayer = mLauncher.getDragLayer();
Rect from = new Rect();
- Rect to = new Rect();
dragLayer.getViewRectRelativeToSelf(d.dragView, from);
- dragLayer.getViewRectRelativeToSelf(this, to);
-
- int width = mCurrentDrawable.getIntrinsicWidth();
- int height = mCurrentDrawable.getIntrinsicHeight();
- to.set(to.left + getPaddingLeft(), to.top + getPaddingTop(),
- to.left + getPaddingLeft() + width, to.bottom);
-
- // Center the destination rect about the trash icon
- int xOffset = (int) -(d.dragView.getMeasuredWidth() - width) / 2;
- int yOffset = (int) -(d.dragView.getMeasuredHeight() - height) / 2;
- to.offset(xOffset, yOffset);
+ Rect to = getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(),
+ mCurrentDrawable.getIntrinsicWidth(), mCurrentDrawable.getIntrinsicHeight());
+ float scale = (float) to.width() / from.width();
mSearchDropTargetBar.deferOnDragEnd();
Runnable onAnimationEndRunnable = new Runnable() {
@@ -191,9 +182,10 @@ public class DeleteDropTarget extends ButtonDropTarget {
completeDrop(d);
}
};
- dragLayer.animateView(d.dragView, from, to, 0.1f, 0.1f,
+ dragLayer.animateView(d.dragView, from, to, scale, 1f, 1f, 0.1f, 0.1f,
DELETE_ANIMATION_DURATION, new DecelerateInterpolator(2),
- new DecelerateInterpolator(1.5f), onAnimationEndRunnable, false);
+ new LinearInterpolator(), onAnimationEndRunnable,
+ DragLayer.ANIMATION_END_DISAPPEAR, null);
}
private void completeDrop(DragObject d) {
diff --git a/src/com/android/launcher2/DragController.java b/src/com/android/launcher2/DragController.java
index a120ac569..129987f00 100644
--- a/src/com/android/launcher2/DragController.java
+++ b/src/com/android/launcher2/DragController.java
@@ -47,8 +47,9 @@ public class DragController {
/** Indicates the drag is a copy. */
public static int DRAG_ACTION_COPY = 1;
- private static final int SCROLL_DELAY = 600;
- private static final int VIBRATE_DURATION = 35;
+ private static final int SCROLL_DELAY = 500;
+ private static final int RESCROLL_DELAY = 750;
+ private static final int VIBRATE_DURATION = 15;
private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
@@ -184,7 +185,7 @@ public class DragController {
int dragLayerX = loc[0];
int dragLayerY = loc[1];
- startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, dragRegion);
+ startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, dragRegion, 1f);
b.recycle();
if (dragAction == DRAG_ACTION_MOVE) {
@@ -205,13 +206,16 @@ public class DragController {
* Makes dragging feel more precise, e.g. you can clip out a transparent border
*/
public void startDrag(View v, Bitmap bmp, DragSource source, Object dragInfo, int dragAction,
- Rect dragRegion) {
+ Rect dragRegion, float initialDragViewScale) {
int[] loc = mCoordinatesTemp;
mLauncher.getDragLayer().getLocationInDragLayer(v, loc);
- int dragLayerX = loc[0];
- int dragLayerY = loc[1];
+ int dragLayerX = loc[0] + v.getPaddingLeft() +
+ (int) ((initialDragViewScale * bmp.getWidth() - bmp.getWidth()) / 2);
+ int dragLayerY = loc[1] + v.getPaddingTop() +
+ (int) ((initialDragViewScale * bmp.getHeight() - bmp.getHeight()) / 2);
- startDrag(bmp, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, dragRegion);
+ startDrag(bmp, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, dragRegion,
+ initialDragViewScale);
if (dragAction == DRAG_ACTION_MOVE) {
v.setVisibility(View.GONE);
@@ -229,28 +233,12 @@ public class DragController {
* @param dragInfo The data associated with the object that is being dragged
* @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
* {@link #DRAG_ACTION_COPY}
- */
- public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,
- DragSource source, Object dragInfo, int dragAction) {
- startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, null);
- }
-
- /**
- * Starts a drag.
- *
- * @param b The bitmap to display as the drag image. It will be re-scaled to the
- * enlarged size.
- * @param dragLayerX The x position in the DragLayer of the left-top of the bitmap.
- * @param dragLayerY The y position in the DragLayer of the left-top of the bitmap.
- * @param source An object representing where the drag originated
- * @param dragInfo The data associated with the object that is being dragged
- * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
- * {@link #DRAG_ACTION_COPY}
* @param dragRegion Coordinates within the bitmap b for the position of item being dragged.
* Makes dragging feel more precise, e.g. you can clip out a transparent border
*/
public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,
- DragSource source, Object dragInfo, int dragAction, Point dragOffset, Rect dragRegion) {
+ DragSource source, Object dragInfo, int dragAction, Point dragOffset, Rect dragRegion,
+ float initialDragViewScale) {
if (PROFILE_DRAWING_DURING_DRAG) {
android.os.Debug.startMethodTracing("Launcher");
}
@@ -285,7 +273,7 @@ public class DragController {
mVibrator.vibrate(VIBRATE_DURATION);
final DragView dragView = mDragObject.dragView = new DragView(mLauncher, b, registrationX,
- registrationY, 0, 0, b.getWidth(), b.getHeight());
+ registrationY, 0, 0, b.getWidth(), b.getHeight(), initialDragViewScale);
if (dragOffset != null) {
dragView.setDragVisualizeOffset(new Point(dragOffset));
@@ -388,11 +376,14 @@ public class DragController {
private void endDrag() {
if (mDragging) {
mDragging = false;
+ clearScrollRunnable();
for (DragListener listener : mListeners) {
listener.onDragEnd();
}
if (mDragObject.dragView != null) {
- mDragObject.dragView.remove();
+ if (!mDragObject.deferDragViewCleanupPostAnimation) {
+ mDragObject.dragView.remove();
+ }
mDragObject.dragView = null;
}
}
@@ -456,6 +447,15 @@ public class DragController {
return mMoveTarget != null && mMoveTarget.dispatchUnhandledMove(focused, direction);
}
+ private void clearScrollRunnable() {
+ mHandler.removeCallbacks(mScrollRunnable);
+ if (mScrollState == SCROLL_WAITING_IN_ZONE) {
+ mScrollState = SCROLL_OUTSIDE_ZONE;
+ mScrollRunnable.setDirection(SCROLL_RIGHT);
+ mDragScroller.onExitScrollArea();
+ }
+ }
+
private void handleMoveEvent(int x, int y) {
mDragObject.dragView.move(x, y);
@@ -491,30 +491,32 @@ public class DragController {
Math.sqrt(Math.pow(mLastTouch[0] - x, 2) + Math.pow(mLastTouch[1] - y, 2));
mLastTouch[0] = x;
mLastTouch[1] = y;
+ final int delay = mDistanceSinceScroll < slop ? RESCROLL_DELAY : SCROLL_DELAY;
if (x < mScrollZone) {
- if (mScrollState == SCROLL_OUTSIDE_ZONE && mDistanceSinceScroll > slop) {
+ if (mScrollState == SCROLL_OUTSIDE_ZONE) {
mScrollState = SCROLL_WAITING_IN_ZONE;
if (mDragScroller.onEnterScrollArea(x, y, SCROLL_LEFT)) {
mScrollRunnable.setDirection(SCROLL_LEFT);
- mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
+ mHandler.postDelayed(mScrollRunnable, delay);
}
}
} else if (x > mScrollView.getWidth() - mScrollZone) {
- if (mScrollState == SCROLL_OUTSIDE_ZONE && mDistanceSinceScroll > slop) {
+ if (mScrollState == SCROLL_OUTSIDE_ZONE) {
mScrollState = SCROLL_WAITING_IN_ZONE;
if (mDragScroller.onEnterScrollArea(x, y, SCROLL_RIGHT)) {
mScrollRunnable.setDirection(SCROLL_RIGHT);
- mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
+ mHandler.postDelayed(mScrollRunnable, delay);
}
}
} else {
- if (mScrollState == SCROLL_WAITING_IN_ZONE) {
- mScrollState = SCROLL_OUTSIDE_ZONE;
- mScrollRunnable.setDirection(SCROLL_RIGHT);
- mHandler.removeCallbacks(mScrollRunnable);
- mDragScroller.onExitScrollArea();
- }
+ clearScrollRunnable();
+ }
+ }
+
+ public void forceMoveEvent() {
+ if (mDragging) {
+ handleMoveEvent(mDragObject.x, mDragObject.y);
}
}
@@ -558,6 +560,7 @@ public class DragController {
endDrag();
break;
case MotionEvent.ACTION_CANCEL:
+ mHandler.removeCallbacks(mScrollRunnable);
cancelDrag();
break;
}
@@ -681,6 +684,11 @@ public class DragController {
mScrollState = SCROLL_OUTSIDE_ZONE;
mDistanceSinceScroll = 0;
mDragScroller.onExitScrollArea();
+
+ if (isDragging()) {
+ // Force an update so that we can requeue the scroller if necessary
+ forceMoveEvent();
+ }
}
}
diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java
index 915477119..a3b389d24 100644
--- a/src/com/android/launcher2/DragLayer.java
+++ b/src/com/android/launcher2/DragLayer.java
@@ -62,15 +62,17 @@ public class DragLayer extends FrameLayout {
private ValueAnimator mDropAnim = null;
private ValueAnimator mFadeOutAnim = null;
private TimeInterpolator mCubicEaseOutInterpolator = new DecelerateInterpolator(1.5f);
- private View mDropView = null;
+ private DragView mDropView = null;
+ private int mAnchorViewInitialScrollX = 0;
+ private View mAnchorView = null;
- private int[] mDropViewPos = new int[2];
- private float mDropViewScale;
- private float mDropViewAlpha;
private boolean mHoverPointClosesFolder = false;
private Rect mHitRect = new Rect();
private int mWorkspaceIndex = -1;
private int mQsbIndex = -1;
+ public static final int ANIMATION_END_DISAPPEAR = 0;
+ public static final int ANIMATION_END_FADE_OUT = 1;
+ public static final int ANIMATION_END_REMAIN_VISIBLE = 2;
/**
* Used to create a new DragLayer from XML.
@@ -412,24 +414,25 @@ public class DragLayer extends FrameLayout {
animateViewIntoPosition(dragView, child, null);
}
- public void animateViewIntoPosition(DragView dragView, final int[] pos, float scale,
- Runnable onFinishRunnable) {
+ public void animateViewIntoPosition(DragView dragView, final int[] pos, float alpha,
+ float scaleX, float scaleY, int animationEndStyle, Runnable onFinishRunnable,
+ int duration) {
Rect r = new Rect();
getViewRectRelativeToSelf(dragView, r);
final int fromX = r.left;
final int fromY = r.top;
- animateViewIntoPosition(dragView, fromX, fromY, pos[0], pos[1], scale,
- onFinishRunnable, true, -1);
+ animateViewIntoPosition(dragView, fromX, fromY, pos[0], pos[1], alpha, 1, 1, scaleX, scaleY,
+ onFinishRunnable, animationEndStyle, duration, null);
}
public void animateViewIntoPosition(DragView dragView, final View child,
final Runnable onFinishAnimationRunnable) {
- animateViewIntoPosition(dragView, child, -1, onFinishAnimationRunnable);
+ animateViewIntoPosition(dragView, child, -1, onFinishAnimationRunnable, null);
}
public void animateViewIntoPosition(DragView dragView, final View child, int duration,
- final Runnable onFinishAnimationRunnable) {
+ final Runnable onFinishAnimationRunnable, View anchorView) {
((CellLayoutChildren) child.getParent()).measureChild(child);
CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
@@ -455,7 +458,7 @@ public class DragLayer extends FrameLayout {
toX -= (dragView.getMeasuredWidth() - Math.round(scale * child.getMeasuredWidth())) / 2;
} else if (child instanceof FolderIcon) {
// Account for holographic blur padding on the drag view
- toY -= HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS / 2;
+ toY -= Workspace.DRAG_BITMAP_PADDING / 2;
// Center in the x coordinate about the target's drawable
toX -= (dragView.getMeasuredWidth() - Math.round(scale * child.getMeasuredWidth())) / 2;
} else {
@@ -467,34 +470,27 @@ public class DragLayer extends FrameLayout {
final int fromX = r.left;
final int fromY = r.top;
child.setVisibility(INVISIBLE);
- child.setAlpha(0);
Runnable onCompleteRunnable = new Runnable() {
public void run() {
child.setVisibility(VISIBLE);
- ObjectAnimator oa = ObjectAnimator.ofFloat(child, "alpha", 0f, 1f);
- oa.setDuration(60);
- oa.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(android.animation.Animator animation) {
- if (onFinishAnimationRunnable != null) {
- onFinishAnimationRunnable.run();
- }
- }
- });
- oa.start();
+ if (onFinishAnimationRunnable != null) {
+ onFinishAnimationRunnable.run();
+ }
}
};
- animateViewIntoPosition(dragView, fromX, fromY, toX, toY, scale,
- onCompleteRunnable, true, duration);
+ animateViewIntoPosition(dragView, fromX, fromY, toX, toY, 1, 1, 1, scale, scale,
+ onCompleteRunnable, ANIMATION_END_DISAPPEAR, duration, anchorView);
}
- private void animateViewIntoPosition(final View view, final int fromX, final int fromY,
- final int toX, final int toY, float finalScale, Runnable onCompleteRunnable,
- boolean fadeOut, int duration) {
+ public void animateViewIntoPosition(final DragView view, final int fromX, final int fromY,
+ final int toX, final int toY, float finalAlpha, float initScaleX, float initScaleY,
+ float finalScaleX, float finalScaleY, Runnable onCompleteRunnable,
+ int animationEndStyle, int duration, View anchorView) {
Rect from = new Rect(fromX, fromY, fromX +
view.getMeasuredWidth(), fromY + view.getMeasuredHeight());
Rect to = new Rect(toX, toY, toX + view.getMeasuredWidth(), toY + view.getMeasuredHeight());
- animateView(view, from, to, 1f, finalScale, duration, null, null, onCompleteRunnable, true);
+ animateView(view, from, to, finalAlpha, initScaleX, initScaleY, finalScaleX, finalScaleY, duration,
+ null, null, onCompleteRunnable, animationEndStyle, anchorView);
}
/**
@@ -514,11 +510,16 @@ public class DragLayer extends FrameLayout {
* @param onCompleteRunnable Optional runnable to run on animation completion.
* @param fadeOut Whether or not to fade out the view once the animation completes. If true,
* the runnable will execute after the view is faded out.
+ * @param anchorView If not null, this represents the view which the animated view stays
+ * anchored to in case scrolling is currently taking place. Note: currently this is
+ * only used for the X dimension for the case of the workspace.
*/
- public void animateView(final View view, final Rect from, final Rect to, final float finalAlpha,
- final float finalScale, int duration, final Interpolator motionInterpolator,
- final Interpolator alphaInterpolator, final Runnable onCompleteRunnable,
- final boolean fadeOut) {
+ public void animateView(final DragView view, final Rect from, final Rect to,
+ final float finalAlpha, final float initScaleX, final float initScaleY,
+ final float finalScaleX, final float finalScaleY, int duration,
+ final Interpolator motionInterpolator, final Interpolator alphaInterpolator,
+ final Runnable onCompleteRunnable, final int animationEndStyle, View anchorView) {
+
// Calculate the duration of the animation based on the object's distance
final float dist = (float) Math.sqrt(Math.pow(to.left - from.left, 2) +
Math.pow(to.top - from.top, 2));
@@ -531,6 +532,7 @@ public class DragLayer extends FrameLayout {
if (dist < maxDist) {
duration *= mCubicEaseOutInterpolator.getInterpolation(dist / maxDist);
}
+ duration = Math.max(duration, res.getInteger(R.integer.config_dropAnimMinDuration));
}
if (mDropAnim != null) {
@@ -541,36 +543,58 @@ public class DragLayer extends FrameLayout {
mFadeOutAnim.cancel();
}
+ // Show the drop view if it was previously hidden
mDropView = view;
- final float initialAlpha = view.getAlpha();
+ mDropView.cancelAnimation();
+ mDropView.resetLayoutParams();
mDropAnim = new ValueAnimator();
if (alphaInterpolator == null || motionInterpolator == null) {
mDropAnim.setInterpolator(mCubicEaseOutInterpolator);
}
+ if (anchorView != null) {
+ mAnchorViewInitialScrollX = anchorView.getScrollX();
+ }
+ mAnchorView = anchorView;
+
+ final float initAlpha = view.getAlpha();
+ final float dropViewScale = mDropView.getScaleX();
+
mDropAnim.setDuration(duration);
mDropAnim.setFloatValues(0.0f, 1.0f);
mDropAnim.removeAllUpdateListeners();
mDropAnim.addUpdateListener(new AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
final float percent = (Float) animation.getAnimatedValue();
- // Invalidate the old position
- int width = view.getMeasuredWidth();
- int height = view.getMeasuredHeight();
- invalidate(mDropViewPos[0], mDropViewPos[1],
- mDropViewPos[0] + width, mDropViewPos[1] + height);
+ final int width = view.getMeasuredWidth();
+ final int height = view.getMeasuredHeight();
float alphaPercent = alphaInterpolator == null ? percent :
alphaInterpolator.getInterpolation(percent);
float motionPercent = motionInterpolator == null ? percent :
motionInterpolator.getInterpolation(percent);
- mDropViewPos[0] = from.left + (int) Math.round(((to.left - from.left) * motionPercent));
- mDropViewPos[1] = from.top + (int) Math.round(((to.top - from.top) * motionPercent));
- mDropViewScale = percent * finalScale + (1 - percent);
- mDropViewAlpha = alphaPercent * finalAlpha + (1 - alphaPercent) * initialAlpha;
- invalidate(mDropViewPos[0], mDropViewPos[1],
- mDropViewPos[0] + width, mDropViewPos[1] + height);
+ float initialScaleX = initScaleX * dropViewScale;
+ float initialScaleY = initScaleY * dropViewScale;
+ float scaleX = finalScaleX * percent + initialScaleX * (1 - percent);
+ float scaleY = finalScaleY * percent + initialScaleY * (1 - percent);
+ float alpha = finalAlpha * alphaPercent + initAlpha * (1 - alphaPercent);
+
+ float fromLeft = from.left + (initialScaleX - 1f) * width / 2;
+ float fromTop = from.top + (initialScaleY - 1f) * height / 2;
+
+ int x = (int) (fromLeft + Math.round(((to.left - fromLeft) * motionPercent)));
+ int y = (int) (fromTop + Math.round(((to.top - fromTop) * motionPercent)));
+
+ int xPos = x - mDropView.getScrollX() + (mAnchorView != null
+ ? (mAnchorViewInitialScrollX - mAnchorView.getScrollX()) : 0);
+ int yPos = y - mDropView.getScrollY();
+
+ mDropView.setTranslationX(xPos);
+ mDropView.setTranslationY(yPos);
+ mDropView.setScaleX(scaleX);
+ mDropView.setScaleY(scaleY);
+ mDropView.setAlpha(alpha);
}
});
mDropAnim.addListener(new AnimatorListenerAdapter() {
@@ -578,16 +602,36 @@ public class DragLayer extends FrameLayout {
if (onCompleteRunnable != null) {
onCompleteRunnable.run();
}
- if (fadeOut) {
+ switch (animationEndStyle) {
+ case ANIMATION_END_DISAPPEAR:
+ clearAnimatedView();
+ break;
+ case ANIMATION_END_FADE_OUT:
fadeOutDragView();
- } else {
- mDropView = null;
+ break;
+ case ANIMATION_END_REMAIN_VISIBLE:
+ break;
}
}
});
mDropAnim.start();
}
+ public void clearAnimatedView() {
+ if (mDropAnim != null) {
+ mDropAnim.cancel();
+ }
+ if (mDropView != null) {
+ mDropView.remove();
+ }
+ mDropView = null;
+ invalidate();
+ }
+
+ public View getAnimatedView() {
+ return mDropView;
+ }
+
private void fadeOutDragView() {
mFadeOutAnim = new ValueAnimator();
mFadeOutAnim.setDuration(150);
@@ -596,16 +640,18 @@ public class DragLayer extends FrameLayout {
mFadeOutAnim.addUpdateListener(new AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
final float percent = (Float) animation.getAnimatedValue();
- mDropViewAlpha = 1 - percent;
- int width = mDropView.getMeasuredWidth();
- int height = mDropView.getMeasuredHeight();
- invalidate(mDropViewPos[0], mDropViewPos[1],
- mDropViewPos[0] + width, mDropViewPos[1] + height);
+
+ float alpha = 1 - percent;
+ mDropView.setAlpha(alpha);
}
});
mFadeOutAnim.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) {
+ if (mDropView != null) {
+ mDropView.remove();
+ }
mDropView = null;
+ invalidate();
}
});
mFadeOutAnim.start();
@@ -654,24 +700,4 @@ public class DragLayer extends FrameLayout {
return i;
}
}
-
- @Override
- protected void dispatchDraw(Canvas canvas) {
- super.dispatchDraw(canvas);
- if (mDropView != null) {
- // We are animating an item that was just dropped on the home screen.
- // Render its View in the current animation position.
- canvas.save(Canvas.MATRIX_SAVE_FLAG);
- final int xPos = mDropViewPos[0] - mDropView.getScrollX();
- final int yPos = mDropViewPos[1] - mDropView.getScrollY();
- int width = mDropView.getMeasuredWidth();
- int height = mDropView.getMeasuredHeight();
- canvas.translate(xPos, yPos);
- canvas.translate((1 - mDropViewScale) * width / 2, (1 - mDropViewScale) * height / 2);
- canvas.scale(mDropViewScale, mDropViewScale);
- mDropView.setAlpha(mDropViewAlpha);
- mDropView.draw(canvas);
- canvas.restore();
- }
- }
}
diff --git a/src/com/android/launcher2/DragView.java b/src/com/android/launcher2/DragView.java
index dd94175b6..f6c16b36e 100644
--- a/src/com/android/launcher2/DragView.java
+++ b/src/com/android/launcher2/DragView.java
@@ -25,6 +25,8 @@ import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
@@ -32,7 +34,10 @@ import android.view.animation.DecelerateInterpolator;
import com.android.launcher.R;
public class DragView extends View {
+ private static float sDragAlpha = 1f;
+
private Bitmap mBitmap;
+ private Bitmap mCrossFadeBitmap;
private Paint mPaint;
private int mRegistrationX;
private int mRegistrationY;
@@ -41,13 +46,12 @@ public class DragView extends View {
private Rect mDragRegion = null;
private DragLayer mDragLayer = null;
private boolean mHasDrawn = false;
+ private float mCrossFadeProgress = 0f;
ValueAnimator mAnim;
private float mOffsetX = 0.0f;
private float mOffsetY = 0.0f;
- private DragLayer.LayoutParams mLayoutParams;
-
/**
* Construct the drag view.
* <p>
@@ -60,26 +64,19 @@ public class DragView extends View {
* @param registrationY The y coordinate of the registration point.
*/
public DragView(Launcher launcher, Bitmap bitmap, int registrationX, int registrationY,
- int left, int top, int width, int height) {
+ int left, int top, int width, int height, final float initialScale) {
super(launcher);
mDragLayer = launcher.getDragLayer();
final Resources res = getResources();
- final int dragScale = res.getInteger(R.integer.config_dragViewExtraPixels);
-
- Matrix scale = new Matrix();
- final float scaleFactor = (width + dragScale) / width;
- if (scaleFactor != 1.0f) {
- scale.setScale(scaleFactor, scaleFactor);
- }
-
- final int offsetX = res.getDimensionPixelSize(R.dimen.dragViewOffsetX);
- final int offsetY = res.getDimensionPixelSize(R.dimen.dragViewOffsetY);
+ final float offsetX = res.getDimensionPixelSize(R.dimen.dragViewOffsetX);
+ final float offsetY = res.getDimensionPixelSize(R.dimen.dragViewOffsetY);
+ final float scaleDps = res.getDimensionPixelSize(R.dimen.dragViewScale);
+ final float scale = (width + scaleDps) / width;
// Animate the view into the correct position
mAnim = ValueAnimator.ofFloat(0.0f, 1.0f);
- mAnim.setDuration(110);
- mAnim.setInterpolator(new DecelerateInterpolator(2.5f));
+ mAnim.setDuration(150);
mAnim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
@@ -90,19 +87,22 @@ public class DragView extends View {
mOffsetX += deltaX;
mOffsetY += deltaY;
+ setScaleX(initialScale + (value * (scale - initialScale)));
+ setScaleY(initialScale + (value * (scale - initialScale)));
+ if (sDragAlpha != 1f) {
+ setAlpha(sDragAlpha * value + (1f - value));
+ }
if (getParent() == null) {
animation.cancel();
} else {
- DragLayer.LayoutParams lp = mLayoutParams;
- lp.x += deltaX;
- lp.y += deltaY;
- mDragLayer.requestLayout();
+ setTranslationX(getTranslationX() + deltaX);
+ setTranslationY(getTranslationY() + deltaY);
}
}
});
- mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, scale, true);
+ mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height);
setDragRegion(new Rect(0, 0, width, height));
// The point in our scaled bitmap that the touch events are located
@@ -112,6 +112,7 @@ public class DragView extends View {
// Force a measure, because Workspace uses getMeasuredHeight() before the layout pass
int ms = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
measure(ms, ms);
+ mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
}
public float getOffsetY() {
@@ -166,11 +167,49 @@ public class DragView extends View {
}
mHasDrawn = true;
+ boolean crossFade = mCrossFadeProgress > 0 && mCrossFadeBitmap != null;
+ if (crossFade) {
+ int alpha = crossFade ? (int) (255 * (1 - mCrossFadeProgress)) : 255;
+ mPaint.setAlpha(alpha);
+ }
canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
+ if (crossFade) {
+ mPaint.setAlpha((int) (255 * mCrossFadeProgress));
+ canvas.save();
+ float sX = (mBitmap.getWidth() * 1.0f) / mCrossFadeBitmap.getWidth();
+ float sY = (mBitmap.getHeight() * 1.0f) / mCrossFadeBitmap.getHeight();
+ canvas.scale(sX, sY);
+ canvas.drawBitmap(mCrossFadeBitmap, 0.0f, 0.0f, mPaint);
+ canvas.restore();
+ }
+ }
+
+ public void setCrossFadeBitmap(Bitmap crossFadeBitmap) {
+ mCrossFadeBitmap = crossFadeBitmap;
+ }
+
+ public void crossFade(int duration) {
+ ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
+ va.setDuration(duration);
+ va.setInterpolator(new DecelerateInterpolator(1.5f));
+ va.addUpdateListener(new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ mCrossFadeProgress = animation.getAnimatedFraction();
+ }
+ });
+ va.start();
}
- public void setPaint(Paint paint) {
- mPaint = paint;
+ public void setColor(int color) {
+ if (mPaint == null) {
+ mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
+ }
+ if (color != 0) {
+ mPaint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP));
+ } else {
+ mPaint.setColorFilter(null);
+ }
invalidate();
}
@@ -181,9 +220,6 @@ public class DragView extends View {
@Override
public void setAlpha(float alpha) {
super.setAlpha(alpha);
- if (mPaint == null) {
- mPaint = new Paint();
- }
mPaint.setAlpha((int) (255 * alpha));
invalidate();
}
@@ -200,14 +236,24 @@ public class DragView extends View {
DragLayer.LayoutParams lp = new DragLayer.LayoutParams(0, 0);
lp.width = mBitmap.getWidth();
lp.height = mBitmap.getHeight();
- lp.x = touchX - mRegistrationX;
- lp.y = touchY - mRegistrationY;
lp.customPosition = true;
setLayoutParams(lp);
- mLayoutParams = lp;
+ setTranslationX(touchX - mRegistrationX);
+ setTranslationY(touchY - mRegistrationY);
mAnim.start();
}
+ public void cancelAnimation() {
+ if (mAnim != null && mAnim.isRunning()) {
+ mAnim.cancel();
+ }
+ }
+
+ public void resetLayoutParams() {
+ mOffsetX = mOffsetY = 0;
+ requestLayout();
+ }
+
/**
* Move the window containing this view.
*
@@ -215,26 +261,14 @@ public class DragView extends View {
* @param touchY the y coordinate the user touched in DragLayer coordinates
*/
void move(int touchX, int touchY) {
- DragLayer.LayoutParams lp = mLayoutParams;
- lp.x = touchX - mRegistrationX + (int) mOffsetX;
- lp.y = touchY - mRegistrationY + (int) mOffsetY;
- mDragLayer.requestLayout();
+ setTranslationX(touchX - mRegistrationX + (int) mOffsetX);
+ setTranslationY(touchY - mRegistrationY + (int) mOffsetY);
}
void remove() {
- post(new Runnable() {
- public void run() {
- mDragLayer.removeView(DragView.this);
- }
- });
- }
-
- int[] getPosition(int[] result) {
- DragLayer.LayoutParams lp = mLayoutParams;
- if (result == null) result = new int[2];
- result[0] = lp.x;
- result[1] = lp.y;
- return result;
+ if (getParent() != null) {
+ mDragLayer.removeView(DragView.this);
+ }
}
}
diff --git a/src/com/android/launcher2/DrawableStateProxyView.java b/src/com/android/launcher2/DrawableStateProxyView.java
new file mode 100644
index 000000000..498730fdb
--- /dev/null
+++ b/src/com/android/launcher2/DrawableStateProxyView.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2012 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.launcher2;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.android.launcher.R;
+
+public class DrawableStateProxyView extends LinearLayout {
+
+ private View mView;
+ private int mViewId;
+
+ public DrawableStateProxyView(Context context) {
+ this(context, null);
+ }
+
+ public DrawableStateProxyView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public DrawableStateProxyView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DrawableStateProxyView,
+ defStyle, 0);
+ mViewId = a.getResourceId(R.styleable.DrawableStateProxyView_sourceViewId, -1);
+ a.recycle();
+
+ setFocusable(false);
+ }
+
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+
+ if (mView == null) {
+ View parent = (View) getParent();
+ mView = parent.findViewById(mViewId);
+ }
+ mView.setPressed(isPressed());
+ mView.setHovered(isHovered());
+ }
+}
diff --git a/src/com/android/launcher2/DropTarget.java b/src/com/android/launcher2/DropTarget.java
index 4172da243..e49f7829b 100644
--- a/src/com/android/launcher2/DropTarget.java
+++ b/src/com/android/launcher2/DropTarget.java
@@ -55,6 +55,9 @@ public interface DropTarget {
/** Indicates that the drag operation was cancelled */
public boolean cancelled = false;
+ /** Defers removing the DragView from the DragLayer until after the drop animation. */
+ public boolean deferDragViewCleanupPostAnimation = true;
+
public DragObject() {
}
}
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index fdde4d593..08d33159f 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -20,8 +20,6 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
-import android.animation.ValueAnimator;
-import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
@@ -37,10 +35,9 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
+import android.view.View.MeasureSpec;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.LinearLayout;
@@ -74,18 +71,13 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
private final LayoutInflater mInflater;
private final IconCache mIconCache;
private int mState = STATE_NONE;
- private static final int FULL_GROW = 0;
- private static final int PARTIAL_GROW = 1;
private static final int REORDER_ANIMATION_DURATION = 230;
private static final int ON_EXIT_CLOSE_DELAY = 800;
- private int mMode = PARTIAL_GROW;
private boolean mRearrangeOnClose = false;
private FolderIcon mFolderIcon;
private int mMaxCountX;
private int mMaxCountY;
private int mMaxNumItems;
- private Rect mNewSize = new Rect();
- private Rect mIconRect = new Rect();
private ArrayList<View> mItemsInReadingOrder = new ArrayList<View>();
private Drawable mIconDrawable;
boolean mItemsInvalidated = false;
@@ -365,21 +357,9 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
*/
private void positionAndSizeAsIcon() {
if (!(getParent() instanceof DragLayer)) return;
-
- DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams();
-
- if (mMode == PARTIAL_GROW) {
- setScaleX(0.8f);
- setScaleY(0.8f);
- setAlpha(0f);
- } else {
- mLauncher.getDragLayer().getDescendantRectRelativeToSelf(mFolderIcon, mIconRect);
- lp.width = mIconRect.width();
- lp.height = mIconRect.height();
- lp.x = mIconRect.left;
- lp.y = mIconRect.top;
- mContent.setAlpha(0);
- }
+ setScaleX(0.8f);
+ setScaleY(0.8f);
+ setAlpha(0f);
mState = STATE_SMALL;
}
@@ -387,34 +367,11 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
positionAndSizeAsIcon();
if (!(getParent() instanceof DragLayer)) return;
-
- ObjectAnimator oa;
- DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams();
-
centerAboutIcon();
- if (mMode == PARTIAL_GROW) {
- PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1);
- PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f);
- PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
- oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
- } else {
- PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", mNewSize.width());
- PropertyValuesHolder height = PropertyValuesHolder.ofInt("height", mNewSize.height());
- PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", mNewSize.left);
- PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", mNewSize.top);
- oa = ObjectAnimator.ofPropertyValuesHolder(lp, width, height, x, y);
- oa.addUpdateListener(new AnimatorUpdateListener() {
- public void onAnimationUpdate(ValueAnimator animation) {
- requestLayout();
- }
- });
-
- PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1.0f);
- ObjectAnimator alphaOa = ObjectAnimator.ofPropertyValuesHolder(mContent, alpha);
- alphaOa.setDuration(mExpandDuration);
- alphaOa.setInterpolator(new AccelerateInterpolator(2.0f));
- alphaOa.start();
- }
+ PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1);
+ PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f);
+ PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
+ ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
oa.addListener(new AnimatorListenerAdapter() {
@Override
@@ -457,33 +414,10 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
public void animateClosed() {
if (!(getParent() instanceof DragLayer)) return;
-
- ObjectAnimator oa;
- if (mMode == PARTIAL_GROW) {
- PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0);
- PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.9f);
- PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.9f);
- oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
- } else {
- DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams();
-
- PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", mIconRect.width());
- PropertyValuesHolder height = PropertyValuesHolder.ofInt("height", mIconRect.height());
- PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", mIconRect.left);
- PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", mIconRect.top);
- oa = ObjectAnimator.ofPropertyValuesHolder(lp, width, height, x, y);
- oa.addUpdateListener(new AnimatorUpdateListener() {
- public void onAnimationUpdate(ValueAnimator animation) {
- requestLayout();
- }
- });
-
- PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0f);
- ObjectAnimator alphaOa = ObjectAnimator.ofPropertyValuesHolder(mContent, alpha);
- alphaOa.setDuration(mExpandDuration);
- alphaOa.setInterpolator(new DecelerateInterpolator(2.0f));
- alphaOa.start();
- }
+ PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0);
+ PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.9f);
+ PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.9f);
+ ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
oa.addListener(new AnimatorListenerAdapter() {
@Override
@@ -791,11 +725,17 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
int centeredLeft = centerX - width / 2;
int centeredTop = centerY - height / 2;
+ int currentPage = mLauncher.getWorkspace().getCurrentPage();
+ // In case the workspace is scrolling, we need to use the final scroll to compute
+ // the folders bounds.
+ mLauncher.getWorkspace().setFinalScrollForPageChange(currentPage);
// We first fetch the currently visible CellLayoutChildren
- CellLayout currentPage = mLauncher.getWorkspace().getCurrentDropLayout();
- CellLayoutChildren boundingLayout = currentPage.getChildrenLayout();
+ CellLayout currentLayout = (CellLayout) mLauncher.getWorkspace().getChildAt(currentPage);
+ CellLayoutChildren boundingLayout = currentLayout.getChildrenLayout();
Rect bounds = new Rect();
parent.getDescendantRectRelativeToSelf(boundingLayout, bounds);
+ // We reset the workspaces scroll
+ mLauncher.getWorkspace().resetFinalScrollForPageChange(currentPage);
// We need to bound the folder to the currently visible CellLayoutChildren
int left = Math.min(Math.max(bounds.left, centeredLeft),
@@ -821,14 +761,10 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
mFolderIcon.setPivotX(folderIconPivotX);
mFolderIcon.setPivotY(folderIconPivotY);
- if (mMode == PARTIAL_GROW) {
- lp.width = width;
- lp.height = height;
- lp.x = left;
- lp.y = top;
- } else {
- mNewSize.set(left, top, left + width, top + height);
- }
+ lp.width = width;
+ lp.height = height;
+ lp.x = left;
+ lp.y = top;
}
private void setupContentForNumItems(int count) {
diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java
index 3c0829d4a..c005edfcd 100644
--- a/src/com/android/launcher2/FolderIcon.java
+++ b/src/com/android/launcher2/FolderIcon.java
@@ -30,6 +30,7 @@ import android.graphics.drawable.Drawable;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
@@ -53,6 +54,8 @@ public class FolderIcon extends LinearLayout implements FolderListener {
FolderInfo mInfo;
private static boolean sStaticValuesDirty = true;
+ private CheckLongPressHelper mLongPressHelper;
+
// The number of icons to display in the
private static final int NUM_ITEMS_IN_PREVIEW = 3;
private static final int CONSUMPTION_ANIMATION_DURATION = 100;
@@ -95,10 +98,16 @@ public class FolderIcon extends LinearLayout implements FolderListener {
public FolderIcon(Context context, AttributeSet attrs) {
super(context, attrs);
+ init();
}
public FolderIcon(Context context) {
super(context);
+ init();
+ }
+
+ private void init() {
+ mLongPressHelper = new CheckLongPressHelper(this);
}
public boolean isDropEnabled() {
@@ -295,14 +304,14 @@ public class FolderIcon extends LinearLayout implements FolderListener {
}
public void performCreateAnimation(final ShortcutInfo destInfo, final View destView,
- final ShortcutInfo srcInfo, final View srcView, Rect dstRect,
+ final ShortcutInfo srcInfo, final DragView srcView, Rect dstRect,
float scaleRelativeToDragLayer, Runnable postAnimationRunnable) {
Drawable animateDrawable = ((TextView) destView).getCompoundDrawables()[1];
computePreviewDrawingParams(animateDrawable.getIntrinsicWidth(), destView.getMeasuredWidth());
// This will animate the dragView (srcView) into the new folder
- onDrop(srcInfo, srcView, dstRect, scaleRelativeToDragLayer, 1, postAnimationRunnable);
+ onDrop(srcInfo, srcView, dstRect, scaleRelativeToDragLayer, 1, postAnimationRunnable, null);
// This will animate the first item from it's position as an icon into its
// position as the first item in the preview
@@ -320,8 +329,9 @@ public class FolderIcon extends LinearLayout implements FolderListener {
mFolderRingAnimator.animateToNaturalState();
}
- private void onDrop(final ShortcutInfo item, View animateView, Rect finalRect,
- float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable) {
+ private void onDrop(final ShortcutInfo item, DragView animateView, Rect finalRect,
+ float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable,
+ DragObject d) {
item.cellX = -1;
item.cellY = -1;
@@ -359,10 +369,11 @@ public class FolderIcon extends LinearLayout implements FolderListener {
float finalAlpha = index < NUM_ITEMS_IN_PREVIEW ? 0.5f : 0f;
+ float finalScale = scale * scaleRelativeToDragLayer;
dragLayer.animateView(animateView, from, to, finalAlpha,
- scale * scaleRelativeToDragLayer, DROP_IN_ANIMATION_DURATION,
+ 1, 1, finalScale, finalScale, DROP_IN_ANIMATION_DURATION,
new DecelerateInterpolator(2), new AccelerateInterpolator(2),
- postAnimationRunnable, false);
+ postAnimationRunnable, DragLayer.ANIMATION_END_DISAPPEAR, null);
postDelayed(new Runnable() {
public void run() {
addItem(item);
@@ -382,7 +393,7 @@ public class FolderIcon extends LinearLayout implements FolderListener {
item = (ShortcutInfo) d.dragInfo;
}
mFolder.notifyDrop();
- onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable);
+ onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable, d);
}
public DropTarget getDropTargetDelegate(DragObject d) {
@@ -589,4 +600,29 @@ public class FolderIcon extends LinearLayout implements FolderListener {
setContentDescription(String.format(mContext.getString(R.string.folder_name_format),
title));
}
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ // Call the superclass onTouchEvent first, because sometimes it changes the state to
+ // isPressed() on an ACTION_UP
+ boolean result = super.onTouchEvent(event);
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mLongPressHelper.postCheckForLongPress();
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ mLongPressHelper.cancelLongPress();
+ break;
+ }
+ return result;
+ }
+
+ @Override
+ public void cancelLongPress() {
+ super.cancelLongPress();
+
+ mLongPressHelper.cancelLongPress();
+ }
}
diff --git a/src/com/android/launcher2/HandleView.java b/src/com/android/launcher2/HandleView.java
index 13d07e2dd..d77138b0a 100644
--- a/src/com/android/launcher2/HandleView.java
+++ b/src/com/android/launcher2/HandleView.java
@@ -17,13 +17,12 @@
package com.android.launcher2;
-import android.widget.ImageView;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.MotionEvent;
-import android.view.KeyEvent;
import android.view.View;
+import android.widget.ImageView;
import com.android.launcher.R;
diff --git a/src/com/android/launcher2/HolographicPagedViewIcon.java b/src/com/android/launcher2/HolographicPagedViewIcon.java
deleted file mode 100644
index dda233e37..000000000
--- a/src/com/android/launcher2/HolographicPagedViewIcon.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher2;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.widget.TextView;
-
-
-
-/**
- * An icon on a PagedView, specifically for items in the launcher's paged view (with compound
- * drawables on the top).
- */
-public class HolographicPagedViewIcon extends TextView {
- PagedViewIcon mOriginalIcon;
- Paint mPaint;
-
- public HolographicPagedViewIcon(Context context, PagedViewIcon original) {
- super(context);
- mOriginalIcon = original;
- mPaint = new Paint();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- Bitmap overlay = mOriginalIcon.getHolographicOutline();
- if (overlay != null) {
- final int offset = getScrollX();
- final int compoundPaddingLeft = getCompoundPaddingLeft();
- final int compoundPaddingRight = getCompoundPaddingRight();
- int hspace = getWidth() - compoundPaddingRight - compoundPaddingLeft;
- canvas.drawBitmap(overlay,
- offset + compoundPaddingLeft + (hspace - overlay.getWidth()) / 2,
- mOriginalIcon.getPaddingTop(),
- mPaint);
- }
- }
-}
diff --git a/src/com/android/launcher2/InfoDropTarget.java b/src/com/android/launcher2/InfoDropTarget.java
index dba845b04..2e0b5c827 100644
--- a/src/com/android/launcher2/InfoDropTarget.java
+++ b/src/com/android/launcher2/InfoDropTarget.java
@@ -21,8 +21,6 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.TransitionDrawable;
import android.util.AttributeSet;
import android.view.View;
@@ -34,7 +32,6 @@ public class InfoDropTarget extends ButtonDropTarget {
private ColorStateList mOriginalTextColor;
private TransitionDrawable mDrawable;
- private int mHoverColor = 0xFF0000FF;
public InfoDropTarget(Context context, AttributeSet attrs) {
this(context, attrs, 0);
@@ -53,8 +50,6 @@ public class InfoDropTarget extends ButtonDropTarget {
// Get the hover color
Resources r = getResources();
mHoverColor = r.getColor(R.color.info_target_hover_tint);
- mHoverPaint.setColorFilter(new PorterDuffColorFilter(
- mHoverColor, PorterDuff.Mode.SRC_ATOP));
mDrawable = (TransitionDrawable) getCompoundDrawables()[0];
mDrawable.setCrossFadeEnabled(true);
@@ -85,6 +80,9 @@ public class InfoDropTarget extends ButtonDropTarget {
if (componentName != null) {
mLauncher.startApplicationDetailsActivity(componentName);
}
+
+ // There is no post-drop animation, so clean up the DragView now
+ d.deferDragViewCleanupPostAnimation = false;
return false;
}
diff --git a/src/com/android/launcher2/InstallShortcutReceiver.java b/src/com/android/launcher2/InstallShortcutReceiver.java
index ed8f29942..e04ce6419 100644
--- a/src/com/android/launcher2/InstallShortcutReceiver.java
+++ b/src/com/android/launcher2/InstallShortcutReceiver.java
@@ -16,15 +16,18 @@
package com.android.launcher2;
-import java.util.ArrayList;
-
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
import android.widget.Toast;
import com.android.launcher.R;
+import java.util.ArrayList;
+
public class InstallShortcutReceiver extends BroadcastReceiver {
public static final String ACTION_INSTALL_SHORTCUT =
"com.android.launcher.action.INSTALL_SHORTCUT";
@@ -40,21 +43,46 @@ public class InstallShortcutReceiver extends BroadcastReceiver {
return;
}
- int screen = Launcher.getScreen();
+ final int screen = Launcher.getScreen();
+ final Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
+ if (intent == null) {
+ return;
+ }
+ // This name is only used for comparisons and notifications, so fall back to activity name
+ // if not supplied
+ String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
+ if (name == null) {
+ try {
+ PackageManager pm = context.getPackageManager();
+ ActivityInfo info = pm.getActivityInfo(intent.getComponent(), 0);
+ name = info.loadLabel(pm).toString();
+ } catch (PackageManager.NameNotFoundException nnfe) {
+ return;
+ }
+ }
+
+ final ArrayList<ItemInfo> items = LauncherModel.getItemsInLocalCoordinates(context);
+ final boolean shortcutExists = LauncherModel.shortcutExists(context, name, intent);
+ final String[] errorMsgs = {""};
- if (!installShortcut(context, data, screen)) {
+ if (!installShortcut(context, data, items, name, intent, screen, shortcutExists,
+ errorMsgs)) {
// The target screen is full, let's try the other screens
for (int i = 0; i < Launcher.SCREEN_COUNT; i++) {
- if (i != screen && installShortcut(context, data, i)) break;
+ if (i != screen && installShortcut(context, data, items, name, intent, i,
+ shortcutExists, errorMsgs)) break;
}
}
- }
- private boolean installShortcut(Context context, Intent data, int screen) {
- String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
+ if (!errorMsgs[0].isEmpty()) {
+ Toast.makeText(context, errorMsgs[0],
+ Toast.LENGTH_SHORT).show();
+ }
+ }
- if (findEmptyCell(context, mCoordinates, screen)) {
- Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
+ private boolean installShortcut(Context context, Intent data, ArrayList<ItemInfo> items,
+ String name, Intent intent, int screen, boolean shortcutExists, String[] errorMsgs) {
+ if (findEmptyCell(context, items, mCoordinates, screen)) {
if (intent != null) {
if (intent.getAction() == null) {
intent.setAction(Intent.ACTION_VIEW);
@@ -63,38 +91,35 @@ public class InstallShortcutReceiver extends BroadcastReceiver {
// By default, we allow for duplicate entries (located in
// different places)
boolean duplicate = data.getBooleanExtra(Launcher.EXTRA_SHORTCUT_DUPLICATE, true);
- if (duplicate || !LauncherModel.shortcutExists(context, name, intent)) {
+ if (duplicate || !shortcutExists) {
LauncherApplication app = (LauncherApplication) context.getApplicationContext();
ShortcutInfo info = app.getModel().addShortcut(context, data,
LauncherSettings.Favorites.CONTAINER_DESKTOP, screen, mCoordinates[0],
mCoordinates[1], true);
if (info != null) {
- Toast.makeText(context, context.getString(R.string.shortcut_installed, name),
- Toast.LENGTH_SHORT).show();
+ errorMsgs[0] = context.getString(R.string.shortcut_installed, name);
} else {
return false;
}
} else {
- Toast.makeText(context, context.getString(R.string.shortcut_duplicate, name),
- Toast.LENGTH_SHORT).show();
+ errorMsgs[0] = context.getString(R.string.shortcut_duplicate, name);
}
return true;
}
} else {
- Toast.makeText(context, context.getString(R.string.out_of_space),
- Toast.LENGTH_SHORT).show();
+ errorMsgs[0] = context.getString(R.string.out_of_space);
}
return false;
}
- private static boolean findEmptyCell(Context context, int[] xy, int screen) {
+ private static boolean findEmptyCell(Context context, ArrayList<ItemInfo> items, int[] xy,
+ int screen) {
final int xCount = LauncherModel.getCellCountX();
final int yCount = LauncherModel.getCellCountY();
boolean[][] occupied = new boolean[xCount][yCount];
- ArrayList<ItemInfo> items = LauncherModel.getItemsInLocalCoordinates(context);
ItemInfo item = null;
int cellX, cellY, spanX, spanY;
for (int i = 0; i < items.size(); ++i) {
diff --git a/src/com/android/launcher2/InstallWidgetReceiver.java b/src/com/android/launcher2/InstallWidgetReceiver.java
index 6b3763ce0..a1e9b1187 100644
--- a/src/com/android/launcher2/InstallWidgetReceiver.java
+++ b/src/com/android/launcher2/InstallWidgetReceiver.java
@@ -189,7 +189,7 @@ public class InstallWidgetReceiver {
final PendingAddWidgetInfo createInfo = new PendingAddWidgetInfo(widgetInfo, mMimeType,
mClipData);
mLauncher.addAppWidgetFromDrop(createInfo, LauncherSettings.Favorites.CONTAINER_DESKTOP,
- mTargetLayoutScreen, null, mTargetLayoutPos);
+ mTargetLayoutScreen, null, null, mTargetLayoutPos);
}
}
}
diff --git a/src/com/android/launcher2/ItemInfo.java b/src/com/android/launcher2/ItemInfo.java
index 8d4662495..11a6c0d00 100644
--- a/src/com/android/launcher2/ItemInfo.java
+++ b/src/com/android/launcher2/ItemInfo.java
@@ -77,6 +77,15 @@ class ItemInfo {
int spanY = 1;
/**
+ * Indicates the minimum X cell span.
+ */
+ int minSpanX = 1;
+
+ /**
+ * Indicates the minimum Y cell span.
+ */
+ int minSpanY = 1;
+ /**
* Indicates whether the item is a gesture.
*/
boolean isGesture = false;
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 63fb12cf1..d8a43845c 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -23,12 +23,12 @@ import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.SearchManager;
-import android.app.StatusBarManager;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
@@ -54,7 +54,6 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
-import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
@@ -80,6 +79,7 @@ import android.view.View;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.AccelerateDecelerateInterpolator;
@@ -139,6 +139,7 @@ public final class Launcher extends Activity
static final int DIALOG_RENAME_FOLDER = 2;
private static final String PREFERENCES = "launcher.preferences";
+ static final String FORCE_ENABLE_ROTATION_PROPERTY = "launcher.force_enable_rotation";
// Type: int
private static final String RUNTIME_STATE_CURRENT_SCREEN = "launcher.current_screen";
@@ -246,6 +247,11 @@ public final class Launcher extends Activity
private static Drawable.ConstantState[] sAppMarketIcon = new Drawable.ConstantState[2];
static final ArrayList<String> sDumpLogs = new ArrayList<String>();
+ PendingAddWidgetInfo mWidgetBeingConfigured = null;
+
+ // We only want to get the SharedPreferences once since it does an FS stat each time we get
+ // it from the context.
+ private SharedPreferences mSharedPrefs;
private BubbleTextView mWaitingForResume;
@@ -274,6 +280,7 @@ public final class Launcher extends Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LauncherApplication app = ((LauncherApplication)getApplication());
+ mSharedPrefs = getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE);
mModel = app.setLauncher(this);
mIconCache = app.getIconCache();
mDragController = new DragController(this);
@@ -348,8 +355,11 @@ public final class Launcher extends Activity
}
mSearchDropTargetBar.onSearchPackagesChanged(searchVisible, voiceVisible);
+ final String forceEnableRotation =
+ SystemProperties.get(FORCE_ENABLE_ROTATION_PROPERTY, "false");
+
// On large interfaces, we want the screen to auto-rotate based on the current orientation
- if (LauncherApplication.isScreenLarge() || Build.TYPE.contentEquals("eng")) {
+ if (LauncherApplication.isScreenLarge() || "true".equalsIgnoreCase(forceEnableRotation)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}
@@ -495,24 +505,31 @@ public final class Launcher extends Activity
break;
case REQUEST_CREATE_APPWIDGET:
int appWidgetId = args.intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
- completeAddAppWidget(appWidgetId, args.container, args.screen);
+ completeAddAppWidget(appWidgetId, args.container, args.screen, null, null);
result = true;
break;
case REQUEST_PICK_WALLPAPER:
// We just wanted the activity result here so we can clear mWaitingForResult
break;
}
- // In any situation where we have a multi-step drop, we should reset the add info only after
- // we complete the drop
- resetAddInfo();
return result;
}
@Override
- protected void onActivityResult(final int requestCode, int resultCode, final Intent data) {
+ protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
boolean delayExitSpringLoadedMode = false;
+ boolean isWidgetDrop = (requestCode == REQUEST_PICK_APPWIDGET ||
+ requestCode == REQUEST_CREATE_APPWIDGET);
mWaitingForResult = false;
+ // We have special handling for widgets
+ if (isWidgetDrop) {
+ int appWidgetId = data != null ?
+ data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) : -1;
+ completeTwoStageWidgetDrop(resultCode, appWidgetId);
+ return;
+ }
+
// The pattern used here is that a user PICKs a specific application,
// which, depending on the target, might need to CREATE the actual target.
@@ -526,26 +543,51 @@ public final class Launcher extends Activity
args.screen = mPendingAddInfo.screen;
args.cellX = mPendingAddInfo.cellX;
args.cellY = mPendingAddInfo.cellY;
-
- // If the loader is still running, defer the add until it is done.
if (isWorkspaceLocked()) {
sPendingAddList.add(args);
} else {
delayExitSpringLoadedMode = completeAdd(args);
}
- } else if ((requestCode == REQUEST_PICK_APPWIDGET ||
- requestCode == REQUEST_CREATE_APPWIDGET) && resultCode == RESULT_CANCELED) {
- if (data != null) {
- // Clean up the appWidgetId if we canceled
- int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
- if (appWidgetId != -1) {
- mAppWidgetHost.deleteAppWidgetId(appWidgetId);
- }
- }
}
-
+ mDragLayer.clearAnimatedView();
// Exit spring loaded mode if necessary after cancelling the configuration of a widget
- exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), delayExitSpringLoadedMode);
+ exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), delayExitSpringLoadedMode,
+ null);
+ }
+
+ private void completeTwoStageWidgetDrop(final int resultCode, final int appWidgetId) {
+ CellLayout cellLayout = (CellLayout) mWorkspace.getChildAt(mWidgetBeingConfigured.screen);
+ Runnable onCompleteRunnable = null;
+ int animationType = 0;
+
+ if (resultCode == RESULT_OK) {
+ animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION;
+ final AppWidgetHostView layout = mAppWidgetHost.createView(this, appWidgetId,
+ mWidgetBeingConfigured.info);
+ mWidgetBeingConfigured.boundWidget = layout;
+ onCompleteRunnable = new Runnable() {
+ @Override
+ public void run() {
+ completeAddAppWidget(appWidgetId, mPendingAddInfo.container,
+ mPendingAddInfo.screen, layout, null);
+ exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), false,
+ null);
+ }
+ };
+ } else if (resultCode == RESULT_CANCELED) {
+ animationType = Workspace.CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION;
+ onCompleteRunnable = new Runnable() {
+ @Override
+ public void run() {
+ exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), false,
+ null);
+ }
+ };
+ }
+ mWorkspace.animateWidgetDrop(mWidgetBeingConfigured, cellLayout,
+ (DragView) mDragLayer.getAnimatedView(), onCompleteRunnable,
+ animationType, mWidgetBeingConfigured.boundWidget, true);
+ mWidgetBeingConfigured = null;
}
@Override
@@ -558,39 +600,17 @@ public final class Launcher extends Activity
mRestoring = false;
mOnResumeNeedsLoad = false;
}
+
+ // Reset the pressed state of icons that were locked in the press state while activities
+ // were launching
if (mWaitingForResume != null) {
+ // Resets the previous workspace icon press state
mWaitingForResume.setStayPressed(false);
}
- // When we resume Launcher, a different Activity might be responsible for the app
- // market intent, so refresh the icon
- updateAppMarketIcon();
- mAppsCustomizeTabHost.onResume();
- if (!mWorkspaceLoading) {
- final ViewTreeObserver observer = mWorkspace.getViewTreeObserver();
- final Workspace workspace = mWorkspace;
- // We want to let Launcher draw itself at least once before we force it to build
- // layers on all the workspace pages, so that transitioning to Launcher from other
- // apps is nice and speedy. Usually the first call to preDraw doesn't correspond to
- // a true draw so we wait until the second preDraw call to be safe
- observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
- boolean mFirstTime = true;
- public boolean onPreDraw() {
- if (mFirstTime) {
- mFirstTime = false;
- } else {
- // We delay the layer building a bit in order to give
- // other message processing a time to run. In particular
- // this avoids a delay in hiding the IME if it was
- // currently shown, because doing that may involve
- // some communication back with the app.
- workspace.postDelayed(mBuildLayersRunnable, 500);
- observer.removeOnPreDrawListener(this);
- }
- return true;
- }
- });
+ if (mAppsCustomizeContent != null) {
+ // Resets the previous all apps icon press state
+ mAppsCustomizeContent.resetDrawableState();
}
- clearTypedText();
}
@Override
@@ -939,7 +959,7 @@ public final class Launcher extends Activity
return getSpanForWidget(info.provider, info.minWidth, info.minHeight, spanXY);
}
- int[] getMinResizeSpanForWidget(AppWidgetProviderInfo info, int[] spanXY) {
+ int[] getMinSpanForWidget(AppWidgetProviderInfo info, int[] spanXY) {
return getSpanForWidget(info.provider, info.minResizeWidth, info.minResizeHeight, spanXY);
}
@@ -947,18 +967,27 @@ public final class Launcher extends Activity
return getSpanForWidget(info.componentName, info.minWidth, info.minHeight, spanXY);
}
+ int[] getMinSpanForWidget(PendingAddWidgetInfo info, int[] spanXY) {
+ return getSpanForWidget(info.componentName, info.minResizeWidth,
+ info.minResizeHeight, spanXY);
+ }
+
/**
* Add a widget to the workspace.
*
* @param appWidgetId The app widget id
* @param cellInfo The position on screen where to create the widget.
*/
- private void completeAddAppWidget(final int appWidgetId, long container, int screen) {
- AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
+ private void completeAddAppWidget(final int appWidgetId, long container, int screen,
+ AppWidgetHostView hostView, AppWidgetProviderInfo appWidgetInfo) {
+ if (appWidgetInfo == null) {
+ appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
+ }
// Calculate the grid spans needed to fit this widget
CellLayout layout = getCellLayout(container, screen);
+ int[] minSpanXY = getMinSpanForWidget(appWidgetInfo, null);
int[] spanXY = getSpanForWidget(appWidgetInfo, null);
// Try finding open space on Launcher screen
@@ -966,18 +995,24 @@ public final class Launcher extends Activity
// if we are placing widgets on a "spring-loaded" screen
int[] cellXY = mTmpAddItemCellCoordinates;
int[] touchXY = mPendingAddInfo.dropPos;
+ int[] finalSpan = new int[2];
boolean foundCellSpan = false;
if (mPendingAddInfo.cellX >= 0 && mPendingAddInfo.cellY >= 0) {
cellXY[0] = mPendingAddInfo.cellX;
cellXY[1] = mPendingAddInfo.cellY;
+ spanXY[0] = mPendingAddInfo.spanX;
+ spanXY[1] = mPendingAddInfo.spanY;
foundCellSpan = true;
} else if (touchXY != null) {
// when dragging and dropping, just find the closest free spot
int[] result = layout.findNearestVacantArea(
- touchXY[0], touchXY[1], spanXY[0], spanXY[1], cellXY);
+ touchXY[0], touchXY[1], minSpanXY[0], minSpanXY[1], spanXY[0],
+ spanXY[1], cellXY, finalSpan);
+ spanXY[0] = finalSpan[0];
+ spanXY[1] = finalSpan[1];
foundCellSpan = (result != null);
} else {
- foundCellSpan = layout.findCellForSpan(cellXY, spanXY[0], spanXY[1]);
+ foundCellSpan = layout.findCellForSpan(cellXY, minSpanXY[0], minSpanXY[1]);
}
if (!foundCellSpan) {
@@ -998,22 +1033,30 @@ public final class Launcher extends Activity
LauncherAppWidgetInfo launcherInfo = new LauncherAppWidgetInfo(appWidgetId);
launcherInfo.spanX = spanXY[0];
launcherInfo.spanY = spanXY[1];
+ launcherInfo.minSpanX = mPendingAddInfo.minSpanX;
+ launcherInfo.minSpanY = mPendingAddInfo.minSpanY;
LauncherModel.addItemToDatabase(this, launcherInfo,
container, screen, cellXY[0], cellXY[1], false);
if (!mRestoring) {
- // Perform actual inflation because we're live
- launcherInfo.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
+ if (hostView == null) {
+ // Perform actual inflation because we're live
+ launcherInfo.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
+ launcherInfo.hostView.setAppWidget(appWidgetId, appWidgetInfo);
+ } else {
+ // The AppWidgetHostView has already been inflated and instantiated
+ launcherInfo.hostView = hostView;
+ }
- launcherInfo.hostView.setAppWidget(appWidgetId, appWidgetInfo);
launcherInfo.hostView.setTag(launcherInfo);
-
+ launcherInfo.hostView.setVisibility(View.VISIBLE);
mWorkspace.addInScreen(launcherInfo.hostView, container, screen, cellXY[0], cellXY[1],
launcherInfo.spanX, launcherInfo.spanY, isWorkspaceLocked());
addWidgetToAutoAdvanceIfNeeded(launcherInfo.hostView, appWidgetInfo);
}
+ resetAddInfo();
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -1068,6 +1111,35 @@ public final class Launcher extends Activity
public void onWindowVisibilityChanged(int visibility) {
mVisible = visibility == View.VISIBLE;
updateRunning();
+ // The following code used to be in onResume, but it turns out onResume is called when
+ // you're in All Apps and click home to go to the workspace. onWindowVisibilityChanged
+ // is a more appropriate event to handle
+ if (mVisible) {
+ mAppsCustomizeTabHost.onWindowVisible();
+ if (!mWorkspaceLoading) {
+ final ViewTreeObserver observer = mWorkspace.getViewTreeObserver();
+ // We want to let Launcher draw itself at least once before we force it to build
+ // layers on all the workspace pages, so that transitioning to Launcher from other
+ // apps is nice and speedy. Usually the first call to preDraw doesn't correspond to
+ // a true draw so we wait until the second preDraw call to be safe
+ observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+ public boolean onPreDraw() {
+ // We delay the layer building a bit in order to give
+ // other message processing a time to run. In particular
+ // this avoids a delay in hiding the IME if it was
+ // currently shown, because doing that may involve
+ // some communication back with the app.
+ mWorkspace.postDelayed(mBuildLayersRunnable, 500);
+ observer.removeOnPreDrawListener(this);
+ return true;
+ }
+ });
+ }
+ // When Launcher comes back to foreground, a different Activity might be responsible for
+ // the app market intent, so refresh the icon
+ updateAppMarketIcon();
+ clearTypedText();
+ }
}
private void sendAdvanceMessage(long delay) {
@@ -1408,6 +1480,7 @@ public final class Launcher extends Activity
mPendingAddInfo.screen = -1;
mPendingAddInfo.cellX = mPendingAddInfo.cellY = -1;
mPendingAddInfo.spanX = mPendingAddInfo.spanY = -1;
+ mPendingAddInfo.minSpanX = mPendingAddInfo.minSpanY = -1;
mPendingAddInfo.dropPos = null;
}
@@ -1419,9 +1492,9 @@ public final class Launcher extends Activity
addAppWidgetImpl(appWidgetId, null);
}
- void addAppWidgetImpl(int appWidgetId, PendingAddWidgetInfo info) {
- AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
-
+ void addAppWidgetImpl(final int appWidgetId, final PendingAddWidgetInfo info) {
+ final AppWidgetProviderInfo appWidget = info.info;
+ Runnable configurationActivity = null;
if (appWidget.configure != null) {
// Launch over to configure widget, if needed
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
@@ -1429,9 +1502,8 @@ public final class Launcher extends Activity
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
if (info != null) {
if (info.mimeType != null && !info.mimeType.isEmpty()) {
- intent.putExtra(
- InstallWidgetReceiver.EXTRA_APPWIDGET_CONFIGURATION_DATA_MIME_TYPE,
- info.mimeType);
+ intent.putExtra(InstallWidgetReceiver.
+ EXTRA_APPWIDGET_CONFIGURATION_DATA_MIME_TYPE, info.mimeType);
final String mimeType = info.mimeType;
final ClipData clipData = (ClipData) info.configurationData;
@@ -1442,8 +1514,8 @@ public final class Launcher extends Activity
final CharSequence stringData = item.getText();
final Uri uriData = item.getUri();
final Intent intentData = item.getIntent();
- final String key =
- InstallWidgetReceiver.EXTRA_APPWIDGET_CONFIGURATION_DATA;
+ final String key = InstallWidgetReceiver.
+ EXTRA_APPWIDGET_CONFIGURATION_DATA;
if (uriData != null) {
intent.putExtra(key, uriData);
} else if (intentData != null) {
@@ -1456,14 +1528,13 @@ public final class Launcher extends Activity
}
}
}
-
startActivityForResultSafely(intent, REQUEST_CREATE_APPWIDGET);
+ mWidgetBeingConfigured = info;
} else {
// Otherwise just add it
- completeAddAppWidget(appWidgetId, info.container, info.screen);
-
+ completeAddAppWidget(appWidgetId, info.container, info.screen, info.boundWidget, appWidget);
// Exit spring loaded mode if necessary after adding the widget
- exitSpringLoadedDragModeDelayed(true, false);
+ exitSpringLoadedDragModeDelayed(true, false, null);
}
}
@@ -1501,18 +1572,31 @@ public final class Launcher extends Activity
* @param position The location on the screen where it was dropped, optional
*/
void addAppWidgetFromDrop(PendingAddWidgetInfo info, long container, int screen,
- int[] cell, int[] loc) {
+ int[] cell, int[] span, int[] loc) {
resetAddInfo();
mPendingAddInfo.container = info.container = container;
mPendingAddInfo.screen = info.screen = screen;
mPendingAddInfo.dropPos = loc;
+ mPendingAddInfo.minSpanX = info.minSpanX;
+ mPendingAddInfo.minSpanY = info.minSpanY;
+
if (cell != null) {
mPendingAddInfo.cellX = cell[0];
mPendingAddInfo.cellY = cell[1];
}
+ if (span != null) {
+ mPendingAddInfo.spanX = span[0];
+ mPendingAddInfo.spanY = span[1];
+ }
- int appWidgetId = getAppWidgetHost().allocateAppWidgetId();
- AppWidgetManager.getInstance(this).bindAppWidgetId(appWidgetId, info.componentName);
+ AppWidgetHostView hostView = info.boundWidget;
+ int appWidgetId;
+ if (hostView != null) {
+ appWidgetId = hostView.getAppWidgetId();
+ } else {
+ appWidgetId = getAppWidgetHost().allocateAppWidgetId();
+ AppWidgetManager.getInstance(this).bindAppWidgetId(appWidgetId, info.componentName);
+ }
addAppWidgetImpl(appWidgetId, info);
}
@@ -1662,7 +1746,7 @@ public final class Launcher extends Activity
return;
}
- if (mWorkspace.isSwitchingState()) {
+ if (!mWorkspace.isFinishedSwitchingState()) {
return;
}
@@ -2160,6 +2244,30 @@ public final class Launcher extends Activity
}
}
+ private void dispatchOnLauncherTransitionStart(View v, boolean animated, boolean toWorkspace) {
+ if (v instanceof LauncherTransitionable) {
+ ((LauncherTransitionable) v).onLauncherTransitionStart(this, animated, toWorkspace);
+ }
+
+ // Update the workspace transition step as well
+ dispatchOnLauncherTransitionStep(v, 0f);
+ }
+
+ private void dispatchOnLauncherTransitionStep(View v, float t) {
+ if (v instanceof LauncherTransitionable) {
+ ((LauncherTransitionable) v).onLauncherTransitionStep(this, t);
+ }
+ }
+
+ private void dispatchOnLauncherTransitionEnd(View v, boolean animated, boolean toWorkspace) {
+ if (v instanceof LauncherTransitionable) {
+ ((LauncherTransitionable) v).onLauncherTransitionEnd(this, animated, toWorkspace);
+ }
+
+ // Update the workspace transition step as well
+ dispatchOnLauncherTransitionStep(v, 1f);
+ }
+
/**
* Things to test when changing the following seven functions.
* - Home from workspace
@@ -2205,7 +2313,7 @@ public final class Launcher extends Activity
* Assumes that the view to show is anchored at either the very top or very bottom
* of the screen.
*/
- private void showAppsCustomizeHelper(boolean animated, final boolean springLoaded) {
+ private void showAppsCustomizeHelper(final boolean animated, final boolean springLoaded) {
if (mStateAnimation != null) {
mStateAnimation.cancel();
mStateAnimation = null;
@@ -2216,6 +2324,7 @@ public final class Launcher extends Activity
final int duration = res.getInteger(R.integer.config_appsCustomizeZoomInTime);
final int fadeDuration = res.getInteger(R.integer.config_appsCustomizeFadeInTime);
final float scale = (float) res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor);
+ final View fromView = mWorkspace;
final View toView = mAppsCustomizeTabHost;
final int startDelay =
res.getInteger(R.integer.config_workspaceAppsCustomizeAnimationStagger);
@@ -2223,32 +2332,40 @@ public final class Launcher extends Activity
setPivotsForZoom(toView, scale);
// Shrink workspaces away if going to AppsCustomize from workspace
- mWorkspace.changeState(Workspace.State.SMALL, animated);
+ Animator workspaceAnim =
+ mWorkspace.getChangeStateAnimation(Workspace.State.SMALL, animated);
if (animated) {
- final ValueAnimator scaleAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
- scaleAnim.setInterpolator(new Workspace.ZoomOutInterpolator());
- scaleAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
- public void onAnimationUpdate(float a, float b) {
- toView.setScaleX(a * scale + b * 1f);
- toView.setScaleY(a * scale + b * 1f);
- }
- });
+ toView.setScaleX(scale);
+ toView.setScaleY(scale);
+ final LauncherViewPropertyAnimator scaleAnim = new LauncherViewPropertyAnimator(toView);
+ scaleAnim.
+ scaleX(1f).scaleY(1f).
+ setDuration(duration).
+ setInterpolator(new Workspace.ZoomOutInterpolator());
toView.setVisibility(View.VISIBLE);
toView.setAlpha(0f);
- ValueAnimator alphaAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(fadeDuration);
+ final ObjectAnimator alphaAnim = ObjectAnimator
+ .ofFloat(toView, "alpha", 0f, 1f)
+ .setDuration(fadeDuration);
alphaAnim.setInterpolator(new DecelerateInterpolator(1.5f));
- alphaAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
- public void onAnimationUpdate(float a, float b) {
- // don't need to invalidate because we do so above
- toView.setAlpha(a * 0f + b * 1f);
+ alphaAnim.addUpdateListener(new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float t = (Float) animation.getAnimatedValue();
+ dispatchOnLauncherTransitionStep(fromView, t);
+ dispatchOnLauncherTransitionStep(toView, t);
}
});
- alphaAnim.setStartDelay(startDelay);
- alphaAnim.start();
- scaleAnim.addListener(new AnimatorListenerAdapter() {
+ // toView should appear right at the end of the workspace shrink
+ // animation
+ mStateAnimation = new AnimatorSet();
+ mStateAnimation.play(scaleAnim).after(startDelay);
+ mStateAnimation.play(alphaAnim).after(startDelay);
+
+ mStateAnimation.addListener(new AnimatorListenerAdapter() {
boolean animationCancelled = false;
@Override
@@ -2262,15 +2379,8 @@ public final class Launcher extends Activity
}
@Override
public void onAnimationEnd(Animator animation) {
- // If we don't set the final scale values here, if this animation is cancelled
- // it will have the wrong scale value and subsequent cameraPan animations will
- // not fix that
- toView.setScaleX(1.0f);
- toView.setScaleY(1.0f);
- if (toView instanceof LauncherTransitionable) {
- ((LauncherTransitionable) toView).onLauncherTransitionEnd(instance,
- scaleAnim, false);
- }
+ dispatchOnLauncherTransitionEnd(fromView, animated, false);
+ dispatchOnLauncherTransitionEnd(toView, animated, false);
if (!springLoaded && !LauncherApplication.isScreenLarge()) {
// Hide the workspace scrollbar
@@ -2288,19 +2398,48 @@ public final class Launcher extends Activity
}
});
- // toView should appear right at the end of the workspace shrink animation
- mStateAnimation = new AnimatorSet();
- mStateAnimation.play(scaleAnim).after(startDelay);
+ if (workspaceAnim != null) {
+ mStateAnimation.play(workspaceAnim);
+ }
boolean delayAnim = false;
- if (toView instanceof LauncherTransitionable) {
- LauncherTransitionable lt = (LauncherTransitionable) toView;
- delayAnim = lt.onLauncherTransitionStart(instance, mStateAnimation, false);
+ final ViewTreeObserver observer;
+
+ dispatchOnLauncherTransitionStart(fromView, animated, false);
+ dispatchOnLauncherTransitionStart(toView, animated, false);
+
+ // If any of the objects being animated haven't been measured/laid out
+ // yet, delay the animation until we get a layout pass
+ if ((((LauncherTransitionable) toView).getContent().getMeasuredWidth() == 0) ||
+ (mWorkspace.getMeasuredWidth() == 0) ||
+ (toView.getMeasuredWidth() == 0)) {
+ observer = mWorkspace.getViewTreeObserver();
+ delayAnim = true;
+ } else {
+ observer = null;
}
- // if the anim is delayed, the LauncherTransitionable is responsible for starting it
- if (!delayAnim) {
- // TODO: q-- what if this anim is cancelled before being started? or started after
- // being cancelled?
+
+ if (delayAnim) {
+ final AnimatorSet stateAnimation = mStateAnimation;
+ final OnGlobalLayoutListener delayedStart = new OnGlobalLayoutListener() {
+ public void onGlobalLayout() {
+ mWorkspace.post(new Runnable() {
+ public void run() {
+ // Check that mStateAnimation hasn't changed while
+ // we waited for a layout pass
+ if (mStateAnimation == stateAnimation) {
+ // Need to update pivots for zoom if layout changed
+ setPivotsForZoom(toView, scale);
+ mStateAnimation.start();
+ }
+ }
+ });
+ observer.removeGlobalOnLayoutListener(this);
+ }
+ };
+ observer.addOnGlobalLayoutListener(delayedStart);
+ } else {
+ setPivotsForZoom(toView, scale);
mStateAnimation.start();
}
} else {
@@ -2310,16 +2449,16 @@ public final class Launcher extends Activity
toView.setScaleY(1.0f);
toView.setVisibility(View.VISIBLE);
toView.bringToFront();
- if (toView instanceof LauncherTransitionable) {
- ((LauncherTransitionable) toView).onLauncherTransitionStart(instance, null, false);
- ((LauncherTransitionable) toView).onLauncherTransitionEnd(instance, null, false);
-
- if (!springLoaded && !LauncherApplication.isScreenLarge()) {
- // Hide the workspace scrollbar
- mWorkspace.hideScrollingIndicator(true);
- hideDockDivider();
- }
+
+ if (!springLoaded && !LauncherApplication.isScreenLarge()) {
+ // Hide the workspace scrollbar
+ mWorkspace.hideScrollingIndicator(true);
+ hideDockDivider();
}
+ dispatchOnLauncherTransitionStart(fromView, animated, false);
+ dispatchOnLauncherTransitionEnd(fromView, animated, false);
+ dispatchOnLauncherTransitionStart(toView, animated, false);
+ dispatchOnLauncherTransitionEnd(toView, animated, false);
updateWallpaperVisibility(false);
}
}
@@ -2329,18 +2468,32 @@ public final class Launcher extends Activity
* This is the opposite of showAppsCustomizeHelper.
* @param animated If true, the transition will be animated.
*/
- private void hideAppsCustomizeHelper(boolean animated, final boolean springLoaded) {
+ private void hideAppsCustomizeHelper(State toState, final boolean animated,
+ final boolean springLoaded, final Runnable onCompleteRunnable) {
+
if (mStateAnimation != null) {
mStateAnimation.cancel();
mStateAnimation = null;
}
Resources res = getResources();
- final Launcher instance = this;
final int duration = res.getInteger(R.integer.config_appsCustomizeZoomOutTime);
+ final int fadeOutDuration =
+ res.getInteger(R.integer.config_appsCustomizeFadeOutTime);
final float scaleFactor = (float)
res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor);
final View fromView = mAppsCustomizeTabHost;
+ final View toView = mWorkspace;
+ Animator workspaceAnim = null;
+
+ if (toState == State.WORKSPACE) {
+ int stagger = res.getInteger(R.integer.config_appsCustomizeWorkspaceAnimationStagger);
+ workspaceAnim = mWorkspace.getChangeStateAnimation(
+ Workspace.State.NORMAL, animated, stagger);
+ } else if (toState == State.APPS_CUSTOMIZE_SPRING_LOADED) {
+ workspaceAnim = mWorkspace.getChangeStateAnimation(
+ Workspace.State.SPRING_LOADED, animated);
+ }
setPivotsForZoom(fromView, scaleFactor);
updateWallpaperVisibility(true);
@@ -2349,48 +2502,56 @@ public final class Launcher extends Activity
final float oldScaleX = fromView.getScaleX();
final float oldScaleY = fromView.getScaleY();
- ValueAnimator scaleAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
- scaleAnim.setInterpolator(new Workspace.ZoomInInterpolator());
- scaleAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
- public void onAnimationUpdate(float a, float b) {
- fromView.setScaleX(a * oldScaleX + b * scaleFactor);
- fromView.setScaleY(a * oldScaleY + b * scaleFactor);
- }
- });
- final ValueAnimator alphaAnim = ValueAnimator.ofFloat(0f, 1f);
- alphaAnim.setDuration(res.getInteger(R.integer.config_appsCustomizeFadeOutTime));
+ final LauncherViewPropertyAnimator scaleAnim =
+ new LauncherViewPropertyAnimator(fromView);
+ scaleAnim.
+ scaleX(scaleFactor).scaleY(scaleFactor).
+ setDuration(duration).
+ setInterpolator(new Workspace.ZoomInInterpolator());
+
+ final ObjectAnimator alphaAnim = ObjectAnimator
+ .ofFloat(fromView, "alpha", 1f, 0f)
+ .setDuration(fadeOutDuration);
alphaAnim.setInterpolator(new AccelerateDecelerateInterpolator());
- alphaAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
- public void onAnimationUpdate(float a, float b) {
- fromView.setAlpha(a * 1f + b * 0f);
+ alphaAnim.addUpdateListener(new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float t = 1f - (Float) animation.getAnimatedValue();
+ dispatchOnLauncherTransitionStep(fromView, t);
+ dispatchOnLauncherTransitionStep(toView, t);
}
});
- if (fromView instanceof LauncherTransitionable) {
- ((LauncherTransitionable) fromView).onLauncherTransitionStart(instance, alphaAnim,
- true);
- }
- alphaAnim.addListener(new AnimatorListenerAdapter() {
+
+ mStateAnimation = new AnimatorSet();
+
+ dispatchOnLauncherTransitionStart(fromView, animated, true);
+ dispatchOnLauncherTransitionStart(toView, animated, true);
+
+ mStateAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
updateWallpaperVisibility(true);
fromView.setVisibility(View.GONE);
- if (fromView instanceof LauncherTransitionable) {
- ((LauncherTransitionable) fromView).onLauncherTransitionEnd(instance,
- alphaAnim, true);
- }
+ dispatchOnLauncherTransitionEnd(fromView, animated, true);
+ dispatchOnLauncherTransitionEnd(toView, animated, true);
mWorkspace.hideScrollingIndicator(false);
+ if (onCompleteRunnable != null) {
+ onCompleteRunnable.run();
+ }
}
});
- mStateAnimation = new AnimatorSet();
mStateAnimation.playTogether(scaleAnim, alphaAnim);
+ if (workspaceAnim != null) {
+ mStateAnimation.play(workspaceAnim);
+ }
mStateAnimation.start();
} else {
fromView.setVisibility(View.GONE);
- if (fromView instanceof LauncherTransitionable) {
- ((LauncherTransitionable) fromView).onLauncherTransitionStart(instance, null, true);
- ((LauncherTransitionable) fromView).onLauncherTransitionEnd(instance, null, true);
- }
+ dispatchOnLauncherTransitionStart(fromView, animated, true);
+ dispatchOnLauncherTransitionEnd(fromView, animated, true);
+ dispatchOnLauncherTransitionStart(toView, animated, true);
+ dispatchOnLauncherTransitionEnd(toView, animated, true);
mWorkspace.hideScrollingIndicator(false);
}
}
@@ -2404,13 +2565,13 @@ public final class Launcher extends Activity
}
void showWorkspace(boolean animated) {
- Resources res = getResources();
- int stagger = res.getInteger(R.integer.config_appsCustomizeWorkspaceAnimationStagger);
+ showWorkspace(animated, null);
+ }
- mWorkspace.changeState(Workspace.State.NORMAL, animated, stagger);
+ void showWorkspace(boolean animated, Runnable onCompleteRunnable) {
if (mState != State.WORKSPACE) {
mWorkspace.setVisibility(View.VISIBLE);
- hideAppsCustomizeHelper(animated, false);
+ hideAppsCustomizeHelper(State.WORKSPACE, animated, false, onCompleteRunnable);
// Show the search bar and hotseat
mSearchDropTargetBar.showSearchBar(animated);
@@ -2459,14 +2620,14 @@ public final class Launcher extends Activity
void enterSpringLoadedDragMode() {
if (mState == State.APPS_CUSTOMIZE) {
- mWorkspace.changeState(Workspace.State.SPRING_LOADED);
- hideAppsCustomizeHelper(true, true);
+ hideAppsCustomizeHelper(State.APPS_CUSTOMIZE_SPRING_LOADED, true, true, null);
hideDockDivider();
mState = State.APPS_CUSTOMIZE_SPRING_LOADED;
}
}
- void exitSpringLoadedDragModeDelayed(final boolean successfulDrop, boolean extendedDelay) {
+ void exitSpringLoadedDragModeDelayed(final boolean successfulDrop, boolean extendedDelay,
+ final Runnable onCompleteRunnable) {
if (mState != State.APPS_CUSTOMIZE_SPRING_LOADED) return;
mHandler.postDelayed(new Runnable() {
@@ -2478,7 +2639,7 @@ public final class Launcher extends Activity
// clean up our state transition functions
mAppsCustomizeTabHost.setVisibility(View.GONE);
mSearchDropTargetBar.showSearchBar(true);
- showWorkspace(true);
+ showWorkspace(true, onCompleteRunnable);
} else {
exitSpringLoadedDragMode();
}
@@ -2543,8 +2704,10 @@ public final class Launcher extends Activity
void showHotseat(boolean animated) {
if (!LauncherApplication.isScreenLarge()) {
if (animated) {
- int duration = mSearchDropTargetBar.getTransitionInDuration();
- mHotseat.animate().alpha(1f).setDuration(duration);
+ if (mHotseat.getAlpha() != 1f) {
+ int duration = mSearchDropTargetBar.getTransitionInDuration();
+ mHotseat.animate().alpha(1f).setDuration(duration);
+ }
} else {
mHotseat.setAlpha(1f);
}
@@ -2557,8 +2720,10 @@ public final class Launcher extends Activity
void hideHotseat(boolean animated) {
if (!LauncherApplication.isScreenLarge()) {
if (animated) {
- int duration = mSearchDropTargetBar.getTransitionOutDuration();
- mHotseat.animate().alpha(0f).setDuration(duration);
+ if (mHotseat.getAlpha() != 0f) {
+ int duration = mSearchDropTargetBar.getTransitionOutDuration();
+ mHotseat.animate().alpha(0f).setDuration(duration);
+ }
} else {
mHotseat.setAlpha(0f);
}
@@ -3002,6 +3167,11 @@ public final class Launcher extends Activity
item.hostView.setAppWidget(appWidgetId, appWidgetInfo);
item.hostView.setTag(item);
+ // We need to load the minimum span and embed it into the item info
+ int[] minSpan = getMinSpanForWidget(appWidgetInfo, null);
+ item.minSpanX = minSpan[0];
+ item.minSpanY = minSpan[1];
+
workspace.addInScreen(item.hostView, item.container, item.screen, item.cellX,
item.cellY, item.spanX, item.spanY, false);
@@ -3048,7 +3218,7 @@ public final class Launcher extends Activity
// package changes in bindSearchablesChanged()
updateAppMarketIcon();
- mWorkspace.post(mBuildLayersRunnable);
+ mWorkspace.postDelayed(mBuildLayersRunnable, 500);
}
@Override
@@ -3227,11 +3397,14 @@ public final class Launcher extends Activity
public void onAnimationEnd(Animator animation) {
cling.setVisibility(View.GONE);
cling.cleanup();
- SharedPreferences prefs =
- getSharedPreferences("com.android.launcher2.prefs", Context.MODE_PRIVATE);
- SharedPreferences.Editor editor = prefs.edit();
- editor.putBoolean(flag, true);
- editor.commit();
+ // We should update the shared preferences on a background thread
+ new Thread("dismissClingThread") {
+ public void run() {
+ SharedPreferences.Editor editor = mSharedPrefs.edit();
+ editor.putBoolean(flag, true);
+ editor.commit();
+ }
+ }.start();
};
});
anim.start();
@@ -3251,9 +3424,8 @@ public final class Launcher extends Activity
}
public void showFirstRunWorkspaceCling() {
// Enable the clings only if they have not been dismissed before
- SharedPreferences prefs =
- getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE);
- if (isClingsEnabled() && !prefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) {
+ if (isClingsEnabled() &&
+ !mSharedPrefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) {
initCling(R.id.workspace_cling, null, false, 0);
} else {
removeCling(R.id.workspace_cling);
@@ -3261,9 +3433,8 @@ public final class Launcher extends Activity
}
public void showFirstRunAllAppsCling(int[] position) {
// Enable the clings only if they have not been dismissed before
- SharedPreferences prefs =
- getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE);
- if (isClingsEnabled() && !prefs.getBoolean(Cling.ALLAPPS_CLING_DISMISSED_KEY, false)) {
+ if (isClingsEnabled() &&
+ !mSharedPrefs.getBoolean(Cling.ALLAPPS_CLING_DISMISSED_KEY, false)) {
initCling(R.id.all_apps_cling, position, true, 0);
} else {
removeCling(R.id.all_apps_cling);
@@ -3271,15 +3442,13 @@ public final class Launcher extends Activity
}
public Cling showFirstRunFoldersCling() {
// Enable the clings only if they have not been dismissed before
- SharedPreferences prefs =
- getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE);
- Cling cling = null;
- if (isClingsEnabled() && !prefs.getBoolean(Cling.FOLDER_CLING_DISMISSED_KEY, false)) {
- cling = initCling(R.id.folder_cling, null, true, 0);
+ if (isClingsEnabled() &&
+ !mSharedPrefs.getBoolean(Cling.FOLDER_CLING_DISMISSED_KEY, false)) {
+ return initCling(R.id.folder_cling, null, true, 0);
} else {
removeCling(R.id.folder_cling);
+ return null;
}
- return cling;
}
public boolean isFolderClingVisible() {
Cling cling = (Cling) findViewById(R.id.folder_cling);
@@ -3332,7 +3501,8 @@ public final class Launcher extends Activity
}
interface LauncherTransitionable {
- // return true if the callee will take care of start the animation by itself
- boolean onLauncherTransitionStart(Launcher l, Animator animation, boolean toWorkspace);
- void onLauncherTransitionEnd(Launcher l, Animator animation, boolean toWorkspace);
+ View getContent();
+ void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace);
+ void onLauncherTransitionStep(Launcher l, float t);
+ void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace);
}
diff --git a/src/com/android/launcher2/LauncherAppWidgetHostView.java b/src/com/android/launcher2/LauncherAppWidgetHostView.java
index 0c3bdcaf8..d73dd3008 100644
--- a/src/com/android/launcher2/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher2/LauncherAppWidgetHostView.java
@@ -30,12 +30,12 @@ import com.android.launcher.R;
* {@inheritDoc}
*/
public class LauncherAppWidgetHostView extends AppWidgetHostView {
- private boolean mHasPerformedLongPress;
- private CheckForLongPress mPendingCheckForLongPress;
+ private CheckLongPressHelper mLongPressHelper;
private LayoutInflater mInflater;
public LauncherAppWidgetHostView(Context context) {
super(context);
+ mLongPressHelper = new CheckLongPressHelper(this);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@@ -46,8 +46,8 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView {
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Consume any touch events for ourselves after longpress is triggered
- if (mHasPerformedLongPress) {
- mHasPerformedLongPress = false;
+ if (mLongPressHelper.hasPerformedLongPress()) {
+ mLongPressHelper.cancelLongPress();
return true;
}
@@ -55,16 +55,13 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView {
// users can always pick up this widget
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: {
- postCheckForLongClick();
+ mLongPressHelper.postCheckForLongPress();
break;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
- mHasPerformedLongPress = false;
- if (mPendingCheckForLongPress != null) {
- removeCallbacks(mPendingCheckForLongPress);
- }
+ mLongPressHelper.cancelLongPress();
break;
}
@@ -72,42 +69,11 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView {
return false;
}
- class CheckForLongPress implements Runnable {
- private int mOriginalWindowAttachCount;
-
- public void run() {
- if ((mParent != null) && hasWindowFocus()
- && mOriginalWindowAttachCount == getWindowAttachCount()
- && !mHasPerformedLongPress) {
- if (performLongClick()) {
- mHasPerformedLongPress = true;
- }
- }
- }
-
- public void rememberWindowAttachCount() {
- mOriginalWindowAttachCount = getWindowAttachCount();
- }
- }
-
- private void postCheckForLongClick() {
- mHasPerformedLongPress = false;
-
- if (mPendingCheckForLongPress == null) {
- mPendingCheckForLongPress = new CheckForLongPress();
- }
- mPendingCheckForLongPress.rememberWindowAttachCount();
- postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());
- }
-
@Override
public void cancelLongPress() {
super.cancelLongPress();
- mHasPerformedLongPress = false;
- if (mPendingCheckForLongPress != null) {
- removeCallbacks(mPendingCheckForLongPress);
- }
+ mLongPressHelper.cancelLongPress();
}
@Override
diff --git a/src/com/android/launcher2/LauncherApplication.java b/src/com/android/launcher2/LauncherApplication.java
index 29c93bef2..47ce0b722 100644
--- a/src/com/android/launcher2/LauncherApplication.java
+++ b/src/com/android/launcher2/LauncherApplication.java
@@ -25,6 +25,7 @@ import android.content.IntentFilter;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.os.Handler;
+import android.view.MotionEvent;
import com.android.launcher.R;
@@ -35,6 +36,7 @@ public class LauncherApplication extends Application {
public IconCache mIconCache;
private static boolean sIsScreenLarge;
private static float sScreenDensity;
+ private static int sLongPressTimeout = 300;
WeakReference<LauncherProvider> mLauncherProvider;
@Override
@@ -129,4 +131,8 @@ public class LauncherApplication extends Application {
public static float getScreenDensity() {
return sScreenDensity;
}
+
+ public static int getLongPressTimeout() {
+ return sLongPressTimeout;
+ }
}
diff --git a/src/com/android/launcher2/LauncherViewPropertyAnimator.java b/src/com/android/launcher2/LauncherViewPropertyAnimator.java
new file mode 100644
index 000000000..88b4cb4b8
--- /dev/null
+++ b/src/com/android/launcher2/LauncherViewPropertyAnimator.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2012 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.launcher2;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.TimeInterpolator;
+import android.view.ViewPropertyAnimator;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+
+public class LauncherViewPropertyAnimator extends Animator implements AnimatorListener {
+ enum Properties {
+ TRANSLATION_X,
+ TRANSLATION_Y,
+ SCALE_X,
+ SCALE_Y,
+ ROTATION_Y,
+ ALPHA,
+ START_DELAY,
+ DURATION,
+ INTERPOLATOR
+ }
+ EnumSet<Properties> mPropertiesToSet = EnumSet.noneOf(Properties.class);
+ ViewPropertyAnimator mViewPropertyAnimator;
+ View mTarget;
+
+ float mTranslationX;
+ float mTranslationY;
+ float mScaleX;
+ float mScaleY;
+ float mRotationY;
+ float mAlpha;
+ long mStartDelay;
+ long mDuration;
+ TimeInterpolator mInterpolator;
+ ArrayList<Animator.AnimatorListener> mListeners;
+ boolean mRunning = false;
+
+ public LauncherViewPropertyAnimator(View target) {
+ mTarget = target;
+ mListeners = new ArrayList<Animator.AnimatorListener>();
+ }
+
+ @Override
+ public void addListener(Animator.AnimatorListener listener) {
+ mListeners.add(listener);
+ }
+
+ @Override
+ public void cancel() {
+ if (mViewPropertyAnimator != null) {
+ mViewPropertyAnimator.cancel();
+ }
+ }
+
+ @Override
+ public Animator clone() {
+ throw new RuntimeException("Not implemented");
+ }
+
+ @Override
+ public void end() {
+ throw new RuntimeException("Not implemented");
+ }
+
+ @Override
+ public long getDuration() {
+ return mDuration;
+ }
+
+ @Override
+ public ArrayList<Animator.AnimatorListener> getListeners() {
+ return mListeners;
+ }
+
+ @Override
+ public long getStartDelay() {
+ return mStartDelay;
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ for (int i = 0; i < mListeners.size(); i++) {
+ Animator.AnimatorListener listener = mListeners.get(i);
+ listener.onAnimationCancel(this);
+ }
+ mRunning = false;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ for (int i = 0; i < mListeners.size(); i++) {
+ Animator.AnimatorListener listener = mListeners.get(i);
+ listener.onAnimationEnd(this);
+ }
+ mRunning = false;
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ for (int i = 0; i < mListeners.size(); i++) {
+ Animator.AnimatorListener listener = mListeners.get(i);
+ listener.onAnimationRepeat(this);
+ }
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ for (int i = 0; i < mListeners.size(); i++) {
+ Animator.AnimatorListener listener = mListeners.get(i);
+ listener.onAnimationStart(this);
+ }
+ mRunning = true;
+ }
+
+ @Override
+ public boolean isRunning() {
+ return mRunning;
+ }
+
+ @Override
+ public boolean isStarted() {
+ return mViewPropertyAnimator != null;
+ }
+
+ @Override
+ public void removeAllListeners() {
+ mListeners.clear();
+ }
+
+ @Override
+ public void removeListener(Animator.AnimatorListener listener) {
+ mListeners.remove(listener);
+ }
+
+ @Override
+ public Animator setDuration(long duration) {
+ mPropertiesToSet.add(Properties.DURATION);
+ mDuration = duration;
+ return this;
+ }
+
+ @Override
+ public void setInterpolator(TimeInterpolator value) {
+ mPropertiesToSet.add(Properties.INTERPOLATOR);
+ mInterpolator = value;
+ }
+
+ @Override
+ public void setStartDelay(long startDelay) {
+ mPropertiesToSet.add(Properties.START_DELAY);
+ mStartDelay = startDelay;
+ }
+
+ @Override
+ public void setTarget(Object target) {
+ throw new RuntimeException("Not implemented");
+ }
+
+ @Override
+ public void setupEndValues() {
+
+ }
+
+ @Override
+ public void setupStartValues() {
+ }
+
+ @Override
+ public void start() {
+ mViewPropertyAnimator = mTarget.animate();
+ if (mPropertiesToSet.contains(Properties.TRANSLATION_X)) {
+ mViewPropertyAnimator.translationX(mTranslationX);
+ }
+ if (mPropertiesToSet.contains(Properties.TRANSLATION_Y)) {
+ mViewPropertyAnimator.translationY(mTranslationY);
+ }
+ if (mPropertiesToSet.contains(Properties.SCALE_X)) {
+ mViewPropertyAnimator.scaleX(mScaleX);
+ }
+ if (mPropertiesToSet.contains(Properties.ROTATION_Y)) {
+ mViewPropertyAnimator.rotationY(mRotationY);
+ }
+ if (mPropertiesToSet.contains(Properties.SCALE_Y)) {
+ mViewPropertyAnimator.scaleY(mScaleY);
+ }
+ if (mPropertiesToSet.contains(Properties.ALPHA)) {
+ mViewPropertyAnimator.alpha(mAlpha);
+ }
+ if (mPropertiesToSet.contains(Properties.START_DELAY)) {
+ mViewPropertyAnimator.setStartDelay(mStartDelay);
+ }
+ if (mPropertiesToSet.contains(Properties.DURATION)) {
+ mViewPropertyAnimator.setDuration(mDuration);
+ }
+ if (mPropertiesToSet.contains(Properties.INTERPOLATOR)) {
+ mViewPropertyAnimator.setInterpolator(mInterpolator);
+ }
+ mViewPropertyAnimator.setListener(this);
+ mViewPropertyAnimator.start();
+ }
+
+ public LauncherViewPropertyAnimator translationX(float value) {
+ mPropertiesToSet.add(Properties.TRANSLATION_X);
+ mTranslationX = value;
+ return this;
+ }
+
+ public LauncherViewPropertyAnimator translationY(float value) {
+ mPropertiesToSet.add(Properties.TRANSLATION_Y);
+ mTranslationY = value;
+ return this;
+ }
+
+ public LauncherViewPropertyAnimator scaleX(float value) {
+ mPropertiesToSet.add(Properties.SCALE_X);
+ mScaleX = value;
+ return this;
+ }
+
+ public LauncherViewPropertyAnimator scaleY(float value) {
+ mPropertiesToSet.add(Properties.SCALE_Y);
+ mScaleY = value;
+ return this;
+ }
+
+ public LauncherViewPropertyAnimator rotationY(float value) {
+ mPropertiesToSet.add(Properties.ROTATION_Y);
+ mRotationY = value;
+ return this;
+ }
+
+ public LauncherViewPropertyAnimator alpha(float value) {
+ mPropertiesToSet.add(Properties.ALPHA);
+ mAlpha = value;
+ return this;
+ }
+}
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 3f5652e1d..a615b59f2 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -67,14 +67,20 @@ public abstract class PagedView extends ViewGroup {
private static final float OVERSCROLL_ACCELERATE_FACTOR = 2;
private static final float OVERSCROLL_DAMP_FACTOR = 0.14f;
- private static final int MINIMUM_SNAP_VELOCITY = 2200;
- private static final int MIN_FLING_VELOCITY = 250;
+
private static final float RETURN_TO_ORIGINAL_PAGE_THRESHOLD = 0.33f;
// The page is moved more than halfway, automatically move to the next page on touch up.
private static final float SIGNIFICANT_MOVE_THRESHOLD = 0.4f;
- // the velocity at which a fling gesture will cause us to snap to the next page
- protected int mSnapVelocity = 500;
+ // The following constants need to be scaled based on density. The scaled versions will be
+ // assigned to the corresponding member variables below.
+ private static final int FLING_THRESHOLD_VELOCITY = 500;
+ private static final int MIN_SNAP_VELOCITY = 1500;
+ private static final int MIN_FLING_VELOCITY = 250;
+
+ protected int mFlingThresholdVelocity;
+ protected int mMinFlingVelocity;
+ protected int mMinSnapVelocity;
protected float mDensity;
protected float mSmoothingTime;
@@ -145,15 +151,6 @@ public abstract class PagedView extends ViewGroup {
protected ArrayList<Boolean> mDirtyPageContent;
- // choice modes
- protected static final int CHOICE_MODE_NONE = 0;
- protected static final int CHOICE_MODE_SINGLE = 1;
- // Multiple selection mode is not supported by all Launcher actions atm
- protected static final int CHOICE_MODE_MULTIPLE = 2;
-
- protected int mChoiceMode;
- private ActionMode mActionMode;
-
// If true, syncPages and syncPageItems will be called to refresh pages
protected boolean mContentIsRefreshable = true;
@@ -175,10 +172,12 @@ public abstract class PagedView extends ViewGroup {
// Scrolling indicator
private ValueAnimator mScrollIndicatorAnimator;
- private ImageView mScrollIndicator;
+ private View mScrollIndicator;
private int mScrollIndicatorPaddingLeft;
private int mScrollIndicatorPaddingRight;
private boolean mHasScrollIndicator = true;
+ private boolean mShouldShowScrollIndicator = false;
+ private boolean mShouldShowScrollIndicatorImmediately = false;
protected static final int sScrollIndicatorFadeInDuration = 150;
protected static final int sScrollIndicatorFadeOutDuration = 650;
protected static final int sScrollIndicatorFlashDuration = 650;
@@ -200,7 +199,6 @@ public abstract class PagedView extends ViewGroup {
public PagedView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- mChoiceMode = CHOICE_MODE_NONE;
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.PagedView, defStyle, 0);
@@ -242,6 +240,10 @@ public abstract class PagedView extends ViewGroup {
mPagingTouchSlop = configuration.getScaledPagingTouchSlop();
mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
mDensity = getResources().getDisplayMetrics().density;
+
+ mFlingThresholdVelocity = (int) (FLING_THRESHOLD_VELOCITY * mDensity);
+ mMinFlingVelocity = (int) (MIN_FLING_VELOCITY * mDensity);
+ mMinSnapVelocity = (int) (MIN_SNAP_VELOCITY * mDensity);
}
public void setPageSwitchListener(PageSwitchListener pageSwitchListener) {
@@ -292,6 +294,7 @@ public abstract class PagedView extends ViewGroup {
int newX = getChildOffset(mCurrentPage) - getRelativeChildOffset(mCurrentPage);
scrollTo(newX, 0);
mScroller.setFinalX(newX);
+ mScroller.forceFinished(true);
}
/**
@@ -340,12 +343,10 @@ public abstract class PagedView extends ViewGroup {
// a method that subclasses can override to add behavior
protected void onPageBeginMoving() {
- showScrollingIndicator(false);
}
// a method that subclasses can override to add behavior
protected void onPageEndMoving() {
- hideScrollingIndicator(false);
}
/**
@@ -602,9 +603,7 @@ public abstract class PagedView extends ViewGroup {
if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) {
setHorizontalScrollBarEnabled(false);
- int newX = getChildOffset(mCurrentPage) - getRelativeChildOffset(mCurrentPage);
- scrollTo(newX, 0);
- mScroller.setFinalX(newX);
+ updateCurrentPageScroll();
setHorizontalScrollBarEnabled(true);
mFirstLayout = false;
}
@@ -624,8 +623,7 @@ public abstract class PagedView extends ViewGroup {
if (child != null) {
float scrollProgress = getScrollProgress(screenCenter, child, i);
float alpha = 1 - Math.abs(scrollProgress);
- child.setFastAlpha(alpha);
- child.fastInvalidate();
+ child.setAlpha(alpha);
}
}
invalidate();
@@ -716,19 +714,17 @@ public abstract class PagedView extends ViewGroup {
protected void getVisiblePages(int[] range) {
final int pageCount = getChildCount();
if (pageCount > 0) {
- final int pageWidth = getScaledMeasuredWidth(getPageAt(0));
final int screenWidth = getMeasuredWidth();
- int x = getScaledRelativeChildOffset(0) + pageWidth;
int leftScreen = 0;
int rightScreen = 0;
- while (x <= mScrollX && leftScreen < pageCount - 1) {
+ while (leftScreen < pageCount - 1 &&
+ getPageAt(leftScreen).getRight() <= mScrollX) {
leftScreen++;
- x += getScaledMeasuredWidth(getPageAt(leftScreen)) + mPageSpacing;
}
rightScreen = leftScreen;
- while (x < mScrollX + screenWidth && rightScreen < pageCount - 1) {
+ while (rightScreen < pageCount - 1 &&
+ getPageAt(rightScreen + 1).getLeft() < mScrollX + screenWidth) {
rightScreen++;
- x += getScaledMeasuredWidth(getPageAt(rightScreen)) + mPageSpacing;
}
range[0] = leftScreen;
range[1] = rightScreen;
@@ -764,8 +760,22 @@ public abstract class PagedView extends ViewGroup {
canvas.clipRect(mScrollX, mScrollY, mScrollX + mRight - mLeft,
mScrollY + mBottom - mTop);
- for (int i = rightScreen; i >= leftScreen; i--) {
- drawChild(canvas, getPageAt(i), drawingTime);
+ // On certain graphics drivers, if you draw to a off-screen buffer that's not
+ // used, it can lead to poor performance. We were running into this when
+ // setChildrenLayersEnabled was called on a CellLayout; that triggered a re-draw
+ // of that CellLayout's hardware layer, even if that CellLayout wasn't visible.
+ // As a fix, below we set pages that aren't going to be rendered are to be
+ // View.INVISIBLE, preventing re-drawing of their hardware layer
+ for (int i = getChildCount() - 1; i >= 0; i--) {
+ final View v = getPageAt(i);
+
+ if (leftScreen <= i && i <= rightScreen &&
+ v.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD) {
+ v.setVisibility(VISIBLE);
+ drawChild(canvas, v, drawingTime);
+ } else {
+ v.setVisibility(INVISIBLE);
+ }
}
canvas.restore();
}
@@ -986,19 +996,6 @@ public abstract class PagedView extends ViewGroup {
return mTouchState != TOUCH_STATE_REST;
}
- protected void animateClickFeedback(View v, final Runnable r) {
- // animate the view slightly to show click feedback running some logic after it is "pressed"
- ObjectAnimator anim = (ObjectAnimator) AnimatorInflater.
- loadAnimator(mContext, R.anim.paged_view_click_feedback);
- anim.setTarget(v);
- anim.addListener(new AnimatorListenerAdapter() {
- public void onAnimationRepeat(Animator animation) {
- r.run();
- }
- });
- anim.start();
- }
-
protected void determineScrollingStart(MotionEvent ev) {
determineScrollingStart(ev, 1.0f);
}
@@ -1208,12 +1205,11 @@ public abstract class PagedView extends ViewGroup {
final int pageWidth = getScaledMeasuredWidth(getPageAt(mCurrentPage));
boolean isSignificantMove = Math.abs(deltaX) > pageWidth *
SIGNIFICANT_MOVE_THRESHOLD;
- final int snapVelocity = mSnapVelocity;
mTotalMotionX += Math.abs(mLastMotionX + mLastMotionXRemainder - x);
boolean isFling = mTotalMotionX > MIN_LENGTH_FOR_FLING &&
- Math.abs(velocityX) > snapVelocity;
+ Math.abs(velocityX) > mFlingThresholdVelocity;
// In the case that the page is moved far to one direction and then is flung
// in the opposite direction, we use a threshold to determine whether we should
@@ -1434,7 +1430,7 @@ public abstract class PagedView extends ViewGroup {
int delta = newX - mUnboundedScrollX;
int duration = 0;
- if (Math.abs(velocity) < MIN_FLING_VELOCITY) {
+ if (Math.abs(velocity) < mMinFlingVelocity) {
// If the velocity is low enough, then treat this more as an automatic page advance
// as opposed to an apparent physical response to flinging
snapToPage(whichPage, PAGE_SNAP_ANIMATION_DURATION);
@@ -1450,7 +1446,7 @@ public abstract class PagedView extends ViewGroup {
distanceInfluenceForSnapDuration(distanceRatio);
velocity = Math.abs(velocity);
- velocity = Math.max(MINIMUM_SNAP_VELOCITY, velocity);
+ velocity = Math.max(mMinSnapVelocity, velocity);
// we want the page's snap velocity to approximately match the velocity at which the
// user flings, so we scale the duration by a value near to the derivative of the scroll
@@ -1591,22 +1587,26 @@ public abstract class PagedView extends ViewGroup {
int upperPageBound = getAssociatedUpperPageBound(page);
if (DEBUG) Log.d(TAG, "loadAssociatedPages: " + lowerPageBound + "/"
+ upperPageBound);
+ // First, clear any pages that should no longer be loaded
+ for (int i = 0; i < count; ++i) {
+ Page layout = (Page) getPageAt(i);
+ if ((i < lowerPageBound) || (i > upperPageBound)) {
+ if (layout.getPageChildCount() > 0) {
+ layout.removeAllViewsOnPage();
+ }
+ mDirtyPageContent.set(i, true);
+ }
+ }
+ // Next, load any new pages
for (int i = 0; i < count; ++i) {
if ((i != page) && immediateAndOnly) {
continue;
}
- Page layout = (Page) getPageAt(i);
- final int childCount = layout.getPageChildCount();
if (lowerPageBound <= i && i <= upperPageBound) {
if (mDirtyPageContent.get(i)) {
syncPageItems(i, (i == page) && immediateAndOnly);
mDirtyPageContent.set(i, false);
}
- } else {
- if (childCount > 0) {
- layout.removeAllViewsOnPage();
- }
- mDirtyPageContent.set(i, true);
}
}
}
@@ -1621,72 +1621,6 @@ public abstract class PagedView extends ViewGroup {
return Math.min(page + 1, count - 1);
}
- protected void startChoiceMode(int mode, ActionMode.Callback callback) {
- if (isChoiceMode(CHOICE_MODE_NONE)) {
- mChoiceMode = mode;
- mActionMode = startActionMode(callback);
- }
- }
-
- public void endChoiceMode() {
- if (!isChoiceMode(CHOICE_MODE_NONE)) {
- mChoiceMode = CHOICE_MODE_NONE;
- resetCheckedGrandchildren();
- if (mActionMode != null) mActionMode.finish();
- mActionMode = null;
- }
- }
-
- protected boolean isChoiceMode(int mode) {
- return mChoiceMode == mode;
- }
-
- protected ArrayList<Checkable> getCheckedGrandchildren() {
- ArrayList<Checkable> checked = new ArrayList<Checkable>();
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; ++i) {
- Page layout = (Page) getPageAt(i);
- final int grandChildCount = layout.getPageChildCount();
- for (int j = 0; j < grandChildCount; ++j) {
- final View v = layout.getChildOnPageAt(j);
- if (v instanceof Checkable && ((Checkable) v).isChecked()) {
- checked.add((Checkable) v);
- }
- }
- }
- return checked;
- }
-
- /**
- * If in CHOICE_MODE_SINGLE and an item is checked, returns that item.
- * Otherwise, returns null.
- */
- protected Checkable getSingleCheckedGrandchild() {
- if (mChoiceMode != CHOICE_MODE_MULTIPLE) {
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; ++i) {
- Page layout = (Page) getPageAt(i);
- final int grandChildCount = layout.getPageChildCount();
- for (int j = 0; j < grandChildCount; ++j) {
- final View v = layout.getChildOnPageAt(j);
- if (v instanceof Checkable && ((Checkable) v).isChecked()) {
- return (Checkable) v;
- }
- }
- }
- }
- return null;
- }
-
- protected void resetCheckedGrandchildren() {
- // loop through children, and set all of their children to _not_ be checked
- final ArrayList<Checkable> checked = getCheckedGrandchildren();
- for (int i = 0; i < checked.size(); ++i) {
- final Checkable c = checked.get(i);
- c.setChecked(false);
- }
- }
-
/**
* This method is called ONLY to synchronize the number of pages that the paged view has.
* To actually fill the pages with information, implement syncPageItems() below. It is
@@ -1743,12 +1677,12 @@ public abstract class PagedView extends ViewGroup {
}
}
- protected ImageView getScrollingIndicator() {
+ protected View getScrollingIndicator() {
// We use mHasScrollIndicator to prevent future lookups if there is no sibling indicator
// found
if (mHasScrollIndicator && mScrollIndicator == null) {
ViewGroup parent = (ViewGroup) getParent();
- mScrollIndicator = (ImageView) (parent.findViewById(R.id.paged_view_indicator));
+ mScrollIndicator = (View) (parent.findViewById(R.id.paged_view_indicator));
mHasScrollIndicator = mScrollIndicator != null;
if (mHasScrollIndicator) {
mScrollIndicator.setVisibility(View.VISIBLE);
@@ -1774,9 +1708,12 @@ public abstract class PagedView extends ViewGroup {
}
protected void showScrollingIndicator(boolean immediately) {
+ mShouldShowScrollIndicator = true;
+ mShouldShowScrollIndicatorImmediately = true;
if (getChildCount() <= 1) return;
if (!isScrollingIndicatorEnabled()) return;
+ mShouldShowScrollIndicator = false;
getScrollingIndicator();
if (mScrollIndicator != null) {
// Fade the indicator in
@@ -1848,6 +1785,9 @@ public abstract class PagedView extends ViewGroup {
if (mScrollIndicator != null) {
updateScrollingIndicatorPosition();
}
+ if (mShouldShowScrollIndicator) {
+ showScrollingIndicator(mShouldShowScrollIndicatorImmediately);
+ }
}
private void updateScrollingIndicatorPosition() {
@@ -1874,7 +1814,6 @@ public abstract class PagedView extends ViewGroup {
indicatorPos += indicatorCenterOffset;
}
mScrollIndicator.setTranslationX(indicatorPos);
- mScrollIndicator.invalidate();
}
public void showScrollIndicatorTrack() {
diff --git a/src/com/android/launcher2/PagedViewGridLayout.java b/src/com/android/launcher2/PagedViewGridLayout.java
index b1b621598..90bfe88ec 100644
--- a/src/com/android/launcher2/PagedViewGridLayout.java
+++ b/src/com/android/launcher2/PagedViewGridLayout.java
@@ -109,6 +109,7 @@ public class PagedViewGridLayout extends GridLayout implements Page {
@Override
public void removeAllViewsOnPage() {
removeAllViews();
+ mOnLayoutListener = null;
destroyHardwareLayer();
}
diff --git a/src/com/android/launcher2/PagedViewIcon.java b/src/com/android/launcher2/PagedViewIcon.java
index af10f189c..4149ab618 100644
--- a/src/com/android/launcher2/PagedViewIcon.java
+++ b/src/com/android/launcher2/PagedViewIcon.java
@@ -16,43 +16,28 @@
package com.android.launcher2;
-import android.animation.ObjectAnimator;
import android.content.Context;
-import android.content.res.Resources;
import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
import android.util.AttributeSet;
-import android.widget.Checkable;
import android.widget.TextView;
-import com.android.launcher.R;
-
-
/**
* An icon on a PagedView, specifically for items in the launcher's paged view (with compound
* drawables on the top).
*/
-public class PagedViewIcon extends TextView implements Checkable {
- private static final String TAG = "PagedViewIcon";
-
- // holographic outline
- private final Paint mPaint = new Paint();
- private Bitmap mCheckedOutline;
- private Bitmap mHolographicOutline;
- private Bitmap mIcon;
+public class PagedViewIcon extends TextView {
+ /** A simple callback interface to allow a PagedViewIcon to notify when it has been pressed */
+ public static interface PressedCallback {
+ void iconPressed(PagedViewIcon icon);
+ }
- private int mAlpha = 255;
- private int mHolographicAlpha;
+ private static final String TAG = "PagedViewIcon";
+ private static final float PRESS_ALPHA = 0.4f;
- private boolean mIsChecked;
- private ObjectAnimator mCheckedAlphaAnimator;
- private float mCheckedAlpha = 1.0f;
- private int mCheckedFadeInDuration;
- private int mCheckedFadeOutDuration;
+ private PagedViewIcon.PressedCallback mPressedCallback;
+ private boolean mLockDrawableState = false;
- HolographicPagedViewIcon mHolographicOutlineView;
- private HolographicOutlineHelper mHolographicOutlineHelper;
+ private Bitmap mIcon;
public PagedViewIcon(Context context) {
this(context, null);
@@ -64,131 +49,43 @@ public class PagedViewIcon extends TextView implements Checkable {
public PagedViewIcon(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
-
- // Set up fade in/out constants
- final Resources r = context.getResources();
- final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha);
- if (alpha > 0) {
- mCheckedAlpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha) / 256.0f;
- mCheckedFadeInDuration =
- r.getInteger(R.integer.config_dragAppsCustomizeIconFadeInDuration);
- mCheckedFadeOutDuration =
- r.getInteger(R.integer.config_dragAppsCustomizeIconFadeOutDuration);
- }
-
- mHolographicOutlineView = new HolographicPagedViewIcon(context, this);
- }
-
- protected HolographicPagedViewIcon getHolographicOutlineView() {
- return mHolographicOutlineView;
- }
-
- protected Bitmap getHolographicOutline() {
- return mHolographicOutline;
}
public void applyFromApplicationInfo(ApplicationInfo info, boolean scaleUp,
- HolographicOutlineHelper holoOutlineHelper) {
- mHolographicOutlineHelper = holoOutlineHelper;
+ PagedViewIcon.PressedCallback cb) {
mIcon = info.iconBitmap;
+ mPressedCallback = cb;
setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null);
setText(info.title);
setTag(info);
}
- public void setHolographicOutline(Bitmap holoOutline) {
- mHolographicOutline = holoOutline;
- getHolographicOutlineView().invalidate();
- }
-
- @Override
- public void setAlpha(float alpha) {
- final float viewAlpha = HolographicOutlineHelper.viewAlphaInterpolator(alpha);
- final float holographicAlpha = HolographicOutlineHelper.highlightAlphaInterpolator(alpha);
- int newViewAlpha = (int) (viewAlpha * 255);
- int newHolographicAlpha = (int) (holographicAlpha * 255);
- if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) {
- mAlpha = newViewAlpha;
- mHolographicAlpha = newHolographicAlpha;
- super.setAlpha(viewAlpha);
- }
- }
-
- public void invalidateCheckedImage() {
- if (mCheckedOutline != null) {
- mCheckedOutline.recycle();
- mCheckedOutline = null;
- }
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- if (mAlpha > 0) {
- super.onDraw(canvas);
- }
-
- Bitmap overlay = null;
-
- // draw any blended overlays
- if (mCheckedOutline != null) {
- mPaint.setAlpha(255);
- overlay = mCheckedOutline;
- }
-
- if (overlay != null) {
- final int offset = getScrollX();
- final int compoundPaddingLeft = getCompoundPaddingLeft();
- final int compoundPaddingRight = getCompoundPaddingRight();
- int hspace = getWidth() - compoundPaddingRight - compoundPaddingLeft;
- canvas.drawBitmap(overlay,
- offset + compoundPaddingLeft + (hspace - overlay.getWidth()) / 2,
- mPaddingTop,
- mPaint);
- }
+ public void lockDrawableState() {
+ mLockDrawableState = true;
}
- @Override
- public boolean isChecked() {
- return mIsChecked;
+ public void resetDrawableState() {
+ mLockDrawableState = false;
+ post(new Runnable() {
+ @Override
+ public void run() {
+ refreshDrawableState();
+ }
+ });
}
- void setChecked(boolean checked, boolean animate) {
- if (mIsChecked != checked) {
- mIsChecked = checked;
-
- float alpha;
- int duration;
- if (mIsChecked) {
- alpha = mCheckedAlpha;
- duration = mCheckedFadeInDuration;
- } else {
- alpha = 1.0f;
- duration = mCheckedFadeOutDuration;
- }
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
- // Initialize the animator
- if (mCheckedAlphaAnimator != null) {
- mCheckedAlphaAnimator.cancel();
+ // We keep in the pressed state until resetDrawableState() is called to reset the press
+ // feedback
+ if (isPressed()) {
+ setAlpha(PRESS_ALPHA);
+ if (mPressedCallback != null) {
+ mPressedCallback.iconPressed(this);
}
- if (animate) {
- mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
- mCheckedAlphaAnimator.setDuration(duration);
- mCheckedAlphaAnimator.start();
- } else {
- setAlpha(alpha);
- }
-
- invalidate();
+ } else if (!mLockDrawableState) {
+ setAlpha(1f);
}
}
-
- @Override
- public void setChecked(boolean checked) {
- setChecked(checked, true);
- }
-
- @Override
- public void toggle() {
- setChecked(!mIsChecked);
- }
}
diff --git a/src/com/android/launcher2/PagedViewWidget.java b/src/com/android/launcher2/PagedViewWidget.java
index 8fcfa8fed..670717e49 100644
--- a/src/com/android/launcher2/PagedViewWidget.java
+++ b/src/com/android/launcher2/PagedViewWidget.java
@@ -16,20 +16,14 @@
package com.android.launcher2;
-import android.animation.ObjectAnimator;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
import android.util.AttributeSet;
-import android.view.KeyEvent;
import android.view.MotionEvent;
-import android.widget.Checkable;
+import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -39,27 +33,15 @@ import com.android.launcher.R;
/**
* The linear layout used strictly for the widget/wallpaper tab of the customization tray
*/
-public class PagedViewWidget extends LinearLayout implements Checkable {
+public class PagedViewWidget extends LinearLayout {
static final String TAG = "PagedViewWidgetLayout";
private static boolean sDeletePreviewsWhenDetachedFromWindow = true;
- private final Paint mPaint = new Paint();
- private Bitmap mHolographicOutline;
- private HolographicOutlineHelper mHolographicOutlineHelper;
- private ImageView mPreviewImageView;
- private final RectF mTmpScaleRect = new RectF();
-
private String mDimensionsFormatString;
-
- private int mAlpha = 255;
- private int mHolographicAlpha;
-
- private boolean mIsChecked;
- private ObjectAnimator mCheckedAlphaAnimator;
- private float mCheckedAlpha = 1.0f;
- private int mCheckedFadeInDuration;
- private int mCheckedFadeOutDuration;
+ CheckForShortPress mPendingCheckForShortPress = null;
+ ShortPressListener mShortPressListener = null;
+ boolean mShortPressTriggered = false;
public PagedViewWidget(Context context) {
this(context, null);
@@ -72,16 +54,7 @@ public class PagedViewWidget extends LinearLayout implements Checkable {
public PagedViewWidget(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- // Set up fade in/out constants
final Resources r = context.getResources();
- final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha);
- if (alpha > 0) {
- mCheckedAlpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha) / 256.0f;
- mCheckedFadeInDuration =
- r.getInteger(R.integer.config_dragAppsCustomizeIconFadeInDuration);
- mCheckedFadeOutDuration =
- r.getInteger(R.integer.config_dragAppsCustomizeIconFadeOutDuration);
- }
mDimensionsFormatString = r.getString(R.string.widget_dims_format);
setWillNotDraw(false);
@@ -109,14 +82,12 @@ public class PagedViewWidget extends LinearLayout implements Checkable {
}
public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info,
- int maxWidth, int[] cellSpan, HolographicOutlineHelper holoOutlineHelper) {
- mHolographicOutlineHelper = holoOutlineHelper;
+ int maxWidth, int[] cellSpan) {
final ImageView image = (ImageView) findViewById(R.id.widget_preview);
if (maxWidth > -1) {
image.setMaxWidth(maxWidth);
}
image.setContentDescription(info.label);
- mPreviewImageView = image;
final TextView name = (TextView) findViewById(R.id.widget_name);
name.setText(info.label);
final TextView dims = (TextView) findViewById(R.id.widget_dims);
@@ -125,13 +96,10 @@ public class PagedViewWidget extends LinearLayout implements Checkable {
}
}
- public void applyFromResolveInfo(PackageManager pm, ResolveInfo info,
- HolographicOutlineHelper holoOutlineHelper) {
- mHolographicOutlineHelper = holoOutlineHelper;
+ public void applyFromResolveInfo(PackageManager pm, ResolveInfo info) {
CharSequence label = info.loadLabel(pm);
final ImageView image = (ImageView) findViewById(R.id.widget_preview);
image.setContentDescription(label);
- mPreviewImageView = image;
final TextView name = (TextView) findViewById(R.id.widget_name);
name.setText(label);
final TextView dims = (TextView) findViewById(R.id.widget_dims);
@@ -159,111 +127,74 @@ public class PagedViewWidget extends LinearLayout implements Checkable {
}
}
- public void setHolographicOutline(Bitmap holoOutline) {
- mHolographicOutline = holoOutline;
- invalidate();
+ void setShortPressListener(ShortPressListener listener) {
+ mShortPressListener = listener;
}
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- // We eat up the touch events here, since the PagedView (which uses the same swiping
- // touch code as Workspace previously) uses onInterceptTouchEvent() to determine when
- // the user is scrolling between pages. This means that if the pages themselves don't
- // handle touch events, it gets forwarded up to PagedView itself, and it's own
- // onTouchEvent() handling will prevent further intercept touch events from being called
- // (it's the same view in that case). This is not ideal, but to prevent more changes,
- // we just always mark the touch event as handled.
- return super.onTouchEvent(event) || true;
+ interface ShortPressListener {
+ void onShortPress(View v);
+ void cleanUpShortPress(View v);
}
- @Override
- protected void onDraw(Canvas canvas) {
- if (mAlpha > 0) {
- super.onDraw(canvas);
- }
-
- // draw any blended overlays
- if (mHolographicOutline != null && mHolographicAlpha > 0) {
- // Calculate how much to scale the holographic preview
- mTmpScaleRect.set(0,0,1,1);
- mPreviewImageView.getImageMatrix().mapRect(mTmpScaleRect);
-
- mPaint.setAlpha(mHolographicAlpha);
- canvas.save();
- canvas.scale(mTmpScaleRect.right, mTmpScaleRect.bottom);
- canvas.drawBitmap(mHolographicOutline, mPreviewImageView.getLeft(),
- mPreviewImageView.getTop(), mPaint);
- canvas.restore();
+ class CheckForShortPress implements Runnable {
+ public void run() {
+ if (mShortPressListener != null) {
+ mShortPressListener.onShortPress(PagedViewWidget.this);
+ }
+ mShortPressTriggered = true;
}
}
- @Override
- protected boolean onSetAlpha(int alpha) {
- return true;
- }
-
- private void setChildrenAlpha(float alpha) {
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; i++) {
- getChildAt(i).setAlpha(alpha);
+ private void checkForShortPress() {
+ if (mPendingCheckForShortPress == null) {
+ mPendingCheckForShortPress = new CheckForShortPress();
}
+ postDelayed(mPendingCheckForShortPress, 120);
}
- @Override
- public void setAlpha(float alpha) {
- final float viewAlpha = mHolographicOutlineHelper.viewAlphaInterpolator(alpha);
- final float holographicAlpha = mHolographicOutlineHelper.highlightAlphaInterpolator(alpha);
- int newViewAlpha = (int) (viewAlpha * 255);
- int newHolographicAlpha = (int) (holographicAlpha * 255);
- if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) {
- mAlpha = newViewAlpha;
- mHolographicAlpha = newHolographicAlpha;
- setChildrenAlpha(viewAlpha);
- super.setAlpha(viewAlpha);
+
+ /**
+ * Remove the longpress detection timer.
+ */
+ private void removeShortPressCallback() {
+ if (mPendingCheckForShortPress != null) {
+ removeCallbacks(mPendingCheckForShortPress);
}
}
- void setChecked(boolean checked, boolean animate) {
- if (mIsChecked != checked) {
- mIsChecked = checked;
-
- float alpha;
- int duration;
- if (mIsChecked) {
- alpha = mCheckedAlpha;
- duration = mCheckedFadeInDuration;
- } else {
- alpha = 1.0f;
- duration = mCheckedFadeOutDuration;
- }
-
- // Initialize the animator
- if (mCheckedAlphaAnimator != null) {
- mCheckedAlphaAnimator.cancel();
- }
- if (animate) {
- mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
- mCheckedAlphaAnimator.setDuration(duration);
- mCheckedAlphaAnimator.start();
- } else {
- setAlpha(alpha);
+ private void cleanUpShortPress() {
+ removeShortPressCallback();
+ if (mShortPressTriggered) {
+ if (mShortPressListener != null) {
+ mShortPressListener.cleanUpShortPress(PagedViewWidget.this);
}
-
- invalidate();
+ mShortPressTriggered = false;
}
}
@Override
- public void setChecked(boolean checked) {
- setChecked(checked, true);
- }
-
- @Override
- public boolean isChecked() {
- return mIsChecked;
- }
-
- @Override
- public void toggle() {
- setChecked(!mIsChecked);
+ public boolean onTouchEvent(MotionEvent event) {
+ super.onTouchEvent(event);
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_UP:
+ cleanUpShortPress();
+ break;
+ case MotionEvent.ACTION_DOWN:
+ checkForShortPress();
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ cleanUpShortPress();
+ break;
+ case MotionEvent.ACTION_MOVE:
+ break;
+ }
+ // We eat up the touch events here, since the PagedView (which uses the same swiping
+ // touch code as Workspace previously) uses onInterceptTouchEvent() to determine when
+ // the user is scrolling between pages. This means that if the pages themselves don't
+ // handle touch events, it gets forwarded up to PagedView itself, and it's own
+ // onTouchEvent() handling will prevent further intercept touch events from being called
+ // (it's the same view in that case). This is not ideal, but to prevent more changes,
+ // we just always mark the touch event as handled.
+ return true;
}
}
diff --git a/src/com/android/launcher2/PagedViewWithDraggableItems.java b/src/com/android/launcher2/PagedViewWithDraggableItems.java
index 287a06565..a0479707e 100644
--- a/src/com/android/launcher2/PagedViewWithDraggableItems.java
+++ b/src/com/android/launcher2/PagedViewWithDraggableItems.java
@@ -165,4 +165,12 @@ public abstract class PagedViewWithDraggableItems extends PagedView
cancelDragging();
super.onDetachedFromWindow();
}
+
+ /** Show the scrolling indicators when we move the page */
+ protected void onPageBeginMoving() {
+ showScrollingIndicator(false);
+ }
+ protected void onPageEndMoving() {
+ hideScrollingIndicator(false);
+ }
}
diff --git a/src/com/android/launcher2/PendingAddItemInfo.java b/src/com/android/launcher2/PendingAddItemInfo.java
index 9c52ecfa0..d36e21763 100644
--- a/src/com/android/launcher2/PendingAddItemInfo.java
+++ b/src/com/android/launcher2/PendingAddItemInfo.java
@@ -16,6 +16,7 @@
package com.android.launcher2;
+import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.os.Parcelable;
@@ -33,8 +34,12 @@ class PendingAddItemInfo extends ItemInfo {
class PendingAddWidgetInfo extends PendingAddItemInfo {
int minWidth;
int minHeight;
+ int minResizeWidth;
+ int minResizeHeight;
int previewImage;
int icon;
+ AppWidgetProviderInfo info;
+ AppWidgetHostView boundWidget;
// Any configuration data that we want to pass to a configuration activity when
// starting up a widget
@@ -43,9 +48,12 @@ class PendingAddWidgetInfo extends PendingAddItemInfo {
public PendingAddWidgetInfo(AppWidgetProviderInfo i, String dataMimeType, Parcelable data) {
itemType = LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET;
+ this.info = i;
componentName = i.provider;
minWidth = i.minWidth;
minHeight = i.minHeight;
+ minResizeWidth = i.minResizeWidth;
+ minResizeHeight = i.minResizeHeight;
previewImage = i.previewImage;
icon = i.icon;
if (dataMimeType != null && data != null) {
@@ -53,4 +61,20 @@ class PendingAddWidgetInfo extends PendingAddItemInfo {
configurationData = data;
}
}
-} \ No newline at end of file
+
+ // Copy constructor
+ public PendingAddWidgetInfo(PendingAddWidgetInfo copy) {
+ minWidth = copy.minWidth;
+ minHeight = copy.minHeight;
+ minResizeWidth = copy.minResizeWidth;
+ minResizeHeight = copy.minResizeHeight;
+ previewImage = copy.previewImage;
+ icon = copy.icon;
+ info = copy.info;
+ boundWidget = copy.boundWidget;
+ mimeType = copy.mimeType;
+ configurationData = copy.configurationData;
+ componentName = copy.componentName;
+ itemType = copy.itemType;
+ }
+}
diff --git a/src/com/android/launcher2/RocketLauncher.java b/src/com/android/launcher2/RocketLauncher.java
index 125537464..505ac4c9e 100644
--- a/src/com/android/launcher2/RocketLauncher.java
+++ b/src/com/android/launcher2/RocketLauncher.java
@@ -23,7 +23,6 @@ package com.android.launcher2;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.TimeAnimator;
-import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -31,6 +30,7 @@ import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
+import android.support.v13.dreams.BasicDream;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
@@ -44,7 +44,7 @@ import com.android.launcher.R;
import java.util.HashMap;
import java.util.Random;
-public class RocketLauncher extends Activity {
+public class RocketLauncher extends BasicDream {
public static final boolean ROCKET_LAUNCHER = true;
public static class Board extends FrameLayout
diff --git a/src/com/android/launcher2/SearchDropTargetBar.java b/src/com/android/launcher2/SearchDropTargetBar.java
index 3a7f24b09..03ca38fb4 100644
--- a/src/com/android/launcher2/SearchDropTargetBar.java
+++ b/src/com/android/launcher2/SearchDropTargetBar.java
@@ -129,14 +129,26 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D
@Override
public void onAnimationStart(Animator animation) {
mQSBSearchBar.setVisibility(View.VISIBLE);
+ mQSBSearchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mQSBSearchBar.setLayerType(View.LAYER_TYPE_NONE, null);
}
});
mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 0f);
mQSBSearchBarFadeOutAnim.setDuration(sTransitionOutDuration);
mQSBSearchBarFadeOutAnim.addListener(new AnimatorListenerAdapter() {
@Override
+ public void onAnimationStart(Animator animation) {
+ mQSBSearchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ }
+
+ @Override
public void onAnimationEnd(Animator animation) {
mQSBSearchBar.setVisibility(View.INVISIBLE);
+ mQSBSearchBar.setLayerType(View.LAYER_TYPE_NONE, null);
}
});
}
diff --git a/src/com/android/launcher2/SpringLoadedDragController.java b/src/com/android/launcher2/SpringLoadedDragController.java
index 358362c85..d96aab794 100644
--- a/src/com/android/launcher2/SpringLoadedDragController.java
+++ b/src/com/android/launcher2/SpringLoadedDragController.java
@@ -18,7 +18,7 @@ package com.android.launcher2;
public class SpringLoadedDragController implements OnAlarmListener {
// how long the user must hover over a mini-screen before it unshrinks
- final long ENTER_SPRING_LOAD_HOVER_TIME = 550;
+ final long ENTER_SPRING_LOAD_HOVER_TIME = 500;
final long ENTER_SPRING_LOAD_CANCEL_HOVER_TIME = 950;
final long EXIT_SPRING_LOAD_HOVER_TIME = 200;
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index a6a1ed535..dffaf896c 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -17,7 +17,6 @@
package com.android.launcher2;
import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
@@ -42,7 +41,6 @@ import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
-import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region.Op;
@@ -59,6 +57,8 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
+import android.view.View.MeasureSpec;
+import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
@@ -79,7 +79,7 @@ import java.util.List;
*/
public class Workspace extends SmoothPagedView
implements DropTarget, DragSource, DragScroller, View.OnTouchListener,
- DragController.DragListener {
+ DragController.DragListener, LauncherTransitionable {
@SuppressWarnings({"UnusedDeclaration"})
private static final String TAG = "Launcher.Workspace";
@@ -94,6 +94,7 @@ public class Workspace extends SmoothPagedView
private static final int BACKGROUND_FADE_OUT_DURATION = 350;
private static final int ADJACENT_SCREEN_DROP_DURATION = 300;
+ private static final int FLING_THRESHOLD_VELOCITY = 500;
// These animators are used to fade the children's outlines
private ObjectAnimator mChildrenOutlineFadeInAnimation;
@@ -131,6 +132,7 @@ public class Workspace extends SmoothPagedView
* The CellLayout that is currently being dragged over
*/
private CellLayout mDragTargetLayout = null;
+ private boolean mDragHasEnteredWorkspace = false;
private Launcher mLauncher;
private IconCache mIconCache;
@@ -158,11 +160,6 @@ public class Workspace extends SmoothPagedView
enum State { NORMAL, SPRING_LOADED, SMALL };
private State mState = State.NORMAL;
private boolean mIsSwitchingState = false;
- private boolean mSwitchStateAfterFirstLayout = false;
- private State mStateAfterFirstLayout;
-
- private AnimatorSet mAnimator;
- private AnimatorListener mChangeStateAnimationListener;
boolean mAnimatingViewIntoPlace = false;
boolean mIsDragOccuring = false;
@@ -175,8 +172,8 @@ public class Workspace extends SmoothPagedView
private Bitmap mDragOutline = null;
private final Rect mTempRect = new Rect();
private final int[] mTempXY = new int[2];
- private int mDragViewMultiplyColor;
private float mOverscrollFade = 0;
+ public static final int DRAG_BITMAP_PADDING = 0;
// Paint used to draw external drop outline
private final Paint mExternalDragOutlinePaint = new Paint();
@@ -194,6 +191,7 @@ public class Workspace extends SmoothPagedView
private Runnable mDelayedResizeRunnable;
private int mDisplayWidth;
private int mDisplayHeight;
+ private boolean mIsStaticWallpaper;
private int mWallpaperTravelWidth;
// Variables relating to the creation of user folders by hovering shortcuts over shortcuts
@@ -210,6 +208,17 @@ public class Workspace extends SmoothPagedView
final static float MAX_SWIPE_ANGLE = (float) Math.PI / 3;
final static float TOUCH_SLOP_DAMPING_FACTOR = 4;
+ // Relating to the animation of items being dropped externally
+ public static final int ANIMATE_INTO_POSITION_AND_DISAPPEAR = 0;
+ public static final int ANIMATE_INTO_POSITION_AND_REMAIN = 1;
+ public static final int ANIMATE_INTO_POSITION_AND_RESIZE = 2;
+ public static final int COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION = 3;
+ public static final int CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION = 4;
+
+ // Relating to workspace drag fade out
+ private float mDragFadeOutAlpha;
+ private int mDragFadeOutDuration;
+
// These variables are used for storing the initial and final values during workspace animations
private int mSavedScrollX;
private float mSavedRotationY;
@@ -261,8 +270,10 @@ public class Workspace extends SmoothPagedView
// With workspace, data is available straight from the get-go
setDataIsReady();
- mFadeInAdjacentScreens =
- getResources().getBoolean(R.bool.config_workspaceFadeAdjacentScreens);
+ final Resources res = getResources();
+ mFadeInAdjacentScreens = res.getBoolean(R.bool.config_workspaceFadeAdjacentScreens);
+ mDragFadeOutAlpha = res.getInteger(R.integer.config_dragFadeOutAlpha) / 100f;
+ mDragFadeOutDuration = res.getInteger(R.integer.config_dragFadeOutDuration);
mWallpaperManager = WallpaperManager.getInstance(context);
int cellCountX = DEFAULT_CELL_COUNT_X;
@@ -271,7 +282,6 @@ public class Workspace extends SmoothPagedView
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.Workspace, defStyle, 0);
- final Resources res = context.getResources();
if (LauncherApplication.isScreenLarge()) {
// Determine number of rows/columns dynamically
// TODO: This code currently fails on tablets with an aspect ratio < 1.3.
@@ -299,7 +309,6 @@ public class Workspace extends SmoothPagedView
mSpringLoadedShrinkFactor =
res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f;
- mDragViewMultiplyColor = res.getColor(R.color.drag_view_multiply_color);
// if the value is manually specified, use that instead
cellCountX = a.getInt(R.styleable.Workspace_cellCountX, cellCountX);
@@ -320,13 +329,13 @@ public class Workspace extends SmoothPagedView
// estimate the size of a widget with spans hSpan, vSpan. return MAX_VALUE for each
// dimension if unsuccessful
public int[] estimateItemSize(int hSpan, int vSpan,
- PendingAddItemInfo pendingItemInfo, boolean springLoaded) {
+ ItemInfo itemInfo, boolean springLoaded) {
int[] size = new int[2];
if (getChildCount() > 0) {
CellLayout cl = (CellLayout) mLauncher.getWorkspace().getChildAt(0);
- RectF r = estimateItemPosition(cl, pendingItemInfo, 0, 0, hSpan, vSpan);
- size[0] = (int) r.width();
- size[1] = (int) r.height();
+ Rect r = estimateItemPosition(cl, itemInfo, 0, 0, hSpan, vSpan);
+ size[0] = r.width();
+ size[1] = r.height();
if (springLoaded) {
size[0] *= mSpringLoadedShrinkFactor;
size[1] *= mSpringLoadedShrinkFactor;
@@ -338,19 +347,10 @@ public class Workspace extends SmoothPagedView
return size;
}
}
- public RectF estimateItemPosition(CellLayout cl, ItemInfo pendingInfo,
+ public Rect estimateItemPosition(CellLayout cl, ItemInfo pendingInfo,
int hCell, int vCell, int hSpan, int vSpan) {
- RectF r = new RectF();
+ Rect r = new Rect();
cl.cellToRect(hCell, vCell, hSpan, vSpan, r);
- if (pendingInfo instanceof PendingAddWidgetInfo) {
- PendingAddWidgetInfo widgetInfo = (PendingAddWidgetInfo) pendingInfo;
- Rect p = AppWidgetHostView.getDefaultPaddingForWidget(mContext,
- widgetInfo.componentName, null);
- r.top += p.top;
- r.left += p.left;
- r.right -= p.right;
- r.bottom -= p.bottom;
- }
return r;
}
@@ -368,12 +368,32 @@ public class Workspace extends SmoothPagedView
mIsDragOccuring = true;
updateChildrenLayersEnabled();
mLauncher.lockScreenOrientationOnLargeUI();
+
+ // Fade out the workspace slightly to highlight the currently dragging item
+ int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ CellLayout cl = (CellLayout) getPageAt(i);
+ cl.getChildrenLayout().animate().alpha(mDragFadeOutAlpha)
+ .setInterpolator(new AccelerateInterpolator(1.5f))
+ .setDuration(mDragFadeOutDuration)
+ .start();
+ }
}
public void onDragEnd() {
mIsDragOccuring = false;
updateChildrenLayersEnabled();
mLauncher.unlockScreenOrientationOnLargeUI();
+
+ // Fade the workspace back in after we have completed dragging
+ int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ CellLayout cl = (CellLayout) getPageAt(i);
+ cl.getChildrenLayout().animate().alpha(1f)
+ .setInterpolator(new DecelerateInterpolator(1.5f))
+ .setDuration(mDragFadeOutDuration)
+ .start();
+ }
}
/**
@@ -396,28 +416,15 @@ public class Workspace extends SmoothPagedView
// In this case, we will skip drawing background protection
}
- mChangeStateAnimationListener = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- mIsSwitchingState = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- mIsSwitchingState = false;
- mWallpaperOffset.setOverrideHorizontalCatchupConstant(false);
- mAnimator = null;
- updateChildrenLayersEnabled();
- }
- };
-
- mSnapVelocity = 600;
mWallpaperOffset = new WallpaperOffsetInterpolator();
Display display = mLauncher.getWindowManager().getDefaultDisplay();
mDisplayWidth = display.getWidth();
mDisplayHeight = display.getHeight();
mWallpaperTravelWidth = (int) (mDisplayWidth *
wallpaperTravelToScreenWidthRatio(mDisplayWidth, mDisplayHeight));
+
+ mFlingThresholdVelocity = (int) (FLING_THRESHOLD_VELOCITY * mDensity);
+
}
@Override
@@ -523,10 +530,12 @@ public class Workspace extends SmoothPagedView
child.setOnKeyListener(new IconKeyEventListener());
}
- CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
- if (lp == null) {
+ LayoutParams genericLp = child.getLayoutParams();
+ CellLayout.LayoutParams lp;
+ if (genericLp == null || !(genericLp instanceof CellLayout.LayoutParams)) {
lp = new CellLayout.LayoutParams(x, y, spanX, spanY);
} else {
+ lp = (CellLayout.LayoutParams) genericLp;
lp.cellX = x;
lp.cellY = y;
lp.cellHSpan = spanX;
@@ -599,20 +608,26 @@ public class Workspace extends SmoothPagedView
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
- return (isSmall() || mIsSwitchingState);
+ return (isSmall() || !isFinishedSwitchingState());
}
public boolean isSwitchingState() {
return mIsSwitchingState;
}
+ /** This differs from isSwitchingState in that we take into account how far the transition
+ * has completed. */
+ public boolean isFinishedSwitchingState() {
+ return !mIsSwitchingState || (mTransitionProgress > 0.5f);
+ }
+
protected void onWindowVisibilityChanged (int visibility) {
mLauncher.onWindowVisibilityChanged(visibility);
}
@Override
public boolean dispatchUnhandledMove(View focused, int direction) {
- if (isSmall() || mIsSwitchingState) {
+ if (isSmall() || !isFinishedSwitchingState()) {
// when the home screens are shrunken, shouldn't allow side-scrolling
return false;
}
@@ -640,35 +655,36 @@ public class Workspace extends SmoothPagedView
@Override
protected void determineScrollingStart(MotionEvent ev) {
- if (!isSmall() && !mIsSwitchingState) {
- float deltaX = Math.abs(ev.getX() - mXDown);
- float deltaY = Math.abs(ev.getY() - mYDown);
+ if (isSmall()) return;
+ if (!isFinishedSwitchingState()) return;
- if (Float.compare(deltaX, 0f) == 0) return;
+ float deltaX = Math.abs(ev.getX() - mXDown);
+ float deltaY = Math.abs(ev.getY() - mYDown);
- float slope = deltaY / deltaX;
- float theta = (float) Math.atan(slope);
+ if (Float.compare(deltaX, 0f) == 0) return;
- if (deltaX > mTouchSlop || deltaY > mTouchSlop) {
- cancelCurrentPageLongPress();
- }
+ float slope = deltaY / deltaX;
+ float theta = (float) Math.atan(slope);
- if (theta > MAX_SWIPE_ANGLE) {
- // Above MAX_SWIPE_ANGLE, we don't want to ever start scrolling the workspace
- return;
- } else if (theta > START_DAMPING_TOUCH_SLOP_ANGLE) {
- // Above START_DAMPING_TOUCH_SLOP_ANGLE and below MAX_SWIPE_ANGLE, we want to
- // increase the touch slop to make it harder to begin scrolling the workspace. This
- // results in vertically scrolling widgets to more easily. The higher the angle, the
- // more we increase touch slop.
- theta -= START_DAMPING_TOUCH_SLOP_ANGLE;
- float extraRatio = (float)
- Math.sqrt((theta / (MAX_SWIPE_ANGLE - START_DAMPING_TOUCH_SLOP_ANGLE)));
- super.determineScrollingStart(ev, 1 + TOUCH_SLOP_DAMPING_FACTOR * extraRatio);
- } else {
- // Below START_DAMPING_TOUCH_SLOP_ANGLE, we don't do anything special
- super.determineScrollingStart(ev);
- }
+ if (deltaX > mTouchSlop || deltaY > mTouchSlop) {
+ cancelCurrentPageLongPress();
+ }
+
+ if (theta > MAX_SWIPE_ANGLE) {
+ // Above MAX_SWIPE_ANGLE, we don't want to ever start scrolling the workspace
+ return;
+ } else if (theta > START_DAMPING_TOUCH_SLOP_ANGLE) {
+ // Above START_DAMPING_TOUCH_SLOP_ANGLE and below MAX_SWIPE_ANGLE, we want to
+ // increase the touch slop to make it harder to begin scrolling the workspace. This
+ // results in vertically scrolling widgets to more easily. The higher the angle, the
+ // more we increase touch slop.
+ theta -= START_DAMPING_TOUCH_SLOP_ANGLE;
+ float extraRatio = (float)
+ Math.sqrt((theta / (MAX_SWIPE_ANGLE - START_DAMPING_TOUCH_SLOP_ANGLE)));
+ super.determineScrollingStart(ev, 1 + TOUCH_SLOP_DAMPING_FACTOR * extraRatio);
+ } else {
+ // Below START_DAMPING_TOUCH_SLOP_ANGLE, we don't do anything special
+ super.determineScrollingStart(ev);
}
}
@@ -696,7 +712,19 @@ public class Workspace extends SmoothPagedView
// Only show page outlines as we pan if we are on large screen
if (LauncherApplication.isScreenLarge()) {
showOutlines();
+ mIsStaticWallpaper = mWallpaperManager.getWallpaperInfo() == null;
+ }
+
+ // If we are not fading in adjacent screens, we still need to restore the alpha in case the
+ // user scrolls while we are transitioning (should not affect dispatchDraw optimizations)
+ if (!mFadeInAdjacentScreens) {
+ for (int i = 0; i < getChildCount(); ++i) {
+ getPageAt(i).setAlpha(1f);
+ }
}
+
+ // Show the scroll indicator as you pan the page
+ showScrollingIndicator(false);
}
protected void onPageEndMoving() {
@@ -708,12 +736,23 @@ public class Workspace extends SmoothPagedView
clearChildrenCache();
}
- // Hide the outlines, as long as we're not dragging
- if (!mDragController.dragging()) {
- // Only hide page outlines as we pan if we are on large screen
+
+ if (mDragController.isDragging()) {
+ if (isSmall()) {
+ // If we are in springloaded mode, then force an event to check if the current touch
+ // is under a new page (to scroll to)
+ mDragController.forceMoveEvent();
+ }
+ } else {
+ // If we are not mid-dragging, hide the page outlines if we are on a large screen
if (LauncherApplication.isScreenLarge()) {
hideOutlines();
}
+
+ // Hide the scroll indicator as you pan the page
+ if (!mDragController.isDragging()) {
+ hideScrollingIndicator(false);
+ }
}
mOverScrollMaxBackgroundAlpha = 0.0f;
mOverScrollPageIndex = -1;
@@ -784,28 +823,7 @@ public class Workspace extends SmoothPagedView
}.start();
}
- public void setVerticalWallpaperOffset(float offset) {
- mWallpaperOffset.setFinalY(offset);
- }
- public float getVerticalWallpaperOffset() {
- return mWallpaperOffset.getCurrY();
- }
- public void setHorizontalWallpaperOffset(float offset) {
- mWallpaperOffset.setFinalX(offset);
- }
- public float getHorizontalWallpaperOffset() {
- return mWallpaperOffset.getCurrX();
- }
-
private float wallpaperOffsetForCurrentScroll() {
- // The wallpaper travel width is how far, from left to right, the wallpaper will move
- // at this orientation. On tablets in portrait mode we don't move all the way to the
- // edges of the wallpaper, or otherwise the parallax effect would be too strong.
- int wallpaperTravelWidth = mWallpaperWidth;
- if (LauncherApplication.isScreenLarge()) {
- wallpaperTravelWidth = mWallpaperTravelWidth;
- }
-
// Set wallpaper offset steps (1 / (number of screens - 1))
mWallpaperManager.setWallpaperOffsetSteps(1.0f / (getChildCount() - 1), 1.0f);
@@ -823,11 +841,22 @@ public class Workspace extends SmoothPagedView
float scrollProgress =
adjustedScrollX / (float) scrollRange;
- float offsetInDips = wallpaperTravelWidth * scrollProgress +
- (mWallpaperWidth - wallpaperTravelWidth) / 2; // center it
- float offset = offsetInDips / (float) mWallpaperWidth;
- return offset;
+
+ if (LauncherApplication.isScreenLarge() && mIsStaticWallpaper) {
+ // The wallpaper travel width is how far, from left to right, the wallpaper will move
+ // at this orientation. On tablets in portrait mode we don't move all the way to the
+ // edges of the wallpaper, or otherwise the parallax effect would be too strong.
+ int wallpaperTravelWidth = Math.min(mWallpaperTravelWidth, mWallpaperWidth);
+
+ float offsetInDips = wallpaperTravelWidth * scrollProgress +
+ (mWallpaperWidth - wallpaperTravelWidth) / 2; // center it
+ float offset = offsetInDips / (float) mWallpaperWidth;
+ return offset;
+ } else {
+ return scrollProgress;
+ }
}
+
private void syncWallpaperOffsetWithScroll() {
final boolean enableWallpaperEffects = isHardwareAccelerated();
if (enableWallpaperEffects) {
@@ -857,7 +886,7 @@ public class Workspace extends SmoothPagedView
}
}
if (keepUpdating) {
- fastInvalidate();
+ invalidate();
}
}
@@ -1169,13 +1198,12 @@ public class Workspace extends SmoothPagedView
backgroundAlphaInterpolator(Math.abs(scrollProgress)));
}
}
- cl.setFastTranslationX(translationX);
- cl.setFastRotationY(rotation);
+ cl.setTranslationX(translationX);
+ cl.setRotationY(rotation);
if (mFadeInAdjacentScreens && !isSmall()) {
float alpha = 1 - Math.abs(scrollProgress);
- cl.setFastAlpha(alpha);
+ cl.setAlpha(alpha);
}
- cl.fastInvalidate();
}
}
if (!isSwitchingState() && !isInOverscroll) {
@@ -1248,19 +1276,6 @@ public class Workspace extends SmoothPagedView
mUpdateWallpaperOffsetImmediately = true;
}
super.onLayout(changed, left, top, right, bottom);
-
- // if shrinkToBottom() is called on initialization, it has to be deferred
- // until after the first call to onLayout so that it has the correct width
- if (mSwitchStateAfterFirstLayout) {
- mSwitchStateAfterFirstLayout = false;
- // shrink can trigger a synchronous onLayout call, so we
- // post this to avoid a stack overflow / tangled onLayout calls
- post(new Runnable() {
- public void run() {
- changeState(mStateAfterFirstLayout, false);
- }
- });
- }
}
@Override
@@ -1283,32 +1298,6 @@ public class Workspace extends SmoothPagedView
return (mBackground != null && mBackgroundAlpha > 0.0f && mDrawBackground);
}
- public void scrollTo (int x, int y) {
- super.scrollTo(x, y);
- syncChildrenLayersEnabledOnVisiblePages();
- }
-
- // This method just applies the value mChildrenLayersEnabled to all the pages that
- // will be rendered on the next frame.
- // We do this because calling setChildrenLayersEnabled on a view that's not
- // visible/rendered causes slowdowns on some graphics cards
- private void syncChildrenLayersEnabledOnVisiblePages() {
- if (mChildrenLayersEnabled) {
- getVisiblePages(mTempVisiblePagesRange);
- final int leftScreen = mTempVisiblePagesRange[0];
- final int rightScreen = mTempVisiblePagesRange[1];
- if (leftScreen != -1 && rightScreen != -1) {
- for (int i = leftScreen; i <= rightScreen; i++) {
- ViewGroup page = (ViewGroup) getPageAt(i);
- if (page.getVisibility() == VISIBLE &&
- page.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD) {
- ((ViewGroup)getPageAt(i)).setChildrenLayersEnabled(true);
- }
- }
- }
- }
- }
-
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
@@ -1323,8 +1312,9 @@ public class Workspace extends SmoothPagedView
final int paddingTop = mPaddingTop + offset;
final int paddingBottom = mPaddingBottom + offset;
- final CellLayout leftPage = (CellLayout) getChildAt(mCurrentPage - 1);
- final CellLayout rightPage = (CellLayout) getChildAt(mCurrentPage + 1);
+ final int page = (mNextPage != INVALID_PAGE ? mNextPage : mCurrentPage);
+ final CellLayout leftPage = (CellLayout) getChildAt(page - 1);
+ final CellLayout rightPage = (CellLayout) getChildAt(page + 1);
if (leftPage != null && leftPage.getIsDragOverlapping()) {
final Drawable d = getResources().getDrawable(R.drawable.page_hover_left_holo);
@@ -1415,13 +1405,8 @@ public class Workspace extends SmoothPagedView
if (enableChildrenLayers != mChildrenLayersEnabled) {
mChildrenLayersEnabled = enableChildrenLayers;
- // calling setChildrenLayersEnabled on a view that's not visible/rendered
- // causes slowdowns on some graphics cards, so we only disable it here and leave
- // the enabling to dispatchDraw
- if (!enableChildrenLayers) {
- for (int i = 0; i < getPageCount(); i++) {
- ((ViewGroup)getChildAt(i)).setChildrenLayersEnabled(false);
- }
+ for (int i = 0; i < getPageCount(); i++) {
+ ((ViewGroup)getChildAt(i)).setChildrenLayersEnabled(mChildrenLayersEnabled);
}
}
}
@@ -1510,23 +1495,18 @@ public class Workspace extends SmoothPagedView
public void onDragStartedWithItem(View v) {
final Canvas canvas = new Canvas();
- // We need to add extra padding to the bitmap to make room for the glow effect
- final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-
// The outline is used to visualize where the item will land if dropped
- mDragOutline = createDragOutline(v, canvas, bitmapPadding);
+ mDragOutline = createDragOutline(v, canvas, DRAG_BITMAP_PADDING);
}
public void onDragStartedWithItem(PendingAddItemInfo info, Bitmap b, Paint alphaClipPaint) {
final Canvas canvas = new Canvas();
- // We need to add extra padding to the bitmap to make room for the glow effect
- final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-
int[] size = estimateItemSize(info.spanX, info.spanY, info, false);
// The outline is used to visualize where the item will land if dropped
- mDragOutline = createDragOutline(b, canvas, bitmapPadding, size[0], size[1], alphaClipPaint);
+ mDragOutline = createDragOutline(b, canvas, DRAG_BITMAP_PADDING, size[0],
+ size[1], alphaClipPaint);
}
// we call this method whenever a drag and drop in Launcher finishes, even if Workspace was
@@ -1564,32 +1544,19 @@ public class Workspace extends SmoothPagedView
mNewRotationYs = new float[childCount];
}
- public void changeState(State shrinkState) {
- changeState(shrinkState, true);
+ Animator getChangeStateAnimation(final State state, boolean animated) {
+ return getChangeStateAnimation(state, animated, 0);
}
- void changeState(final State state, boolean animated) {
- changeState(state, animated, 0);
- }
-
- void changeState(final State state, boolean animated, int delay) {
+ Animator getChangeStateAnimation(final State state, boolean animated, int delay) {
if (mState == state) {
- return;
- }
- if (mFirstLayout) {
- // (mFirstLayout == "first layout has not happened yet")
- // cancel any pending shrinks that were set earlier
- mSwitchStateAfterFirstLayout = false;
- mStateAfterFirstLayout = state;
- return;
+ return null;
}
// Initialize animation arrays for the first time if necessary
initAnimationArrays();
- // Cancel any running transition animations
- if (mAnimator != null) mAnimator.cancel();
- mAnimator = new AnimatorSet();
+ AnimatorSet anim = animated ? new AnimatorSet() : null;
// Stop any scrolling, move to the current page right away
setCurrentPage((mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage);
@@ -1689,81 +1656,65 @@ public class Workspace extends SmoothPagedView
cl.setBackgroundAlphaMultiplier(finalAlphaMultiplierValue);
cl.setAlpha(finalAlpha);
cl.setRotationY(rotation);
- mChangeStateAnimationListener.onAnimationEnd(null);
}
}
if (animated) {
- ValueAnimator animWithInterpolator =
- ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
-
- if (zoomIn) {
- animWithInterpolator.setInterpolator(mZoomInInterpolator);
- }
-
- animWithInterpolator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(android.animation.Animator animation) {
- // The above code to determine initialAlpha and finalAlpha will ensure that only
- // the current page is visible during (and subsequently, after) the transition
- // animation. If fade adjacent pages is disabled, then re-enable the page
- // visibility after the transition animation.
- if (!mFadeInAdjacentScreens && stateIsNormal && oldStateIsSmall) {
- for (int i = 0; i < getChildCount(); i++) {
- final CellLayout cl = (CellLayout) getChildAt(i);
- cl.setAlpha(1f);
- }
- }
- }
- });
- animWithInterpolator.addUpdateListener(new LauncherAnimatorUpdateListener() {
- public void onAnimationUpdate(float a, float b) {
- mTransitionProgress = b;
- if (b == 0f) {
- // an optimization, but not required
- return;
- }
- invalidate();
- for (int i = 0; i < getChildCount(); i++) {
- final CellLayout cl = (CellLayout) getChildAt(i);
- cl.invalidate();
- cl.setFastTranslationX(a * mOldTranslationXs[i] + b * mNewTranslationXs[i]);
- cl.setFastTranslationY(a * mOldTranslationYs[i] + b * mNewTranslationYs[i]);
- cl.setFastScaleX(a * mOldScaleXs[i] + b * mNewScaleXs[i]);
- cl.setFastScaleY(a * mOldScaleYs[i] + b * mNewScaleYs[i]);
- cl.setFastBackgroundAlpha(
- a * mOldBackgroundAlphas[i] + b * mNewBackgroundAlphas[i]);
- cl.setBackgroundAlphaMultiplier(a * mOldBackgroundAlphaMultipliers[i] +
- b * mNewBackgroundAlphaMultipliers[i]);
- cl.setFastAlpha(a * mOldAlphas[i] + b * mNewAlphas[i]);
- cl.invalidate();
+ for (int index = 0; index < getChildCount(); index++) {
+ final int i = index;
+ final CellLayout cl = (CellLayout) getChildAt(i);
+ if (mOldAlphas[i] == 0 && mNewAlphas[i] == 0) {
+ cl.setTranslationX(mNewTranslationXs[i]);
+ cl.setTranslationY(mNewTranslationYs[i]);
+ cl.setScaleX(mNewScaleXs[i]);
+ cl.setScaleY(mNewScaleYs[i]);
+ cl.setBackgroundAlpha(mNewBackgroundAlphas[i]);
+ cl.setBackgroundAlphaMultiplier(mNewBackgroundAlphaMultipliers[i]);
+ cl.setAlpha(mNewAlphas[i]);
+ cl.setRotationY(mNewRotationYs[i]);
+ } else {
+ LauncherViewPropertyAnimator a = new LauncherViewPropertyAnimator(cl);
+ a.translationX(mNewTranslationXs[i])
+ .translationY(mNewTranslationYs[i])
+ .scaleX(mNewScaleXs[i])
+ .scaleY(mNewScaleYs[i])
+ .setDuration(duration)
+ .setInterpolator(mZoomInInterpolator);
+ if (mOldAlphas[i] != mNewAlphas[i]) {
+ a.alpha(mNewAlphas[i]);
}
- syncChildrenLayersEnabledOnVisiblePages();
- }
- });
-
- ValueAnimator rotationAnim =
- ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
- rotationAnim.setInterpolator(new DecelerateInterpolator(2.0f));
- rotationAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
- public void onAnimationUpdate(float a, float b) {
- if (b == 0f) {
- // an optimization, but not required
- return;
+ anim.play(a);
+ if (mOldRotationYs[i] != 0 || mNewRotationYs[i] != 0) {
+ ValueAnimator rotate = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
+ rotate.setInterpolator(new DecelerateInterpolator(2.0f));
+ rotate.addUpdateListener(new LauncherAnimatorUpdateListener() {
+ public void onAnimationUpdate(float a, float b) {
+ cl.setRotationY(a * mOldRotationYs[i] + b * mNewRotationYs[i]);
+ }
+ });
+ anim.play(rotate);
}
- for (int i = 0; i < getChildCount(); i++) {
- final CellLayout cl = (CellLayout) getChildAt(i);
- cl.setFastRotationY(a * mOldRotationYs[i] + b * mNewRotationYs[i]);
+ if (mOldBackgroundAlphas[i] != 0 ||
+ mNewBackgroundAlphas[i] != 0 ||
+ mOldBackgroundAlphaMultipliers[i] != 0 ||
+ mNewBackgroundAlphaMultipliers[i] != 0) {
+ ValueAnimator bgAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
+ bgAnim.setInterpolator(mZoomInInterpolator);
+ bgAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
+ public void onAnimationUpdate(float a, float b) {
+ cl.setBackgroundAlpha(
+ a * mOldBackgroundAlphas[i] +
+ b * mNewBackgroundAlphas[i]);
+ cl.setBackgroundAlphaMultiplier(
+ a * mOldBackgroundAlphaMultipliers[i] +
+ b * mNewBackgroundAlphaMultipliers[i]);
+ }
+ });
+ anim.play(bgAnim);
}
}
- });
-
- mAnimator.playTogether(animWithInterpolator, rotationAnim);
- mAnimator.setStartDelay(delay);
- // If we call this when we're not animated, onAnimationEnd is never called on
- // the listener; make sure we only use the listener when we're actually animating
- mAnimator.addListener(mChangeStateAnimationListener);
- mAnimator.start();
+ }
+ anim.setStartDelay(delay);
}
if (stateIsSpringLoaded) {
@@ -1776,7 +1727,39 @@ public class Workspace extends SmoothPagedView
// Fade the background gradient away
animateBackgroundGradient(0f, true);
}
- syncChildrenLayersEnabledOnVisiblePages();
+ return anim;
+ }
+
+ @Override
+ public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) {
+ mIsSwitchingState = true;
+ }
+
+ @Override
+ public void onLauncherTransitionStep(Launcher l, float t) {
+ mTransitionProgress = t;
+ }
+
+ @Override
+ public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) {
+ mIsSwitchingState = false;
+ mWallpaperOffset.setOverrideHorizontalCatchupConstant(false);
+ updateChildrenLayersEnabled();
+ // The code in getChangeStateAnimation to determine initialAlpha and finalAlpha will ensure
+ // ensure that only the current page is visible during (and subsequently, after) the
+ // transition animation. If fade adjacent pages is disabled, then re-enable the page
+ // visibility after the transition animation.
+ if (!mFadeInAdjacentScreens) {
+ for (int i = 0; i < getChildCount(); i++) {
+ final CellLayout cl = (CellLayout) getChildAt(i);
+ cl.setAlpha(1f);
+ }
+ }
+ }
+
+ @Override
+ public View getContent() {
+ return this;
}
/**
@@ -1846,8 +1829,6 @@ public class Workspace extends SmoothPagedView
canvas.setBitmap(b);
drawDragView(v, canvas, padding, true);
- mOutlineHelper.applyOuterBlur(b, canvas, outlineColor);
- canvas.drawColor(mDragViewMultiplyColor, PorterDuff.Mode.MULTIPLY);
canvas.setBitmap(null);
return b;
@@ -1929,35 +1910,29 @@ public class Workspace extends SmoothPagedView
}
mDragInfo = cellInfo;
- child.setVisibility(GONE);
+ child.setVisibility(INVISIBLE);
child.clearFocus();
child.setPressed(false);
final Canvas canvas = new Canvas();
- // We need to add extra padding to the bitmap to make room for the glow effect
- final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-
// The outline is used to visualize where the item will land if dropped
- mDragOutline = createDragOutline(child, canvas, bitmapPadding);
+ mDragOutline = createDragOutline(child, canvas, DRAG_BITMAP_PADDING);
beginDragShared(child, this);
}
public void beginDragShared(View child, DragSource source) {
Resources r = getResources();
- // We need to add extra padding to the bitmap to make room for the glow effect
- final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-
// The drag bitmap follows the touch point around on the screen
- final Bitmap b = createDragBitmap(child, new Canvas(), bitmapPadding);
+ final Bitmap b = createDragBitmap(child, new Canvas(), DRAG_BITMAP_PADDING);
final int bmpWidth = b.getWidth();
mLauncher.getDragLayer().getLocationInDragLayer(child, mTempXY);
final int dragLayerX = (int) mTempXY[0] + (child.getWidth() - bmpWidth) / 2;
- int dragLayerY = mTempXY[1] - bitmapPadding / 2;
+ int dragLayerY = mTempXY[1] - DRAG_BITMAP_PADDING / 2;
Point dragVisualizeOffset = null;
Rect dragRect = null;
@@ -1971,7 +1946,8 @@ public class Workspace extends SmoothPagedView
dragLayerY += top;
// Note: The drag region is used to calculate drag layer offsets, but the
// dragVisualizeOffset in addition to the dragRect (the size) to position the outline.
- dragVisualizeOffset = new Point(-bitmapPadding / 2, iconPaddingTop - bitmapPadding / 2);
+ dragVisualizeOffset = new Point(-DRAG_BITMAP_PADDING / 2,
+ iconPaddingTop - DRAG_BITMAP_PADDING / 2);
dragRect = new Rect(left, top, right, bottom);
} else if (child instanceof FolderIcon) {
int previewSize = r.getDimensionPixelSize(R.dimen.folder_preview_size);
@@ -1985,8 +1961,11 @@ public class Workspace extends SmoothPagedView
}
mDragController.startDrag(b, dragLayerX, dragLayerY, source, child.getTag(),
- DragController.DRAG_ACTION_MOVE, dragVisualizeOffset, dragRect);
+ DragController.DRAG_ACTION_MOVE, dragVisualizeOffset, dragRect, 1f);
b.recycle();
+
+ // Show the scrolling indicator when you pick up an item
+ showScrollingIndicator(false);
}
void addApplicationShortcut(ShortcutInfo info, CellLayout target, long container, int screen,
@@ -2001,7 +1980,7 @@ public class Workspace extends SmoothPagedView
}
public boolean transitionStateShouldAllowDrop() {
- return (!isSwitchingState() || mTransitionProgress > 0.5f);
+ return ((!isSwitchingState() || mTransitionProgress > 0.5f) && mState != State.SMALL);
}
/**
@@ -2040,8 +2019,15 @@ public class Workspace extends SmoothPagedView
spanY = dragInfo.spanY;
}
+ int minSpanX = spanX;
+ int minSpanY = spanY;
+ if (d.dragInfo instanceof PendingAddWidgetInfo) {
+ minSpanX = ((PendingAddWidgetInfo) d.dragInfo).minSpanX;
+ minSpanY = ((PendingAddWidgetInfo) d.dragInfo).minSpanY;
+ }
mTargetCell = findNearestArea((int) mDragViewVisualCenter[0],
- (int) mDragViewVisualCenter[1], spanX, spanY, mDragTargetLayout, mTargetCell);
+ (int) mDragViewVisualCenter[1], minSpanX, minSpanY, mDragTargetLayout,
+ mTargetCell);
if (willCreateUserFolder((ItemInfo) d.dragInfo, mDragTargetLayout, mTargetCell, true)) {
return true;
}
@@ -2051,7 +2037,7 @@ public class Workspace extends SmoothPagedView
}
// Don't accept the drop if there's no room for the item
- if (!mDragTargetLayout.findCellForSpanIgnoring(null, spanX, spanY, ignoreView)) {
+ if (!mDragTargetLayout.findCellForSpanIgnoring(null, minSpanX, minSpanY, ignoreView)) {
// Don't show the message if we are dropping on the AllApps button and the hotseat
// is full
if (mTargetCell != null && mLauncher.isHotseatLayout(mDragTargetLayout)) {
@@ -2171,7 +2157,7 @@ public class Workspace extends SmoothPagedView
return false;
}
- public void onDrop(DragObject d) {
+ public void onDrop(final DragObject d) {
mDragViewVisualCenter = getDragViewVisualCenter(d.x, d.y, d.xOffset, d.yOffset, d.dragView,
mDragViewVisualCenter);
@@ -2187,6 +2173,7 @@ public class Workspace extends SmoothPagedView
CellLayout dropTargetLayout = mDragTargetLayout;
int snapScreen = -1;
+ boolean resizeOnDrop = false;
if (d.dragSource != this) {
final int[] touchXY = new int[] { (int) mDragViewVisualCenter[0],
(int) mDragViewVisualCenter[1] };
@@ -2194,6 +2181,7 @@ public class Workspace extends SmoothPagedView
} else if (mDragInfo != null) {
final View cell = mDragInfo.cell;
+ Runnable resizeRunnable = null;
if (dropTargetLayout != null) {
// Move internally
boolean hasMovedLayouts = (getParentCellLayoutForView(cell) != dropTargetLayout);
@@ -2222,29 +2210,46 @@ public class Workspace extends SmoothPagedView
// Aside from the special case where we're dropping a shortcut onto a shortcut,
// we need to find the nearest cell location that is vacant
+ ItemInfo item = (ItemInfo) d.dragInfo;
+ int minSpanX = item.spanX;
+ int minSpanY = item.spanY;
+ if (item.minSpanX > 0 && item.minSpanY > 0) {
+ minSpanX = item.minSpanX;
+ minSpanY = item.minSpanY;
+ }
+ int[] resultSpan = new int[2];
mTargetCell = findNearestVacantArea((int) mDragViewVisualCenter[0],
- (int) mDragViewVisualCenter[1], mDragInfo.spanX, mDragInfo.spanY, cell,
- dropTargetLayout, mTargetCell);
+ (int) mDragViewVisualCenter[1], minSpanX, minSpanY, mDragInfo.spanX,
+ mDragInfo.spanY, cell, dropTargetLayout, mTargetCell, resultSpan);
+ boolean foundCell = mTargetCell[0] >= 0 && mTargetCell[1] >= 0;
+ if (foundCell && (resultSpan[0] != item.spanX || resultSpan[1] != item.spanY)) {
+ resizeOnDrop = true;
+ item.spanX = resultSpan[0];
+ item.spanY = resultSpan[1];
+ }
if (mCurrentPage != screen && !hasMovedIntoHotseat) {
snapScreen = screen;
snapToPage(screen);
}
- if (mTargetCell[0] >= 0 && mTargetCell[1] >= 0) {
+ if (foundCell) {
+ final ItemInfo info = (ItemInfo) cell.getTag();
if (hasMovedLayouts) {
// Reparent the view
getParentCellLayoutForView(cell).removeView(cell);
addInScreen(cell, container, screen, mTargetCell[0], mTargetCell[1],
- mDragInfo.spanX, mDragInfo.spanY);
+ info.spanX, info.spanY);
}
// update the item's position after drop
- final ItemInfo info = (ItemInfo) cell.getTag();
CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams();
- dropTargetLayout.onMove(cell, mTargetCell[0], mTargetCell[1]);
+ dropTargetLayout.onMove(cell, mTargetCell[0], mTargetCell[1],
+ item.spanX, item.spanY);
lp.cellX = mTargetCell[0];
lp.cellY = mTargetCell[1];
+ lp.cellHSpan = item.spanX;
+ lp.cellVSpan = item.spanY;
cell.setId(LauncherModel.getCellLayoutChildId(container, mDragInfo.screen,
mTargetCell[0], mTargetCell[1], mDragInfo.spanX, mDragInfo.spanY));
@@ -2257,18 +2262,18 @@ public class Workspace extends SmoothPagedView
final LauncherAppWidgetHostView hostView = (LauncherAppWidgetHostView) cell;
AppWidgetProviderInfo pinfo = hostView.getAppWidgetInfo();
if (pinfo.resizeMode != AppWidgetProviderInfo.RESIZE_NONE) {
- final Runnable resizeRunnable = new Runnable() {
+ final Runnable addResizeFrame = new Runnable() {
public void run() {
DragLayer dragLayer = mLauncher.getDragLayer();
dragLayer.addResizeFrame(info, hostView, cellLayout);
}
};
- post(new Runnable() {
+ resizeRunnable = (new Runnable() {
public void run() {
if (!isPageMoving()) {
- resizeRunnable.run();
+ addResizeFrame.run();
} else {
- mDelayedResizeRunnable = resizeRunnable;
+ mDelayedResizeRunnable = addResizeFrame;
}
}
});
@@ -2277,28 +2282,42 @@ public class Workspace extends SmoothPagedView
LauncherModel.moveItemInDatabase(mLauncher, info, container, screen, lp.cellX,
lp.cellY);
+ } else {
+ // If we can't find a drop location, we return the item to its original position
+ CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams();
+ mTargetCell[0] = lp.cellX;
+ mTargetCell[1] = lp.cellY;
}
}
final CellLayout parent = (CellLayout) cell.getParent().getParent();
-
+ final Runnable finalResizeRunnable = resizeRunnable;
// Prepare it to be animated into its new position
// This must be called after the view has been re-parented
- final Runnable disableHardwareLayersRunnable = new Runnable() {
+ final Runnable onCompleteRunnable = new Runnable() {
@Override
public void run() {
mAnimatingViewIntoPlace = false;
updateChildrenLayersEnabled();
+ if (finalResizeRunnable != null) {
+ finalResizeRunnable.run();
+ }
}
};
mAnimatingViewIntoPlace = true;
if (d.dragView.hasDrawn()) {
- int duration = snapScreen < 0 ? -1 : ADJACENT_SCREEN_DROP_DURATION;
- setFinalScrollForPageChange(snapScreen);
- mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, cell, duration,
- disableHardwareLayersRunnable);
- resetFinalScrollForPageChange(snapScreen);
+ final ItemInfo info = (ItemInfo) cell.getTag();
+ if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET) {
+ int animationType = resizeOnDrop ? ANIMATE_INTO_POSITION_AND_RESIZE :
+ ANIMATE_INTO_POSITION_AND_DISAPPEAR;
+ animateWidgetDrop(info, parent, d.dragView,
+ onCompleteRunnable, animationType, cell, false);
+ } else {
+ mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, cell,
+ onCompleteRunnable);
+ }
} else {
+ d.deferDragViewCleanupPostAnimation = false;
cell.setVisibility(VISIBLE);
}
parent.onDropChild(cell);
@@ -2341,6 +2360,7 @@ public class Workspace extends SmoothPagedView
}
public void onDragEnter(DragObject d) {
+ mDragHasEnteredWorkspace = true;
if (mDragTargetLayout != null) {
mDragTargetLayout.setIsDragOverlapping(false);
mDragTargetLayout.onDragExit();
@@ -2376,6 +2396,7 @@ public class Workspace extends SmoothPagedView
}
public void onDragExit(DragObject d) {
+ mDragHasEnteredWorkspace = false;
doDragExit(d);
}
@@ -2443,19 +2464,18 @@ public class Workspace extends SmoothPagedView
// Create the drag outline
// We need to add extra padding to the bitmap to make room for the glow effect
final Canvas canvas = new Canvas();
- final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
- mDragOutline = createExternalDragOutline(canvas, bitmapPadding);
+ mDragOutline = createExternalDragOutline(canvas, DRAG_BITMAP_PADDING);
// Show the current page outlines to indicate that we can accept this drop
showOutlines();
layout.onDragEnter();
- layout.visualizeDropLocation(null, mDragOutline, x, y, 1, 1, null, null);
+ layout.visualizeDropLocation(null, mDragOutline, x, y, 1, 1, 1, 1, null, null);
return true;
}
case DragEvent.ACTION_DRAG_LOCATION:
// Visualize the drop location
- layout.visualizeDropLocation(null, mDragOutline, x, y, 1, 1, null, null);
+ layout.visualizeDropLocation(null, mDragOutline, x, y, 1, 1, 1, 1, null, null);
return true;
case DragEvent.ACTION_DROP: {
// Try and add any shortcuts
@@ -2488,7 +2508,8 @@ public class Workspace extends SmoothPagedView
final PendingAddWidgetInfo createInfo =
new PendingAddWidgetInfo(widgetInfo, mimeType, data);
mLauncher.addAppWidgetFromDrop(createInfo,
- LauncherSettings.Favorites.CONTAINER_DESKTOP, mCurrentPage, null, pos);
+ LauncherSettings.Favorites.CONTAINER_DESKTOP, mCurrentPage,
+ null, null, pos);
} else {
// Show the widget picker dialog if there is more than one widget
// that can handle this data type
@@ -2542,7 +2563,11 @@ public class Workspace extends SmoothPagedView
v.getMatrix().invert(mTempInverseMatrix);
cachedInverseMatrix = mTempInverseMatrix;
}
- xy[0] = xy[0] + mScrollX - v.getLeft();
+ int scrollX = mScrollX;
+ if (mNextPage != INVALID_PAGE) {
+ scrollX = mScroller.getFinalX();
+ }
+ xy[0] = xy[0] + scrollX - v.getLeft();
xy[1] = xy[1] + mScrollY - v.getTop();
cachedInverseMatrix.mapPoints(xy);
}
@@ -2564,7 +2589,11 @@ public class Workspace extends SmoothPagedView
*/
void mapPointFromChildToSelf(View v, float[] xy) {
v.getMatrix().mapPoints(xy);
- xy[0] -= (mScrollX - v.getLeft());
+ int scrollX = mScrollX;
+ if (mNextPage != INVALID_PAGE) {
+ scrollX = mScroller.getFinalX();
+ }
+ xy[0] -= (scrollX - v.getLeft());
xy[1] -= (mScrollY - v.getTop());
}
@@ -2709,8 +2738,7 @@ public class Workspace extends SmoothPagedView
public void onDragOver(DragObject d) {
// Skip drag over events while we are dragging over side pages
- if (mInScrollArea) return;
- if (mIsSwitchingState) return;
+ if (mInScrollArea || mIsSwitchingState || mState == State.SMALL) return;
Rect r = new Rect();
CellLayout layout = null;
@@ -2821,10 +2849,16 @@ public class Workspace extends SmoothPagedView
mLastDragOverView = dragOverView;
if (!mCreateUserFolderOnDrop && !isOverFolder) {
+ int minSpanX = item.spanX;
+ int minSpanY = item.spanY;
+ if (item.minSpanX > 0 && item.minSpanY > 0) {
+ minSpanX = item.minSpanX;
+ minSpanY = item.minSpanY;
+ }
mDragTargetLayout.visualizeDropLocation(child, mDragOutline,
(int) mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1],
- item.spanX, item.spanY, d.dragView.getDragVisualizeOffset(),
- d.dragView.getDragRegion());
+ minSpanX, minSpanY, item.spanX, item.spanY,
+ d.dragView.getDragVisualizeOffset(), d.dragView.getDragRegion());
}
}
}
@@ -2911,7 +2945,7 @@ public class Workspace extends SmoothPagedView
final Runnable exitSpringLoadedRunnable = new Runnable() {
@Override
public void run() {
- mLauncher.exitSpringLoadedDragModeDelayed(true, false);
+ mLauncher.exitSpringLoadedDragModeDelayed(true, false, null);
}
};
@@ -2945,9 +2979,19 @@ public class Workspace extends SmoothPagedView
findNearestVacantCell = false;
}
}
+ final ItemInfo item = (ItemInfo) d.dragInfo;
+ int minSpanX = item.spanX;
+ int minSpanY = item.spanY;
+ if (item.minSpanX > 0 && item.minSpanY > 0) {
+ minSpanX = item.minSpanX;
+ minSpanY = item.minSpanY;
+ }
if (findNearestVacantCell) {
- mTargetCell = findNearestVacantArea(touchXY[0], touchXY[1], spanX, spanY, null,
- cellLayout, mTargetCell);
+ int[] resultSpan = new int[2];
+ mTargetCell = findNearestVacantArea(touchXY[0], touchXY[1], minSpanX, minSpanY,
+ spanX, spanY, null, cellLayout, mTargetCell, resultSpan);
+ item.spanX = resultSpan[0];
+ item.spanY = resultSpan[1];
}
Runnable onAnimationCompleteRunnable = new Runnable() {
@@ -2957,8 +3001,11 @@ public class Workspace extends SmoothPagedView
// widgets/shortcuts/folders in a slightly different way
switch (pendingInfo.itemType) {
case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
+ int span[] = new int[2];
+ span[0] = item.spanX;
+ span[1] = item.spanY;
mLauncher.addAppWidgetFromDrop((PendingAddWidgetInfo) pendingInfo,
- container, screen, mTargetCell, null);
+ container, screen, mTargetCell, span, null);
break;
case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
mLauncher.processShortcutFromDrop(pendingInfo.componentName,
@@ -2971,28 +3018,15 @@ public class Workspace extends SmoothPagedView
cellLayout.onDragExit();
}
};
-
- // Now we animate the dragView, (ie. the widget or shortcut preview) into its final
- // location and size on the home screen.
- RectF r = estimateItemPosition(cellLayout, pendingInfo,
- mTargetCell[0], mTargetCell[1], spanX, spanY);
- int loc[] = new int[2];
- loc[0] = (int) r.left;
- loc[1] = (int) r.top;
- setFinalTransitionTransform(cellLayout);
- float cellLayoutScale =
- mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(cellLayout, loc);
- resetTransitionTransform(cellLayout);
-
- float dragViewScale = Math.min(r.width() / d.dragView.getMeasuredWidth(),
- r.height() / d.dragView.getMeasuredHeight());
- // The animation will scale the dragView about its center, so we need to center about
- // the final location.
- loc[0] -= (d.dragView.getMeasuredWidth() - cellLayoutScale * r.width()) / 2;
- loc[1] -= (d.dragView.getMeasuredHeight() - cellLayoutScale * r.height()) / 2;
-
- mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, loc,
- dragViewScale * cellLayoutScale, onAnimationCompleteRunnable);
+ View finalView = pendingInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET
+ ? ((PendingAddWidgetInfo) pendingInfo).boundWidget : null;
+ int animationStyle = ANIMATE_INTO_POSITION_AND_DISAPPEAR;
+ if (pendingInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET &&
+ ((PendingAddWidgetInfo) pendingInfo).info.configure != null) {
+ animationStyle = ANIMATE_INTO_POSITION_AND_REMAIN;
+ }
+ animateWidgetDrop(info, cellLayout, d.dragView, onAnimationCompleteRunnable,
+ animationStyle, finalView, true);
} else {
// This is for other drag/drop cases, like dragging from All Apps
View view = null;
@@ -3059,6 +3093,109 @@ public class Workspace extends SmoothPagedView
}
}
+ public Bitmap createWidgetBitmap(ItemInfo widgetInfo, View layout) {
+ int[] unScaledSize = mLauncher.getWorkspace().estimateItemSize(widgetInfo.spanX,
+ widgetInfo.spanY, widgetInfo, false);
+ int visibility = layout.getVisibility();
+ layout.setVisibility(VISIBLE);
+
+ int width = MeasureSpec.makeMeasureSpec(unScaledSize[0], MeasureSpec.EXACTLY);
+ int height = MeasureSpec.makeMeasureSpec(unScaledSize[1], MeasureSpec.EXACTLY);
+ Bitmap b = Bitmap.createBitmap(unScaledSize[0], unScaledSize[1],
+ Bitmap.Config.ARGB_8888);
+ Canvas c = new Canvas(b);
+
+ layout.measure(width, height);
+ layout.layout(0, 0, unScaledSize[0], unScaledSize[1]);
+ layout.draw(c);
+ c.setBitmap(null);
+ layout.setVisibility(visibility);
+ return b;
+ }
+
+ private void getFinalPositionForDropAnimation(int[] loc, float[] scaleXY,
+ DragView dragView, CellLayout layout, ItemInfo info, int[] targetCell, View finalView,
+ boolean external) {
+ // Now we animate the dragView, (ie. the widget or shortcut preview) into its final
+ // location and size on the home screen.
+ int spanX = info.spanX;
+ int spanY = info.spanY;
+
+ Rect r = estimateItemPosition(layout, info, targetCell[0], targetCell[1], spanX, spanY);
+ loc[0] = r.left;
+ loc[1] = r.top;
+
+ setFinalTransitionTransform(layout);
+ float cellLayoutScale =
+ mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(layout, loc);
+ resetTransitionTransform(layout);
+ float dragViewScaleX = (1.0f * r.width()) / dragView.getMeasuredWidth();
+ float dragViewScaleY = (1.0f * r.height()) / dragView.getMeasuredHeight();
+
+ // The animation will scale the dragView about its center, so we need to center about
+ // the final location.
+ loc[0] -= (dragView.getMeasuredWidth() - cellLayoutScale * r.width()) / 2;
+ loc[1] -= (dragView.getMeasuredHeight() - cellLayoutScale * r.height()) / 2;
+
+ scaleXY[0] = dragViewScaleX * cellLayoutScale;
+ scaleXY[1] = dragViewScaleY * cellLayoutScale;
+ }
+
+ public void animateWidgetDrop(ItemInfo info, CellLayout cellLayout, DragView dragView,
+ final Runnable onCompleteRunnable, int animationType, final View finalView,
+ boolean external) {
+ Rect from = new Rect();
+ mLauncher.getDragLayer().getViewRectRelativeToSelf(dragView, from);
+
+ int[] finalPos = new int[2];
+ float scaleXY[] = new float[2];
+ getFinalPositionForDropAnimation(finalPos, scaleXY, dragView, cellLayout, info, mTargetCell,
+ finalView, external);
+
+ Resources res = mLauncher.getResources();
+ int duration = res.getInteger(R.integer.config_dropAnimMaxDuration) - 200;
+
+ // In the case where we've prebound the widget, we remove it from the DragLayer
+ if (finalView instanceof AppWidgetHostView && external) {
+ mLauncher.getDragLayer().removeView(finalView);
+ }
+ if ((animationType == ANIMATE_INTO_POSITION_AND_RESIZE || external) && finalView != null) {
+ Bitmap crossFadeBitmap = createWidgetBitmap(info, finalView);
+ dragView.setCrossFadeBitmap(crossFadeBitmap);
+ dragView.crossFade((int) (duration * 0.8f));
+ } else if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET && external) {
+ scaleXY[0] = scaleXY[1] = Math.min(scaleXY[0], scaleXY[1]);
+ }
+
+ DragLayer dragLayer = mLauncher.getDragLayer();
+ if (animationType == CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION) {
+ mLauncher.getDragLayer().animateViewIntoPosition(dragView, finalPos, 0f, 0.1f, 0.1f,
+ DragLayer.ANIMATION_END_DISAPPEAR, onCompleteRunnable, duration);
+ } else {
+ int endStyle;
+ if (animationType == ANIMATE_INTO_POSITION_AND_REMAIN) {
+ endStyle = DragLayer.ANIMATION_END_REMAIN_VISIBLE;
+ } else {
+ endStyle = DragLayer.ANIMATION_END_DISAPPEAR;;
+ }
+
+ Runnable onComplete = new Runnable() {
+ @Override
+ public void run() {
+ if (finalView != null) {
+ finalView.setVisibility(VISIBLE);
+ }
+ if (onCompleteRunnable != null) {
+ onCompleteRunnable.run();
+ }
+ }
+ };
+ dragLayer.animateViewIntoPosition(dragView, from.left, from.top, finalPos[0],
+ finalPos[1], 1, 1, 1, scaleXY[0], scaleXY[1], onComplete, endStyle,
+ duration, this);
+ }
+ }
+
public void setFinalTransitionTransform(CellLayout layout) {
if (isSwitchingState()) {
int index = indexOfChild(layout);
@@ -3115,7 +3252,19 @@ public class Workspace extends SmoothPagedView
private int[] findNearestVacantArea(int pixelX, int pixelY,
int spanX, int spanY, View ignoreView, CellLayout layout, int[] recycle) {
return layout.findNearestVacantArea(
- pixelX, pixelY, spanX, spanY, ignoreView, recycle);
+ pixelX, pixelY, spanX, spanY, spanX, spanY, ignoreView, recycle, null);
+ }
+
+ /**
+ * Calculate the nearest cell where the given object would be dropped.
+ *
+ * pixelX and pixelY should be in the coordinate system of layout
+ */
+ private int[] findNearestVacantArea(int pixelX, int pixelY, int minSpanX, int minSpanY,
+ int spanX, int spanY, View ignoreView, CellLayout layout, int[] recycle,
+ int[] returnSpan) {
+ return layout.findNearestVacantArea(
+ pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, ignoreView, recycle, returnSpan);
}
/**
@@ -3170,6 +3319,9 @@ public class Workspace extends SmoothPagedView
}
mDragOutline = null;
mDragInfo = null;
+
+ // Hide the scrolling indicator after you pick up an item
+ hideScrollingIndicator(false);
}
public boolean isDropEnabled() {
@@ -3219,11 +3371,12 @@ public class Workspace extends SmoothPagedView
if (!isSmall() && !mIsSwitchingState) {
mInScrollArea = true;
- final int page = mCurrentPage + (direction == DragController.SCROLL_LEFT ? -1 : 1);
- final CellLayout layout = (CellLayout) getChildAt(page);
+ final int page = (mNextPage != INVALID_PAGE ? mNextPage : mCurrentPage) +
+ (direction == DragController.SCROLL_LEFT ? -1 : 1);
cancelFolderCreation();
- if (layout != null) {
+ if (0 <= page && page < getChildCount()) {
+ CellLayout layout = (CellLayout) getChildAt(page);
// Exit the current layout and mark the overlapping layout
if (mDragTargetLayout != null) {
mDragTargetLayout.setIsDragOverlapping(false);
@@ -3246,16 +3399,17 @@ public class Workspace extends SmoothPagedView
boolean result = false;
if (mInScrollArea) {
if (mDragTargetLayout != null) {
- // Unmark the overlapping layout and re-enter the current layout
mDragTargetLayout.setIsDragOverlapping(false);
- mDragTargetLayout = getCurrentDropLayout();
- mDragTargetLayout.onDragEnter();
-
// Workspace is responsible for drawing the edge glow on adjacent pages,
// so we need to redraw the workspace when this may have changed.
invalidate();
- result = true;
}
+ if (mDragTargetLayout != null && mDragHasEnteredWorkspace) {
+ // Unmark the overlapping layout and re-enter the current layout
+ mDragTargetLayout = getCurrentDropLayout();
+ mDragTargetLayout.onDragEnter();
+ }
+ result = true;
mInScrollArea = false;
}
return result;
@@ -3527,7 +3681,7 @@ public class Workspace extends SmoothPagedView
final ViewGroup parent = (ViewGroup) getParent();
final ImageView qsbDivider = (ImageView) (parent.findViewById(R.id.qsb_divider));
final ImageView dockDivider = (ImageView) (parent.findViewById(R.id.dock_divider));
- final ImageView scrollIndicator = getScrollingIndicator();
+ final View scrollIndicator = getScrollingIndicator();
cancelScrollingIndicatorAnimations();
if (qsbDivider != null) qsbDivider.setAlpha(reducedFade);