diff options
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">"ፍርግም ለማንሳት ንካ & በመጫን ያዝ"</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-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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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); |