am 5d73fb70: am 8493aacd: am ab37bce3: Merge changes If379cc4b,I1c6ccb01 into jb-ub-now-indigo-rose
* commit '5d73fb70f53da6aec0f4ce73c833a53a2cdca3bd':
diff --git a/Android.mk b/Android.mk
index 10c9f24..3bd20a7 100644
--- a/Android.mk
+++ b/Android.mk
@@ -15,28 +15,48 @@
#
LOCAL_PATH := $(call my-dir)
+
+#
+# Build app code.
+#
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v13
-LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) \
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+ $(call all-renderscript-files-under, src) \
$(call all-proto-files-under, protos)
LOCAL_PROTOC_OPTIMIZE_TYPE := nano
+LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/
-LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos
-
-LOCAL_SDK_VERSION := 17
+LOCAL_SDK_VERSION := 19
LOCAL_PACKAGE_NAME := Launcher3
#LOCAL_CERTIFICATE := shared
-LOCAL_OVERRIDES_PACKAGES := Home
+LOCAL_OVERRIDES_PACKAGES := Launcher2
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
+
+#
+# Protocol Buffer Debug Utility in Java
+#
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, util) \
+ $(call all-proto-files-under, protos)
+
+LOCAL_PROTOC_OPTIMIZE_TYPE := nano
+LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := protoutil
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/protos/backup.proto b/protos/backup.proto
index 3780bc5..7ba2937 100644
--- a/protos/backup.proto
+++ b/protos/backup.proto
@@ -23,7 +23,8 @@
enum Type {
FAVORITE = 1;
SCREEN = 2;
- IMAGE = 3;
+ ICON = 3;
+ WIDGET = 4;
}
required Type type = 1;
optional string name = 2; // keep this short
@@ -71,6 +72,14 @@
}
message Resource {
- required int32 dpi = 2;
- required bytes data = 3;
+ required int32 dpi = 1;
+ required bytes data = 2;
+ }
+
+message Widget {
+ required string provider = 1;
+ optional string label = 2;
+ optional bool configure = 3;
+ optional Resource icon = 4;
+ optional Resource preview = 5;
}
diff --git a/res/drawable-hdpi/cling.9.png b/res/drawable-hdpi/cling.9.png
index 42a889f..36fbfc8 100644
--- a/res/drawable-hdpi/cling.9.png
+++ b/res/drawable-hdpi/cling.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cling_button.9.png b/res/drawable-hdpi/cling_button.9.png
index 4dbe564..e308382 100644
--- a/res/drawable-hdpi/cling_button.9.png
+++ b/res/drawable-hdpi/cling_button.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cling_button_pressed.9.png b/res/drawable-hdpi/cling_button_pressed.9.png
index 2a85cab..4f9ca6f 100644
--- a/res/drawable-hdpi/cling_button_pressed.9.png
+++ b/res/drawable-hdpi/cling_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps.png b/res/drawable-hdpi/ic_allapps.png
index f55aabf..e7677d5 100644
--- a/res/drawable-hdpi/ic_allapps.png
+++ b/res/drawable-hdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps_pressed.png b/res/drawable-hdpi/ic_allapps_pressed.png
index bbc4d7d..863eeba 100644
--- a/res/drawable-hdpi/ic_allapps_pressed.png
+++ b/res/drawable-hdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pageindicator_add.png b/res/drawable-hdpi/ic_pageindicator_add.png
index c77a4f9..c37d622 100644
--- a/res/drawable-hdpi/ic_pageindicator_add.png
+++ b/res/drawable-hdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-hdpi/widget_preview_tile.png b/res/drawable-hdpi/widget_preview_tile.png
deleted file mode 100644
index caeddd1..0000000
--- a/res/drawable-hdpi/widget_preview_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/widget_tile.png b/res/drawable-hdpi/widget_tile.png
new file mode 100644
index 0000000..310ff8b
--- /dev/null
+++ b/res/drawable-hdpi/widget_tile.png
Binary files differ
diff --git a/res/drawable-mdpi/cling.9.png b/res/drawable-mdpi/cling.9.png
index f6f730d..4c0f139 100644
--- a/res/drawable-mdpi/cling.9.png
+++ b/res/drawable-mdpi/cling.9.png
Binary files differ
diff --git a/res/drawable-mdpi/cling_button.9.png b/res/drawable-mdpi/cling_button.9.png
index 38de60a..a0b6f97 100644
--- a/res/drawable-mdpi/cling_button.9.png
+++ b/res/drawable-mdpi/cling_button.9.png
Binary files differ
diff --git a/res/drawable-mdpi/cling_button_pressed.9.png b/res/drawable-mdpi/cling_button_pressed.9.png
index c60837d..986e669 100644
--- a/res/drawable-mdpi/cling_button_pressed.9.png
+++ b/res/drawable-mdpi/cling_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps.png b/res/drawable-mdpi/ic_allapps.png
index d95f1bf..e0fd9c0 100644
--- a/res/drawable-mdpi/ic_allapps.png
+++ b/res/drawable-mdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps_pressed.png b/res/drawable-mdpi/ic_allapps_pressed.png
index e24b9d7..3bd87b1 100644
--- a/res/drawable-mdpi/ic_allapps_pressed.png
+++ b/res/drawable-mdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pageindicator_add.png b/res/drawable-mdpi/ic_pageindicator_add.png
index 22420bd..8e05e64 100644
--- a/res/drawable-mdpi/ic_pageindicator_add.png
+++ b/res/drawable-mdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-mdpi/widget_preview_tile.png b/res/drawable-mdpi/widget_preview_tile.png
deleted file mode 100644
index 9c7c4f7..0000000
--- a/res/drawable-mdpi/widget_preview_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/widget_tile.png b/res/drawable-mdpi/widget_tile.png
new file mode 100644
index 0000000..1ba559d
--- /dev/null
+++ b/res/drawable-mdpi/widget_tile.png
Binary files differ
diff --git a/res/drawable-xhdpi/cling.9.png b/res/drawable-xhdpi/cling.9.png
index 9cc03c9..1cb4681 100644
--- a/res/drawable-xhdpi/cling.9.png
+++ b/res/drawable-xhdpi/cling.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/cling_button.9.png b/res/drawable-xhdpi/cling_button.9.png
index 1c93bc4..4192563 100644
--- a/res/drawable-xhdpi/cling_button.9.png
+++ b/res/drawable-xhdpi/cling_button.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/cling_button_pressed.9.png b/res/drawable-xhdpi/cling_button_pressed.9.png
index b5d4aae..d3ce469 100644
--- a/res/drawable-xhdpi/cling_button_pressed.9.png
+++ b/res/drawable-xhdpi/cling_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps.png b/res/drawable-xhdpi/ic_allapps.png
index 0e4316c..f71964c 100644
--- a/res/drawable-xhdpi/ic_allapps.png
+++ b/res/drawable-xhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps_pressed.png b/res/drawable-xhdpi/ic_allapps_pressed.png
index 2b13330..d678f02 100644
--- a/res/drawable-xhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pageindicator_add.png b/res/drawable-xhdpi/ic_pageindicator_add.png
index 9647b8f..28e164b 100644
--- a/res/drawable-xhdpi/ic_pageindicator_add.png
+++ b/res/drawable-xhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xhdpi/widget_preview_tile.png b/res/drawable-xhdpi/widget_preview_tile.png
deleted file mode 100644
index 6023867..0000000
--- a/res/drawable-xhdpi/widget_preview_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/widget_tile.png b/res/drawable-xhdpi/widget_tile.png
new file mode 100644
index 0000000..9730f35
--- /dev/null
+++ b/res/drawable-xhdpi/widget_tile.png
Binary files differ
diff --git a/res/drawable-xxhdpi/cling.9.png b/res/drawable-xxhdpi/cling.9.png
index 3dcf121..7beae03 100644
--- a/res/drawable-xxhdpi/cling.9.png
+++ b/res/drawable-xxhdpi/cling.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/cling_button.9.png b/res/drawable-xxhdpi/cling_button.9.png
index 4f68a03..e412876 100644
--- a/res/drawable-xxhdpi/cling_button.9.png
+++ b/res/drawable-xxhdpi/cling_button.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/cling_button_pressed.9.png b/res/drawable-xxhdpi/cling_button_pressed.9.png
index 4bc0337..55e89da 100644
--- a/res/drawable-xxhdpi/cling_button_pressed.9.png
+++ b/res/drawable-xxhdpi/cling_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps.png b/res/drawable-xxhdpi/ic_allapps.png
index 9d5d80c..624e0ef 100644
--- a/res/drawable-xxhdpi/ic_allapps.png
+++ b/res/drawable-xxhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps_pressed.png b/res/drawable-xxhdpi/ic_allapps_pressed.png
index b6a34a8..77b45ae 100644
--- a/res/drawable-xxhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xxhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_add.png b/res/drawable-xxhdpi/ic_pageindicator_add.png
index 591b189..fd8a662 100644
--- a/res/drawable-xxhdpi/ic_pageindicator_add.png
+++ b/res/drawable-xxhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xxhdpi/widget_tile.png b/res/drawable-xxhdpi/widget_tile.png
new file mode 100644
index 0000000..3a3790d
--- /dev/null
+++ b/res/drawable-xxhdpi/widget_tile.png
Binary files differ
diff --git a/res/drawable-xxhdpi/widget_tile_jb.png b/res/drawable-xxhdpi/widget_tile_jb.png
deleted file mode 100644
index 363fe84..0000000
--- a/res/drawable-xxhdpi/widget_tile_jb.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/cling_arrow_end.xml b/res/drawable/cling_arrow_end.xml
new file mode 100644
index 0000000..3f63c7d
--- /dev/null
+++ b/res/drawable/cling_arrow_end.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/cling_arrow_right"
+ android:autoMirrored="true">
+</bitmap>
diff --git a/res/drawable/cling_arrow_start.xml b/res/drawable/cling_arrow_start.xml
new file mode 100644
index 0000000..ebe9183
--- /dev/null
+++ b/res/drawable/cling_arrow_start.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/cling_arrow_left"
+ android:autoMirrored="true">
+</bitmap>
diff --git a/res/layout-land/first_run_cling.xml b/res/layout-land/first_run_cling.xml
index 3b21e14..9baee64 100644
--- a/res/layout-land/first_run_cling.xml
+++ b/res/layout-land/first_run_cling.xml
@@ -25,26 +25,31 @@
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/bubble_content"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
+ android:layout_marginLeft="100dp"
+ android:layout_marginRight="100dp"
android:orientation="vertical">
<TextView
style="@style/ClingAltTitleText"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="10dp"
android:text="@string/first_run_cling_title"
android:textColor="#FFFFFFFF"
- android:textSize="30sp" />
+ android:textSize="30sp"
+ android:gravity="center" />
<TextView
style="@style/ClingAltTitleText"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
android:text="@string/first_run_cling_description"
android:textColor="#80000000"
- android:textSize="16sp" />
+ android:textSize="16sp"
+ android:gravity="center" />
</LinearLayout>
<TextView
style="@style/ClingHintText"
@@ -53,7 +58,7 @@
android:layout_height="wrap_content"
android:layout_gravity="top|end"
android:layout_marginEnd="10dp"
- android:layout_marginTop="80dp"
+ android:layout_marginTop="65dp"
android:visibility="gone"
android:drawableTop="@drawable/cling_arrow_up"
android:drawablePadding="5dp"
@@ -76,7 +81,7 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="10dp"
- android:layout_marginBottom="100dp"
+ android:layout_marginBottom="85dp"
android:drawableEnd="@drawable/cling_arrow_right"
android:drawablePadding="5dp"
android:text="@string/first_run_cling_create_screens_hint" />
diff --git a/res/layout-land/folder_cling.xml b/res/layout-land/folder_cling.xml
index 1f4a115..86286d7 100644
--- a/res/layout-land/folder_cling.xml
+++ b/res/layout-land/folder_cling.xml
@@ -27,22 +27,31 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="20dp"
- android:paddingRight="20dp"
- android:paddingTop="20dp"
- android:paddingBottom="20dp"
- android:orientation="vertical"
- android:background="@drawable/cling">
- <TextView
- style="@style/ClingTitleText"
- android:id="@+id/folder_cling_title"
- android:text="@string/folder_cling_title" />
- <TextView
- style="@style/ClingText"
- android:id="@+id/folder_cling_create_folder"
+ android:orientation="vertical">
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/folder_cling_create_folder" />
+ android:paddingLeft="20dp"
+ android:paddingRight="20dp"
+ android:paddingTop="20dp"
+ android:paddingBottom="20dp"
+ android:orientation="vertical"
+ android:background="@drawable/cling">
+ <TextView
+ style="@style/ClingTitleText"
+ android:id="@+id/folder_cling_title"
+ android:text="@string/folder_cling_title" />
+ <TextView
+ style="@style/ClingText"
+ android:id="@+id/folder_cling_create_folder"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/folder_cling_create_folder" />
+ </LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:src="@drawable/cling_arrow_down" />
</LinearLayout>
</FrameLayout>
<Button
diff --git a/res/layout-land/workspace_cling.xml b/res/layout-land/workspace_cling.xml
index 08fb8cf..db33db0 100644
--- a/res/layout-land/workspace_cling.xml
+++ b/res/layout-land/workspace_cling.xml
@@ -25,13 +25,11 @@
android:layout_height="match_parent"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
- android:layout_marginTop="20dp"
- android:layout_marginBottom="100dp">
+ android:layout_marginTop="310dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- android:layout_marginBottom="40dp"
+ android:layout_gravity="top"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
diff --git a/res/layout-port/first_run_cling.xml b/res/layout-port/first_run_cling.xml
index 3b21e14..4830e5d 100644
--- a/res/layout-port/first_run_cling.xml
+++ b/res/layout-port/first_run_cling.xml
@@ -25,35 +25,42 @@
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/bubble_content"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
+ android:layout_marginLeft="100dp"
+ android:layout_marginRight="100dp"
android:orientation="vertical">
<TextView
style="@style/ClingAltTitleText"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="10dp"
android:text="@string/first_run_cling_title"
android:textColor="#FFFFFFFF"
- android:textSize="30sp" />
+ android:textSize="30sp"
+ android:gravity="center" />
<TextView
style="@style/ClingAltTitleText"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
android:text="@string/first_run_cling_description"
android:textColor="#80000000"
- android:textSize="16sp" />
+ android:textSize="16sp"
+ android:gravity="center" />
</LinearLayout>
<TextView
style="@style/ClingHintText"
android:id="@+id/search_bar_hint"
- android:layout_width="160dp"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|end"
android:layout_marginEnd="10dp"
- android:layout_marginTop="80dp"
+ android:layout_marginTop="65dp"
+ android:gravity="center_horizontal"
+ android:maxWidth="160dp"
android:visibility="gone"
android:drawableTop="@drawable/cling_arrow_up"
android:drawablePadding="5dp"
@@ -61,23 +68,26 @@
<TextView
style="@style/ClingHintText"
android:id="@+id/custom_content_hint"
- android:layout_width="160dp"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="top"
+ android:layout_gravity="top|start"
android:layout_marginStart="10dp"
+ android:layout_marginEnd="10dp"
android:layout_marginTop="100dp"
+ android:maxWidth="160dp"
android:visibility="gone"
- android:drawableStart="@drawable/cling_arrow_left"
+ android:drawableStart="@drawable/cling_arrow_start"
android:drawablePadding="10dp"
android:text="@string/first_run_cling_custom_content_hint" />
<TextView
style="@style/ClingHintText"
- android:layout_width="160dp"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="10dp"
- android:layout_marginBottom="100dp"
- android:drawableEnd="@drawable/cling_arrow_right"
+ android:layout_marginBottom="85dp"
+ android:maxWidth="180dp"
+ android:drawableEnd="@drawable/cling_arrow_end"
android:drawablePadding="5dp"
android:text="@string/first_run_cling_create_screens_hint" />
</FrameLayout>
diff --git a/res/layout-port/folder_cling.xml b/res/layout-port/folder_cling.xml
index 1f4a115..86286d7 100644
--- a/res/layout-port/folder_cling.xml
+++ b/res/layout-port/folder_cling.xml
@@ -27,22 +27,31 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="20dp"
- android:paddingRight="20dp"
- android:paddingTop="20dp"
- android:paddingBottom="20dp"
- android:orientation="vertical"
- android:background="@drawable/cling">
- <TextView
- style="@style/ClingTitleText"
- android:id="@+id/folder_cling_title"
- android:text="@string/folder_cling_title" />
- <TextView
- style="@style/ClingText"
- android:id="@+id/folder_cling_create_folder"
+ android:orientation="vertical">
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/folder_cling_create_folder" />
+ android:paddingLeft="20dp"
+ android:paddingRight="20dp"
+ android:paddingTop="20dp"
+ android:paddingBottom="20dp"
+ android:orientation="vertical"
+ android:background="@drawable/cling">
+ <TextView
+ style="@style/ClingTitleText"
+ android:id="@+id/folder_cling_title"
+ android:text="@string/folder_cling_title" />
+ <TextView
+ style="@style/ClingText"
+ android:id="@+id/folder_cling_create_folder"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/folder_cling_create_folder" />
+ </LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:src="@drawable/cling_arrow_down" />
</LinearLayout>
</FrameLayout>
<Button
diff --git a/res/layout-port/workspace_cling.xml b/res/layout-port/workspace_cling.xml
index 38d3858..b926ca9 100644
--- a/res/layout-port/workspace_cling.xml
+++ b/res/layout-port/workspace_cling.xml
@@ -22,21 +22,15 @@
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginStart="25dp"
- android:layout_marginEnd="25dp"
- android:layout_marginTop="20dp"
- android:layout_marginBottom="120dp">
+ android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="bottom"
+ android:layout_gravity="top"
+ android:layout_marginStart="25dp"
+ android:layout_marginEnd="25dp"
+ android:layout_marginTop="30dp"
android:orientation="vertical">
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:src="@drawable/cling_arrow_up" />
<LinearLayout
android:paddingLeft="20dp"
android:paddingRight="20dp"
@@ -57,14 +51,57 @@
android:layout_height="wrap_content"
android:text="@string/workspace_cling_move_item" />
</LinearLayout>
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:src="@drawable/cling_arrow_down" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/focused_hotseat_app_bubble"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|left"
+ android:layout_marginLeft="25dp"
+ android:layout_marginBottom="90dp"
+ android:orientation="vertical"
+ android:visibility="gone">
+ <LinearLayout
+ android:paddingLeft="20dp"
+ android:paddingRight="20dp"
+ android:paddingTop="20dp"
+ android:paddingBottom="20dp"
+ android:layout_width="240dp"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:background="@drawable/cling">
+ <TextView
+ android:id="@+id/focused_hotseat_app_title"
+ style="@style/ClingTitleText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:id="@+id/focused_hotseat_app_description"
+ style="@style/ClingText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ </LinearLayout>
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:layout_marginLeft="78dp"
+ android:src="@drawable/cling_arrow_down" />
</LinearLayout>
</FrameLayout>
+
<Button
style="@style/ClingButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
- android:layout_marginEnd="20dp"
- android:layout_gravity="bottom|end"
+ android:layout_marginRight="20dp"
+ android:layout_gravity="bottom|right"
android:onClick="dismissWorkspaceCling" />
</com.android.launcher3.Cling>
diff --git a/res/layout/all_apps_button.xml b/res/layout/all_apps_button.xml
new file mode 100644
index 0000000..1b9ea08
--- /dev/null
+++ b/res/layout/all_apps_button.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/WorkspaceIcon"
+ android:focusable="true"
+ android:background="@drawable/focusable_view_bg" />
diff --git a/res/layout/apps_customize_pane.xml b/res/layout/apps_customize_pane.xml
index e488601..11a938f 100644
--- a/res/layout/apps_customize_pane.xml
+++ b/res/layout/apps_customize_pane.xml
@@ -78,10 +78,4 @@
android:layout_marginBottom="@dimen/apps_customize_page_indicator_margin" />
</FrameLayout>
</LinearLayout>
-
- <include layout="@layout/all_apps_cling"
- android:id="@+id/all_apps_cling"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone" />
</com.android.launcher3.AppsCustomizeTabHost>
diff --git a/res/layout/user_folder.xml b/res/layout/user_folder.xml
index d01e2eb..5d5f33b 100644
--- a/res/layout/user_folder.xml
+++ b/res/layout/user_folder.xml
@@ -45,7 +45,7 @@
android:hint="@string/folder_hint_text"
android:textSize="14sp"
android:textColor="#ff777777"
- android:textColorHighlight="#ff333333"
+ android:textColorHighlight="#ffCCCCCC"
android:textCursorDrawable="@null"
android:gravity="center_horizontal"
android:singleLine="true"
diff --git a/res/layout/wallpaper_picker.xml b/res/layout/wallpaper_picker.xml
index 53c529c..c91cc7e 100644
--- a/res/layout/wallpaper_picker.xml
+++ b/res/layout/wallpaper_picker.xml
@@ -18,7 +18,8 @@
*/
-->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.launcher3.WallpaperRootView
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/wallpaper_root"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -41,23 +42,19 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
- android:orientation="vertical"
- android:fitsSystemWindows="true" >
+ android:orientation="vertical" >
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@drawable/tile_shadow_top" />
<HorizontalScrollView
+ android:id="@+id/wallpaper_scroll_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout android:id="@+id/master_wallpaper_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
- <LinearLayout android:id="@+id/third_party_wallpaper_list"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal" />
<LinearLayout android:id="@+id/wallpaper_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -66,6 +63,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" />
+ <LinearLayout android:id="@+id/third_party_wallpaper_list"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" />
</LinearLayout>
</HorizontalScrollView>
<View
@@ -73,4 +74,4 @@
android:layout_height="2dp"
android:background="@drawable/tile_shadow_bottom" />
</LinearLayout>
-</RelativeLayout>
+</com.android.launcher3.WallpaperRootView>
diff --git a/res/layout/wallpaper_picker_gallery_item.xml b/res/layout/wallpaper_picker_image_picker_item.xml
similarity index 95%
rename from res/layout/wallpaper_picker_gallery_item.xml
rename to res/layout/wallpaper_picker_image_picker_item.xml
index d14ab3e..ae3c43d 100644
--- a/res/layout/wallpaper_picker_gallery_item.xml
+++ b/res/layout/wallpaper_picker_image_picker_item.xml
@@ -32,6 +32,8 @@
android:id="@+id/wallpaper_item_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:ellipsize="marquee"
+ android:gravity="center"
android:layout_gravity="center"
android:text="@string/pick_image"
android:drawableTop="@drawable/ic_images"
diff --git a/res/layout/live_wallpaper_picker_item.xml b/res/layout/wallpaper_picker_live_wallpaper_item.xml
similarity index 90%
rename from res/layout/live_wallpaper_picker_item.xml
rename to res/layout/wallpaper_picker_live_wallpaper_item.xml
index 29aa12c..29fdb1b 100644
--- a/res/layout/live_wallpaper_picker_item.xml
+++ b/res/layout/wallpaper_picker_live_wallpaper_item.xml
@@ -31,14 +31,16 @@
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/wallpaper_icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_width="@dimen/wallpaperItemIconSize"
+ android:layout_height="@dimen/wallpaperItemIconSize"
android:layout_gravity="center"
android:visibility="gone" />
<TextView
android:id="@+id/wallpaper_item_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="marquee"
android:gravity="center"
android:padding="4dp"
android:layout_gravity="bottom"
diff --git a/res/layout/third_party_wallpaper_picker_item.xml b/res/layout/wallpaper_picker_third_party_item.xml
similarity index 95%
rename from res/layout/third_party_wallpaper_picker_item.xml
rename to res/layout/wallpaper_picker_third_party_item.xml
index c2aeade..68661bc 100644
--- a/res/layout/third_party_wallpaper_picker_item.xml
+++ b/res/layout/wallpaper_picker_third_party_item.xml
@@ -32,6 +32,8 @@
android:id="@+id/wallpaper_item_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:ellipsize="marquee"
+ android:gravity="center"
android:layout_gravity="center"
android:drawablePadding="4dp"
android:textColor="@android:color/white"/>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index bb8492a..e167189 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d gekies"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d gekies"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Muurpapier %1$d van %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Het <xliff:g id="LABEL">%1$s</xliff:g> gekies"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Vee uit"</string>
<string name="pick_image" msgid="1272073934062909527">"Kies prent"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Muurpapiere"</string>
@@ -38,7 +40,7 @@
<string name="widget_adder" msgid="3201040140710381657">"Legstukke"</string>
<string name="toggle_weight_watcher" msgid="5645299835184636119">"Wys Mem"</string>
<string name="long_press_widget_to_add" msgid="7699152356777458215">"Raak en hou om \'n legstuk op te tel."</string>
- <string name="market" msgid="2619650989819296998">"Soek-en-koop"</string>
+ <string name="market" msgid="2619650989819296998">"Winkel"</string>
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
<string name="external_drop_widget_error" msgid="3165821058322217155">"Kan nie item op hierdie Tuisskerm laat los nie."</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Kies legstuk om te skep"</string>
@@ -51,7 +53,7 @@
<string name="group_shortcuts" msgid="6012256992764410535">"Kortpaaie"</string>
<string name="group_widgets" msgid="1569030723286851002">"Legstukke"</string>
<string name="completely_out_of_space" msgid="6106288382070760318">"Niks meer spasie op jou Tuisskerms nie."</string>
- <string name="out_of_space" msgid="4691004494942118364">"Niks meer spasie op tuisskerm nie."</string>
+ <string name="out_of_space" msgid="4691004494942118364">"Niks meer spasie op die tuisskerm nie."</string>
<string name="hotseat_out_of_space" msgid="9139760413395605841">"Niks meer plek op die warmlaai nie."</string>
<string name="invalid_hotseat_item" msgid="1211534262129849507">"Hierdie legstuk is te groot vir die warmlaai."</string>
<string name="shortcut_installed" msgid="1701742129426969556">"Kortpad \"<xliff:g id="NAME">%s</xliff:g>\" is geskep."</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Programme-bladsy %1$d van %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Legstukke-bladsy %1$d van %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Welkom!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Maak jouself tuis"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Maak jouself tuis."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Skep meer skerms vir programme en vouers"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organiseer jou spasie"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Raak en hou agtergrond om muurpapier, legstukke en instellings te bestuur"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Raak en hou agtergrond om muurpapier, legstukke en instellings te bestuur."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Kies \'n paar programme"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Om \'n program by jou Tuisskerm te voeg, raak en hou dit."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Skep nuwe vouers vir jou programme"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Raak en hou \'n program, en skuif dit dan bo-op \'n ander programikoon."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Hier\'s \'n vouer"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Om een soos dié te skep, raak en hou \'n program en skuif dit dan oor \'n ander een."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Raak om vouer toe te maak"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 2d040b5..6e8aaa4 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d ተመርጧል"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d ተመርጧል"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"የግድግዳ ወረቀት %1$d ከ%2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> ተመርጧል"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"ሰርዝ"</string>
<string name="pick_image" msgid="1272073934062909527">"ምስል ምረጥ"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"የግድግዳ ወረቀቶች"</string>
@@ -45,7 +47,7 @@
<string name="rename_folder_label" msgid="3727762225964550653">"አቃፊ ስም"</string>
<string name="rename_folder_title" msgid="3771389277707820891">"አቃፊ ዳግም ሰይም"</string>
<string name="rename_action" msgid="5559600076028658757">"እሺ"</string>
- <string name="cancel_action" msgid="7009134900002915310">"ይቅር"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"ተው"</string>
<string name="menu_item_add_item" msgid="1264911265836810421">"ወደ መነሻ ማያ ገጽ ያክሉ"</string>
<string name="group_applications" msgid="3797214114206693605">"መተግበሪያዎች"</string>
<string name="group_shortcuts" msgid="6012256992764410535">"አቋራጮች"</string>
@@ -78,11 +80,11 @@
<string name="cab_folder_selection_text" msgid="7999992513806132118">"1 አቃፊ ተመርጧል"</string>
<string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 አቋራጭ ተመርጧል"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"አቋራጮችን ይጭናል"</string>
- <string name="permdesc_install_shortcut" msgid="923466509822011139">"አንድ መተግበሪያው ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ እንዲያክል ያስችለዋል።"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"መተግበሪያው ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ እንዲያክል ያስችለዋል።"</string>
<string name="permlab_uninstall_shortcut" msgid="864595034498083837">"አቋራጮችን ያራግፋል"</string>
<string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"መተግበሪያው አቋራጮችን ያለተጠቃሚ ጣልቃ ገብነት እንዲያስወግድ ያስችለዋል።"</string>
<string name="permlab_read_settings" msgid="1941457408239617576">"የመነሻ ቅንብሮች እና አቋራጮችን ያነባል"</string>
- <string name="permdesc_read_settings" msgid="5833423719057558387">"መተግበሪያው በመነሻ ውስጥ ያኡ ቅንብሮችን እና አቋራጮችን እንዲያነብ ያስችለዋል።"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"መተግበሪያው በመነሻ ውስጥ ያሉ ቅንብሮችን እና አቋራጮችን እንዲያነብ ያስችለዋል።"</string>
<string name="permlab_write_settings" msgid="3574213698004620587">"የመነሻ ቅንብሮችን እና አቋራጮችን ይጽፋል"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"መተግብሪያው ቅንብሮችን እና አቋራጮችን በመነሻ ውስጥ እንዲቀይራቸው ያስችለዋል።"</string>
<string name="gadget_error_text" msgid="6081085226050792095">"ፍርግም የመጫን ችግር"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"የመተግበሪያዎች ገጽ %1$d ከ%2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"የመግብሮች ገጽ %1$d ከ%2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"እንኳን ደህና መጡ!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"እቤትዎ እንዳሉ ሆነው ዘና ይበሉ"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"ልክ እቤትዎ እንዳሉ ሆነው ዘና ይበሉ።"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"ለመተግበሪያዎች እና አቃፊዎች ተጨማሪ ማያ ገጾችን ይፍጠሩ"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"ቦታዎን ያደራጁ"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"የግድግዳ ወረቀት፣ መግብሮችን እና ቅንብሮችን ለማቀናበር ጀርባውን ይንኩ እና ይያዙት"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"የግድግዳ ወረቀት፣ ምግብሮችን እና ቅንብሮችን ለማቀናበር ጀርባውን ይንኩ እና ይያዙት።"</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"አንዳንድ መተግበሪያዎችን ይምረጡ"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"አንድ መተግበሪያ ወደ መነሻ ማያ ገጽዎ ለማከል ይንኩት እና ይያዙት።"</string>
- <string name="folder_cling_title" msgid="294708344826056909">"ለመተግበሪያዎችዎ አዲስ አቃፊዎችን ይፍጠሩ"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"አንድ መተግበሪያ ነክተውት ይያዙት፣ ወደ የሌላ መተግበሪያ አዶ ላይ ይውሰዱት"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"አንድ አቃፊ እነሆ"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"አንድ እንደዚህ አይነት ለመፍጠር መተግበሪያውን ነክተው ይያዙት እና ወደ ሌላ ያንቀሳቅሱት።"</string>
<string name="cling_dismiss" msgid="8962359497601507581">"እሺ"</string>
<string name="folder_opened" msgid="94695026776264709">"አቃፊ ተከፍቷል፣ <xliff:g id="WIDTH">%1$d</xliff:g> በ<xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"አቃፊን ለመዝጋት ይንኩ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index cfb1012..73ee690 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
- <string name="home" msgid="7658288663002113681">"الشاشة الرئيسية"</string>
+ <string name="home" msgid="7658288663002113681">"الرئيسية"</string>
<string name="uid_name" msgid="7820867637514617527">"تطبيقات Android الأساسية"</string>
<string name="folder_name" msgid="7371454440695724752"></string>
<string name="wallpaper_instructions" msgid="563973358787555519">"تعيين خلفية"</string>
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"تم تحديد %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"تم تحديد %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"الخلفية %1$d من %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"تم تحديد <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"حذف"</string>
<string name="pick_image" msgid="1272073934062909527">"اختيار صورة"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"الخلفيات"</string>
@@ -60,7 +62,7 @@
<string name="title_select_shortcut" msgid="6680642571148153868">"اختيار اختصار"</string>
<string name="title_select_application" msgid="3280812711670683644">"اختيار تطبيق"</string>
<string name="all_apps_button_label" msgid="9110807029020582876">"التطبيقات"</string>
- <string name="all_apps_home_button_label" msgid="252062713717058851">"الشاشة الرئيسية"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"الرئيسية"</string>
<string name="delete_zone_label_workspace" msgid="4009607676751398685">"إزالة"</string>
<string name="delete_zone_label_all_apps" msgid="8083826390278958980">"إزالة"</string>
<string name="delete_target_label" msgid="1822697352535677073">"إزالة"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"صفحة التطبيقات %1$d من %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"صفحة الأدوات %1$d من %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"مرحبًا!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"تصرف على راحتك"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"تصرف على راحتك."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"إنشاء المزيد من الشاشات للتطبيقات والمجلدات"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"تنظيم مساحتك"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"المس مع الاستمرار الجزء الخلفي من صورة الشاشة لإدارة الخلفية والأدوات والإعدادات"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"المس مع الاستمرار الجزء الخلفي من صورة الشاشة لإدارة الخلفية والأدوات والإعدادات."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"اختيار بعض التطبيقات"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"لإضافة تطبيق إلى الشاشة الرئيسية، المسه مع الاستمرار."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"إنشاء مجلدات جديدة لتطبيقاتك"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"المس مع الاستمرار تطبيقًا ثم انقله ليكون فوق رمز تطبيق آخر"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"إليك المجلد"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"لإنشاء مجلد مثل هذا، المس أحد التطبيقات مع استمرار اللمس، ثم حركه فوق آخر."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"موافق"</string>
<string name="folder_opened" msgid="94695026776264709">"تم فتح المجلد، بمقاس <xliff:g id="WIDTH">%1$d</xliff:g> في <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"المس لإغلاق المجلد"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index e4f0424..ddcf404 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -31,6 +31,10 @@
<!-- no translation found for number_of_items_selected:zero (7464587177007785408) -->
<!-- no translation found for number_of_items_selected:one (142482526010824029) -->
<!-- no translation found for number_of_items_selected:other (1418352074806573570) -->
+ <!-- no translation found for wallpaper_accessibility_name (1655953108132967972) -->
+ <skip />
+ <!-- no translation found for announce_selection (8338254712932127413) -->
+ <skip />
<!-- no translation found for wallpaper_delete (8095005658756613921) -->
<skip />
<!-- no translation found for pick_image (1272073934062909527) -->
@@ -163,7 +167,7 @@
<skip />
<!-- no translation found for first_run_cling_title (7257389003637362144) -->
<skip />
- <!-- no translation found for first_run_cling_description (658815204153067813) -->
+ <!-- no translation found for first_run_cling_description (6447072552696253358) -->
<skip />
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
@@ -171,15 +175,15 @@
<skip />
<!-- no translation found for workspace_cling_title (5626202359865825661) -->
<skip />
- <!-- no translation found for workspace_cling_move_item (2243369117709858844) -->
+ <!-- no translation found for workspace_cling_move_item (528201129978005352) -->
<skip />
<!-- no translation found for all_apps_cling_title (34929250753095858) -->
<skip />
<!-- no translation found for all_apps_cling_add_item (400866858451850784) -->
<skip />
- <!-- no translation found for folder_cling_title (294708344826056909) -->
+ <!-- no translation found for folder_cling_title (3894908818693254164) -->
<skip />
- <!-- no translation found for folder_cling_create_folder (3245124301268588807) -->
+ <!-- no translation found for folder_cling_create_folder (6158215559475836131) -->
<skip />
<!-- no translation found for cling_dismiss (8962359497601507581) -->
<skip />
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 2039b74..2f53fa3 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Избрахте %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Избрахте %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Тапет %1$d от %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Избрахте <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Изтриване"</string>
<string name="pick_image" msgid="1272073934062909527">"Избиране на изображение"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Тапети"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Страница с приложения %1$d от %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Страница с приспособления %1$d от %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Добре дошли!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Персонализиране и приспособяване"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Персонализиране и приспособяване."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Създаване на още екрани за приложения и папки"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Организиране на мястото ви"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Докоснете и задръжте фона, за да управлявате тапета, приспособленията и настройките"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Докоснете и задръжте фона, за да управлявате тапета, приспособленията и настройките."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Изберете някои приложения"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"За да добавите приложение към началния си екран, го докоснете и задръжте."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Създаване на нови папки за приложенията ви"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Докоснете и задръжте приложение, след което го преместете върху иконата на друго."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Ето една папка"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"За да създадете подобна, докоснете и задръжте приложение, след което го преместете върху друго."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"ОK"</string>
<string name="folder_opened" msgid="94695026776264709">"Папката е отворена – <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"Докоснете, за да затворите папката"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 704cf7a..3400482 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Seleccionats: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Seleccionats: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fons de pantalla %1$d de %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"S\'ha seleccionat <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Suprimeix"</string>
<string name="pick_image" msgid="1272073934062909527">"Selecciona una imatge"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Fons de pantalla"</string>
@@ -87,7 +89,7 @@
<string name="permdesc_write_settings" msgid="5440712911516509985">"Permet que l\'aplicació canviï la configuració i les dreceres de la pantalla d\'inici."</string>
<string name="gadget_error_text" msgid="6081085226050792095">"S\'ha produït un problema en carregar el widget"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Aquesta aplicació és una aplicació del sistema i no es pot desinstal·lar."</string>
- <string name="dream_name" msgid="1530253749244328964">"Llançamíssils"</string>
+ <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
<string name="folder_hint_text" msgid="6617836969016293992">"Carpeta sense nom"</string>
<string name="workspace_description_format" msgid="2950174241104043327">"Pantalla d\'inici %1$d"</string>
<string name="default_scroll_format" msgid="7475544710230993317">"Pàgina %1$d de %2$d"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Pàgina d\'aplicacions %1$d de %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Pàgina de widgets %1$d de %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Hola!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Posa\'t còmode"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Personalitza la pantalla d\'inici"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crea més pantalles per a aplicacions i carpetes"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organitza el teu espai"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Toca i mantén premut el fons per gestionar el fons de pantalla, els widgets i la configuració"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Toca i mantén premut el fons per gestionar el fons de pantalla, els widgets i la configuració."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Tria unes quantes aplicacions"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Per afegir una aplicació a la pantalla d\'inici, mantén-la premuda."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Crea carpetes per a les aplicacions"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Toca i mantén premuda una aplicació i, a continuació, mou-la a sobre de la icona d\'una altra aplicació."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Aquí hi ha una carpeta"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Per crear-ne una com aquesta, mantén premuda una aplicació i, a continuació, mou-la sobre una altra."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"D\'acord"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Toca per tancar la carpeta"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index a5478f9..1061e79 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Vybráno: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Vybráno: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Tapeta %1$d z %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Vybrána položka <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Smazat"</string>
<string name="pick_image" msgid="1272073934062909527">"Vybrat obrázek"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Tapety"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Stránka aplikací %1$d z %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Stránka widgetů %1$d z %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Vítejte!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Udělejte si pohodlí"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Udělejte si pohodlí."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Vytvořte několik obrazovek pro aplikace a složky"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organizace prostoru"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Chcete-li spravovat tapetu, widgety a nastavení, dotkněte se pozadí a přidržte je."</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Chcete-li spravovat tapetu, widgety a nastavení, dotkněte se pozadí a přidržte je."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Vyberte nějaké aplikace"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Chcete-li na plochu přidat aplikaci, dotkněte se jí a přidržte ji."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Vytvořit pro aplikace nové složky"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Dotkněte se aplikace, přidržte ji a poté ji přesuňte na ikonu jiné aplikace"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Toto je složka"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Chcete-li vytvořit složku, přetáhněte aplikaci na jinou aplikaci."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"Složka otevřena, rozměry <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="1884479294466410023">"Dotykem složku zavřete"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index f2a7763..5db246e 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d er valgt"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d er valgt"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Baggrund %1$d af %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> blev valgt"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Slet"</string>
<string name="pick_image" msgid="1272073934062909527">"Vælg billede"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Baggrunde"</string>
@@ -37,8 +39,8 @@
<string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string>
<string name="widget_adder" msgid="3201040140710381657">"Widgets"</string>
<string name="toggle_weight_watcher" msgid="5645299835184636119">"Vis Mem"</string>
- <string name="long_press_widget_to_add" msgid="7699152356777458215">"Tryk på en widget, og hold fingeren nede for at vælge den."</string>
- <string name="market" msgid="2619650989819296998">"Køb"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"Tryk på en widget, og hold den nede for at vælge."</string>
+ <string name="market" msgid="2619650989819296998">"Køb i Google Play Butik"</string>
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
<string name="external_drop_widget_error" msgid="3165821058322217155">"Elementet kunne ikke trækkes til startskærmen."</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Vælg den widget, du vil oprette"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps-side %1$d ud af %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgets-side %1$d ud af %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Velkommen"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Tilpas din startskærm"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Føl dig hjemme."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Opret flere skærme til apps og mapper"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organiser din arbejdsplads"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Tryk på en baggrund, og hold fingeren nede for at håndtere baggrunde, widgets og indstillinger."</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Tryk på en baggrund, og hold fingeren nede for at administrere baggrunde, widgets og indstillinger."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Vælge nogle apps"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Tryk på en app, og hold fingeren nede for at føje appen til startskærmen."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Opret nye mapper til dine apps"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Tryk på en app, og hold fingeren nede, og flyt den over til et andet appikon"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Her kan du se en mappe"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Du kan oprette en mappe magen til denne ved at trykke på en app og holde fingeren nede, mens du flytter appen til en anden mappe."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"Mappen er åben, <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="1884479294466410023">"Tryk for at lukke mappen"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index b67f0e0..7a5e7e6 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d ausgewählt"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d ausgewählt"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Hintergrund %1$d von %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> ausgewählt"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Entfernen"</string>
<string name="pick_image" msgid="1272073934062909527">"Bild auswählen"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Hintergründe"</string>
@@ -78,16 +80,16 @@
<string name="cab_folder_selection_text" msgid="7999992513806132118">"1 Ordner ausgewählt"</string>
<string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 Verknüpfung ausgewählt"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Verknüpfungen installieren"</string>
- <string name="permdesc_install_shortcut" msgid="923466509822011139">"Ermöglicht einer App das Hinzufügen von Verknüpfungen ohne Eingriff des Nutzers"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"Ermöglicht einer App das Hinzufügen von Verknüpfungen ohne Eingreifen des Nutzers"</string>
<string name="permlab_uninstall_shortcut" msgid="864595034498083837">"Verknüpfungen deinstallieren"</string>
- <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Ermöglicht einer App das Entfernen von Verknüpfungen ohne Eingriff des Nutzers"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Ermöglicht einer App das Entfernen von Verknüpfungen ohne Eingreifen des Nutzers"</string>
<string name="permlab_read_settings" msgid="1941457408239617576">"Einstellungen und Verknüpfungen auf dem Startbildschirm lesen"</string>
<string name="permdesc_read_settings" msgid="5833423719057558387">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu lesen"</string>
<string name="permlab_write_settings" msgid="3574213698004620587">"Einstellungen und Verknüpfungen für den Startbildschirm schreiben"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu ändern"</string>
<string name="gadget_error_text" msgid="6081085226050792095">"Problem beim Laden des Widgets"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Dies ist eine Systemanwendung, die nicht deinstalliert werden kann."</string>
- <string name="dream_name" msgid="1530253749244328964">"Raketenstartgerät"</string>
+ <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
<string name="folder_hint_text" msgid="6617836969016293992">"Unbenannter Ordner"</string>
<string name="workspace_description_format" msgid="2950174241104043327">"Startbildschirm %1$d"</string>
<string name="default_scroll_format" msgid="7475544710230993317">"Seite %1$d von %2$d"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps-Seite %1$d von %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgets-Seite %1$d von %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Willkommen!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Gerät personalisieren"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Gerät personalisieren"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Weitere Bildschirme für Apps und Ordner erstellen"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Arbeitsbereich organisieren"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Hintergrund berühren und halten, um Hintergrund, Widgets und Einstellungen zu verwalten"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Hintergrund berühren und halten, um Hintergrund, Widgets und Einstellungen zu verwalten"</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Apps auswählen"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Berühren und halten Sie eine App, um sie zum Startbildschirm hinzuzufügen."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Neue Ordner für Ihre Apps erstellen"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Berühren und halten Sie eine App und verschieben Sie sie dann auf das Symbol einer anderen App."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Hier ist ein Ordner"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Um einen Ordner zu erstellen, berühren und halten Sie eine App und verschieben Sie sie auf eine andere."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Ordner durch Berühren schließen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 673f7bf..74322e0 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d επιλεγμένα"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d επιλεγμένα"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Ταπετσαρία %1$d από %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Επιλέχθηκε το <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Διαγραφή"</string>
<string name="pick_image" msgid="1272073934062909527">"Επιλογή εικόνας"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Ταπετσαρίες"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Σελίδα εφαρμογών %1$d από %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Σελίδα γραφικών στοιχείων %1$d από %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Καλώς ορίσατε!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Νιώστε σαν στο σπίτι σας"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Νιώστε σαν στο σπίτι σας."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Δημιουργία περισσότερων οθονών για εφαρμογές και φακέλους"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Οργανώστε το χώρο σας"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Αγγίξτε παρατεταμένα το φόντο για να διαχειριστείτε την ταπετσαρία, τα γραφικά στοιχεία και τις ρυθμίσεις"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Αγγίξτε παρατεταμένα το φόντο για να διαχειριστείτε την ταπετσαρία, τα γραφικά στοιχεία και τις ρυθμίσεις."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Επιλέξτε ορισμένες εφαρμογές"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Για να προσθέσετε μια εφαρμογή στην αρχική σας οθόνη, αγγίξτε την παρατεταμένα."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Δημιουργήστε νέους φακέλους για τις εφαρμογές σας"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Αγγίξτε παρατεταμένα μια εφαρμογή και, στη συνέχεια, μετακινήστε τη πάνω από κάποιο άλλο εικονίδιο εφαρμογής"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Ορίστε ένας φάκελος"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Για να δημιουργήσετε έναν φάκελο σαν κι αυτόν, πατήστε παρατεταμένα μια εφαρμογή και στη συνέχεια, μετακινήστε τη πάνω σε μια άλλη."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"Άνοιγμα φακέλου, <xliff:g id="WIDTH">%1$d</xliff:g> επί <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"Αγγίξτε για να κλείσετε τον φάκελο"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index ef27031..316585e 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d selected"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d selected"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Wallpaper %1$d of %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Selected <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Delete"</string>
<string name="pick_image" msgid="1272073934062909527">"Pick image"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Wallpapers"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps page %1$d of %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgets page %1$d of %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Welcome!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Make yourself at Home"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Make yourself at home."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Create more screens for apps and folders"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organise your space"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Touch & hold background to manage wallpaper, widgets and settings"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Touch & hold background to manage wallpaper, widgets and settings."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Choose some apps"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"To add an app to your Home screen, touch & hold it."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Create new folders for your apps"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Touch & hold an app, then move it on top of another app icon"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Here\'s a folder"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"To create one like this, touch & hold an app, then move it over another."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Touch to close folder"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..316585e
--- /dev/null
+++ b/res/values-en-rIN/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (C) 2008 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+ <string name="home" msgid="7658288663002113681">"Home"</string>
+ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string>
+ <string name="folder_name" msgid="7371454440695724752"></string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"Set wallpaper"</string>
+ <plurals name="number_of_items_selected">
+ <item quantity="zero" msgid="7464587177007785408">"%1$d selected"</item>
+ <item quantity="one" msgid="142482526010824029">"%1$d selected"</item>
+ <item quantity="other" msgid="1418352074806573570">"%1$d selected"</item>
+ </plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Wallpaper %1$d of %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Selected <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+ <string name="wallpaper_delete" msgid="8095005658756613921">"Delete"</string>
+ <string name="pick_image" msgid="1272073934062909527">"Pick image"</string>
+ <string name="pick_wallpaper" msgid="8179698221502010609">"Wallpapers"</string>
+ <string name="crop_wallpaper" msgid="8334345984491368009">"Crop wallpaper"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"App isn\'t installed."</string>
+ <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string>
+ <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"Show Mem"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"Touch & hold to pick up a widget."</string>
+ <string name="market" msgid="2619650989819296998">"Shop"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"Couldn\'t drop item on this Home screen."</string>
+ <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Choose widget to create"</string>
+ <string name="rename_folder_label" msgid="3727762225964550653">"Folder name"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"Rename folder"</string>
+ <string name="rename_action" msgid="5559600076028658757">"OK"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"Cancel"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"Add to Home screen"</string>
+ <string name="group_applications" msgid="3797214114206693605">"Apps"</string>
+ <string name="group_shortcuts" msgid="6012256992764410535">"Shortcuts"</string>
+ <string name="group_widgets" msgid="1569030723286851002">"Widgets"</string>
+ <string name="completely_out_of_space" msgid="6106288382070760318">"No more room on your Home screens."</string>
+ <string name="out_of_space" msgid="4691004494942118364">"No more room on this Home screen."</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"No more room on the hot seat."</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"This widget is too large for the hot seat."</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" created."</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" was removed."</string>
+ <string name="shortcut_duplicate" msgid="9167217446062498127">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" already exists."</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"Choose shortcut"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"Choose app"</string>
+ <string name="all_apps_button_label" msgid="9110807029020582876">"Apps"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"Home"</string>
+ <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Remove"</string>
+ <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Uninstall"</string>
+ <string name="delete_target_label" msgid="1822697352535677073">"Remove"</string>
+ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Uninstall"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"App info"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"Search"</string>
+ <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Voice Search"</string>
+ <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
+ <string name="accessibility_delete_button" msgid="6466114477993744621">"Remove"</string>
+ <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Uninstall update"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"Uninstall app"</string>
+ <string name="cab_menu_app_info" msgid="8593722221450362342">"App details"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"1 app selected"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 widget selected"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 folder selected"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 shortcut selected"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"install shortcuts"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"Allows an app to add shortcuts without user intervention."</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"uninstall shortcuts"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Allows the app to remove shortcuts without user intervention."</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"read Home settings and shortcuts"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"Allows the app to read the settings and shortcuts in Home."</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"write Home settings and shortcuts"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"Allows the app to change the settings and shortcuts in Home."</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"Problem loading widget"</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"This is a system app and can\'t be uninstalled."</string>
+ <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
+ <string name="folder_hint_text" msgid="6617836969016293992">"Unnamed Folder"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"Home screen %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"Page %1$d of %2$d"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"Home screen %1$d of %2$d"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps page %1$d of %2$d"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgets page %1$d of %2$d"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"Welcome!"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Make yourself at home."</string>
+ <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+ <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Create more screens for apps and folders"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"Organise your space"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Touch & hold background to manage wallpaper, widgets and settings."</string>
+ <string name="all_apps_cling_title" msgid="34929250753095858">"Choose some apps"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"To add an app to your Home screen, touch & hold it."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Here\'s a folder"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"To create one like this, touch & hold an app, then move it over another."</string>
+ <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
+ <string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Touch to close folder"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"Touch to save rename"</string>
+ <string name="folder_closed" msgid="4100806530910930934">"Folder closed"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"Folder renamed to <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="6629239338071103179">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+ <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+ <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+ <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+ <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
+ <string name="wallpaper_button_text" msgid="8404103075899945851">"Wallpapers"</string>
+ <string name="settings_button_text" msgid="8119458837558863227">"Settings"</string>
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 7346215..c9a44a9 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
- <string name="home" msgid="7658288663002113681">"Página principal"</string>
+ <string name="home" msgid="7658288663002113681">"Pantalla principal"</string>
<string name="uid_name" msgid="7820867637514617527">"Aplicaciones básicas de Android"</string>
<string name="folder_name" msgid="7371454440695724752"></string>
<string name="wallpaper_instructions" msgid="563973358787555519">"Establecer como fondo de pantalla"</string>
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d seleccionado"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d seleccionados"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fondo de pantalla %1$d de %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> seleccionado"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Eliminar"</string>
<string name="pick_image" msgid="1272073934062909527">"Elegir imagen"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Fondos de pantalla"</string>
@@ -39,7 +41,7 @@
<string name="toggle_weight_watcher" msgid="5645299835184636119">"Mostrar memoria"</string>
<string name="long_press_widget_to_add" msgid="7699152356777458215">"Mantén presionado el widget que desees elegir."</string>
<string name="market" msgid="2619650989819296998">"Comprar"</string>
- <string name="widget_dims_format" msgid="2370757736025621599">"%1$d x %2$d"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
<string name="external_drop_widget_error" msgid="3165821058322217155">"Error al soltar elemento en la pantalla principal"</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Elegir los widgets para crear"</string>
<string name="rename_folder_label" msgid="3727762225964550653">"Nombre de carpeta"</string>
@@ -60,7 +62,7 @@
<string name="title_select_shortcut" msgid="6680642571148153868">"Elegir acceso directo"</string>
<string name="title_select_application" msgid="3280812711670683644">"Elegir aplicación"</string>
<string name="all_apps_button_label" msgid="9110807029020582876">"Aplicaciones"</string>
- <string name="all_apps_home_button_label" msgid="252062713717058851">"Inicio"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"Pantalla principal"</string>
<string name="delete_zone_label_workspace" msgid="4009607676751398685">"Eliminar"</string>
<string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Desinstalar"</string>
<string name="delete_target_label" msgid="1822697352535677073">"Eliminar"</string>
@@ -81,10 +83,10 @@
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite que una aplicación agregue accesos directos sin que el usuario intervenga."</string>
<string name="permlab_uninstall_shortcut" msgid="864595034498083837">"desinstalar accesos directos"</string>
<string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Permite que la aplicación elimine accesos directos sin que el usuario intervenga."</string>
- <string name="permlab_read_settings" msgid="1941457408239617576">"leer configuración y accesos directos de la página principal"</string>
- <string name="permdesc_read_settings" msgid="5833423719057558387">"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="3574213698004620587">"escribir configuración y accesos directos de la página principal"</string>
- <string name="permdesc_write_settings" msgid="5440712911516509985">"Permite que la aplicación cambie la configuración y los accesos directos de la página principal."</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"leer configuración y accesos directos de la pantalla principal"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"Permite que la aplicación lea la configuración y los accesos directos de la pantalla principal."</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"escribir configuración y accesos directos de la pantalla principal"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"Permite que la aplicación cambie la configuración y los accesos directos de la pantalla principal."</string>
<string name="gadget_error_text" msgid="6081085226050792095">"Problema al cargar el widget"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Esta es una aplicación del sistema y no se puede desinstalar."</string>
<string name="dream_name" msgid="1530253749244328964">"Lanzacohetes"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Página de aplicaciones %1$d de %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Página de widgets %1$d de %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"¡Bienvenido/a!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Siéntete como en casa"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Siéntete como en casa."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crea más pantallas para aplicaciones y carpetas."</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organiza tu espacio"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Mantén presionado el fondo para administrar el fondo de pantalla, los widgets y la configuración."</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Mantén presionado el fondo para administrar el fondo de pantalla, los widgets y la configuración."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Elige algunas aplicaciones"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Para agregar una aplicación a tu pantalla principal, mantenla presionada."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Crea nuevas carpetas para tus aplicaciones"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Toca la aplicación y, sin levantar el dedo, colócala encima del ícono de otra aplicación."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Aquí tienes una carpeta"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Para crear una carpeta como esta, mantén presionada una aplicación y luego muévela sobre otra."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"Aceptar"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Toca para cerrar la carpeta."</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 96d6d58..193e096 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Seleccionados: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Seleccionados: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fondo de pantalla %1$d de %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> seleccionado"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Eliminar"</string>
<string name="pick_image" msgid="1272073934062909527">"Seleccionar imagen"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Fondos de pantalla"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Página de aplicaciones %1$d de %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Página de widgets %1$d de %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Te damos la bienvenida"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Personaliza la pantalla de inicio"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Personaliza tu pantalla de inicio."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crea más pantallas para aplicaciones y carpetas"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organiza tu espacio"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Mantén pulsado el fondo para administrar el fondo de pantalla, los widgets y los ajustes"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Mantén pulsado el fondo para gestionar el fondo de pantalla, los widgets y los ajustes."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Selecciona algunas aplicaciones"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Para añadir una aplicación a tu pantalla de inicio, solo tienes que mantenerla pulsada."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Crea nuevas carpetas para tus aplicaciones"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Mantén pulsada la aplicación y colócala sobre el icono de otra aplicación"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Esto es una carpeta"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Para crear una carpeta como esta, mantén pulsada una aplicación y muévela sobre otra."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"Aceptar"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Toca para cerrar la carpeta"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index fdba5e6c..f026b08 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Valitud on %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Valitud on %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d/%2$d taustapildist"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Valitud on <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Kustuta"</string>
<string name="pick_image" msgid="1272073934062909527">"Vali kujutis"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Taustapildid"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Rakenduste leht %1$d/%2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Vidinate leht %1$d/%2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Tere tulemast!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Tundke end nagu kodus"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Tundke end nagu kodus."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Looge rakenduste ja kaustade jaoks rohkem ekraanikuvasid"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Korraldage oma ruumi"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Taustapildi, vidinate ja seadete haldamiseks puudutage tausta ning hoidke seda all"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Taustapildi, vidinate ja seadete haldamiseks puudutage tausta ning hoidke seda all."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Valige mõned rakendused"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Rakenduse lisamiseks avaekraanile vajutage ja hoidke seda all."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Rakenduste jaoks uute kaustade loomine"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Puudutage rakendust ja hoidke seda all, seejärel liigutage see teise rakenduse ikooni peale"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Siin on kaust"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Sarnase loomiseks vajutage ja hoidke rakendust all, seejärel viige see teise peale."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Puudutage kausta sulgemiseks"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 978c201..3a0d0b8 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d انتخاب شد"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d انتخاب شد"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"کاغذ دیواری %1$d از %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> انتخاب شده"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"حذف"</string>
<string name="pick_image" msgid="1272073934062909527">"انتخاب تصویر"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"کاغذدیواریها"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"صفحه برنامهها %1$d از %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"صفحه ابزارکها %1$d از %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"خوش آمدید!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"راحت باشید"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"راحت باشید."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"صفحات بیشتری را برای برنامهها و پوشهها ایجاد کنید"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"فضای خود را سازماندهی کنید"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"برای مدیریت کاغذدیواریها، ابزارکها و تنظیمات، پسزمینه را لمس کنید و نگهدارید"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"برای مدیریت کاغذدیواری، ابزارکها و تنظیمات، پسزمینه را لمس کرده و نگهدارید."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"چند برنامه انتخاب کنید"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"اگر میخواهید برنامهای را به صفحه اصلی خود اضافه کنید، آن را لمس کرده، نگهدارید."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"ایجاد پوشههای جدید برای برنامههایتان"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"برنامهای را لمس کرده، نگهدارید، سپس آن را به بالای نماد برنامهای دیگر حرکت دهید"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"اینجا یک پوشه است"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"برای ایجاد پوشهای مثل این، یک برنامه را لمس کرده و نگهدارید، سپس آن را روی برنامه دیگر بیاندازید."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"تأیید"</string>
<string name="folder_opened" msgid="94695026776264709">"پوشه باز شده، <xliff:g id="WIDTH">%1$d</xliff:g> در <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"برای بستن پوشه لمس کنید"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 750fd50..d327250 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d valittu"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d valittu"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Taustakuva %1$d/%2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Valittu: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Poista"</string>
<string name="pick_image" msgid="1272073934062909527">"Valitse kuva"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Taustakuvat"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps-sivu %1$d / %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgetit-sivu %1$d / %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Tervetuloa!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Ole kuin kotonasi"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Ole kuin kotonasi."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Luo lisää ruutuja sovelluksille ja kansioille"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Järjestä tilasi"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Hallitse taustakuvaa, widgetejä ja asetuksia koskettamalla taustakuvaa pitkään"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Hallitse taustakuvaa, widgetejä ja asetuksia koskettamalla taustaa pitkään."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Valitse joitakin sovelluksia"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Voit lisätä sovelluksen aloitusruutuun koskettamalla sitä pitkään."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Luo uusia kansioita sovelluksillesi"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Kosketa sovellusta pitkään ja siirrä se sitten toisen sovelluskuvakkeen päälle"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Tässä on kansio"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Luo se seuraavasti: kosketa sovellusta pitkään ja siirrä se sitten toisen päälle."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Sulje kansio koskettamalla"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..9d8dbeb
--- /dev/null
+++ b/res/values-fr-rCA/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (C) 2008 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="5181331383435256801">"Lanceur3"</string>
+ <string name="home" msgid="7658288663002113681">"Accueil"</string>
+ <string name="uid_name" msgid="7820867637514617527">"Applications de base Android"</string>
+ <string name="folder_name" msgid="7371454440695724752"></string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"Définir le fond d\'écran"</string>
+ <plurals name="number_of_items_selected">
+ <item quantity="zero" msgid="7464587177007785408">"%1$d sélectionné"</item>
+ <item quantity="one" msgid="142482526010824029">"%1$d sélectionné"</item>
+ <item quantity="other" msgid="1418352074806573570">"%1$d sélectionné(s)"</item>
+ </plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fond d\'écran %1$d sur %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Sélection : <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+ <string name="wallpaper_delete" msgid="8095005658756613921">"Supprimer"</string>
+ <string name="pick_image" msgid="1272073934062909527">"Sélectionner une image"</string>
+ <string name="pick_wallpaper" msgid="8179698221502010609">"Fonds d\'écran"</string>
+ <string name="crop_wallpaper" msgid="8334345984491368009">"Rogner le fond d\'écran"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"L\'application n\'est pas installée."</string>
+ <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string>
+ <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"Afficher la mémoire"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"Maintenez un doigt sur le widget pour l\'ajouter."</string>
+ <string name="market" msgid="2619650989819296998">"Magasiner"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"Imposs. de déposer l\'élément sur l\'écran d\'accueil"</string>
+ <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Sélectionnez le widget à créer"</string>
+ <string name="rename_folder_label" msgid="3727762225964550653">"Nom du dossier"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"Renommer le dossier"</string>
+ <string name="rename_action" msgid="5559600076028658757">"OK"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"Annuler"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"Ajouter à l\'écran d\'accueil"</string>
+ <string name="group_applications" msgid="3797214114206693605">"Applications"</string>
+ <string name="group_shortcuts" msgid="6012256992764410535">"Raccourcis"</string>
+ <string name="group_widgets" msgid="1569030723286851002">"Widgets"</string>
+ <string name="completely_out_of_space" msgid="6106288382070760318">"Vous n\'avez plus d\'espace libre sur vos écrans d\'accueil."</string>
+ <string name="out_of_space" msgid="4691004494942118364">"Pas d\'espace libre sur l\'écran d\'accueil."</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"Vous n\'avez plus de place sur la barre d\'accès rapide."</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"Ce widget est trop volumineux pour la barre d\'accès rapide."</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"Le raccourci « <xliff:g id="NAME">%s</xliff:g> » a été créé."</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"Le raccourci « <xliff:g id="NAME">%s</xliff:g> » a été supprimé."</string>
+ <string name="shortcut_duplicate" msgid="9167217446062498127">"Le raccourci « <xliff:g id="NAME">%s</xliff:g> » existe déjà."</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"Sélectionner un raccourci"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"Sélectionner une application"</string>
+ <string name="all_apps_button_label" msgid="9110807029020582876">"Applications"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"Accueil"</string>
+ <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Supprimer"</string>
+ <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Désinstaller"</string>
+ <string name="delete_target_label" msgid="1822697352535677073">"Supprimer"</string>
+ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Désinstaller"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"Détails de l\'application"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"Rechercher"</string>
+ <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Recherche vocale"</string>
+ <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Applications"</string>
+ <string name="accessibility_delete_button" msgid="6466114477993744621">"Supprimer"</string>
+ <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Désinstaller la mise à jour"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"Désinstaller l\'application"</string>
+ <string name="cab_menu_app_info" msgid="8593722221450362342">"Détails de l\'application"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"1 application sélectionnée"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 widget sélectionné"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 dossier sélectionné"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 raccourci sélectionné"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"installer des raccourcis"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur."</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"désinstaller des raccourcis"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Permet à l\'application de supprimer des raccourcis sans l\'intervention de l\'utilisateur."</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"lire les paramètres et les raccourcis de la page d\'accueil"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"Permet à l\'application de lire les paramètres et les raccourcis de l\'écran d\'accueil."</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"enregistrer les paramètres de la page d\'accueil et des raccourcis"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"Permet à l\'application de modifier les paramètres et les raccourcis de l\'écran d\'accueil."</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"Problème lors du chargement du widget"</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"Impossible de désinstaller cette application, car il s\'agit d\'une application système."</string>
+ <string name="dream_name" msgid="1530253749244328964">"Lance-missile"</string>
+ <string name="folder_hint_text" msgid="6617836969016293992">"Dossier sans nom"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"Écran d\'accueil %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"Page %1$d sur %2$d"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"Écran d\'accueil %1$d sur %2$d"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Page des applications : %1$d sur %2$d"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Page des widgets : %1$d sur %2$d"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"Bienvenue!"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Faites comme chez vous."</string>
+ <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+ <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Créer plus d\'écrans pour les applications et les dossiers"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"Organiser son espace personnel"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Maintenez votre doigt sur l\'arrière-plan pour gérer les fonds d\'écran, les widgets et les paramètres."</string>
+ <string name="all_apps_cling_title" msgid="34929250753095858">"Sélectionner des applications"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"Pour ajouter une application à votre écran d\'accueil, maintenez votre doigt dessus."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Voici un dossier"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Pour créer un dossier comme ça, maintenez votre doigt sur une application, puis déplacez-la sur une autre."</string>
+ <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
+ <string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Toucher pour fermer le dossier"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"Toucher pour enregistrer le nouveau nom"</string>
+ <string name="folder_closed" msgid="4100806530910930934">"Dossier fermé"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"Nouveau nom du dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="6629239338071103179">"Dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+ <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+ <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+ <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+ <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
+ <string name="wallpaper_button_text" msgid="8404103075899945851">"Fonds d\'écran"</string>
+ <string name="settings_button_text" msgid="8119458837558863227">"Paramètres"</string>
+</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a6c75be..b1b0a79 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d fond d\'écran sélectionné"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d fonds d\'écran sélectionnés"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fond d\'écran %1$d sur %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> est sélectionné."</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Supprimer"</string>
<string name="pick_image" msgid="1272073934062909527">"Sélectionner une image"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Fonds d\'écran"</string>
@@ -37,10 +39,10 @@
<string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string>
<string name="widget_adder" msgid="3201040140710381657">"Widgets"</string>
<string name="toggle_weight_watcher" msgid="5645299835184636119">"Afficher la mémoire"</string>
- <string name="long_press_widget_to_add" msgid="7699152356777458215">"Appuyez manière prolongée pour sélectionner widget."</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"App. de manière prolongée pour sélectionner widget."</string>
<string name="market" msgid="2619650989819296998">"Boutique"</string>
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d x %2$d"</string>
- <string name="external_drop_widget_error" msgid="3165821058322217155">"Impossible de déposer l\'élément sur écran d\'accueil."</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"Impossible de déposer élément sur écran d\'accueil."</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Sélectionner le widget à créer"</string>
<string name="rename_folder_label" msgid="3727762225964550653">"Nom du dossier"</string>
<string name="rename_folder_title" msgid="3771389277707820891">"Renommer le dossier"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Page des applications %1$d sur %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Page des widgets %1$d sur %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Bienvenue !"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Se familiariser avec l\'écran d\'accueil"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Familiarisez-vous avec l\'écran d\'accueil."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
- <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Créer plus d\'écrans pour les applications et les dossiers"</string>
- <string name="workspace_cling_title" msgid="5626202359865825661">"Organiser son espace"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Appuyez de manière prolongée sur l\'arrière-plan pour gérer les fonds d\'écran, les widgets et les paramètres."</string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Créez des écrans personnalisés pour vos applis et dossiers"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"Organisez votre espace"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Appuyez de manière prolongée sur l\'arrière-plan pour gérer les fonds d\'écran, les widgets et les paramètres."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Sélectionner des applications"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Pour ajouter une application à votre écran d\'accueil, appuyez dessus de manière prolongée."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Créer des dossiers pour vos applications"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Appuyez de manière prolongée sur l\'icône d\'une application, puis déplacez-la sur une autre icône d\'application."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Voici un dossier"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Pour en créer un, appuyez de manière prolongée sur une application, puis déplacez-la vers une autre."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Appuyez pour fermer le dossier."</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 9dbf4d9..eddd75c 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d चयनित"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d चयनित"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"वॉलपेपर %2$d में से %1$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"चयनित <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"हटाएं"</string>
<string name="pick_image" msgid="1272073934062909527">"चित्र चुनें"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"वॉलपेपर"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"एप्लिकेशन पृष्ठ %2$d में से %1$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"विजेट पृष्ठ %2$d में से %1$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"स्वागत है!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"जैसा चाहें वैसा उपयोग करें"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"जैसा चाहें वैसा उपयोग करें."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"एप्लिकेशन और फ़ोल्डर के लिए और अधिक स्क्रीन बनाएं"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"अपने स्थान को व्यवस्थित करें"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"वॉलपेपर, विजेट और सेटिंग प्रबंधित करने के लिए पृष्ठभूमि को स्पर्श करके रखें"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"वॉलपेपर, विजेट और सेटिंग प्रबंधित करने के लिए पृष्ठभूमि को स्पर्श करके रखें."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"कुछ एप्लिकेशन चुनें"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"किसी एप्लिकेशन को अपनी होम स्क्रीन से जोड़ने के लिए, उसे स्पर्श करके रखें."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"अपने एप्लिकेशन के लिए नए फ़ोल्डर बनाएं"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"एक एप्लिकेशन को स्पर्श करके रखें, फिर उसे किसी दूसरे एप्लिकेशन आइकन के शीर्ष पर ले जाएं"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"यहां एक फ़ोल्डर है"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"इसके जैसा कोई एक बनाने के लिए, किसी एप्लिकेशन को स्पर्श करके रखें, फिर इसे किसी दूसरे पर ले जाएं."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"ठीक"</string>
<string name="folder_opened" msgid="94695026776264709">"फ़ोल्डर खोला गया, <xliff:g id="WIDTH">%1$d</xliff:g> गुणा <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"फ़ोल्डर बंद करने के लिए स्पर्श करें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index a3f7fe2..783946d 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Odabrano: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Odabrano: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d. pozadinska slika od %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Odabrana je stavka <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Izbriši"</string>
<string name="pick_image" msgid="1272073934062909527">"Odaberi sliku"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Pozadinske slike"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Stranica aplikacija %1$d od %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Stranica widgeta %1$d od %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Dobro došli!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Osjećajte se kao kod kuće"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Osjećajte se kao kod kuće."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Izradite više zaslona za aplikacije i mape"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organizirajte svoj prostor"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Dodirnite i zadržite pozadinu da biste upravljali pozadinskom slikom, widgetima i postavkama"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Dodirnite i držite pozadinu da biste upravljali pozadinskom slikom, widgetima i postavkama."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Odaberite neke aplikacije"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Da biste dodali aplikaciju na početni zaslon, dodirnite je i zadržite."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Izradite nove mape za svoje aplikacije"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Dodirnite i zadržite aplikaciju pa je premjestite na ikonu neke druge aplikacije"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Evo mape"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Da biste izradili ovakvu mapu, dodirnite i držite aplikaciju pa je pomaknite preko druge aplikacije."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"U redu"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Dodirnite da biste zatvorili mapu"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index d5f41af..8876652 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d kiválasztva"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d kiválasztva"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%2$d/%1$d. háttérkép"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> kiválasztva"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Törlés"</string>
<string name="pick_image" msgid="1272073934062909527">"Kép választása"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Háttérképek"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%2$d/%1$d. alkalmazásoldal"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%2$d/%1$d. moduloldal"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Üdvözöljük!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Szabja személyre készülékét"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Varázsolja egyedivé készülékét."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Hozzon létre további képernyőket az alkalmazásoknak és mappáknak"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Munkaterület rendezése"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Érintse meg a hátteret, és tartsa lenyomva a háttérkép, modulok és beállítások kezeléséhez."</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Érintse meg és tartsa lenyomva a hátteret a háttérkép, modulok és beállítások kezeléséhez."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Válasszon ki néhány alkalmazást"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Ha egy alkalmazást szeretne elhelyezni a kezdőképernyőn, érintse meg, és tartsa lenyomva."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Hozzon létre új mappákat az alkalmazásoknak"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Érintse meg és tartsa lenyomva az alkalmazást, majd mozgassa azt egy másik alkalmazásikon tetejére."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Itt egy mappa"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Mappa létrehozásához érintse meg és tartsa lenyomva az alkalmazást, majd húzza egy másik fölé."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Érintse meg a mappa bezárásához"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..ab7388a
--- /dev/null
+++ b/res/values-hy-rAM/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (C) 2008 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+ <string name="home" msgid="7658288663002113681">"Հիմնական"</string>
+ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string>
+ <string name="folder_name" msgid="7371454440695724752"></string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"Սահմանել պաստառը"</string>
+ <plurals name="number_of_items_selected">
+ <item quantity="zero" msgid="7464587177007785408">"%1$d ընտրված"</item>
+ <item quantity="one" msgid="142482526010824029">"%1$d ընտրված"</item>
+ <item quantity="other" msgid="1418352074806573570">"%1$d ընտրված"</item>
+ </plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d պաստառ՝ %2$d-ից"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Ընտրված է <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+ <string name="wallpaper_delete" msgid="8095005658756613921">"Ջնջել"</string>
+ <string name="pick_image" msgid="1272073934062909527">"Ընտրել պատկեր"</string>
+ <string name="pick_wallpaper" msgid="8179698221502010609">"Պաստառներ"</string>
+ <string name="crop_wallpaper" msgid="8334345984491368009">"Եզրատել պաստառը"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"Ծրագիրը տեղադրված չէ:"</string>
+ <string name="widgets_tab_label" msgid="2921133187116603919">"Վիջեթներ"</string>
+ <string name="widget_adder" msgid="3201040140710381657">"Վիջեթներ"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"Ցուցադրել մեմը"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"Հպեք և պահեք՝ վիջեթն ընտրելու համար:"</string>
+ <string name="market" msgid="2619650989819296998">"Խանութ"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"Հնարավոր չէ տեղադրել տարրն այս հիմնական էկրանին:"</string>
+ <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Ստեղծելու համար ընտրեք վիջեթը"</string>
+ <string name="rename_folder_label" msgid="3727762225964550653">"Թղթապանակի անունը"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"Վերանվանել թղթապանակը"</string>
+ <string name="rename_action" msgid="5559600076028658757">"Լավ"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"Չեղարկել"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"Ավելացնել հիմնական էկրանին"</string>
+ <string name="group_applications" msgid="3797214114206693605">"Ծրագրեր"</string>
+ <string name="group_shortcuts" msgid="6012256992764410535">"Դյուրանցումներ"</string>
+ <string name="group_widgets" msgid="1569030723286851002">"Վիջեթներ"</string>
+ <string name="completely_out_of_space" msgid="6106288382070760318">"Այլևս տեղ չկա ձեր հիմնական էկրաններին:"</string>
+ <string name="out_of_space" msgid="4691004494942118364">"Այլևս տեղ չկա այս հիմնական էկրանին:"</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"Թեժ նստատեղերում այլևս տեղ չկա:"</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"Այս վիջեթը չափազանց մեծ է թեժ նստատեղերի համար:"</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"«<xliff:g id="NAME">%s</xliff:g>» դյուրանցումը ստեղծված է:"</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"«<xliff:g id="NAME">%s</xliff:g>» դյուրանցումը հեռացվեց:"</string>
+ <string name="shortcut_duplicate" msgid="9167217446062498127">"«<xliff:g id="NAME">%s</xliff:g>» դյուրանցումն արդեն գոյություն ունի:"</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"Ընտրել դյուրանցումը"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"Ընտրել ծրագիրը"</string>
+ <string name="all_apps_button_label" msgid="9110807029020582876">"Ծրագրեր"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"Հիմնական"</string>
+ <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Հեռացնել"</string>
+ <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Ապատեղադրել"</string>
+ <string name="delete_target_label" msgid="1822697352535677073">"Հեռացնել"</string>
+ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Ապատեղադրել"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"Ծրագրի տեղեկություններ"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"Որոնել"</string>
+ <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Ձայնային որոնում"</string>
+ <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Ծրագրեր"</string>
+ <string name="accessibility_delete_button" msgid="6466114477993744621">"Հեռացնել"</string>
+ <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Ապատեղադրել թարմացումը"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"Ապատեղադրել ծրագիրը"</string>
+ <string name="cab_menu_app_info" msgid="8593722221450362342">"Ծրագրի մանրամասներ"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"1 ընտրված ծրագիր"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 ընտրված վիջեթ"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 ընտրված թղթապանակ"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 ընտրված դյուրանցում"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"տեղադրել դյուրանցումներ"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"Ծրագրին թույլ է տալիս ավելացնել դյուրանցումներ՝ առանց օգտագործողի միջամտության:"</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"ապատեղադրել դյուրանցումները"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Ծրագրին թույլ է տալիս հեռացնել դյուրանցումներ՝ առանց օգտագործողի միջամտության:"</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"կարդալ հիմնաէջի կարգավորումներն ու դյուրանցումները"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"Ծրագրին թույլ է տալիս կարդալ հիմնաէջի կարգավորումներն ու դյուրանցումները:"</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"ստեղծել հիմնաէջի կարգավորումներ ու դյուրանցումներ"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"Ծրագրին թույլ է տալիս փոփոխել հիմնաէջի կարգավորումներն ու դյուրանցումները:"</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"Վիջեթի բեռնման խնդիր կա"</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"Սա համակարգային ծրագիր է և չի կարող ապատեղադրվել:"</string>
+ <string name="dream_name" msgid="1530253749244328964">"Հրթիռային թողարկիչ"</string>
+ <string name="folder_hint_text" msgid="6617836969016293992">"Անանուն թղթապանակ"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"Հիմնական էկրան %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"Էջ %1$d՝ %2$d-ից"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"Հիմնական էկրան %1$d` %2$d-ից"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Ծրագրերի էջերը՝ %1$d %2$d-ից"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Վիջեթների էջերը՝ %1$d %2$d-ից"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"Բարի գալուստ:"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Զգացեք ձեզ ինչպես տանը:"</string>
+ <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+ <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Ստեղծեք նոր էկրաններ ծրագրերի և թղթապանակների համար"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"Կառավարեք ձեր տարածությունը"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Հպեք և պահեք հետնաշերտի վրա՝ պաստառները, վիջեթներն ու կարգավորումները կառավարելու համար:"</string>
+ <string name="all_apps_cling_title" msgid="34929250753095858">"Ընտրեք ինչ-որ ծրագիր"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ձեր հիմնական էկրանին ծրագիր ավելացնելու համար հպեք և պահեք այն:"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Ահա մի թղթապանակ"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Նման թղթապանակ ստեղծելու համար հպեք և պահեք որևէ ծրագրի վրա, ապա տեղաշարժեք այն մեկ ուրիշ ծրագրի վրա:"</string>
+ <string name="cling_dismiss" msgid="8962359497601507581">"Լավ"</string>
+ <string name="folder_opened" msgid="94695026776264709">"Թղթապանակը բաց է, <xliff:g id="WIDTH">%1$d</xliff:g>-ից <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1884479294466410023">"Հպեք՝ թղթապանակը փակելու համար"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"Հպեք՝ վերանվանումը պահելու համար"</string>
+ <string name="folder_closed" msgid="4100806530910930934">"Թղթապանակը փակ է"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"Թղթապանակը վերանվանվեց <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="6629239338071103179">"Թղթապանակ՝ <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+ <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+ <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+ <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+ <string name="widget_button_text" msgid="2880537293434387943">"Վիջեթներ"</string>
+ <string name="wallpaper_button_text" msgid="8404103075899945851">"Պաստառներ"</string>
+ <string name="settings_button_text" msgid="8119458837558863227">"Կարգավորումներ"</string>
+</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 3dc7be1..e1e93f7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d dipilih"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d dipilih"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Wallpaper %1$d dari %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> terpilih"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Hapus"</string>
<string name="pick_image" msgid="1272073934062909527">"Pilih gambar"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Wallpaper"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Laman aplikasi %1$d dari %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Laman widget %1$d dari %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Selamat datang!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Serasa di rumah sendiri"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Serasa di rumah sendiri."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Buat lebih banyak layar untuk aplikasi dan folder"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Kelola ruang Anda"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Sentuh lama latar belakang untuk mengelola wallpaper, widget, dan setelan"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Sentuh lama latar belakang untuk mengelola wallpaper, widget, dan setelan."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Pilih beberapa aplikasi"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Untuk menambah aplikasi ke layar Utama Anda, sentuh lama aplikasi tersebut."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Buat folder baru untuk aplikasi Anda"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Sentuh lama suatu aplikasi, lalu tumpukkan ke ikon aplikasi lain"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Ini adalah folder"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Untuk membuat seperti yang ini, sentuh lama aplikasi, lalu pindahkan ke atas aplikasi lain."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"Oke"</string>
<string name="folder_opened" msgid="94695026776264709">"Folder dibuka, <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="1884479294466410023">"Sentuh untuk menutup folder"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 7c27b74..d5ada8f 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -29,11 +29,13 @@
<item quantity="one" msgid="142482526010824029">"%1$d selezionato"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d selezionati"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Sfondo %1$d di %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Elemento selezionato: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Elimina"</string>
<string name="pick_image" msgid="1272073934062909527">"Scegli immagine"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Sfondi"</string>
<string name="crop_wallpaper" msgid="8334345984491368009">"Ritaglia sfondo"</string>
- <string name="activity_not_found" msgid="8071924732094499514">"Applicazione non installata."</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"App non installata."</string>
<string name="widgets_tab_label" msgid="2921133187116603919">"Widget"</string>
<string name="widget_adder" msgid="3201040140710381657">"Widget"</string>
<string name="toggle_weight_watcher" msgid="5645299835184636119">"Mostra Mem"</string>
@@ -58,22 +60,22 @@
<string name="shortcut_uninstalled" msgid="8176767991305701821">"La scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" è stata rimossa."</string>
<string name="shortcut_duplicate" msgid="9167217446062498127">"Scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" già presente."</string>
<string name="title_select_shortcut" msgid="6680642571148153868">"Scegli scorciatoia"</string>
- <string name="title_select_application" msgid="3280812711670683644">"Scegli applicazione"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"Scegli app"</string>
<string name="all_apps_button_label" msgid="9110807029020582876">"App"</string>
<string name="all_apps_home_button_label" msgid="252062713717058851">"Home page"</string>
<string name="delete_zone_label_workspace" msgid="4009607676751398685">"Rimuovi"</string>
<string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Disinstalla"</string>
<string name="delete_target_label" msgid="1822697352535677073">"Rimuovi"</string>
<string name="delete_target_uninstall_label" msgid="5100785476250872595">"Disinstalla"</string>
- <string name="info_target_label" msgid="8053346143994679532">"Informazioni applicazione"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"Informazioni app"</string>
<string name="accessibility_search_button" msgid="1628520399424565142">"Cerca"</string>
<string name="accessibility_voice_search_button" msgid="4637324840434406584">"Ricerca vocale"</string>
<string name="accessibility_all_apps_button" msgid="2603132375383800483">"App"</string>
<string name="accessibility_delete_button" msgid="6466114477993744621">"Rimuovi"</string>
<string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Disinstalla aggiornamento"</string>
- <string name="cab_menu_delete_app" msgid="7435191475867183689">"Disinstalla applicazione"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"Disinstalla app"</string>
<string name="cab_menu_app_info" msgid="8593722221450362342">"Dettagli sull\'app"</string>
- <string name="cab_app_selection_text" msgid="374688303047985416">"1 applicazione selezionata"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"1 app selezionata"</string>
<string name="cab_widget_selection_text" msgid="1833458597831541241">"1 widget selezionato"</string>
<string name="cab_folder_selection_text" msgid="7999992513806132118">"1 cartella selezionata"</string>
<string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 scorciatoia selezionata"</string>
@@ -86,7 +88,7 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"creazione di impostazioni e scorciatoie in Home"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Consente all\'app di modificare le impostazioni e le scorciatoie in Home."</string>
<string name="gadget_error_text" msgid="6081085226050792095">"Errore durante il caricamento del widget"</string>
- <string name="uninstall_system_app_text" msgid="4172046090762920660">"Questa è un\'applicazione di sistema e non può essere disinstallata."</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"Questa è un\'app di sistema e non può essere disinstallata."</string>
<string name="dream_name" msgid="1530253749244328964">"Lanciamissili"</string>
<string name="folder_hint_text" msgid="6617836969016293992">"Cartella senza nome"</string>
<string name="workspace_description_format" msgid="2950174241104043327">"Schermata Home %1$d"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Pagina di applicazioni %1$d di %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Pagina di widget %1$d di %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Benvenuto!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Personalizza la schermata Home"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Personalizza la schermata Home."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Creare più schermate per app e cartelle"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organizza il tuo spazio"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Tocca e tieni premuto lo sfondo per gestire sfondi, widget e impostazioni"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Tocca e tieni premuto lo sfondo per gestire sfondi, widget e impostazioni."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Scegli alcune applicazioni"</string>
- <string name="all_apps_cling_add_item" msgid="400866858451850784">"Per aggiungere un\'applicazione alla schermata Home, tocca e tieni premuto."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Crea nuove cartelle per le tue app"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Tocca e tieni premuto su un\'app, quindi spostala sull\'icona di un\'altra app"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"Per aggiungere un\'app alla schermata Home, tocca e tieni premuto."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Ecco una cartella"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Per crearne una simile, tocca un\'app e tieni premuto, dopodiché spostala sopra un\'altra."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Tocca per chiudere la cartella"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 913df1b..603dbb5 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d נבחרו"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d נבחרו"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"טפט %1$d מתוך %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"בחרת <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"מחק"</string>
<string name="pick_image" msgid="1272073934062909527">"בחר תמונה"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"טפטים"</string>
@@ -36,7 +38,7 @@
<string name="activity_not_found" msgid="8071924732094499514">"האפליקציה לא מותקנת."</string>
<string name="widgets_tab_label" msgid="2921133187116603919">"רכיבי ווידג\'ט"</string>
<string name="widget_adder" msgid="3201040140710381657">"רכיבי ווידג\'ט"</string>
- <string name="toggle_weight_watcher" msgid="5645299835184636119">"הצג מם"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"הצג זכרון"</string>
<string name="long_press_widget_to_add" msgid="7699152356777458215">"גע נגיעה רציפה בווידג\'ט כדי לבחור בו."</string>
<string name="market" msgid="2619650989819296998">"קנה"</string>
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"דף אפליקציות %1$d מתוך %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"דף רכיבי ווידג\'ט %1$d מתוך %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"ברוך הבא!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"להרגיש בבית"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"להרגיש בבית."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"צור מסכים נוספים עבור אפליקציות ותיקיות"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"ארגן את אזור העבודה שלך"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"גע נגיעה רציפה ברקע כדי לנהל את הטפט, רכיבי ווידג\'ט ואת ההגדרות"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"גע נגיעה רציפה ברקע כדי לנהל את הטפט, רכיבי הווידג\'ט וההגדרות."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"בחר כמה אפליקציות"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"כדי להוסיף אפליקציה למסך דף הבית, גע בה נגיעה רציפה."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"צור תיקיות חדשות עבור האפליקציות שלך"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"גע נגיעה רציפה באפליקציה והזז אותה אל מעל סמל של אפליקציה אחרת"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"הנה תיקייה"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"כדי ליצור תיקייה כזו, גע נגיעה רציפה באפליקציה, ולאחר מכן גרור ושחרר אותו על-גבי אפליקציה אחרת."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"אישור"</string>
<string name="folder_opened" msgid="94695026776264709">"תיקיה פתוחה, <xliff:g id="WIDTH">%1$d</xliff:g> על <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"גע כדי לסגור את התיקיה"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b6d0ffb..6e39c54 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d件選択済み"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d件選択済み"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"壁紙: %1$d/%2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"選択: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"削除"</string>
<string name="pick_image" msgid="1272073934062909527">"画像を選択"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"壁紙"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"アプリの%1$d/%2$dページ"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"ウィジェットの%1$d/%2$dページ"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"ようこそ!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"ホームをカスタマイズします"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"ホームをカスタマイズします。"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"アプリとフォルダの画面をもっと作成します"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"スペースを整理"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"壁紙、ウィジェット、設定を管理するには、背景を押し続けます"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"壁紙、ウィジェット、設定を管理するには、背景を押し続けます。"</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"アプリの選択"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"アプリをホーム画面に追加するにはアプリを押し続けます。"</string>
- <string name="folder_cling_title" msgid="294708344826056909">"アプリの新しいフォルダを作成"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"アプリを押し続け、別のアプリアイコンの上に移動します"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"これがフォルダです"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"これと同じフォルダを作成するには、アプリを押し続けてから別のアプリの上に移動します。"</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"フォルダが開いています。<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="1884479294466410023">"タップしてフォルダを閉じます"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..a2e3374
--- /dev/null
+++ b/res/values-ka-rGE/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (C) 2008 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+ <string name="home" msgid="7658288663002113681">"მთავარი"</string>
+ <string name="uid_name" msgid="7820867637514617527">"Android-ის ბირთვის აპები"</string>
+ <string name="folder_name" msgid="7371454440695724752"></string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"ფონის დაყენება"</string>
+ <plurals name="number_of_items_selected">
+ <item quantity="zero" msgid="7464587177007785408">"არჩეულია %1$d"</item>
+ <item quantity="one" msgid="142482526010824029">"არჩეულია %1$d"</item>
+ <item quantity="other" msgid="1418352074806573570">"არჩეულია %1$d"</item>
+ </plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"ფონი %1$d %2$d-დან"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"არჩეულია <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+ <string name="wallpaper_delete" msgid="8095005658756613921">"წაშლა"</string>
+ <string name="pick_image" msgid="1272073934062909527">"სურათის ამორჩევა"</string>
+ <string name="pick_wallpaper" msgid="8179698221502010609">"ფონები"</string>
+ <string name="crop_wallpaper" msgid="8334345984491368009">"ფონის ჩამოჭრა"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"აპი არ არის დაყენებული."</string>
+ <string name="widgets_tab_label" msgid="2921133187116603919">"ვიჯეტები"</string>
+ <string name="widget_adder" msgid="3201040140710381657">"ვიჯეტები"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"Mem-ის ჩვენება"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად."</string>
+ <string name="market" msgid="2619650989819296998">"მაღაზია"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"ერთეულის მთავარ ეკრანზე ჩაგდება ვერ მოხერხდა."</string>
+ <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"აირჩიეთ ვიჯეტი შესაქმნელად"</string>
+ <string name="rename_folder_label" msgid="3727762225964550653">"საქაღალდის სახელი"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"საქაღალდის გადარქმევა"</string>
+ <string name="rename_action" msgid="5559600076028658757">"კარგი"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"გაუქმება"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"მთავარ ეკრანზე დამატება"</string>
+ <string name="group_applications" msgid="3797214114206693605">"აპები"</string>
+ <string name="group_shortcuts" msgid="6012256992764410535">"მალსახმობები"</string>
+ <string name="group_widgets" msgid="1569030723286851002">"ვიჯეტები"</string>
+ <string name="completely_out_of_space" msgid="6106288382070760318">"მთავარ ეკრანებზე ადგილი აღარ არის."</string>
+ <string name="out_of_space" msgid="4691004494942118364">"ამ მთავარ ეკრანზე ადგილი აღარ არის."</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"hotseat-ში მეტი ადგილი არ არის."</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"ეს ვიჯეტი ძალიან დიდია hotseat-ისთვის."</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"შეიქმნა მალსახმობი „<xliff:g id="NAME">%s</xliff:g>“."</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"მასლახმობი „<xliff:g id="NAME">%s</xliff:g>“ წაშლილია."</string>
+ <string name="shortcut_duplicate" msgid="9167217446062498127">"მალსახმობი „<xliff:g id="NAME">%s</xliff:g>“ უკვე არსებობს."</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"აირჩიეთ მალსახმობი"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"აირჩიეთ აპი"</string>
+ <string name="all_apps_button_label" msgid="9110807029020582876">"აპები"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"მთავარი"</string>
+ <string name="delete_zone_label_workspace" msgid="4009607676751398685">"წაშლა"</string>
+ <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"დეინსტალაცია"</string>
+ <string name="delete_target_label" msgid="1822697352535677073">"წაშლა"</string>
+ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"დეინსტალაცია"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"აპის შესახებ"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"ძიება"</string>
+ <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ხმოვანი ძიება"</string>
+ <string name="accessibility_all_apps_button" msgid="2603132375383800483">"აპები"</string>
+ <string name="accessibility_delete_button" msgid="6466114477993744621">"წაშლა"</string>
+ <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"განახლების დეინსტალაცია"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"აპის დეინსტალაცია"</string>
+ <string name="cab_menu_app_info" msgid="8593722221450362342">"აპის შესახებ"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"არჩეულია 1 აპი"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"არჩეულია 1 ვიჯეტი"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"არჩეულია 1 საქაღალდე"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"არჩეულია 1 მალსახმობი"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"მალსახმობების დაყენება"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"აპისთვის მალსახმობების დამოუკიდებლად დამატების უფლების მიცემა."</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"მალსახმობების წაშლა"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"აპისთვის მალსახმობების დამოუკიდებლად წაშლის უფლების მიცემა."</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვა"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვის უფლების მიცემა."</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"მთავარი ეკრანის პარამეტრებისა და მალსახმობების ჩაწერა"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების შეცვლის უფლების მიცემა."</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"პრობლემა ვიჯეტის ჩატვირთვისას"</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"ეს სისტემური აპია და მისი წაშლა შეუძლებელია."</string>
+ <string name="dream_name" msgid="1530253749244328964">"ფეიერვერკი"</string>
+ <string name="folder_hint_text" msgid="6617836969016293992">"უსახელო საქაღალდე"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"მთავარი ეკრანი %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"გვერდი %1$d %2$d-დან"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"მთავარი ეკრანი %1$d, %2$d-დან"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"აპების გვერდი %1$d, %2$d-დან"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"ვიჯეტების გვერდი %1$d, %2$d-დან"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"კეთილი იყოს თქვენი მობრძანება!"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"იგრძენით თავი საკუთარ სახლში"</string>
+ <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+ <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"აპებისა და საქაღალდეებისთვის კიდევ ერთი ეკრანის შექმნა"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"თქვენი სივრცის ორგანიზება"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"თუ გსურთ ფონების, ვიჯეტების და პარამეტრების მართვა, შეეხეთ და არ აუშვათ ფონს."</string>
+ <string name="all_apps_cling_title" msgid="34929250753095858">"აირჩიეთ რამდენიმე აპი"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"აპის მთავარ ეკრანზე დასამატებლად შეეხეთ მის ხატულას და არ აუშვათ."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"აი, საქაღალდე"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"ასეთის შესაქმნელად, შეეხეთ და დააყოვნეთ აპზე, ხოლო შემდეგ გადააჩოჩეთ შემდეგზე."</string>
+ <string name="cling_dismiss" msgid="8962359497601507581">"კარგი"</string>
+ <string name="folder_opened" msgid="94695026776264709">"საქაღალდე გახსნილია, <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="1884479294466410023">"შეეხეთ საქაღალდის დასახურად"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"შეეხეთ ახალი სახელის შესანახად"</string>
+ <string name="folder_closed" msgid="4100806530910930934">"საქაღალდე დაიხურა"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"საქაღალდეს შეეცვალა სახელი „<xliff:g id="NAME">%1$s</xliff:g>“-ად"</string>
+ <string name="folder_name_format" msgid="6629239338071103179">"საქაღალდე: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+ <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+ <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+ <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+ <string name="widget_button_text" msgid="2880537293434387943">"ვიჯეტები"</string>
+ <string name="wallpaper_button_text" msgid="8404103075899945851">"ფონები"</string>
+ <string name="settings_button_text" msgid="8119458837558863227">"პარამეტრები"</string>
+</resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..977b2dd
--- /dev/null
+++ b/res/values-km-rKH/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (C) 2008 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+ <string name="home" msgid="7658288663002113681">"ដើម"</string>
+ <string name="uid_name" msgid="7820867637514617527">"កម្មវិធីសំខាន់ៗរបស់ Android"</string>
+ <string name="folder_name" msgid="7371454440695724752"></string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"កំណត់ផ្ទាំងរូបភាព"</string>
+ <plurals name="number_of_items_selected">
+ <item quantity="zero" msgid="7464587177007785408">"បានជ្រើស %1$d"</item>
+ <item quantity="one" msgid="142482526010824029">"បានជ្រើស %1$d"</item>
+ <item quantity="other" msgid="1418352074806573570">"បានជ្រើស %1$d"</item>
+ </plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"ផ្ទាំងរូបភាព %1$d នៃ %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"បានជ្រើស <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+ <string name="wallpaper_delete" msgid="8095005658756613921">"លុប"</string>
+ <string name="pick_image" msgid="1272073934062909527">"ជ្រើសយករូបភាព"</string>
+ <string name="pick_wallpaper" msgid="8179698221502010609">"ផ្ទាំងរូបភាព"</string>
+ <string name="crop_wallpaper" msgid="8334345984491368009">"ច្រឹបផ្ទាំងរូបភាព"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"មិនបានដំឡើងកម្មវិធី។"</string>
+ <string name="widgets_tab_label" msgid="2921133187116603919">"ធាតុក្រាហ្វិក"</string>
+ <string name="widget_adder" msgid="3201040140710381657">"ធាតុក្រាហ្វិក"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"បង្ហាញ Mem"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"ប៉ះ & សង្កត់ ដើម្បីជ្រើសធាតុក្រាហ្វិក។"</string>
+ <string name="market" msgid="2619650989819296998">"ហាងទំនិញ"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"មិនអាចទម្លាក់ធាតុលើអេក្រង់ដើមនេះទេ"</string>
+ <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"ជ្រើសធាតុក្រាហ្វិក ដើម្បីបង្កើត"</string>
+ <string name="rename_folder_label" msgid="3727762225964550653">"ឈ្មោះថត"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"ប្ដូរឈ្មោះថត"</string>
+ <string name="rename_action" msgid="5559600076028658757">"យល់ព្រម"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"បោះបង់"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"បន្ថែមទៅអេក្រង់ដើម"</string>
+ <string name="group_applications" msgid="3797214114206693605">"កម្មវិធី"</string>
+ <string name="group_shortcuts" msgid="6012256992764410535">"ផ្លូវកាត់"</string>
+ <string name="group_widgets" msgid="1569030723286851002">"ធាតុក្រាហ្វិក"</string>
+ <string name="completely_out_of_space" msgid="6106288382070760318">"គ្មានបន្ទប់នៅលើអេក្រង់ដើមរស់អ្នកទៀតទេ។"</string>
+ <string name="out_of_space" msgid="4691004494942118364">"គ្មានបន្ទប់នៅលើអេក្រង់ដើមនេះទៀតទេ។"</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"គ្មានបន្ទប់នៅក្នុងមជ្ឈមណ្ឌលទៀតទេ។"</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"ធាតុក្រាហ្វិកនេះធំពេកសម្រាប់មជ្ឈមណ្ឌល។"</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"បានបង្កើតផ្លូវកាត់ \"<xliff:g id="NAME">%s</xliff:g>\" ។"</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"បានលុបផ្លូវកាត់ \"<xliff:g id="NAME">%s</xliff:g>\" ។"</string>
+ <string name="shortcut_duplicate" msgid="9167217446062498127">"មានផ្លូវកាត់ \"<xliff:g id="NAME">%s</xliff:g>\" រួចហើយ។"</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"ជ្រើសផ្លូវកាត់"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"ជ្រើសកម្មវិធី"</string>
+ <string name="all_apps_button_label" msgid="9110807029020582876">"កម្មវិធី"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"ដើម"</string>
+ <string name="delete_zone_label_workspace" msgid="4009607676751398685">"លុបចេញ"</string>
+ <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"លុប"</string>
+ <string name="delete_target_label" msgid="1822697352535677073">"លុបចេញ"</string>
+ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"លុប"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"ព័ត៌មានកម្មវិធី"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"ស្វែងរក"</string>
+ <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ស្វែងរកតាមសំឡេង"</string>
+ <string name="accessibility_all_apps_button" msgid="2603132375383800483">"កម្មវិធី"</string>
+ <string name="accessibility_delete_button" msgid="6466114477993744621">"លុបចេញ"</string>
+ <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"លុបបច្ចុប្បន្នភាព"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"លុបកម្មវិធី"</string>
+ <string name="cab_menu_app_info" msgid="8593722221450362342">"ព័ត៌មានលម្អិតកម្មវិធី"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"បានជ្រើសកម្មវិធី ១"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"បានជ្រើសធាតុ ១"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"បានជ្រើសថត ១"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"បានជ្រើសផ្លូវកាត់ ១"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"ដំឡើងផ្លូវកាត់"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"អនុញ្ញាតឲ្យកម្មវិធីបន្ថែមផ្លូវកាត់ ដោយមិនចាំបាច់អំពើពីអ្នកប្រើ។"</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"លុបផ្លូវកាត់"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"អនុញ្ញាតឲ្យកម្មវិធីលុបផ្លូវកាត់ដោយមិនចាំបាច់អំពើពីអ្នកប្រើ។"</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"អានការកំណត់ និងផ្លូវកាត់អេក្រង់ដើម"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"អនុញ្ញាតឲ្យកម្មវិធីអានការកំណត់ និងផ្លូវកាត់ក្នុងអេក្រង់ដើម។"</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"សរសេរការកំណត់ និងផ្លូវកាត់លើអេក្រង់ដើម"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"អនុញ្ញាតឲ្យកម្មវិធីប្ដូរការកំណត់ និងផ្លូវកាត់ក្នុងអេក្រង់ដើម។"</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"បញ្ហាក្នុងការផ្ទុកធាតុក្រាហ្វិក"</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"នេះជាកម្មវិធីប្រព័ន្ធ មិនអាចលុបបានទេ។"</string>
+ <string name="dream_name" msgid="1530253749244328964">"កម្មវិធីចាប់ផ្ដើមរ៉ូកែត"</string>
+ <string name="folder_hint_text" msgid="6617836969016293992">"ថតគ្មានឈ្មោះ"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"អេក្រង់ដើម %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"ទំព័រ %1$d នៃ %2$d"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"អេក្រង់ដើម %1$d នៃ %2$d"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"ទំព័រកម្មវិធី %1$d នៃ %2$d"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"ទំព័រធាតុក្រាហ្វិក %1$d នៃ %2$d"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"សូមស្វាគមន៍!"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"ធ្វើដោយខ្លួនឯងនៅលើអេក្រង់ដើម។"</string>
+ <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+ <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"បង្កើតអេក្រង់ច្រើនសម្រាប់កម្មវិធី និងថតឯកសារ"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"រៀបចំចន្លោះរបស់អ្នក"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"ប៉ះ & សង្កត់លើផ្ទៃខាងក្រោម ដើម្បីគ្រប់គ្រងផ្ទាំងរូបភាព, ធាតុក្រាហ្វិក និងការកំណត់។"</string>
+ <string name="all_apps_cling_title" msgid="34929250753095858">"ជ្រើសកម្មវិធីមួយចំនួន"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"ប៉ះ & សង្កត់វា ដើម្បីបន្ថែមកម្មវិធីទៅអេក្រង់ដើមរបស់អ្នក"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"នេះជាថត"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"ដើម្បីបង្កើតមួយដូចនេះ ប៉ះ & សង្កត់លើកម្មវិធី បន្ទាប់មកផ្លាស់ទីវាទៅលើធាតុមួយផ្សេងទៀត។"</string>
+ <string name="cling_dismiss" msgid="8962359497601507581">"យល់ព្រម"</string>
+ <string name="folder_opened" msgid="94695026776264709">"បានបើកថត <xliff:g id="WIDTH">%1$d</xliff:g> ដោយ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1884479294466410023">"ប៉ះ ដើម្បីបិទថត"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"ប៉ះ ដើម្បីរក្សាទុកការប្ដូរឈ្មោះ"</string>
+ <string name="folder_closed" msgid="4100806530910930934">"បានបិទថត"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"បានប្ដូរឈ្មោះថតជា <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_name_format" msgid="6629239338071103179">"ថត៖ <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+ <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+ <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+ <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+ <string name="widget_button_text" msgid="2880537293434387943">"ធាតុក្រាហ្វិក"</string>
+ <string name="wallpaper_button_text" msgid="8404103075899945851">"ផ្ទាំងរូបភាព"</string>
+ <string name="settings_button_text" msgid="8119458837558863227">"ការកំណត់"</string>
+</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 5e77f95..31c2d69 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d개 선택됨"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d개 선택됨"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"배경화면 %1$d/%2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> 선택함"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"삭제"</string>
<string name="pick_image" msgid="1272073934062909527">"이미지 선택"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"배경화면"</string>
@@ -90,21 +92,21 @@
<string name="dream_name" msgid="1530253749244328964">"로켓 실행기"</string>
<string name="folder_hint_text" msgid="6617836969016293992">"이름이 없는 폴더"</string>
<string name="workspace_description_format" msgid="2950174241104043327">"홈 화면 %1$d"</string>
- <string name="default_scroll_format" msgid="7475544710230993317">"페이지 %2$d 중 %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"페이지 %1$d/%2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"홈 화면 %1$d/%2$d"</string>
- <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"앱 페이지 %2$d 중 %1$d"</string>
- <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"위젯 페이지 %2$d 중 %1$d"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"앱 페이지 %1$d/%2$d"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"위젯 페이지 %1$d/%2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"환영합니다!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"쉽게 사용하기"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"편리한 사용 환경을 만드세요."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"앱 및 폴더를 표시할 화면 더 만들기"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"공간 관리하기"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"배경화면, 위젯, 설정을 관리하려면 백그라운드를 길게 터치합니다."</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"배경화면, 위젯, 설정을 관리하려면 백그라운드를 길게 터치합니다."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"앱 선택하기"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"홈 화면에 앱을 추가하려면 길게 터치합니다."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"앱에 사용할 새 폴더 만들기"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"앱을 길게 누른 다음 다른 앱 아이콘 위로 이동합니다."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"폴더"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"폴더를 만들려면 앱을 길게 터치한 다음 다른 앱 위에 올려 놓으세요."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"확인"</string>
<string name="folder_opened" msgid="94695026776264709">"폴더 열림(<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="1884479294466410023">"터치하여 폴더를 닫음"</string>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..e3a95dd
--- /dev/null
+++ b/res/values-lo-rLA/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (C) 2008 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+ <string name="home" msgid="7658288663002113681">"ໜ້າຫຼັກ"</string>
+ <string name="uid_name" msgid="7820867637514617527">"ແອັບພລິເຄຊັນຫຼັກຂອງ Android"</string>
+ <string name="folder_name" msgid="7371454440695724752"></string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"ຕັ້ງເປັນພາບພື້ນຫຼັງ"</string>
+ <plurals name="number_of_items_selected">
+ <item quantity="zero" msgid="7464587177007785408">"ເລືອກ %1$d ລາຍການແລ້ວ"</item>
+ <item quantity="one" msgid="142482526010824029">"ເລືອກ %1$d ລາຍການແລ້ວ"</item>
+ <item quantity="other" msgid="1418352074806573570">"ເລືອກ %1$d ລາຍການແລ້ວ"</item>
+ </plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"ຮູບພືື້ນຫຼັງ %1$d ໃນ %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"ເລືອກແລ້ວ <xliff:g id="LABEL">%1$s</xliff:g> ອັນ"</string>
+ <string name="wallpaper_delete" msgid="8095005658756613921">"ລຶບ"</string>
+ <string name="pick_image" msgid="1272073934062909527">"ເລືອກຮູບ"</string>
+ <string name="pick_wallpaper" msgid="8179698221502010609">"ພາບພື້ນຫຼັງ"</string>
+ <string name="crop_wallpaper" msgid="8334345984491368009">"ຕັດຮູບພື້ນຫຼັງ"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"ແອັບຯບໍ່ໄດ້ຖືກຕິດຕັ້ງ."</string>
+ <string name="widgets_tab_label" msgid="2921133187116603919">"ວິດເຈັດ"</string>
+ <string name="widget_adder" msgid="3201040140710381657">"ວິດເຈັດ"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"ສະແດງຄວາມຈຳ"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ."</string>
+ <string name="market" msgid="2619650989819296998">"ຮ້ານຄ້າ"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"ບໍ່ສາມາດວາງລາຍການໃສ່ໜ້າຈໍຫຼັກນີ້ໄດ້"</string>
+ <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"ເລືອກວິດເຈັດເພື່ອສ້າງມັນ"</string>
+ <string name="rename_folder_label" msgid="3727762225964550653">"ຊື່ໂຟນເດີ"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"ປ່ຽນຊື່ໂຟນເດີ"</string>
+ <string name="rename_action" msgid="5559600076028658757">"ຕົກລົງ"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"ຍົກເລີກ"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"ເພີ່ມໃສ່ໜ້າຈໍຫຼັກ"</string>
+ <string name="group_applications" msgid="3797214114206693605">"ແອັບຯ"</string>
+ <string name="group_shortcuts" msgid="6012256992764410535">"ທາງລັດ"</string>
+ <string name="group_widgets" msgid="1569030723286851002">"ວິດເຈັດ"</string>
+ <string name="completely_out_of_space" msgid="6106288382070760318">"ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກຂອງທ່ານ."</string>
+ <string name="out_of_space" msgid="4691004494942118364">"ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກນີ້."</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"ບໍ່ມີຫ້ອງຫວ່າງໃນ hotseat ແລ້ວ."</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"ວິດເຈັດ ມີຂະໜາດໃຫຍ່ເກີນໄປສຳລັບ hotseat."</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"ທາງລັດ \"<xliff:g id="NAME">%s</xliff:g>\" ຖືກສ້າງແລ້ວ."</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"ທາງລັດ \"<xliff:g id="NAME">%s</xliff:g>\" ຖືກລຶບແລ້ວ."</string>
+ <string name="shortcut_duplicate" msgid="9167217446062498127">"ທາງລັດ \"<xliff:g id="NAME">%s</xliff:g>\" ມີຢູ່ແລ້ວ."</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"ເລືອກທາງລັດ"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"ເລືອກແອັບຯ"</string>
+ <string name="all_apps_button_label" msgid="9110807029020582876">"ແອັບຯ"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"ໜ້າຫຼັກ"</string>
+ <string name="delete_zone_label_workspace" msgid="4009607676751398685">"ລຶບ"</string>
+ <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"ຖອນການຕິດຕັ້ງ"</string>
+ <string name="delete_target_label" msgid="1822697352535677073">"ລຶບ"</string>
+ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"ຖອນການຕິດຕັ້ງ"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"ຂໍ້ມູນແອັບຯ"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"ຊອກຫາ"</string>
+ <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ຊອກຫາດ້ວຍສຽງ"</string>
+ <string name="accessibility_all_apps_button" msgid="2603132375383800483">"ແອັບຯ"</string>
+ <string name="accessibility_delete_button" msgid="6466114477993744621">"ລຶບ"</string>
+ <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"ຖອນອັບເດດ"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"ຖອນແອັບຯ"</string>
+ <string name="cab_menu_app_info" msgid="8593722221450362342">"ລາຍລະອຽດແອັບຯ"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"1 ແອັບຯຖືກເລືອກ"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 ວິດເຈັດຖືກເລືອກ"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 ໂຟນເດີຖືກເລືອກ"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 ທາງລັດຖືກເລືອກ"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"ຕິດຕັ້ງທາງລັດ"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"ອະນຸຍາດໃຫ້ແອັບຯ ເພີ່ມທາງລັດໂດຍບໍ່ຕ້ອງຮັບການຢືນຢັນຈາກຜູ່ໃຊ້."</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"ຖອນທາງລັດ"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວ ລຶບທາງລັດໂດຍບໍ່ຕ້ອງຮັບການຢືນຢັນຈາກຜູ່ໃຊ້."</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"ອ່ານການຕັ້ງຄ່າໜ້າຫຼັກ ແລະທາງລັດ"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວອ່ານການຕັ້ງຄ່າ ແລະທາງລັດໃນໜ້າຫຼັກ."</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"ຂຽນການຕັ້ງຄ່າໜ້າຫຼັກ ແລະທາງລັດ"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວ ປ່ຽນການຕັ້ງຄ່າ ແລະທາງລັດໃນໜ້າຫຼັກ."</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"ມີບັນຫາໃນການໂຫລດວິດເຈັດ"</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"ນີ້ແມ່ນແອັບຯຂອງລະບົບ ແລະບໍ່ສາມາດຖອນການຕິດຕັ້ງອອກໄດ້."</string>
+ <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
+ <string name="folder_hint_text" msgid="6617836969016293992">"ໂຟນເດີຍັງບໍ່ຖືກຕັ້ງຊື່"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"ໜ້າຈໍຫຼັກ %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"ໜ້າ %1$d ຈາກ %2$d"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"ໜ້າຈໍຫຼັກ %1$d ໃນ %2$d"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"ແອັບຯໜ້າ %1$d ໃນ %2$d"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"ວິດເຈັດໜ້າ %1$d ໃນ %2$d"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"ຍິນດີຕ້ອນຮັບ!"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"ເຮັດໂຕໃຫ້ຄືຢູ່ໃນບ້ານ"</string>
+ <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+ <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"ສ້າງຈໍເພີ່ມເຕີມສຳລັບແອັບຯ ແລະໂຟນເດີ"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"ຈັດການພື້ນທີ່ຂອງທ່ານ"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"ແຕະຄ້າງໄວ້ທີ່ພາບພື້ນຫຼັງເພື່ອຈັດການພາບພື້ນຫຼັງ, ວິດເຈັດແລະການຕັ້ງຄ່າ."</string>
+ <string name="all_apps_cling_title" msgid="34929250753095858">"ເລືອກແອັບຯ"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"ເພື່ອເພີ່ມແອັບຯໃສ່ໜ້າຈໍຫຼັກຂອງທ່ານ, ໃຫ້ແຕະຄ້າງໄວ້."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"ນີ້ແມ່ນໂຟນເດີ່"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"ເພື່ອສ້າງອັນໃໝ່ແບບນີ້, ແຕະຄ້າງໄວ້ທີ່ແອັບຯ ແລ້ວຍ້າຍມັນໄປຫາໂຕອື່ນ."</string>
+ <string name="cling_dismiss" msgid="8962359497601507581">"ຕົກລົງ"</string>
+ <string name="folder_opened" msgid="94695026776264709">"ເປີດໂຟນເດີແລ້ວ, <xliff:g id="WIDTH">%1$d</xliff:g> ຄູນ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_tap_to_close" msgid="1884479294466410023">"ສຳພັດເພື່ອປິດໂຟນເດີ"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"ສຳພັດເພື່ອບັນທຶກການປ່ຽນຊື່"</string>
+ <string name="folder_closed" msgid="4100806530910930934">"ປິດໂຟນເດີແລ້ວ"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"ປ່ຽນຊື່ໂຟນເດີເປັນ <xliff:g id="NAME">%1$s</xliff:g> ແລ້ວ"</string>
+ <string name="folder_name_format" msgid="6629239338071103179">"ໂຟນເດີ: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+ <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+ <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+ <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+ <string name="widget_button_text" msgid="2880537293434387943">"ວິດເຈັດ"</string>
+ <string name="wallpaper_button_text" msgid="8404103075899945851">"ພາບພື້ນຫຼັງ"</string>
+ <string name="settings_button_text" msgid="8119458837558863227">"ການຕັ້ງຄ່າ"</string>
+</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 5886ed3..80d4412 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Pasirinkta: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Pasirinkta: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d iš %2$d ekrano fonų"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Pasirinkta: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Ištrinti"</string>
<string name="pick_image" msgid="1272073934062909527">"Pasirinkti vaizdą"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Ekrano fonai"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%1$d programų psl. iš %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%1$d valdiklių psl. iš %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Sveiki!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Jauskitės kaip namie"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Jauskitės kaip namie."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Sukurkite daugiau programų ir aplankų ekrano kopijų"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Tvarkykite savo vietą"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Jei norite tvarkyti ekrano foną, valdiklius ir nustatymus, palieskite foną ir laikykite"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Palieskite ir laikykite foną, jei norite tvarkyti ekrano foną, valdiklius ir nustatymus."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Pasirinkite kelias programas"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Jei norite prie pagrindinio ekrano pridėti programą, palieskite ją ir laikykite."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Sukurkite naujus programų aplankus"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Palieskite programą ir laikykite. Tada perkelkite ją ant kitos programos piktogramos"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Štai aplankas"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Kad sukurtumėte tokį patį, palieskite ir laikykite programą, tada perkelkite ją virš kitos programos."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"Gerai"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Palieskite, kad uždarytumėte aplanką"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 3841b33..b70f5dc 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Atlasīti: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Atlasīti: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d. fona tapete no %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Atlasīts: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Dzēst"</string>
<string name="pick_image" msgid="1272073934062909527">"Izvēlēties attēlu"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Fona tapetes"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%1$d. lietotņu lapa no %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%1$d. logrīku lapa no %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Laipni lūdzam!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Informācija par pamatfunkcijām"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Informācija par pamatfunkcijām"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Izveidojiet vairāk ekrānu lietotnēm un mapēm."</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Kārtojiet savu darbvietu"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Pieskarieties fonam un turiet to, lai pārvaldītu fona tapeti, logrīkus un iestatījumus."</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Pieskarieties fonam un turiet to, lai pārvaldītu fona tapeti, logrīkus un iestatījumus."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Izvēlieties dažas lietotnes"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Lai sākuma ekrānam pievienotu lietotni, pieskarieties tai un turiet to."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Veidojiet jaunas mapes savām lietotnēm"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Pieskarieties lietotnei un turiet to, pēc novietojiet to virs citas lietotnes ikonas."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Lūk, mape!"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Lai izveidotu tādu pašu, pieskarieties lietotnei un turiet to, pēc tam pārvietojiet to virs citas lietotnes."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"Labi"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Pieskarieties, lai aizvērtu mapi."</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..7cf7a9c
--- /dev/null
+++ b/res/values-mn-rMN/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (C) 2008 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+ <string name="home" msgid="7658288663002113681">"Нүүр"</string>
+ <string name="uid_name" msgid="7820867637514617527">"Андройд үндсэн апп"</string>
+ <string name="folder_name" msgid="7371454440695724752"></string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"Ханын зургийг тохируулах"</string>
+ <plurals name="number_of_items_selected">
+ <item quantity="zero" msgid="7464587177007785408">"%1$d сонгогдсон"</item>
+ <item quantity="one" msgid="142482526010824029">"%1$d сонгогдсон"</item>
+ <item quantity="other" msgid="1418352074806573570">"%1$d сонгогдсон"</item>
+ </plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%2$d ханын цаасны %1$d нь"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> сонгогдсон"</string>
+ <string name="wallpaper_delete" msgid="8095005658756613921">"Устгах"</string>
+ <string name="pick_image" msgid="1272073934062909527">"Зураг сонгох"</string>
+ <string name="pick_wallpaper" msgid="8179698221502010609">"Ханын зураг"</string>
+ <string name="crop_wallpaper" msgid="8334345984491368009">"Ханын зургийг тайрах"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"Апп суугаагүй байна."</string>
+ <string name="widgets_tab_label" msgid="2921133187116603919">"Виджет"</string>
+ <string name="widget_adder" msgid="3201040140710381657">"Виджет"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"Мем харуулах"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"Виджетийг авах бол хүрээд барина уу."</string>
+ <string name="market" msgid="2619650989819296998">"Дэлгүүр"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"Энэ Нүүр дэлгэцэнд буулгах боломжгүй."</string>
+ <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Үүсгэх виджетээ сонгоно уу"</string>
+ <string name="rename_folder_label" msgid="3727762225964550653">"Фолдерын нэр"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"Фолдерын нэр өөрчлөх"</string>
+ <string name="rename_action" msgid="5559600076028658757">"Тийм"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"Цуцлах"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"Нүүр дэлгэцэнд нэмэх"</string>
+ <string name="group_applications" msgid="3797214114206693605">"Апп"</string>
+ <string name="group_shortcuts" msgid="6012256992764410535">"Товчлол"</string>
+ <string name="group_widgets" msgid="1569030723286851002">"Виджет"</string>
+ <string name="completely_out_of_space" msgid="6106288382070760318">"Таны Нүүр дэлгэц зайгүй."</string>
+ <string name="out_of_space" msgid="4691004494942118364">"Энэ Нүүр дэлгэц зайгүй."</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"Суурь зайгүй."</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"Энэ виджет сууринд хэт томдож байна."</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"\"<xliff:g id="NAME">%s</xliff:g>\" товчлол үүсэв."</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"\"<xliff:g id="NAME">%s</xliff:g>\" товчлол устгагдав."</string>
+ <string name="shortcut_duplicate" msgid="9167217446062498127">"\"<xliff:g id="NAME">%s</xliff:g>\" товчлол өмнө үүссэн байна."</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"Товчлол сонгох"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"Апп сонгох"</string>
+ <string name="all_apps_button_label" msgid="9110807029020582876">"Апп"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"Нүүр"</string>
+ <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Устгах"</string>
+ <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Устгах"</string>
+ <string name="delete_target_label" msgid="1822697352535677073">"Устгах"</string>
+ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Устгах"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"Апп мэдээлэл"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"Хайх"</string>
+ <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Дуун хайлт"</string>
+ <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Апп"</string>
+ <string name="accessibility_delete_button" msgid="6466114477993744621">"Устгах"</string>
+ <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Шинэчлэлийг устгах"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"Апп устгах"</string>
+ <string name="cab_menu_app_info" msgid="8593722221450362342">"Апп дэлгэрэнгүй"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"1 апп сонгогдсон"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 виджет сонгогдсон"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 фолдер сонгогдсон"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 товчлол сонгогдсон"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"товчлол суулгах"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"Апп нь хэрэглэгчийн оролцоогүйгээр товчлолыг нэмэж чадна"</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"товчлолыг устгах"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Апп нь хэрэглэгчийн оролцоогүйгээр товчлолыг устгаж чадна"</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"Нүүрний тохиргоо болон товчлолыг унших"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"Апп нь Нүүрэндэх товчлол болон тохиргоог уншиж чадна."</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"Нүүрний тохиргоо болон товчлолыг бичих"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"Апп нь Нүүрэндэх товчлол болон тохиргоог өөрчилж чадна."</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"Виджет ачаалахад асуудал гарав"</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"Энэ апп нь системийн апп ба устгах боломжгүй."</string>
+ <string name="dream_name" msgid="1530253749244328964">"Пуужин хөөргөгч"</string>
+ <string name="folder_hint_text" msgid="6617836969016293992">"Нэргүй фолдер"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"Нүүр дэлгэц %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"%2$d-н %1$d хуудас"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d-н Нүүр дэлгэц %1$d"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%2$d-н %1$d апп хуудас"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%2$d-н %1$d виджет хуудас"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"Тавтай морилно уу!"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Гэртээ байгаа мэт тухлаарай."</string>
+ <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+ <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Апп болон фолдеруудад зориулан өөр дэлгэцүүд үүсгээрэй"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"Өөрийнхөө зайг тохируулаарай"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Арын дэвсгэр дээр хүрээд & дарснаар ханын зураг, виджет болон тохиргоог өөрчилж болно."</string>
+ <string name="all_apps_cling_title" msgid="34929250753095858">"Апп сонгоно уу"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"Нүүр дэлгэцэнд апп нэмэх бол хүрээд барина уу."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Фолдер энд байна"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Үүнтэй адилханыг үүсгэхийн тулд апп дээр хүрч & бариад нөгөөхийн дээр зөөнө үү."</string>
+ <string name="cling_dismiss" msgid="8962359497601507581">"Тийм"</string>
+ <string name="folder_opened" msgid="94695026776264709">"<xliff:g id="WIDTH">%1$d</xliff:g> <xliff:g id="HEIGHT">%2$d</xliff:g> фолдер нээгдэв"</string>
+ <string name="folder_tap_to_close" msgid="1884479294466410023">"Фолдер хаах бол хүрнэ үү"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"Шинэ нэрийг хадгалах бол хүрнэ үү"</string>
+ <string name="folder_closed" msgid="4100806530910930934">"Фолдер хаагдав"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"Фолдерын нэр <xliff:g id="NAME">%1$s</xliff:g> болов"</string>
+ <string name="folder_name_format" msgid="6629239338071103179">"Фолдер: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+ <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+ <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+ <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+ <string name="widget_button_text" msgid="2880537293434387943">"Виджет"</string>
+ <string name="wallpaper_button_text" msgid="8404103075899945851">"Ханын зураг"</string>
+ <string name="settings_button_text" msgid="8119458837558863227">"Тохиргоо"</string>
+</resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 90fd420..4ee3545 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d dipilih"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d dipilih"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Kertas dinding %1$d daripada %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Memilih <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Padam"</string>
<string name="pick_image" msgid="1272073934062909527">"Pilih imej"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Kertas dinding"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Halaman apl %1$d daripada %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Halaman widget %1$d daripada %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Selamat datang!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Buat seperti berada di rumah sendiri"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Buat seperti berada di rumah sendiri."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Buat lebih banyak skrin untuk apl dan folder"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Susun ruang anda"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Sentuh & tahan latar belakang untuk mengurus kertas dinding, widget dan tetapan"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Sentuh & tahan latar belakang untuk mengurus kertas dinding, widget dan tetapan."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Pilih beberapa apl"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Untuk menambahkan apl pada skrin Laman Utama anda, sentuh & tahan apl."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Buat folder baharu untuk apl anda"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Sentuh & tahan apl, kemudian alihkan ke atas ikon apl lain"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Ini ada folder"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Untuk membuat satu folder seperti ini, sentuh & tahan apl, kemudian alihkan ke atas folder lain."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"Folder 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="1884479294466410023">"Sentuh untuk menutup folder"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 3ebb7fa..ce50754 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -21,14 +21,16 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
<string name="home" msgid="7658288663002113681">"Startside"</string>
- <string name="uid_name" msgid="7820867637514617527">"Kjerneprogrammer for Android"</string>
+ <string name="uid_name" msgid="7820867637514617527">"Kjerneapper for Android"</string>
<string name="folder_name" msgid="7371454440695724752"></string>
- <string name="wallpaper_instructions" msgid="563973358787555519">"Angi bakgrunnsbilde"</string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"Angi bakgrunn"</string>
<plurals name="number_of_items_selected">
<item quantity="zero" msgid="7464587177007785408">"%1$d valgt"</item>
<item quantity="one" msgid="142482526010824029">"%1$d valgt"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d valgt"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Bakgrunn %1$d of %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Valgt <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Slett"</string>
<string name="pick_image" msgid="1272073934062909527">"Velg bilde"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Bakgrunner"</string>
@@ -43,7 +45,7 @@
<string name="external_drop_widget_error" msgid="3165821058322217155">"Kunne ikke slippe elementet på denne startsiden."</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Velg modul for oppretting"</string>
<string name="rename_folder_label" msgid="3727762225964550653">"Mappenavn"</string>
- <string name="rename_folder_title" msgid="3771389277707820891">"Gi mappe nytt navn"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"Gi mappen nytt navn"</string>
<string name="rename_action" msgid="5559600076028658757">"OK"</string>
<string name="cancel_action" msgid="7009134900002915310">"Avbryt"</string>
<string name="menu_item_add_item" msgid="1264911265836810421">"Legg til på startsiden"</string>
@@ -54,8 +56,8 @@
<string name="out_of_space" msgid="4691004494942118364">"Denne startsiden er full."</string>
<string name="hotseat_out_of_space" msgid="9139760413395605841">"Dokksonen er full."</string>
<string name="invalid_hotseat_item" msgid="1211534262129849507">"Denne modulen er for stor for dokksonen."</string>
- <string name="shortcut_installed" msgid="1701742129426969556">"Opprettet snarveien «<xliff:g id="NAME">%s</xliff:g>»."</string>
- <string name="shortcut_uninstalled" msgid="8176767991305701821">"Fjernet snarveien «<xliff:g id="NAME">%s</xliff:g>»."</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"Snarveien «<xliff:g id="NAME">%s</xliff:g>» er opprettet."</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"Snarveien «<xliff:g id="NAME">%s</xliff:g>» er fjernet."</string>
<string name="shortcut_duplicate" msgid="9167217446062498127">"Snarveien «<xliff:g id="NAME">%s</xliff:g>» fins allerede."</string>
<string name="title_select_shortcut" msgid="6680642571148153868">"Valg av snarvei"</string>
<string name="title_select_application" msgid="3280812711670683644">"Velg app"</string>
@@ -74,9 +76,9 @@
<string name="cab_menu_delete_app" msgid="7435191475867183689">"Avinstaller appen"</string>
<string name="cab_menu_app_info" msgid="8593722221450362342">"Informasjon om appen"</string>
<string name="cab_app_selection_text" msgid="374688303047985416">"Én app er valgt"</string>
- <string name="cab_widget_selection_text" msgid="1833458597831541241">"Én modul valgt"</string>
- <string name="cab_folder_selection_text" msgid="7999992513806132118">"Én mappe valgt"</string>
- <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"Én snarvei valgt"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"Én modul er valgt"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"Én mappe er valgt"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"Én snarvei er valgt"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installere snarveier"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Gir apper tillatelse til å legge til snarveier uten innblanding fra brukeren."</string>
<string name="permlab_uninstall_shortcut" msgid="864595034498083837">"avinstallere snarveier"</string>
@@ -95,20 +97,20 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Appside %1$d av %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Modulside %1$d av %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Velkommen!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Sånn blir du kjent med startsiden"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Føl deg som hjemme."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Opprett flere sider for apper og mapper"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organiser plassen din"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Trykk og hold inne på bakgrunnen for å administrere bakgrunnen, moduler og innstillinger"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Trykk og hold på bakgrunnen for å administrere bakgrunnen, moduler og innstillinger."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Velg noen apper"</string>
- <string name="all_apps_cling_add_item" msgid="400866858451850784">"Trykk og hold inne på en app for å legge den til på startsiden."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Lag nye mapper for apper"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Trykk og hold inne på en app, og flytt den så oppå et annet appikon"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"Trykk og hold på en app for å legge den til på startsiden."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Dette er en mappe"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"For å opprette en som denne, trykker og holder du på en app og flytter den over en annen."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Trykk for å lukke mappen"</string>
- <string name="folder_tap_to_rename" msgid="9191075570492871147">"Trykk for å lagre nytt navn"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"Trykk for å lagre det nye navnet"</string>
<string name="folder_closed" msgid="4100806530910930934">"Mappen ble lukket"</string>
<string name="folder_renamed" msgid="1794088362165669656">"Mappen heter nå <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format" msgid="6629239338071103179">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 9a935de..e2a2a07 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="application_name" msgid="5181331383435256801">"Opstartprogramma3"</string>
+ <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
<string name="home" msgid="7658288663002113681">"Startpagina"</string>
<string name="uid_name" msgid="7820867637514617527">"Android-kernapps"</string>
<string name="folder_name" msgid="7371454440695724752"></string>
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d geselecteerd"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d geselecteerd"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Achtergrond %1$d van %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> is geselecteerd"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Verwijderen"</string>
<string name="pick_image" msgid="1272073934062909527">"Afbeelding kiezen"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Achtergronden"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"App-pagina %1$d van %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgetpagina %1$d van %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Welkom!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Het startscherm personaliseren"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Personaliseer uw startscherm."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Meer schermen maken voor apps en mappen"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Uw ruimte indelen"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Blijf de achtergrond aanraken om de achtergrond, widgets en instellingen te beheren"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Blijf de achtergrond aanraken om de achtergrond, widgets en instellingen te beheren."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Selecteer een aantal apps"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Als u een app wilt toevoegen aan het startscherm, blijft u de app aanraken."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Nieuwe mappen maken voor uw apps"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Blijf een app aanraken en plaats deze boven op een ander app-pictogram"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Dit is een map"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Als u een map zoals deze wilt maken, blijft u een app aanraken en schuift u deze boven op een andere app."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Raak dit aan om de map te sluiten"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 8528af6..b629f3d 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Wybrane: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Wybrane: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Tapeta %1$d z %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Wybrano <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Usuń"</string>
<string name="pick_image" msgid="1272073934062909527">"Wybierz obraz"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Tapety"</string>
@@ -94,17 +96,17 @@
<string name="workspace_scroll_format" msgid="8458889198184077399">"Ekran główny %1$d z %2$d"</string>
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Strona aplikacji: %1$d z %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Strona widżetów: %1$d z %2$d"</string>
- <string name="first_run_cling_title" msgid="7257389003637362144">"Witamy!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Poczuj się jak u siebie"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"Witamy"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Poczuj się jak u siebie."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Dodaj więcej ekranów na aplikacje i foldery"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Uporządkuj obszar roboczy"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Kliknij i przytrzymaj tło, by zmienić tapetę, widżety lub ustawienia"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Kliknij i przytrzymaj tło, by zmienić tapetę, widżety lub ustawienia."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Wybierz kilka aplikacji"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Aby dodać aplikację na ekran główny, dotknij i przytrzymaj jej ikonę."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Utwórz nowe foldery z aplikacjami"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Kliknij i przytrzymaj aplikację, a potem przesuń ją na ikonę innej aplikacji"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Tu jest folder"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Aby utworzyć taki sam, kliknij i przytrzymaj aplikację, a następnie przenieś ją na następną."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Kliknij, by zamknąć folder"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 1050665..1ef3982 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d selecionado(s)"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d selecionado(s)"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Imagem de fundo %1$d de %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> selecionado"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Eliminar"</string>
<string name="pick_image" msgid="1272073934062909527">"Escolher imagem"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Imagens de fundo"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Página de aplicações %1$d de %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Página de widgets %1$d de %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Bem-vindo(a)!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Sinta-se em casa"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Sinta-se em casa."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crie mais ecrãs para aplicações e pastas"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organizar o seu espaço"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Toque sem soltar na imagem de fundo para gerir a imagem de fundo, os widgets e as definições"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Toque sem soltar no fundo para gerir a imagem de fundo, os widgets e as definições."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Escolher algumas aplicações"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Para adicionar uma aplicação ao Ecrã principal, toque na mesma sem soltar."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Criar pastas novas para as suas aplicações"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Toque sem soltar numa aplicação e mova-a para a parte superior de outro ícone de aplicação"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Eis uma pasta"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Para criar uma pasta, toque sem soltar numa aplicação e arraste-a para cima de outra aplicação."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Toque para fechar a pasta"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1971634..4d40388 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d selecionados"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d selecionados"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Plano de fundo %1$d de %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> selecionado"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Excluir"</string>
<string name="pick_image" msgid="1272073934062909527">"Escolher imagem"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Planos de fundo"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Página de aplicativos, %1$d de %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Página de widgets, %1$d de %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Bem-vindo!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Sinta-se em casa"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Fique à vontade."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crie mais telas para aplicativos e pastas"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organize seu espaço"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Toque e mantenha pressionada a tela de fundo para gerenciar o plano de fundo, os widgets e as configurações"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Toque e mantenha pressionada a tela de fundo para gerenciar o plano de fundo, os widgets e as configurações."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Escolha alguns aplicativos"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Para adicionar um aplicativo a sua tela inicial, toque e mantenha-o pressionado."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Crie novas pastas para seus aplicativos"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Toque e mantenha pressionado um aplicativo e então mova-o sobre outro ícone de aplicativo"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Aqui está uma pasta"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Para criar uma pasta como esta, mantenha pressionado um aplicativo e mova-o para cima de outro."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"Ok"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Toque para fechar a pasta"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index e4f0424..ddcf404 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -31,6 +31,10 @@
<!-- no translation found for number_of_items_selected:zero (7464587177007785408) -->
<!-- no translation found for number_of_items_selected:one (142482526010824029) -->
<!-- no translation found for number_of_items_selected:other (1418352074806573570) -->
+ <!-- no translation found for wallpaper_accessibility_name (1655953108132967972) -->
+ <skip />
+ <!-- no translation found for announce_selection (8338254712932127413) -->
+ <skip />
<!-- no translation found for wallpaper_delete (8095005658756613921) -->
<skip />
<!-- no translation found for pick_image (1272073934062909527) -->
@@ -163,7 +167,7 @@
<skip />
<!-- no translation found for first_run_cling_title (7257389003637362144) -->
<skip />
- <!-- no translation found for first_run_cling_description (658815204153067813) -->
+ <!-- no translation found for first_run_cling_description (6447072552696253358) -->
<skip />
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
@@ -171,15 +175,15 @@
<skip />
<!-- no translation found for workspace_cling_title (5626202359865825661) -->
<skip />
- <!-- no translation found for workspace_cling_move_item (2243369117709858844) -->
+ <!-- no translation found for workspace_cling_move_item (528201129978005352) -->
<skip />
<!-- no translation found for all_apps_cling_title (34929250753095858) -->
<skip />
<!-- no translation found for all_apps_cling_add_item (400866858451850784) -->
<skip />
- <!-- no translation found for folder_cling_title (294708344826056909) -->
+ <!-- no translation found for folder_cling_title (3894908818693254164) -->
<skip />
- <!-- no translation found for folder_cling_create_folder (3245124301268588807) -->
+ <!-- no translation found for folder_cling_create_folder (6158215559475836131) -->
<skip />
<!-- no translation found for cling_dismiss (8962359497601507581) -->
<skip />
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 1d72a60..78d9da4 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -25,10 +25,12 @@
<string name="folder_name" msgid="7371454440695724752"></string>
<string name="wallpaper_instructions" msgid="563973358787555519">"Setați imaginea de fundal"</string>
<plurals name="number_of_items_selected">
- <item quantity="zero" msgid="7464587177007785408">"%1$d selectat"</item>
+ <item quantity="zero" msgid="7464587177007785408">"%1$d selectate"</item>
<item quantity="one" msgid="142482526010824029">"%1$d selectat"</item>
- <item quantity="other" msgid="1418352074806573570">"%1$d selectat"</item>
+ <item quantity="other" msgid="1418352074806573570">"%1$d selectate"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Imaginea de fundal %1$d din %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"S-a selectat <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Ștergeți"</string>
<string name="pick_image" msgid="1272073934062909527">"Alegeți imaginea"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Imagini de fundal"</string>
@@ -37,10 +39,10 @@
<string name="widgets_tab_label" msgid="2921133187116603919">"Widgeturi"</string>
<string name="widget_adder" msgid="3201040140710381657">"Widgeturi"</string>
<string name="toggle_weight_watcher" msgid="5645299835184636119">"Afișați memoria"</string>
- <string name="long_press_widget_to_add" msgid="7699152356777458215">"Atingeți/mențineți apăsat un widget pt. a-l alege."</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"Atingeți lung un widget pentru a-l alege."</string>
<string name="market" msgid="2619650989819296998">"Cumpărați"</string>
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
- <string name="external_drop_widget_error" msgid="3165821058322217155">"Nu am putut plasa articolul pe ecranul de pornire."</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"Nu se poate plasa articolul pe ecranul de pornire."</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Alegeți widgetul de creat"</string>
<string name="rename_folder_label" msgid="3727762225964550653">"Numele dosarului"</string>
<string name="rename_folder_title" msgid="3771389277707820891">"Redenumiți dosarul"</string>
@@ -54,10 +56,10 @@
<string name="out_of_space" msgid="4691004494942118364">"Nu mai este loc pe acest Ecran de pornire."</string>
<string name="hotseat_out_of_space" msgid="9139760413395605841">"Nu mai este loc în bara de lansare rapidă."</string>
<string name="invalid_hotseat_item" msgid="1211534262129849507">"Acest widget este prea mare pentru bara de lansare rapidă."</string>
- <string name="shortcut_installed" msgid="1701742129426969556">"A fost creată comanda rapidă „<xliff:g id="NAME">%s</xliff:g>\"."</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>\" a fost creată."</string>
<string name="shortcut_uninstalled" msgid="8176767991305701821">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>” a fost eliminată."</string>
<string name="shortcut_duplicate" msgid="9167217446062498127">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>” există deja."</string>
- <string name="title_select_shortcut" msgid="6680642571148153868">"Alegeți o comandă rapidă"</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"Alegeți comanda rapidă"</string>
<string name="title_select_application" msgid="3280812711670683644">"Alegeți aplicația"</string>
<string name="all_apps_button_label" msgid="9110807029020582876">"Aplicații"</string>
<string name="all_apps_home_button_label" msgid="252062713717058851">"Ecran de pornire"</string>
@@ -74,18 +76,18 @@
<string name="cab_menu_delete_app" msgid="7435191475867183689">"Dezinstalați aplicația"</string>
<string name="cab_menu_app_info" msgid="8593722221450362342">"Detalii despre aplicație"</string>
<string name="cab_app_selection_text" msgid="374688303047985416">"1 aplicație selectată"</string>
- <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 obiect widget selectat"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 widget selectat"</string>
<string name="cab_folder_selection_text" msgid="7999992513806132118">"1 dosar selectat"</string>
<string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 comandă rapidă selectată"</string>
- <string name="permlab_install_shortcut" msgid="5632423390354674437">"instalați comenzi rapide"</string>
- <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite unei aplicații să adauge comenzi rapide, fără intervenția utilizatorului."</string>
- <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"dezinstalați comenzi rapide"</string>
- <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Permite aplicației să elimine comenzile rapide, fără intervenția utilizatorului."</string>
- <string name="permlab_read_settings" msgid="1941457408239617576">"citiți setările și comenzile rapide pentru ecranul de pornire"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"instalează comenzi rapide"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite unei aplicații să adauge comenzi rapide fără intervenția utilizatorului."</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"dezinstalează comenzi rapide"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Permite aplicației să elimine comenzi rapide fără intervenția utilizatorului."</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"citește setări și comenzi rapide pentru ecranul de pornire"</string>
<string name="permdesc_read_settings" msgid="5833423719057558387">"Permite aplicației să citească setările și comenzile rapide din ecranul de pornire."</string>
- <string name="permlab_write_settings" msgid="3574213698004620587">"scrieți setările și comenzile rapide pentru ecranul de pornire"</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"scrie setări și comenzi rapide pentru ecranul de pornire"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Permite aplicației să modifice setările și comenzile rapide din ecranul de pornire."</string>
- <string name="gadget_error_text" msgid="6081085226050792095">"Probleme la încărcarea obiectului widget"</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"Problemă la încărcarea widgetului"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Aceasta este o aplicație de sistem și nu poate fi dezinstalată."</string>
<string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
<string name="folder_hint_text" msgid="6617836969016293992">"Dosar fără nume"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Pagina de aplicații %1$d din %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Pagina de widgeturi %1$d din %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Bun venit!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Simțiți-vă ca acasă"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Simțiți-vă ca acasă."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Creați mai multe ecrane pentru aplicații și dosare"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organizați-vă spațiul"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Atingeți și mențineți apăsat fundalul pentru a gestiona imaginea de fundal, widgeturile și setările"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Atingeți lung fundalul pentru a gestiona imaginea de fundal, widgeturile și setările."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Alegeți unele aplicații"</string>
- <string name="all_apps_cling_add_item" msgid="400866858451850784">"Atingeți o aplicație și mențineți-o apăsată pentru a o adăuga pe ecranul de pornire."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Creați dosare noi pentru aplicațiile dvs."</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Atingeți și țineți apăsată o aplicație, apoi mutați-o deasupra pictogramei altei aplicații"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"Atingeți lung o aplicație pentru a o adăuga pe ecranul de pornire."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Iată un dosar"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Pentru a crea un dosar similar, atingeți și țineți degetul pe o aplicație, apoi mutați-o deasupra alteia."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"Dosar deschis, <xliff:g id="WIDTH">%1$d</xliff:g> pe <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"Atingeți pentru a închide dosarul"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 8fd7c34..06fbd26 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Выбрано: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Выбрано: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Обои %1$d из %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Выбран элемент \"<xliff:g id="LABEL">%1$s</xliff:g>\""</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Удалить"</string>
<string name="pick_image" msgid="1272073934062909527">"Выбрать изображение"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Обои"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Приложения: стр. %1$d из %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Виджеты: стр. %1$d из %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Добро пожаловать!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Будьте как дома"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Будьте как дома"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Создание дополнительных экранов для приложений и папок"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Организация рабочего пространства"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Чтобы перейти к управлению обоями, виджетами и настройками, нажмите на фоновое изображение и удерживайте его."</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Чтобы перейти к управлению обоями, виджетами и настройками, нажмите на фоновое изображение и удерживайте его."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Выберите приложения"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Чтобы добавить приложение на главный экран, нажмите на значок и удерживайте его."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Создание папок для приложений"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Нажмите на значок приложения и удерживайте его, затем перенесите его на значок другого приложения."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Это папка"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Чтобы создать папку, нажмите и удерживайте значок приложения, а затем перетащите его на другой значок."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"ОК"</string>
<string name="folder_opened" msgid="94695026776264709">"Папка открыта, <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="1884479294466410023">"Нажмите, чтобы закрыть папку"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index f477b42..29de526 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Počet vybratých položiek: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Počet vybratých položiek: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Tapeta %1$d z %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Vybratá položka <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Odstrániť"</string>
<string name="pick_image" msgid="1272073934062909527">"Vybrať obrázok"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Tapety"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Stránka aplikácií %1$d z %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Stránka miniaplikácií %1$d z %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Vitajte!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Prispôsobte si zariadenie na mieru"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Cíťte sa tu ako doma."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Vytvorte viac obrazoviek pre aplikácie a priečinky"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Usporiadajte svoj priestor"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Ak chcete spravovať tapetu, miniaplikácie a nastavenia, dotknite sa pozadia a podržte"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Ak chcete spravovať tapetu, miniaplikácie a nastavenia, dotknite sa pozadia a podržte."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Vyberte niektoré aplikácie"</string>
- <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ak chcete pridať aplikáciu na plochu, dotknite sa jej a podržte ju."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Vytvorte nové priečinky pre aplikácie"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Dotknite sa aplikácie a podržte ju. Potom ju presuňte na inú aplikáciu."</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ak chcete pridať aplikáciu na plochu, dotknite sa jej a podržte."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Tu je priečinok"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Ak chcete vytvoriť takýto priečinok, dotknite sa príslušnej aplikácie a podržte ju. Potom ju presuňte na druhú aplikáciu."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Dotykom zavriete priečinok"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 40c1634..021eca8 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Št. izbranih: %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Št. izbranih: %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Ozadje %1$d od %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Izbrano: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Izbriši"</string>
<string name="pick_image" msgid="1272073934062909527">"Izberi sliko"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Ozadja"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Stran aplikacij %1$d od %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Stran pripomočkov %1$d od %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Pozdravljeni!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Počutite se kot doma"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Počutite se kot doma."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Ustvarite več zaslonov za aplikacije in mape"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organizirajte svoj prostor"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Če želite upravljati ozadje, pripomočke in nastavitve, se dotaknite ozadja in ga pridržite."</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Če želite upravljati ozadje, pripomočke in nastavitve, se dotaknite ozadja in ga pridržite."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Izberite nekaj aplikacij"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Če želite dodati aplikacijo na začetni zaslon, se je dotaknite in jo pridržite."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Ustvarite nove mape za aplikacije"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Dotaknite se aplikacije in jo pridržite ter jo nato premaknite na vrh druge ikone aplikacije"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"To je mapa"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Če želite ustvariti mapo, podobno tej, se dotaknite aplikacije in jo pridržite, nato pa jo premaknite nad drugo."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"V redu"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Dotaknite se, da zaprete mapo"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index f94fb25..06d80ef 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Изабрана je %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Изабранo je %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Позадина %1$d од %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Изабрано је <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Избриши"</string>
<string name="pick_image" msgid="1272073934062909527">"Изабери слику"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Позадине"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%1$d. страница апликација од %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%1$d. страница виџета од %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Добро дошли!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Осећајте се као код куће"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Осећајте се као код куће."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Направите још екрана за апликације и директоријуме"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Организујте простор"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Додирните и задржите позадину да бисте управљали позадином, виџетима и подешавањима"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Додирните позадину и задржите да бисте управљали позадином, виџетима и подешавањима."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Изаберите неколико апликација"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Да бисте додали апликацију на почетни екран, додирните је и задржите."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Направите нове директоријуме за апликације"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Додирните и задржите апликацију, па је преместите на икону друге апликације"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Ево једног директоријума"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Да бисте направили директоријум попут овога, додирните и задржите апликацију, па је превуците преко друге."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"Потврди"</string>
<string name="folder_opened" msgid="94695026776264709">"Директоријум је отворен, <xliff:g id="WIDTH">%1$d</xliff:g> пута <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"Додирните да бисте затворили директоријум"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 85e86fb..bf75200 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d har valts"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d har valts"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Bakgrund %1$d av %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> har valts"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Ta bort"</string>
<string name="pick_image" msgid="1272073934062909527">"Välj bild"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Bakgrunder"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Appsida %1$d av %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widget-sida %1$d av %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Välkommen!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Känn dig som hemma"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Känn dig som hemma."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Skapa fler skärmar för appar och mappar"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Organisera ditt utrymme"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Tryck och håll ned bakgrunden för att hantera widgetar, inställningar och bakgrundsbilder"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Tryck länge på bakgrunden om du vill hantera bakgrundsbilder, widgetar och inställningar."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Välj några appar"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Om du vill lägga till en app på startskärmen trycker du länge på den."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Skapa nya mappar för dina appar"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Tryck och håll ned en app och placera den sedan på en annan appikon"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Det här är en mapp"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Om du vill skapa en till mapp av det här slaget trycker du länge på en app och drar den sedan ovanpå en annan."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"Mappen är öppen, <xliff:g id="WIDTH">%1$d</xliff:g> gånger <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"Tryck om du vill stänga mappen"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 39f8424..606a80d 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d zimechaguliwa"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d zimechaguliwa"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Mandhari %1$d ya %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> iliyochaguliwa"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Futa"</string>
<string name="pick_image" msgid="1272073934062909527">"Chukua picha"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Mandhari"</string>
@@ -36,24 +38,24 @@
<string name="activity_not_found" msgid="8071924732094499514">"Programu haijasakinishwa."</string>
<string name="widgets_tab_label" msgid="2921133187116603919">"Wijeti"</string>
<string name="widget_adder" msgid="3201040140710381657">"Wijeti"</string>
- <string name="toggle_weight_watcher" msgid="5645299835184636119">"Onyesha Mem"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"Onyesha Kumbukumbu"</string>
<string name="long_press_widget_to_add" msgid="7699152356777458215">"Gusa na ushikilie ili kuteua wijeti."</string>
<string name="market" msgid="2619650989819296998">"Nunua"</string>
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
- <string name="external_drop_widget_error" msgid="3165821058322217155">"Haikuweza kudondosha kipengee kwenye skrini hii ya Nyumbani."</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"Haikuweza kudondosha kipengee kwenye skrini hii ya Kwanza."</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Chagua wijeti ili uunde"</string>
<string name="rename_folder_label" msgid="3727762225964550653">"Jina la folda"</string>
- <string name="rename_folder_title" msgid="3771389277707820891">"Ipe jina jipya folda"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"lipe folda jina jipya"</string>
<string name="rename_action" msgid="5559600076028658757">"SAWA"</string>
<string name="cancel_action" msgid="7009134900002915310">"Ghairi"</string>
- <string name="menu_item_add_item" msgid="1264911265836810421">"Ongeza kwenye skrini ya Nyumbani"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"Ongeza kwenye skrini ya Mwanzo"</string>
<string name="group_applications" msgid="3797214114206693605">"Programu"</string>
<string name="group_shortcuts" msgid="6012256992764410535">"Njia za mkato"</string>
<string name="group_widgets" msgid="1569030723286851002">"Wijeti"</string>
<string name="completely_out_of_space" msgid="6106288382070760318">"Hakuna nafasi zaidi kwenye skrini zako za Nyumbani."</string>
- <string name="out_of_space" msgid="4691004494942118364">"Hakuna nafasi katika skrini hii ya Nyumbani."</string>
- <string name="hotseat_out_of_space" msgid="9139760413395605841">"Hakuna nafasi zaidi kwenye hotseat."</string>
- <string name="invalid_hotseat_item" msgid="1211534262129849507">"Wijeti hii ni kubwa zaidi kwa hotseat."</string>
+ <string name="out_of_space" msgid="4691004494942118364">"Hakuna nafasi katika skrini hii ya Mwanzo."</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"Hakuna nafasi zaidi kwenye eneo kali."</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"Wijeti hii ni kubwa zaidi kwa eneo kali."</string>
<string name="shortcut_installed" msgid="1701742129426969556">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" imeundwa."</string>
<string name="shortcut_uninstalled" msgid="8176767991305701821">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" iliondolewa."</string>
<string name="shortcut_duplicate" msgid="9167217446062498127">"\"<xliff:g id="NAME">%s</xliff:g>\" la njia ya mkato tayari lipo."</string>
@@ -66,7 +68,7 @@
<string name="delete_target_label" msgid="1822697352535677073">"Ondoa"</string>
<string name="delete_target_uninstall_label" msgid="5100785476250872595">"Ondoa"</string>
<string name="info_target_label" msgid="8053346143994679532">"Maelezo ya programu"</string>
- <string name="accessibility_search_button" msgid="1628520399424565142">"Tafuta na Google"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"Tafuta"</string>
<string name="accessibility_voice_search_button" msgid="4637324840434406584">"Kutafuta kwa Kutamka"</string>
<string name="accessibility_all_apps_button" msgid="2603132375383800483">"Programu"</string>
<string name="accessibility_delete_button" msgid="6466114477993744621">"Ondoa"</string>
@@ -82,14 +84,14 @@
<string name="permlab_uninstall_shortcut" msgid="864595034498083837">"ondoa njia za mikato"</string>
<string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Huruhusu programu kuondoa njia za mikato bila mtumiaji kuingilia kati."</string>
<string name="permlab_read_settings" msgid="1941457408239617576">"soma mipangilio ya Mwanzo na njia za mkato"</string>
- <string name="permdesc_read_settings" msgid="5833423719057558387">"Huruhusu programu kusoma mipangilio na njia za mikato katika Mwanzo."</string>
- <string name="permlab_write_settings" msgid="3574213698004620587">"andika mipangilio ya Mwanzo na njia za mkato"</string>
- <string name="permdesc_write_settings" msgid="5440712911516509985">"Huruhusu programu kubadilisha mipangilio na njia za mkato katika Mwanzo."</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"Huruhusu programu kusoma mipangilio na njia za mikato zilizo katika skirini ya Mwanzo."</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"andika mipangilio ya skrini ya Mwanzo na njia za mkato"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"Huruhusu programu kubadilisha mipangilio na njia za mkato katika skrini ya Mwanzo."</string>
<string name="gadget_error_text" msgid="6081085226050792095">"Tatizo la kupakia wijeti"</string>
- <string name="uninstall_system_app_text" msgid="4172046090762920660">"Hii ni programu ya mfumo na haiwezi kusaniduliwa."</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"Hii ni programu ya mfumo na haiwezi kuondolewa."</string>
<string name="dream_name" msgid="1530253749244328964">"Kizinduzi cha Roketi"</string>
<string name="folder_hint_text" msgid="6617836969016293992">"Folda isiyo na jina"</string>
- <string name="workspace_description_format" msgid="2950174241104043327">"Skrini ya nyumbani %1$d"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"Skrini ya mwazo %1$d"</string>
<string name="default_scroll_format" msgid="7475544710230993317">"Ukurasa%1$d wa %2$d"</string>
<!-- String.format failed for translation -->
<!-- no translation found for workspace_scroll_format (8458889198184077399) -->
@@ -97,22 +99,22 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Ukurasa wa programu %1$d ya %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Ukurasa wa wijeti %1$d ya %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Karibu!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Jisikie huru"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Jisikie huru."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Unda skrini zaidi za programu na folda"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Panga nafasi yako"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Gusa na ushikile mandharinyuma ili kusimamia mandhari, wijeti, na mipangilio"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Gusa na ushikile mandharinyuma ili udhibiti mandhari, wijeti, na mipangilio."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Chagua programu kadhaa"</string>
- <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ili kuongeza programu kwenye Skrini yako ya nyumbani, iguse na uishikilie."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Unda folda mpya za programu zako"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Gusa na ushikilie programu, kisha isogeze juu ya ikoni ya programu nyingine"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ili kuongeza programu kwenye Skrini yako Kuu, iguse na uishikilie."</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Folda hii hapa"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Ili kuunda kama hii, gusa na ushikilie programu, kisha ipitishe juu ya nyingine."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"SAWA"</string>
<string name="folder_opened" msgid="94695026776264709">"Folda imefunguliwa, <xliff:g id="WIDTH">%1$d</xliff:g> kwa <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"Gusa ili ufunge folda"</string>
- <string name="folder_tap_to_rename" msgid="9191075570492871147">"Gusa kuhifadhi upaji jina jipya"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"Gusa ili uhifadhi jina jipya"</string>
<string name="folder_closed" msgid="4100806530910930934">"Folda imefungwa"</string>
- <string name="folder_renamed" msgid="1794088362165669656">"Folda imebadilishwa jina hadi <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"Folda imebadilishwa jina kuwa <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format" msgid="6629239338071103179">"Folda: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
<string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml
index 7269e8d..9738a12 100644
--- a/res/values-sw720dp/styles.xml
+++ b/res/values-sw720dp/styles.xml
@@ -53,6 +53,8 @@
<!-- Workspace -->
<style name="Theme" parent="android:Theme.Holo.Wallpaper.NoTitleBar">
<item name="android:windowActionModeOverlay">true</item>
+ <item name="android:windowTranslucentStatus">true</item>
+ <item name="android:windowTranslucentNavigation">true</item>
</style>
<style name="TabIndicator.AppsCustomize">
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index c68c66b..68118a7 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"เลือกไว้ %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"เลือกไว้ %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"วอลเปเปอร์ %1$d จาก %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"เลือก <xliff:g id="LABEL">%1$s</xliff:g> แล้ว"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"ลบ"</string>
<string name="pick_image" msgid="1272073934062909527">"เลือกภาพ"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"วอลเปเปอร์"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"แอปหน้า %1$d จาก %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"วิดเจ็ตหน้า %1$d จาก %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"ยินดีต้อนรับ!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"ทำตัวตามสบาย"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"ทำตัวตามสบาย"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"สร้างหน้าจอเพิ่มสำหรับแอปและโฟลเดอร์"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"จัดระเบียบพื้นที่ของคุณ"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"แตะพื้นหลังค้างไว้เพื่อจัดการวอลล์เปเปอร์ วิดเจ็ต และการตั้งค่า"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"แตะพื้นหลังค้างไว้เพื่อจัดการวอลเปเปอร์ วิดเจ็ต และการตั้งค่า"</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"เลือกบางแอป"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"หากต้องการเพิ่มแอปลงในหน้าจอหลัก ให้แตะแอปค้างไว้"</string>
- <string name="folder_cling_title" msgid="294708344826056909">"สร้างโฟลเดอร์ใหม่สำหรับแอปของคุณ"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"แตะแอปค้างไว้แล้วย้ายไปที่ด้านบนของอีกไอคอนแอป"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"นี่คือโฟลเดอร์"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"หากต้องการสร้างโฟลเดอร์ลักษณะนี้ แตะแอปค้างไว้ แล้วย้ายไปทับอีกแอปหนึ่ง"</string>
<string name="cling_dismiss" msgid="8962359497601507581">"ตกลง"</string>
<string name="folder_opened" msgid="94695026776264709">"เปิดโฟลเดอร์ <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="1884479294466410023">"แตะเพื่อปิดโฟลเดอร์"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 44bab7a..56801b4 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d ang napili"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d ang napili"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Wallpaper %1$d ng %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Napili ang <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Tanggalin"</string>
<string name="pick_image" msgid="1272073934062909527">"Pumili ng larawan"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Mga Wallpaper"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Pahina ng apps %1$d ng %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Pahina ng widget %1$d ng %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Maligayang pagdating!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Gawing kumportable ang iyong sarili"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Gawing kumportable ang iyong sarili."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Gumawa ng higit pang mga screen para sa apps at mga folder"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Ayusin ang iyong espasyo"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Pindutin nang matagal ang background upang pamahalaan ang wallpaper, mga widget at mga setting"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Pindutin nang matagal ang background upang pamahalaan ang wallpaper, mga widget at setting"</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Pumili ng ilang apps"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Upang magdagdag ng app sa iyong Home screen, pindutin ito nang matagal."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Gumawa ng mga bagong folder para sa iyong apps"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Pindutin nang matagal ang isang app, pagkatapos ay ilipat ito sa itaas ng isa pang icon ng app"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Narito ang isang folder"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Upang gumawa ng katulad nito, pindutin nang matagal ang isang app, pagkatapos ay ilipat ito sa isa pang folder."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"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="1884479294466410023">"Pindutin upang isara ang folder"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index e9e0d1d..dbbdee2 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d tane seçildi"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d tane seçildi"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Duvar kağıdı %1$d / %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> seçildi"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Sil"</string>
<string name="pick_image" msgid="1272073934062909527">"Resim seç"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Duvar Kağıtları"</string>
@@ -51,9 +53,9 @@
<string name="group_shortcuts" msgid="6012256992764410535">"Kısayollar"</string>
<string name="group_widgets" msgid="1569030723286851002">"Widget\'lar"</string>
<string name="completely_out_of_space" msgid="6106288382070760318">"Ana ekranlarınızda yer kalmadı."</string>
- <string name="out_of_space" msgid="4691004494942118364">"Bu Ana ekranda başka yer yok."</string>
- <string name="hotseat_out_of_space" msgid="9139760413395605841">"Favori kısayollarda yer yok"</string>
- <string name="invalid_hotseat_item" msgid="1211534262129849507">"Bu widget, favori kısayollar için çok büyük."</string>
+ <string name="out_of_space" msgid="4691004494942118364">"Bu Ana ekranda yer kalmadı."</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"Favori kısa yollarda yer yok"</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"Bu widget, favori kısa yollar için çok büyük."</string>
<string name="shortcut_installed" msgid="1701742129426969556">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu oluşturuldu."</string>
<string name="shortcut_uninstalled" msgid="8176767991305701821">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu kaldırıldı."</string>
<string name="shortcut_duplicate" msgid="9167217446062498127">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu zaten var."</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Uygulama sayfası %1$d / %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widget sayfası %1$d / %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Hoş geldiniz!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Kendinizi Evinizde Hissedin"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Rahatınıza bakın."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Uygulamalar ve klasörler için daha fazla ekran oluşturun"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Alanınızı düzenleyin"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Duvar kağıdını, widget\'ları ve ayarları yönetmek için arka plana dokunun ve basılı tutun"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Duvar kağıdını, widget\'ları ve ayarları yönetmek için arka plana uzun basın."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"İstediğiniz uygulamaları seçin"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Bir uygulamayı Ana ekranınıza eklemek için, ilgili uygulamayı basılı tutun."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Uygulamalarınız için yeni klasörler oluşturun"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Bir uygulamayı basılı tutun ve sonra, başka bir uygulama simgesinin üzerine taşıyın"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"İşte bir klasör"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Buna benzer bir klasör oluşturmak için uygulamaya uzun basın ve sonra uygulamayı başka bir uygulamanın üzerine taşıyın."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"Tamam"</string>
<string name="folder_opened" msgid="94695026776264709">"Klasör açıldı, <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="1884479294466410023">"Klasörü kapatmak için dokunun"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index dbe020b..e0f3211 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Вибрано %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Вибрано %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Фоновий малюнок %1$d з %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"Вибрано <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Видалити"</string>
<string name="pick_image" msgid="1272073934062909527">"Вибрати зображення"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Фонові малюнки"</string>
@@ -37,10 +39,10 @@
<string name="widgets_tab_label" msgid="2921133187116603919">"Віджети"</string>
<string name="widget_adder" msgid="3201040140710381657">"Віджети"</string>
<string name="toggle_weight_watcher" msgid="5645299835184636119">"Показати пам’ять"</string>
- <string name="long_press_widget_to_add" msgid="7699152356777458215">"Торкніться й утримуйте, щоб вибрати віджет."</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"Натисніть і утримуйте, щоб вибрати віджет."</string>
<string name="market" msgid="2619650989819296998">"Магазин"</string>
<string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
- <string name="external_drop_widget_error" msgid="3165821058322217155">"Не вдалося помістити елемент на цей головний екран"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"Не вдалося додати елемент на цей головний екран."</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Вибрати віджет для створення"</string>
<string name="rename_folder_label" msgid="3727762225964550653">"Назва папки"</string>
<string name="rename_folder_title" msgid="3771389277707820891">"Перейменувати папку"</string>
@@ -52,8 +54,8 @@
<string name="group_widgets" msgid="1569030723286851002">"Віджети"</string>
<string name="completely_out_of_space" msgid="6106288382070760318">"На головних екранах більше немає місця."</string>
<string name="out_of_space" msgid="4691004494942118364">"На цьому головному екрані більше немає місця."</string>
- <string name="hotseat_out_of_space" msgid="9139760413395605841">"На гарячій панелі більше немає місця."</string>
- <string name="invalid_hotseat_item" msgid="1211534262129849507">"Цей віджет завеликий для гарячої панелі."</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"Немає вільного місця."</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"Цей віджет завеликий."</string>
<string name="shortcut_installed" msgid="1701742129426969556">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" створено."</string>
<string name="shortcut_uninstalled" msgid="8176767991305701821">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" вилучено."</string>
<string name="shortcut_duplicate" msgid="9167217446062498127">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" уже існує."</string>
@@ -65,7 +67,7 @@
<string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Видалити"</string>
<string name="delete_target_label" msgid="1822697352535677073">"Вилучити"</string>
<string name="delete_target_uninstall_label" msgid="5100785476250872595">"Видалити"</string>
- <string name="info_target_label" msgid="8053346143994679532">"Інформація про програму"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"Про програму"</string>
<string name="accessibility_search_button" msgid="1628520399424565142">"Пошук"</string>
<string name="accessibility_voice_search_button" msgid="4637324840434406584">"Голосовий пошук"</string>
<string name="accessibility_all_apps_button" msgid="2603132375383800483">"Програми"</string>
@@ -78,9 +80,9 @@
<string name="cab_folder_selection_text" msgid="7999992513806132118">"Вибрано 1 папку"</string>
<string name="cab_shortcut_selection_text" msgid="2103811025667946450">"Вибрано 1 ярлик"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"установлювати ярлики"</string>
- <string name="permdesc_install_shortcut" msgid="923466509822011139">"Дозволяє програмі додавати ярлики без втручання користувача."</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"Дозволяє програмі самостійно додавати ярлики."</string>
<string name="permlab_uninstall_shortcut" msgid="864595034498083837">"видаляти ярлики"</string>
- <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Дозволяє програмі вилучати ярлики без втручання користувача."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Дозволяє програмі самостійно вилучати ярлики."</string>
<string name="permlab_read_settings" msgid="1941457408239617576">"читати налаштування та ярлики головного екрана"</string>
<string name="permdesc_read_settings" msgid="5833423719057558387">"Дозволяє програмі читати налаштування та ярлики на головному екрані."</string>
<string name="permlab_write_settings" msgid="3574213698004620587">"записувати налаштування та ярлики головного екрана"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Сторінка програм %1$d з %2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Сторінка віджетів %1$d з %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Вітаємо!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Ознайомтеся з пристроєм"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Будьте як удома."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Створюйте нові екрани для програм і папок"</string>
- <string name="workspace_cling_title" msgid="5626202359865825661">"Упорядкуйте свій простір"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Торкніться й утримуйте фон, щоб керувати фоновим малюнком, віджетами та налаштуваннями"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"Організуйте робочий простір"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Натисніть і утримуйте фон, щоб керувати фоновим малюнком, віджетами та налаштуваннями."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Виберіть програми"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Щоб додати програму на головний екран, торкніться й утримуйте її."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Створюйте нові папки для своїх програм"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Торкніться й утримуйте програму, а потім перемістіть її на піктограму іншої програми"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Це папка"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Щоб створити папку, натисніть і утримуйте програму, а потім перетягніть її на іншу."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OК"</string>
<string name="folder_opened" msgid="94695026776264709">"Папку відкрито (<xliff:g id="WIDTH">%1$d</xliff:g> х <xliff:g id="HEIGHT">%2$d</xliff:g>)"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"Торкніться, щоб закрити папку"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 16bceeb..3b081d0 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"Đã chọn %1$d"</item>
<item quantity="other" msgid="1418352074806573570">"Đã chọn %1$d"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Hình nền %1$d / %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> được chọn"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Xóa"</string>
<string name="pick_image" msgid="1272073934062909527">"Chọn hình ảnh"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Hình nền"</string>
@@ -90,21 +92,21 @@
<string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
<string name="folder_hint_text" msgid="6617836969016293992">"Thư mục chưa đặt tên"</string>
<string name="workspace_description_format" msgid="2950174241104043327">"Màn hình chính %1$d"</string>
- <string name="default_scroll_format" msgid="7475544710230993317">"Trang %1$d trong tổng số %2$d"</string>
- <string name="workspace_scroll_format" msgid="8458889198184077399">"Màn hình chính %1$d trong tổng số %2$d"</string>
- <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Trang ứng dụng %1$d trong tổng số %2$d"</string>
- <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Trang tiện ích con %1$d trong tổng số %2$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"Trang %1$d / %2$d"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"Màn hình chính %1$d / %2$d"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Trang ứng dụng %1$d / %2$d"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Trang tiện ích con %1$d / %2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Xin chào!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Tự nhiên như ở nhà"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Tự nhiên như ở nhà."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Tạo thêm màn hình cho ứng dụng và thư mục"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Sắp xếp không gian của bạn"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Chạm và giữ nền để quản lý hình nền, tiện ích con và cài đặt"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Chạm và giữ nền để quản lý hình nền, tiện ích con và cài đặt."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Chọn một số ứng dụng"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Để thêm ứng dụng vào Màn hình chính của bạn, chạm và giữ ứng dụng đó."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Tạo thư mục mới cho ứng dụng của bạn"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Chạm và giữ ứng dụng, sau đó di chuyển ứng dụng lên trên biểu tượng ứng dụng khác"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Đây là một thư mục"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Để tạo thư mục như thế này, hãy chạm và giữ một ứng dụng, sau đó di chuyển ứng dụng đó lên trên một ứng dụng khác."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
<string name="folder_opened" msgid="94695026776264709">"Đã 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="1884479294466410023">"Chạm để đóng thư mục"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 564c772..43a57c4 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
- <string name="home" msgid="7658288663002113681">"主屏幕"</string>
+ <string name="home" msgid="7658288663002113681">"主屏"</string>
<string name="uid_name" msgid="7820867637514617527">"Android 核心应用"</string>
<string name="folder_name" msgid="7371454440695724752"></string>
<string name="wallpaper_instructions" msgid="563973358787555519">"设置壁纸"</string>
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"已选择%1$d项"</item>
<item quantity="other" msgid="1418352074806573570">"已选择%1$d项"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"第%1$d张壁纸,共%2$d张"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"已选择<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"删除"</string>
<string name="pick_image" msgid="1272073934062909527">"选择图片"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"壁纸"</string>
@@ -39,8 +41,8 @@
<string name="toggle_weight_watcher" msgid="5645299835184636119">"显示内存空间"</string>
<string name="long_press_widget_to_add" msgid="7699152356777458215">"触摸并按住小部件即可选择。"</string>
<string name="market" msgid="2619650989819296998">"商店"</string>
- <string name="widget_dims_format" msgid="2370757736025621599">"%1$d×%2$d"</string>
- <string name="external_drop_widget_error" msgid="3165821058322217155">"无法将相关项拖放到此主屏幕上。"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"无法将相关内容拖放到此主屏幕上。"</string>
<string name="external_drop_widget_pick_title" msgid="3486317258037690630">"选择要创建的小部件"</string>
<string name="rename_folder_label" msgid="3727762225964550653">"文件夹名称"</string>
<string name="rename_folder_title" msgid="3771389277707820891">"重命名文件夹"</string>
@@ -87,28 +89,28 @@
<string name="permdesc_write_settings" msgid="5440712911516509985">"允许应用更改主屏幕中的设置和快捷方式。"</string>
<string name="gadget_error_text" msgid="6081085226050792095">"加载小部件时出现问题"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"这是系统应用,无法卸载。"</string>
- <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
+ <string name="dream_name" msgid="1530253749244328964">"火箭发射器"</string>
<string name="folder_hint_text" msgid="6617836969016293992">"未命名文件夹"</string>
<string name="workspace_description_format" msgid="2950174241104043327">"主屏幕%1$d"</string>
<string name="default_scroll_format" msgid="7475544710230993317">"第%1$d页,共%2$d页"</string>
- <string name="workspace_scroll_format" msgid="8458889198184077399">"主屏幕:第%1$d页,共%2$d页"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"主屏幕:第%1$d屏,共%2$d屏"</string>
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"应用:第%1$d页,共%2$d页"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"小部件:第%1$d页,共%2$d页"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"欢迎!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"您的主屏幕您做主"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"您的主屏幕您做主。"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
- <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"创建更多屏幕空间容纳应用和文件夹"</string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"添加更多屏幕来容纳应用和文件夹"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"整理您的空间"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"触摸并按住背景即可管理壁纸、小部件和设置"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"触摸并按住背景,即可管理壁纸、小部件和设置。"</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"选择一些应用"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"要将应用添加到主屏幕,请触摸并按住该应用。"</string>
- <string name="folder_cling_title" msgid="294708344826056909">"创建新文件夹容纳您的应用"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"触摸并按住某个应用,然后将其移到另一个应用图标上"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"这是一个文件夹"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"要创建一个类似的文件夹,请触摸并按住某个应用,然后将其移至另一个应用上。"</string>
<string name="cling_dismiss" msgid="8962359497601507581">"确定"</string>
- <string name="folder_opened" msgid="94695026776264709">"文件夹已打开,尺寸为<xliff:g id="WIDTH">%1$d</xliff:g>×<xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+ <string name="folder_opened" msgid="94695026776264709">"文件夹已打开,大小为<xliff:g id="WIDTH">%1$d</xliff:g>×<xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"触摸可关闭文件夹"</string>
- <string name="folder_tap_to_rename" msgid="9191075570492871147">"触摸可保存重命名的名称"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"触摸可保存新名称"</string>
<string name="folder_closed" msgid="4100806530910930934">"文件夹已关闭"</string>
<string name="folder_renamed" msgid="1794088362165669656">"已将文件夹重命名为“<xliff:g id="NAME">%1$s</xliff:g>”"</string>
<string name="folder_name_format" msgid="6629239338071103179">"文件夹:<xliff:g id="NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..eb3def4
--- /dev/null
+++ b/res/values-zh-rHK/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (C) 2008 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+ <string name="home" msgid="7658288663002113681">"主畫面"</string>
+ <string name="uid_name" msgid="7820867637514617527">"Android 核心應用程式"</string>
+ <string name="folder_name" msgid="7371454440695724752"></string>
+ <string name="wallpaper_instructions" msgid="563973358787555519">"設定桌布"</string>
+ <plurals name="number_of_items_selected">
+ <item quantity="zero" msgid="7464587177007785408">"已選取 %1$d 個"</item>
+ <item quantity="one" msgid="142482526010824029">"已選取 %1$d 個"</item>
+ <item quantity="other" msgid="1418352074806573570">"已選取 %1$d 個"</item>
+ </plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"第 %1$d 張桌布,共 %2$d 張"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"已選取「<xliff:g id="LABEL">%1$s</xliff:g>」"</string>
+ <string name="wallpaper_delete" msgid="8095005658756613921">"刪除"</string>
+ <string name="pick_image" msgid="1272073934062909527">"選擇圖片"</string>
+ <string name="pick_wallpaper" msgid="8179698221502010609">"桌布"</string>
+ <string name="crop_wallpaper" msgid="8334345984491368009">"裁剪桌布"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"尚未安裝應用程式。"</string>
+ <string name="widgets_tab_label" msgid="2921133187116603919">"小工具"</string>
+ <string name="widget_adder" msgid="3201040140710381657">"小工具"</string>
+ <string name="toggle_weight_watcher" msgid="5645299835184636119">"顯示記憶體"</string>
+ <string name="long_press_widget_to_add" msgid="7699152356777458215">"輕觸並按住小工具即可選取。"</string>
+ <string name="market" msgid="2619650989819296998">"商店"</string>
+ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+ <string name="external_drop_widget_error" msgid="3165821058322217155">"無法將項目拖放至主畫面。"</string>
+ <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"選擇要建立的小工具"</string>
+ <string name="rename_folder_label" msgid="3727762225964550653">"資料夾名稱"</string>
+ <string name="rename_folder_title" msgid="3771389277707820891">"重新命名資料夾"</string>
+ <string name="rename_action" msgid="5559600076028658757">"確定"</string>
+ <string name="cancel_action" msgid="7009134900002915310">"取消"</string>
+ <string name="menu_item_add_item" msgid="1264911265836810421">"新增至主畫面"</string>
+ <string name="group_applications" msgid="3797214114206693605">"應用程式"</string>
+ <string name="group_shortcuts" msgid="6012256992764410535">"捷徑"</string>
+ <string name="group_widgets" msgid="1569030723286851002">"小工具"</string>
+ <string name="completely_out_of_space" msgid="6106288382070760318">"主畫面已無空間。"</string>
+ <string name="out_of_space" msgid="4691004494942118364">"主畫面已無空間。"</string>
+ <string name="hotseat_out_of_space" msgid="9139760413395605841">"停駐區已無可用空間。"</string>
+ <string name="invalid_hotseat_item" msgid="1211534262129849507">"這個小工具過大,停駐區沒有足夠空間。"</string>
+ <string name="shortcut_installed" msgid="1701742129426969556">"已建立「<xliff:g id="NAME">%s</xliff:g>」捷徑。"</string>
+ <string name="shortcut_uninstalled" msgid="8176767991305701821">"已移除「<xliff:g id="NAME">%s</xliff:g>」捷徑。"</string>
+ <string name="shortcut_duplicate" msgid="9167217446062498127">"「<xliff:g id="NAME">%s</xliff:g>」捷徑已存在。"</string>
+ <string name="title_select_shortcut" msgid="6680642571148153868">"選擇捷徑"</string>
+ <string name="title_select_application" msgid="3280812711670683644">"選擇應用程式"</string>
+ <string name="all_apps_button_label" msgid="9110807029020582876">"應用程式"</string>
+ <string name="all_apps_home_button_label" msgid="252062713717058851">"主畫面"</string>
+ <string name="delete_zone_label_workspace" msgid="4009607676751398685">"移除"</string>
+ <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"解除安裝"</string>
+ <string name="delete_target_label" msgid="1822697352535677073">"移除"</string>
+ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"解除安裝"</string>
+ <string name="info_target_label" msgid="8053346143994679532">"應用程式資料"</string>
+ <string name="accessibility_search_button" msgid="1628520399424565142">"搜尋"</string>
+ <string name="accessibility_voice_search_button" msgid="4637324840434406584">"語音搜尋"</string>
+ <string name="accessibility_all_apps_button" msgid="2603132375383800483">"應用程式"</string>
+ <string name="accessibility_delete_button" msgid="6466114477993744621">"移除"</string>
+ <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"解除安裝更新"</string>
+ <string name="cab_menu_delete_app" msgid="7435191475867183689">"解除安裝應用程式"</string>
+ <string name="cab_menu_app_info" msgid="8593722221450362342">"應用程式詳細資料"</string>
+ <string name="cab_app_selection_text" msgid="374688303047985416">"已選取 1 個應用程式"</string>
+ <string name="cab_widget_selection_text" msgid="1833458597831541241">"已選取 1 個小工具"</string>
+ <string name="cab_folder_selection_text" msgid="7999992513806132118">"已選取 1 個資料夾"</string>
+ <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"已選取 1 個捷徑"</string>
+ <string name="permlab_install_shortcut" msgid="5632423390354674437">"安裝捷徑"</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"允許應用程式無需用戶許可也可新增捷徑。"</string>
+ <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"解除安裝捷徑"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"允許應用程式無需用戶許可也可移除捷徑。"</string>
+ <string name="permlab_read_settings" msgid="1941457408239617576">"讀取主畫面的設定和捷徑"</string>
+ <string name="permdesc_read_settings" msgid="5833423719057558387">"允許應用程式讀取主畫面中的設定和捷徑。"</string>
+ <string name="permlab_write_settings" msgid="3574213698004620587">"寫入主畫面的設定和捷徑"</string>
+ <string name="permdesc_write_settings" msgid="5440712911516509985">"允許應用程式更改主畫面中的設定和捷徑。"</string>
+ <string name="gadget_error_text" msgid="6081085226050792095">"載入小工具時發生問題"</string>
+ <string name="uninstall_system_app_text" msgid="4172046090762920660">"這是系統應用程式,無法將其解除安裝。"</string>
+ <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
+ <string name="folder_hint_text" msgid="6617836969016293992">"未命名的資料夾"</string>
+ <string name="workspace_description_format" msgid="2950174241104043327">"主畫面 %1$d"</string>
+ <string name="default_scroll_format" msgid="7475544710230993317">"第 %1$d 頁,共 %2$d 頁"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"主畫面 %1$d,共 %2$d 個"</string>
+ <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"第 %1$d 個應用程式頁面,共 %2$d 頁"</string>
+ <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"第 %1$d 個小工具頁面,共 %2$d 頁"</string>
+ <string name="first_run_cling_title" msgid="7257389003637362144">"歡迎!"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"自訂主畫面。"</string>
+ <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+ <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+ <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"建立更多應用程式和資料夾的畫面"</string>
+ <string name="workspace_cling_title" msgid="5626202359865825661">"管理您的空間"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"輕觸並按住背景,即可管理桌布、小工具和設定。"</string>
+ <string name="all_apps_cling_title" msgid="34929250753095858">"選擇一些應用程式"</string>
+ <string name="all_apps_cling_add_item" msgid="400866858451850784">"輕觸並按住應用程式,即可加到主畫面。"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"資料夾顯示如下"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"如要建立類似的資料夾,請輕觸並按住某個應用程式,然後疊到另一個應用程式之上。"</string>
+ <string name="cling_dismiss" msgid="8962359497601507581">"確定"</string>
+ <string name="folder_opened" msgid="94695026776264709">"資料夾已開啟 (<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="1884479294466410023">"輕觸即可關閉資料夾"</string>
+ <string name="folder_tap_to_rename" msgid="9191075570492871147">"輕觸即可儲存新改的名稱"</string>
+ <string name="folder_closed" msgid="4100806530910930934">"已關閉資料夾"</string>
+ <string name="folder_renamed" msgid="1794088362165669656">"資料夾已重新命名為「<xliff:g id="NAME">%1$s</xliff:g>」"</string>
+ <string name="folder_name_format" msgid="6629239338071103179">"資料夾:<xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+ <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+ <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+ <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+ <string name="widget_button_text" msgid="2880537293434387943">"小工具"</string>
+ <string name="wallpaper_button_text" msgid="8404103075899945851">"桌布"</string>
+ <string name="settings_button_text" msgid="8119458837558863227">"設定"</string>
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e755979..a68f163 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"已選取 %1$d 個項目"</item>
<item quantity="other" msgid="1418352074806573570">"已選取 %1$d 個項目"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"第 %1$d 張桌布,共 %2$d 張"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"已選取<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"刪除"</string>
<string name="pick_image" msgid="1272073934062909527">"選擇圖片"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"桌布"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"應用程式:第 %1$d 頁,共 %2$d 頁"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"小工具:第 %1$d 頁,共 %2$d 頁"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"歡迎使用!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"主螢幕由您作主"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"主螢幕由您作主。"</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"建立更多畫面容納應用程式和資料夾"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"管理您的空間"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"輕觸並按住背景,即可管理桌布、小工具和設定"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"輕觸並按住背景,即可管理桌布、小工具和設定。"</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"選擇一些應用程式"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"如要將應用程式新增至主螢幕,請輕觸並按住目標。"</string>
- <string name="folder_cling_title" msgid="294708344826056909">"建立新資料夾容納應用程式"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"輕觸並按住應用程式,將它移至另一個應用程式圖示上面"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"資料夾顯示如下"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"如要建立類似的資料夾,請輕觸並按住應用程式,然後將應用程式疊放在另一個應用程式上。"</string>
<string name="cling_dismiss" msgid="8962359497601507581">"確定"</string>
<string name="folder_opened" msgid="94695026776264709">"資料夾已開啟 (<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="1884479294466410023">"輕觸即可關閉資料夾"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 5d18102..da790e6 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -29,6 +29,8 @@
<item quantity="one" msgid="142482526010824029">"%1$d khethiwe"</item>
<item quantity="other" msgid="1418352074806573570">"%1$d khethiwe"</item>
</plurals>
+ <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Isithombe sangemuva se-%1$d of %2$d"</string>
+ <string name="announce_selection" msgid="8338254712932127413">"I-<xliff:g id="LABEL">%1$s</xliff:g> ekhethiwe"</string>
<string name="wallpaper_delete" msgid="8095005658756613921">"Susa"</string>
<string name="pick_image" msgid="1272073934062909527">"Thatha isithombe"</string>
<string name="pick_wallpaper" msgid="8179698221502010609">"Izithombe zangemuva"</string>
@@ -95,16 +97,16 @@
<string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Ikhasi lezinhlelo zokusebenza elingu-%1$d le-%2$d"</string>
<string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Ikhasi lamawijethi elingu-%1$d le-%2$d"</string>
<string name="first_run_cling_title" msgid="7257389003637362144">"Siyakwamukela!"</string>
- <string name="first_run_cling_description" msgid="658815204153067813">"Zizwe Usekhaya"</string>
+ <string name="first_run_cling_description" msgid="6447072552696253358">"Zizwe usekhaya."</string>
<string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
<string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
<string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Dala izikrini eziningi zezinhlelo zokusebenza namafolda"</string>
<string name="workspace_cling_title" msgid="5626202359865825661">"Hlela isikhala sakho"</string>
- <string name="workspace_cling_move_item" msgid="2243369117709858844">"Thinta uphinde ubambe okungemuva ukuze uphathe isithombe sangemuva, amawijethi nezilungiselelo"</string>
+ <string name="workspace_cling_move_item" msgid="528201129978005352">"Thinta uphinde ubambe okungemuva ukuze uphathe isithombe sangemuva, amawijethi nezilungiselelo."</string>
<string name="all_apps_cling_title" msgid="34929250753095858">"Khetha izinhlelo zokusebenza ezithile"</string>
<string name="all_apps_cling_add_item" msgid="400866858451850784">"Ukuze ungeze uhlelo lokusebenza kusikrini sakho se-Ikhaya, thinta futhi uyibambe."</string>
- <string name="folder_cling_title" msgid="294708344826056909">"Dala amafolda amasha wezinhlelo zakho zokusebenza"</string>
- <string name="folder_cling_create_folder" msgid="3245124301268588807">"Thinta uphinde ubambe uhlelo lokusebenza, bese ulimikisa ngaphezulu kwesithonjana solunye uhlelo lokusebenza"</string>
+ <string name="folder_cling_title" msgid="3894908818693254164">"Nayi ifolda"</string>
+ <string name="folder_cling_create_folder" msgid="6158215559475836131">"Ukuze udale eyodwa efana nale, thinta uphinde ubambe uhlelo lokusebenza, bese ulidlulisa ngaphezulu kwelinye."</string>
<string name="cling_dismiss" msgid="8962359497601507581">"KULUNGILE"</string>
<string name="folder_opened" msgid="94695026776264709">"Ifolda ivuliwe, <xliff:g id="WIDTH">%1$d</xliff:g> nge-<xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="1884479294466410023">"Thinta ukuze uvale ifolda"</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 1dcc5dd..a2d3a83 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -148,6 +148,9 @@
<attr name="key" format="string" />
<attr name="value" format="string" />
</declare-styleable>
+ <declare-styleable name="Include">
+ <attr name="workspace" format="reference" />
+ </declare-styleable>
<!-- Only used in the device overlays -->
<declare-styleable name="CustomClingTitleText">
diff --git a/res/values/colors.xml b/res/values/colors.xml
index e4278d9..dc35a3f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -36,5 +36,5 @@
<color name="folder_items_text_color">#FF333333</color>
<color name="outline_color">#FFFFFFFF</color>
- <color name="first_run_cling_circle_background_color">#FF8BB4E9</color>
+ <color name="first_run_cling_circle_background_color">#64b1ea</color>
</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 97408cc..4978281 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -12,8 +12,10 @@
<!-- AllApps/Customize/AppsCustomize -->
<!-- The alpha of the AppsCustomize bg in spring loaded mode -->
- <integer name="config_appsCustomizeSpringLoadedBgAlpha">45</integer>
+ <integer name="config_appsCustomizeSpringLoadedBgAlpha">65</integer>
<integer name="config_workspaceUnshrinkTime">300</integer>
+ <integer name="config_overviewTransitionTime">250</integer>
+
<!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
<integer name="config_workspaceSpringLoadShrinkPercentage">80</integer>
<!-- Out of 100, the percent to shrink the workspace during overview mode. -->
@@ -81,4 +83,9 @@
<!-- Memory debugging, including a memory dump icon -->
<bool name="debug_memory_enabled">false</bool>
+
+ <!-- Name of a subclass of com.android.launcher3.AppFilter used to
+ filter the activities shown in the launcher. Can be empty. -->
+ <string name="app_filter_class" translatable="false"></string>
+
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2910b7c..b4b2367 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -24,6 +24,7 @@
<!-- Wallpaper picker -->
<dimen name="wallpaperThumbnailWidth">106.5dp</dimen>
<dimen name="wallpaperThumbnailHeight">94.5dp</dimen>
+ <dimen name="wallpaperItemIconSize">32dp</dimen>
<!-- Cling -->
<dimen name="clingPunchThroughGraphicCenterRadius">94dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ac372fd..cafa424 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -38,6 +38,11 @@
<item quantity="one">%1$d selected</item>
<item quantity="other">%1$d selected</item>
</plurals>
+ <!-- Accessibility string used as a label for a particular wallpaper in the Wallpaper Picker list.
+ e.g. "Wallpaper 3 of 10" -->
+ <string name="wallpaper_accessibility_name">Wallpaper %1$d of %2$d</string>
+ <!-- Accessibility string used to announce that a wallpaper has been selected. -->
+ <string name="announce_selection">Selected <xliff:g id="label" example="Wallpaper 3 of 10">%1$s</xliff:g></string>
<!-- Label on button to delete wallpaper(s) -->
<string name="wallpaper_delete">Delete</string>
@@ -225,29 +230,29 @@
<string name="apps_customize_widgets_scroll_format">Widgets page %1$d of %2$d</string>
<!-- Clings -->
- <!-- The title text for the workspace cling [CHAR_LIMIT=none] -->
+ <!-- The title text for the workspace cling [CHAR_LIMIT=60] -->
<string name="first_run_cling_title">Welcome!</string>
- <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
- <string name="first_run_cling_description">Make yourself at Home.</string>
- <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
+ <!-- The description of how to use the workspace [CHAR_LIMIT=60] -->
+ <string name="first_run_cling_description">Make yourself at home.</string>
+ <!-- The description of how to use the workspace [CHAR_LIMIT=60] -->
<string name="first_run_cling_custom_content_hint"></string>
- <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
+ <!-- The description of how to use the workspace [CHAR_LIMIT=60] -->
<string name="first_run_cling_search_bar_hint"></string>
- <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
+ <!-- The description of how to use the workspace [CHAR_LIMIT=60] -->
<string name="first_run_cling_create_screens_hint">Create more screens for apps and folders</string>
- <!-- The title text for the workspace cling [CHAR_LIMIT=none] -->
+ <!-- The title text for the workspace cling [CHAR_LIMIT=60] -->
<string name="workspace_cling_title">Organize your space</string>
- <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
+ <!-- The description of how to use the workspace [CHAR_LIMIT=160] -->
<string name="workspace_cling_move_item">Touch & hold background to manage wallpaper, widgets and settings.</string>
- <!-- The title text for the All Apps cling [CHAR_LIMIT=none] -->
+ <!-- The title text for the All Apps cling [CHAR_LIMIT=60] -->
<string name="all_apps_cling_title">Choose some apps</string>
- <!-- The description of how to pick up and add an item to the workspace [CHAR_LIMIT=none] -->
+ <!-- The description of how to pick up and add an item to the workspace [CHAR_LIMIT=160] -->
<string name="all_apps_cling_add_item">To add an app to your Home screen, touch & hold it.</string>
- <!-- The title text for the Folder cling [CHAR_LIMIT=none] -->
+ <!-- The title text for the Folder cling [CHAR_LIMIT=60] -->
<string name="folder_cling_title">Here\'s a folder</string>
- <!-- The description of how to create a folder [CHAR_LIMIT=none] -->
+ <!-- The description of how to create a folder [CHAR_LIMIT=160] -->
<string name="folder_cling_create_folder">To create one like this, touch & hold an app, then move it over another.</string>
- <!-- The text on the button to dismiss a cling [CHAR_LIMIT=none] -->
+ <!-- The text on the button to dismiss a cling [CHAR_LIMIT=30] -->
<string name="cling_dismiss">OK</string>
<!-- Error message on dummy custom cling layout [DO NOT TRANSLATE] -->
<string name="dummy_custom_cling_error_message">Error: custom workspace layout passed in but custom cling was not overwritten</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 9f2a105..a1d2c5c 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -22,6 +22,7 @@
<item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowActionBarOverlay">true</item>
+ <item name="android:windowTranslucentNavigation">true</item>
</style>
<style name="WallpaperCropperActionBar" parent="android:style/Widget.Holo.ActionBar">
@@ -30,6 +31,8 @@
</style>
<style name="Theme" parent="@android:style/Theme.Holo.Wallpaper.NoTitleBar">
+ <item name="android:windowTranslucentStatus">true</item>
+ <item name="android:windowTranslucentNavigation">true</item>
</style>
<style name="ClingButton">
@@ -58,7 +61,6 @@
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">24sp</item>
<item name="android:textColor">#49C0EC</item>
- <item name="android:fontFamily">sans-serif-condensed</item>
</style>
<style name="ClingText">
<item name="android:layout_width">wrap_content</item>
diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java
index 5d3aa3a..d955e4e 100644
--- a/src/com/android/launcher3/AllAppsList.java
+++ b/src/com/android/launcher3/AllAppsList.java
@@ -46,11 +46,14 @@
private IconCache mIconCache;
+ private AppFilter mAppFilter;
+
/**
* Boring constructor.
*/
- public AllAppsList(IconCache iconCache) {
+ public AllAppsList(IconCache iconCache, AppFilter appFilter) {
mIconCache = iconCache;
+ mAppFilter = appFilter;
}
/**
@@ -60,13 +63,16 @@
* If the app is already in the list, doesn't add it.
*/
public void add(AppInfo info) {
+ if (mAppFilter != null && !mAppFilter.shouldShowApp(info.componentName)) {
+ return;
+ }
if (findActivity(data, info.componentName)) {
return;
}
data.add(info);
added.add(info);
}
-
+
public void clear() {
data.clear();
// TODO: do we clear these too?
diff --git a/src/com/android/launcher3/AppFilter.java b/src/com/android/launcher3/AppFilter.java
new file mode 100644
index 0000000..e01436d
--- /dev/null
+++ b/src/com/android/launcher3/AppFilter.java
@@ -0,0 +1,35 @@
+package com.android.launcher3;
+
+import android.content.ComponentName;
+import android.text.TextUtils;
+import android.util.Log;
+
+public abstract class AppFilter {
+
+ private static final boolean DBG = false;
+ private static final String TAG = "AppFilter";
+
+ public abstract boolean shouldShowApp(ComponentName app);
+
+ public static AppFilter loadByName(String className) {
+ if (TextUtils.isEmpty(className)) return null;
+ if (DBG) Log.d(TAG, "Loading AppFilter: " + className);
+ try {
+ Class<?> cls = Class.forName(className);
+ return (AppFilter) cls.newInstance();
+ } catch (ClassNotFoundException e) {
+ Log.e(TAG, "Bad AppFilter class", e);
+ return null;
+ } catch (InstantiationException e) {
+ Log.e(TAG, "Bad AppFilter class", e);
+ return null;
+ } catch (IllegalAccessException e) {
+ Log.e(TAG, "Bad AppFilter class", e);
+ return null;
+ } catch (ClassCastException e) {
+ Log.e(TAG, "Bad AppFilter class", e);
+ return null;
+ }
+ }
+
+}
diff --git a/src/com/android/launcher3/AppsCustomizePagedView.java b/src/com/android/launcher3/AppsCustomizePagedView.java
index 4e9d68b..9b35bb5 100644
--- a/src/com/android/launcher3/AppsCustomizePagedView.java
+++ b/src/com/android/launcher3/AppsCustomizePagedView.java
@@ -438,6 +438,9 @@
for (Object o : widgetsAndShortcuts) {
if (o instanceof AppWidgetProviderInfo) {
AppWidgetProviderInfo widget = (AppWidgetProviderInfo) o;
+ if (!app.shouldShowAppOrWidgetProvider(widget.provider)) {
+ continue;
+ }
widget.label = widget.label.trim();
if (widget.minWidth > 0 && widget.minHeight > 0) {
// Ensure that all widgets we show can be added on a workspace of this size
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 287bb50..8dab943 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -109,9 +109,8 @@
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
- setCompoundDrawablesWithIntrinsicBounds(null,
- new FastBitmapDrawable(b),
- null, null);
+ setCompoundDrawables(null,
+ Utilities.createIconDrawable(b), null, null);
setCompoundDrawablePadding((int) ((grid.folderIconSizePx - grid.iconSizePx) / 2f));
setText(info.title);
setTag(info);
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index a114ec3..dafb79f 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -95,6 +95,7 @@
private ArrayList<FolderRingAnimator> mFolderOuterRings = new ArrayList<FolderRingAnimator>();
private int[] mFolderLeaveBehindCell = {-1, -1};
+ private float FOREGROUND_ALPHA_DAMPER = 0.65f;
private int mForegroundAlpha = 0;
private float mBackgroundAlpha;
private float mBackgroundAlphaMultiplier = 1.0f;
@@ -114,7 +115,6 @@
// If we're actively dragging something over this screen, mIsDragOverlapping is true
private boolean mIsDragOverlapping = false;
- private final Point mDragCenter = new Point();
boolean mUseActiveGlowBackground = false;
// These arrays are used to implement the drag visualization on x-large screens.
@@ -169,6 +169,8 @@
private static final int INVALID_DIRECTION = -100;
private DropTarget.DragEnforcer mDragEnforcer;
+ private Rect mTempRect = new Rect();
+
private final static PorterDuffXfermode sAddBlendMode =
new PorterDuffXfermode(PorterDuff.Mode.ADD);
private final static Paint sPaint = new Paint();
@@ -295,12 +297,8 @@
addView(mShortcutsAndWidgets);
}
- public void enableHardwareLayers() {
- mShortcutsAndWidgets.setLayerType(LAYER_TYPE_HARDWARE, sPaint);
- }
-
- public void disableHardwareLayers() {
- mShortcutsAndWidgets.setLayerType(LAYER_TYPE_NONE, sPaint);
+ public void enableHardwareLayer(boolean hasLayer) {
+ mShortcutsAndWidgets.setLayerType(hasLayer ? LAYER_TYPE_HARDWARE : LAYER_TYPE_NONE, sPaint);
}
public void buildHardwareLayer() {
@@ -349,6 +347,7 @@
mOverScrollForegroundDrawable = mOverScrollRight;
}
+ r *= FOREGROUND_ALPHA_DAMPER;
mForegroundAlpha = (int) Math.round((r * 255));
mOverScrollForegroundDrawable.setAlpha(mForegroundAlpha);
invalidate();
@@ -400,25 +399,6 @@
}
}
- public void scaleRect(Rect r, float scale) {
- if (scale != 1.0f) {
- r.left = (int) (r.left * scale + 0.5f);
- r.top = (int) (r.top * scale + 0.5f);
- r.right = (int) (r.right * scale + 0.5f);
- r.bottom = (int) (r.bottom * scale + 0.5f);
- }
- }
-
- Rect temp = new Rect();
- void scaleRectAboutCenter(Rect in, Rect out, float scale) {
- int cx = in.centerX();
- int cy = in.centerY();
- out.set(in);
- out.offset(-cx, -cy);
- scaleRect(out, scale);
- out.offset(cx, cy);
- }
-
@Override
protected void onDraw(Canvas canvas) {
// When we're large, we are either drawn in a "hover" state (ie when dragging an item to
@@ -446,10 +426,11 @@
final float alpha = mDragOutlineAlphas[i];
if (alpha > 0) {
final Rect r = mDragOutlines[i];
- scaleRectAboutCenter(r, temp, getChildrenScale());
+ mTempRect.set(r);
+ Utilities.scaleRectAboutCenter(mTempRect, getChildrenScale());
final Bitmap b = (Bitmap) mDragOutlineAnims[i].getTag();
paint.setAlpha((int)(alpha + .5f));
- canvas.drawBitmap(b, null, temp, paint);
+ canvas.drawBitmap(b, null, mTempRect, paint);
}
}
@@ -459,9 +440,13 @@
final int padding = mPressedOrFocusedIcon.getPressedOrFocusedBackgroundPadding();
final Bitmap b = mPressedOrFocusedIcon.getPressedOrFocusedBackground();
if (b != null) {
+ int offset = getMeasuredWidth() - getPaddingLeft() - getPaddingRight() -
+ (mCountX * mCellWidth);
+ int left = getPaddingLeft() + (int) Math.ceil(offset / 2f);
+ int top = getPaddingTop();
canvas.drawBitmap(b,
- mPressedOrFocusedIcon.getLeft() + getPaddingLeft() - padding,
- mPressedOrFocusedIcon.getTop() + getPaddingTop() - padding,
+ mPressedOrFocusedIcon.getLeft() + left - padding,
+ mPressedOrFocusedIcon.getTop() + top - padding,
null);
}
}
@@ -495,10 +480,12 @@
int width, height;
cellToPoint(fra.mCellX, fra.mCellY, mTempLocation);
View child = getChildAt(fra.mCellX, fra.mCellY);
- int centerX = mTempLocation[0] + mCellWidth / 2;
- int centerY = mTempLocation[1] + previewOffset / 2 +
- child.getPaddingTop() + grid.folderBackgroundOffset;
+
if (child != null) {
+ int centerX = mTempLocation[0] + mCellWidth / 2;
+ int centerY = mTempLocation[1] + previewOffset / 2 +
+ child.getPaddingTop() + grid.folderBackgroundOffset;
+
// Draw outer ring, if it exists
if (FolderIcon.HAS_OUTER_RING) {
d = FolderRingAnimator.sSharedOuterRingDrawable;
@@ -549,10 +536,7 @@
super.dispatchDraw(canvas);
if (mForegroundAlpha > 0) {
mOverScrollForegroundDrawable.setBounds(mForegroundRect);
- Paint p = ((NinePatchDrawable) mOverScrollForegroundDrawable).getPaint();
- p.setXfermode(sAddBlendMode);
mOverScrollForegroundDrawable.draw(canvas);
- p.setXfermode(null);
}
}
@@ -1011,11 +995,13 @@
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ int offset = getMeasuredWidth() - getPaddingLeft() - getPaddingRight() -
+ (mCountX * mCellWidth);
+ int left = getPaddingLeft() + (int) Math.ceil(offset / 2f);
+ int top = getPaddingTop();
int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
- int left = getPaddingLeft();
- int top = getPaddingTop();
child.layout(left, top,
left + r - l,
top + b - t);
@@ -1025,7 +1011,12 @@
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
- mBackgroundRect.set(0, 0, w, h);
+
+ // Expand the background drawing bounds by the padding baked into the background drawable
+ Rect padding = new Rect();
+ mNormalBackground.getPadding(padding);
+ mBackgroundRect.set(-padding.left, -padding.top, w + padding.right, h + padding.bottom);
+
mForegroundRect.set(mForegroundPadding, mForegroundPadding,
w - mForegroundPadding, h - mForegroundPadding);
}
@@ -1199,12 +1190,6 @@
final int oldDragCellX = mDragCell[0];
final int oldDragCellY = mDragCell[1];
- if (v != null && dragOffset == null) {
- mDragCenter.set(originX + (v.getWidth() / 2), originY + (v.getHeight() / 2));
- } else {
- mDragCenter.set(originX, originY);
- }
-
if (dragOutline == null && v == null) {
return;
}
@@ -1219,11 +1204,6 @@
int left = topLeft[0];
int top = topLeft[1];
- // Offset icons by their padding
- if (v instanceof BubbleTextView) {
- top += v.getPaddingTop();
- }
-
if (v != null && dragOffset == null) {
// When drawing the drag outline, it did not account for margin offsets
// added by the view's parent.
@@ -1244,7 +1224,9 @@
// outline offset
left += dragOffset.x + ((mCellWidth * spanX) + ((spanX - 1) * mWidthGap)
- dragRegion.width()) / 2;
- top += dragOffset.y;
+ int cHeight = getShortcutsAndWidgets().getCellContentHeight();
+ int cellPaddingY = (int) Math.max(0, ((mCellHeight - cHeight) / 2f));
+ top += dragOffset.y + cellPaddingY;
} else {
// Center the drag outline in the cell
left += ((mCellWidth * spanX) + ((spanX - 1) * mWidthGap)
diff --git a/src/com/android/launcher3/Cling.java b/src/com/android/launcher3/Cling.java
index 2656ad6..338b722 100644
--- a/src/com/android/launcher3/Cling.java
+++ b/src/com/android/launcher3/Cling.java
@@ -18,17 +18,13 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
+import android.app.ActivityOptions;
import android.content.Context;
+import android.content.ComponentName;
+import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
+import android.graphics.*;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
@@ -37,8 +33,10 @@
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.FrameLayout;
+import android.widget.TextView;
-public class Cling extends FrameLayout implements Insettable, View.OnLongClickListener {
+public class Cling extends FrameLayout implements Insettable, View.OnClickListener,
+ View.OnLongClickListener, View.OnTouchListener {
static final String FIRST_RUN_CLING_DISMISSED_KEY = "cling_gel.first_run.dismissed";
static final String WORKSPACE_CLING_DISMISSED_KEY = "cling_gel.workspace.dismissed";
@@ -66,6 +64,12 @@
private String mDrawIdentifier;
private Drawable mBackground;
+ private int[] mTouchDownPt = new int[2];
+
+ private Drawable mFocusedHotseatApp;
+ private ComponentName mFocusedHotseatAppComponent;
+ private Rect mFocusedHotseatAppBounds;
+
private Paint mErasePaint;
private Paint mBubblePaint;
private Paint mDotPaint;
@@ -100,6 +104,8 @@
mScrimView = scrim;
mBackgroundColor = 0xdd000000;
setOnLongClickListener(this);
+ setOnClickListener(this);
+ setOnTouchListener(this);
mErasePaint = new Paint();
mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
@@ -121,6 +127,46 @@
}
}
+ void setFocusedHotseatApp(int drawableId, int appRank, ComponentName cn, String title,
+ String description) {
+ // Get the app to draw
+ Resources r = getResources();
+ int appIconId = drawableId;
+ Hotseat hotseat = mLauncher.getHotseat();
+ if (hotseat != null && appIconId > -1 && appRank > -1 && !title.isEmpty() &&
+ !description.isEmpty()) {
+ // Set the app bounds
+ int x = hotseat.getCellXFromOrder(appRank);
+ int y = hotseat.getCellYFromOrder(appRank);
+ Rect pos = hotseat.getCellCoordinates(x, y);
+ LauncherAppState app = LauncherAppState.getInstance();
+ DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+ mFocusedHotseatApp = getResources().getDrawable(appIconId);
+ mFocusedHotseatAppComponent = cn;
+ mFocusedHotseatAppBounds = new Rect(pos.left, pos.top,
+ pos.left + Utilities.sIconTextureWidth,
+ pos.top + Utilities.sIconTextureHeight);
+ Utilities.scaleRectAboutCenter(mFocusedHotseatAppBounds,
+ (grid.hotseatIconSize / grid.iconSize));
+
+ // Set the title
+ TextView v = (TextView) findViewById(R.id.focused_hotseat_app_title);
+ if (v != null) {
+ v.setText(title);
+ }
+
+ // Set the description
+ v = (TextView) findViewById(R.id.focused_hotseat_app_description);
+ if (v != null) {
+ v.setText(description);
+ }
+
+ // Show the bubble
+ View bubble = findViewById(R.id.focused_hotseat_app_bubble);
+ bubble.setVisibility(View.VISIBLE);
+ }
+ }
+
void show(boolean animate, int duration) {
setVisibility(View.VISIBLE);
setLayerType(View.LAYER_TYPE_HARDWARE, null);
@@ -275,6 +321,32 @@
};
@Override
+ public boolean onTouch(View v, MotionEvent ev) {
+ if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+ mTouchDownPt[0] = (int) ev.getX();
+ mTouchDownPt[1] = (int) ev.getY();
+ }
+ return false;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) ||
+ mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) ||
+ mDrawIdentifier.equals(WORKSPACE_LARGE)) {
+ if (mFocusedHotseatAppBounds != null &&
+ mFocusedHotseatAppBounds.contains(mTouchDownPt[0], mTouchDownPt[1])) {
+ // Launch the activity that is being highlighted
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setComponent(mFocusedHotseatAppComponent);
+ intent.addCategory(Intent.CATEGORY_LAUNCHER);
+ mLauncher.startActivity(intent, null);
+ mLauncher.dismissWorkspaceCling(this);
+ }
+ }
+ }
+
+ @Override
public boolean onLongClick(View v) {
if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) ||
mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) ||
@@ -327,7 +399,7 @@
}
if (mDrawIdentifier.equals(FIRST_RUN_PORTRAIT) ||
mDrawIdentifier.equals(FIRST_RUN_LANDSCAPE)) {
- // Draw the white circle
+ // Draw the circle
View bubbleContent = findViewById(R.id.bubble_content);
Rect bubbleRect = new Rect();
bubbleContent.getGlobalVisibleRect(bubbleRect);
@@ -354,8 +426,16 @@
canvas.drawBitmap(eraseBg, 0, 0, null);
eraseCanvas.setBitmap(null);
eraseBg = null;
- }
+ // Draw the focused hotseat app icon
+ if (mFocusedHotseatAppBounds != null && mFocusedHotseatApp != null) {
+ mFocusedHotseatApp.setBounds(mFocusedHotseatAppBounds.left,
+ mFocusedHotseatAppBounds.top, mFocusedHotseatAppBounds.right,
+ mFocusedHotseatAppBounds.bottom);
+ mFocusedHotseatApp.setAlpha((int) (255 * alpha));
+ mFocusedHotseatApp.draw(canvas);
+ }
+ }
canvas.restore();
}
diff --git a/src/com/android/launcher3/CropView.java b/src/com/android/launcher3/CropView.java
index c4d1475..9224e3b 100644
--- a/src/com/android/launcher3/CropView.java
+++ b/src/com/android/launcher3/CropView.java
@@ -17,13 +17,15 @@
package com.android.launcher3;
import android.content.Context;
+import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.RectF;
import android.util.AttributeSet;
+import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
-import android.view.ViewConfiguration;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
+import android.view.ViewConfiguration;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
@@ -36,10 +38,18 @@
private long mTouchDownTime;
private float mFirstX, mFirstY;
private float mLastX, mLastY;
+ private float mCenterX, mCenterY;
private float mMinScale;
private boolean mTouchEnabled = true;
private RectF mTempEdges = new RectF();
+ private float[] mTempPoint = new float[] { 0, 0 };
+ private float[] mTempCoef = new float[] { 0, 0 };
+ private float[] mTempAdjustment = new float[] { 0, 0 };
+ private float[] mTempImageDims = new float[] { 0, 0 };
+ private float[] mTempRendererCenter = new float[] { 0, 0 };
TouchCallback mTouchCallback;
+ Matrix mRotateMatrix;
+ Matrix mInverseRotateMatrix;
public interface TouchCallback {
void onTouchDown();
@@ -54,17 +64,43 @@
public CropView(Context context, AttributeSet attrs) {
super(context, attrs);
mScaleGestureDetector = new ScaleGestureDetector(context, this);
+ mRotateMatrix = new Matrix();
+ mInverseRotateMatrix = new Matrix();
+ }
+
+ private float[] getImageDims() {
+ final float imageWidth = mRenderer.source.getImageWidth();
+ final float imageHeight = mRenderer.source.getImageHeight();
+ float[] imageDims = mTempImageDims;
+ imageDims[0] = imageWidth;
+ imageDims[1] = imageHeight;
+ mRotateMatrix.mapPoints(imageDims);
+ imageDims[0] = Math.abs(imageDims[0]);
+ imageDims[1] = Math.abs(imageDims[1]);
+ return imageDims;
}
private void getEdgesHelper(RectF edgesOut) {
final float width = getWidth();
final float height = getHeight();
- final float imageWidth = mRenderer.source.getImageWidth();
- final float imageHeight = mRenderer.source.getImageHeight();
+ final float[] imageDims = getImageDims();
+ final float imageWidth = imageDims[0];
+ final float imageHeight = imageDims[1];
+
+ float initialCenterX = mRenderer.source.getImageWidth() / 2f;
+ float initialCenterY = mRenderer.source.getImageHeight() / 2f;
+
+ float[] rendererCenter = mTempRendererCenter;
+ rendererCenter[0] = mCenterX - initialCenterX;
+ rendererCenter[1] = mCenterY - initialCenterY;
+ mRotateMatrix.mapPoints(rendererCenter);
+ rendererCenter[0] += imageWidth / 2;
+ rendererCenter[1] += imageHeight / 2;
+
final float scale = mRenderer.scale;
- float centerX = (width / 2f - mRenderer.centerX + (imageWidth - width) / 2f)
+ float centerX = (width / 2f - rendererCenter[0] + (imageWidth - width) / 2f)
* scale + width / 2f;
- float centerY = (height / 2f - mRenderer.centerY + (imageHeight - height) / 2f)
+ float centerY = (height / 2f - rendererCenter[1] + (imageHeight - height) / 2f)
* scale + height / 2f;
float leftEdge = centerX - imageWidth / 2f * scale;
float rightEdge = centerX + imageWidth / 2f * scale;
@@ -77,6 +113,10 @@
edgesOut.bottom = bottomEdge;
}
+ public int getImageRotation() {
+ return mRenderer.rotation;
+ }
+
public RectF getCrop() {
final RectF edges = mTempEdges;
getEdgesHelper(edges);
@@ -96,6 +136,12 @@
public void setTileSource(TileSource source, Runnable isReadyCallback) {
super.setTileSource(source, isReadyCallback);
+ mCenterX = mRenderer.centerX;
+ mCenterY = mRenderer.centerY;
+ mRotateMatrix.reset();
+ mRotateMatrix.setRotate(mRenderer.rotation);
+ mInverseRotateMatrix.reset();
+ mInverseRotateMatrix.setRotate(-mRenderer.rotation);
updateMinScale(getWidth(), getHeight(), source, true);
}
@@ -115,8 +161,10 @@
mRenderer.scale = 1;
}
if (source != null) {
- mMinScale = Math.max(w / (float) source.getImageWidth(),
- h / (float) source.getImageHeight());
+ final float[] imageDims = getImageDims();
+ final float imageWidth = imageDims[0];
+ final float imageHeight = imageDims[1];
+ mMinScale = Math.max(w / imageWidth, h / imageHeight);
mRenderer.scale = Math.max(mMinScale, mRenderer.scale);
}
}
@@ -154,7 +202,13 @@
final RectF edges = mTempEdges;
getEdgesHelper(edges);
final float scale = mRenderer.scale;
- mRenderer.centerX += Math.ceil(edges.left / scale);
+ mCenterX += Math.ceil(edges.left / scale);
+ updateCenter();
+ }
+
+ private void updateCenter() {
+ mRenderer.centerX = Math.round(mCenterX);
+ mRenderer.centerY = Math.round(mCenterY);
}
public void setTouchEnabled(boolean enabled) {
@@ -197,13 +251,14 @@
float squaredDist = (mFirstX - x) * (mFirstX - x) + (mFirstY - y) * (mFirstY - y);
float slop = config.getScaledTouchSlop() * config.getScaledTouchSlop();
long now = System.currentTimeMillis();
- // only do this if it's a small movement
- if (mTouchCallback != null &&
- squaredDist < slop &&
- now < mTouchDownTime + ViewConfiguration.getTapTimeout()) {
- mTouchCallback.onTap();
+ if (mTouchCallback != null) {
+ // only do this if it's a small movement
+ if (squaredDist < slop &&
+ now < mTouchDownTime + ViewConfiguration.getTapTimeout()) {
+ mTouchCallback.onTap();
+ }
+ mTouchCallback.onTouchUp();
}
- mTouchCallback.onTouchUp();
}
if (!mTouchEnabled) {
@@ -214,8 +269,13 @@
mScaleGestureDetector.onTouchEvent(event);
switch (action) {
case MotionEvent.ACTION_MOVE:
- mRenderer.centerX += (mLastX - x) / mRenderer.scale;
- mRenderer.centerY += (mLastY - y) / mRenderer.scale;
+ float[] point = mTempPoint;
+ point[0] = (mLastX - x) / mRenderer.scale;
+ point[1] = (mLastY - y) / mRenderer.scale;
+ mInverseRotateMatrix.mapPoints(point);
+ mCenterX += point[0];
+ mCenterY += point[1];
+ updateCenter();
invalidate();
break;
}
@@ -225,18 +285,32 @@
final RectF edges = mTempEdges;
getEdgesHelper(edges);
final float scale = mRenderer.scale;
+
+ float[] coef = mTempCoef;
+ coef[0] = 1;
+ coef[1] = 1;
+ mRotateMatrix.mapPoints(coef);
+ float[] adjustment = mTempAdjustment;
+ mTempAdjustment[0] = 0;
+ mTempAdjustment[1] = 0;
if (edges.left > 0) {
- mRenderer.centerX += Math.ceil(edges.left / scale);
- }
- if (edges.right < getWidth()) {
- mRenderer.centerX += (edges.right - getWidth()) / scale;
+ adjustment[0] = edges.left / scale;
+ } else if (edges.right < getWidth()) {
+ adjustment[0] = (edges.right - getWidth()) / scale;
}
if (edges.top > 0) {
- mRenderer.centerY += Math.ceil(edges.top / scale);
+ adjustment[1] = FloatMath.ceil(edges.top / scale);
+ } else if (edges.bottom < getHeight()) {
+ adjustment[1] = (edges.bottom - getHeight()) / scale;
}
- if (edges.bottom < getHeight()) {
- mRenderer.centerY += (edges.bottom - getHeight()) / scale;
+ for (int dim = 0; dim <= 1; dim++) {
+ if (coef[dim] > 0) adjustment[dim] = FloatMath.ceil(adjustment[dim]);
}
+
+ mInverseRotateMatrix.mapPoints(adjustment);
+ mCenterX += adjustment[0];
+ mCenterY += adjustment[1];
+ updateCenter();
}
}
diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java
index da6f2f7..4023daf 100644
--- a/src/com/android/launcher3/DeleteDropTarget.java
+++ b/src/com/android/launcher3/DeleteDropTarget.java
@@ -173,7 +173,8 @@
@Override
public void onDragStart(DragSource source, Object info, int dragAction) {
boolean isVisible = true;
- boolean isUninstall = false;
+ boolean useUninstallLabel = !AppsCustomizePagedView.DISABLE_ALL_APPS &&
+ isAllAppsApplication(source, info);
// If we are dragging an application from AppsCustomize, only show the control if we can
// delete the app (it was downloaded), and rename the string to "uninstall" in such a case.
@@ -182,7 +183,7 @@
isVisible = false;
}
- if (isUninstall) {
+ if (useUninstallLabel) {
setCompoundDrawablesRelativeWithIntrinsicBounds(mUninstallDrawable, null, null, null);
} else {
setCompoundDrawablesRelativeWithIntrinsicBounds(mRemoveDrawable, null, null, null);
@@ -193,7 +194,7 @@
resetHoverColor();
((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE);
if (getText().length() > 0) {
- setText(isUninstall ? R.string.delete_target_uninstall_label
+ setText(useUninstallLabel ? R.string.delete_target_uninstall_label
: R.string.delete_target_label);
}
}
diff --git a/src/com/android/launcher3/DragController.java b/src/com/android/launcher3/DragController.java
index c630427..5b5c35c 100644
--- a/src/com/android/launcher3/DragController.java
+++ b/src/com/android/launcher3/DragController.java
@@ -50,7 +50,7 @@
public static int DRAG_ACTION_COPY = 1;
private static final int SCROLL_DELAY = 500;
- private static final int RESCROLL_DELAY = 750;
+ private static final int RESCROLL_DELAY = PagedView.PAGE_SNAP_ANIMATION_DURATION + 150;
private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
@@ -502,6 +502,8 @@
public void forceTouchMove() {
int[] dummyCoordinates = mCoordinatesTemp;
DropTarget dropTarget = findDropTarget(mLastTouch[0], mLastTouch[1], dummyCoordinates);
+ mDragObject.x = dummyCoordinates[0];
+ mDragObject.y = dummyCoordinates[1];
checkTouchMove(dropTarget);
}
diff --git a/src/com/android/launcher3/DragLayer.java b/src/com/android/launcher3/DragLayer.java
index 3c955cb..89f8275 100644
--- a/src/com/android/launcher3/DragLayer.java
+++ b/src/com/android/launcher3/DragLayer.java
@@ -69,6 +69,8 @@
public static final int ANIMATION_END_FADE_OUT = 1;
public static final int ANIMATION_END_REMAIN_VISIBLE = 2;
+ private TouchCompleteListener mTouchCompleteListener;
+
private final Rect mInsets = new Rect();
/**
@@ -173,10 +175,17 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+ int action = ev.getAction();
+
+ if (action == MotionEvent.ACTION_DOWN) {
if (handleTouchDown(ev, true)) {
return true;
}
+ } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+ if (mTouchCompleteListener != null) {
+ mTouchCompleteListener.onTouchComplete();
+ }
+ mTouchCompleteListener = null;
}
clearAllResizeFrames();
return mDragController.onInterceptTouchEvent(ev);
@@ -278,12 +287,15 @@
int x = (int) ev.getX();
int y = (int) ev.getY();
- if (ev.getAction() == MotionEvent.ACTION_DOWN) {
- if (ev.getAction() == MotionEvent.ACTION_DOWN) {
- if (handleTouchDown(ev, false)) {
- return true;
- }
+ if (action == MotionEvent.ACTION_DOWN) {
+ if (handleTouchDown(ev, false)) {
+ return true;
}
+ } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+ if (mTouchCompleteListener != null) {
+ mTouchCompleteListener.onTouchComplete();
+ }
+ mTouchCompleteListener = null;
}
if (mCurrentResizeFrame != null) {
@@ -818,4 +830,12 @@
}
}
}
+
+ public void setTouchCompleteListener(TouchCompleteListener listener) {
+ mTouchCompleteListener = listener;
+ }
+
+ public interface TouchCompleteListener {
+ public void onTouchComplete();
+ }
}
diff --git a/src/com/android/launcher3/DynamicGrid.java b/src/com/android/launcher3/DynamicGrid.java
index 33eb595..4776c86 100644
--- a/src/com/android/launcher3/DynamicGrid.java
+++ b/src/com/android/launcher3/DynamicGrid.java
@@ -16,11 +16,14 @@
package com.android.launcher3;
+import android.appwidget.AppWidgetHostView;
+import android.content.ComponentName;
+import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Paint;
-import android.graphics.PointF;
import android.graphics.Paint.FontMetrics;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.util.TypedValue;
@@ -64,7 +67,9 @@
boolean isLargeTablet;
boolean transposeLayoutWithOrientation;
+ int desiredWorkspaceLeftRightMarginPx;
int edgeMarginPx;
+ Rect defaultWidgetPadding;
int widthPx;
int heightPx;
@@ -109,7 +114,8 @@
hotseatIconSize = his;
}
- DeviceProfile(ArrayList<DeviceProfile> profiles,
+ DeviceProfile(Context context,
+ ArrayList<DeviceProfile> profiles,
float minWidth, float minHeight,
int wPx, int hPx,
int awPx, int ahPx,
@@ -122,7 +128,11 @@
minWidthDps = minWidth;
minHeightDps = minHeight;
+ ComponentName cn = new ComponentName(context.getPackageName(),
+ this.getClass().getName());
+ defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null);
edgeMarginPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin);
+ desiredWorkspaceLeftRightMarginPx = 2 * edgeMarginPx;
pageIndicatorHeightPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_page_indicator_height);
// Interpolate the rows
@@ -312,9 +322,9 @@
hotseatBarHeightPx + pageIndicatorHeightPx);
} else {
// Pad the top and bottom of the workspace with search/hotseat bar sizes
- padding.set(edgeMarginPx,
+ padding.set(desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.left,
searchBarSpaceHeightPx,
- edgeMarginPx,
+ desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.right,
hotseatBarHeightPx + pageIndicatorHeightPx);
}
}
@@ -460,7 +470,7 @@
lp = (FrameLayout.LayoutParams) pageIndicator.getLayoutParams();
lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
lp.width = LayoutParams.WRAP_CONTENT;
- lp.height = pageIndicatorHeightPx;
+ lp.height = LayoutParams.WRAP_CONTENT;
lp.bottomMargin = hotseatBarHeightPx;
pageIndicator.setLayoutParams(lp);
}
@@ -489,7 +499,8 @@
size, metrics));
}
- public DynamicGrid(Resources resources, int minWidthPx, int minHeightPx,
+ public DynamicGrid(Context context, Resources resources,
+ int minWidthPx, int minHeightPx,
int widthPx, int heightPx,
int awPx, int ahPx) {
DisplayMetrics dm = resources.getDisplayMetrics();
@@ -498,17 +509,17 @@
boolean hasAA = !AppsCustomizePagedView.DISABLE_ALL_APPS;
// Our phone profiles include the bar sizes in each orientation
deviceProfiles.add(new DeviceProfile("Super Short Stubby",
- 255, 300, 2, 3, 48, 12, (hasAA ? 5 : 4), 48));
+ 255, 300, 2, 3, 48, 13, (hasAA ? 5 : 4), 48));
deviceProfiles.add(new DeviceProfile("Shorter Stubby",
- 255, 400, 3, 3, 48, 12, (hasAA ? 5 : 4), 48));
+ 255, 400, 3, 3, 48, 13, (hasAA ? 5 : 4), 48));
deviceProfiles.add(new DeviceProfile("Short Stubby",
- 275, 420, 3, 4, 48, 12, (hasAA ? 5 : 4), 48));
+ 275, 420, 3, 4, 48, 13, (hasAA ? 5 : 4), 48));
deviceProfiles.add(new DeviceProfile("Stubby",
- 255, 450, 3, 4, 48, 12, (hasAA ? 5 : 4), 48));
+ 255, 450, 3, 4, 48, 13, (hasAA ? 5 : 4), 48));
deviceProfiles.add(new DeviceProfile("Nexus S",
- 296, 491.33f, 4, 4, 48, 12, (hasAA ? 5 : 4), 48));
+ 296, 491.33f, 4, 4, 48, 13, (hasAA ? 5 : 4), 48));
deviceProfiles.add(new DeviceProfile("Nexus 4",
- 359, 518, 4, 4, 60, 12, (hasAA ? 5 : 4), 56));
+ 359, 518, 4, 4, 60, 13, (hasAA ? 5 : 4), 56));
// The tablet profile is odd in that the landscape orientation
// also includes the nav bar on the side
deviceProfiles.add(new DeviceProfile("Nexus 7",
@@ -526,7 +537,7 @@
1527, 2527, 7, 7, 100, 20, 7, 72));
mMinWidth = dpiFromPx(minWidthPx, dm);
mMinHeight = dpiFromPx(minHeightPx, dm);
- mProfile = new DeviceProfile(deviceProfiles,
+ mProfile = new DeviceProfile(context, deviceProfiles,
mMinWidth, mMinHeight,
widthPx, heightPx,
awPx, ahPx,
diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java
index a4cb117..69d9a3d 100644
--- a/src/com/android/launcher3/Folder.java
+++ b/src/com/android/launcher3/Folder.java
@@ -532,8 +532,8 @@
protected boolean createAndAddShortcut(ShortcutInfo item) {
final BubbleTextView textView =
(BubbleTextView) mInflater.inflate(R.layout.application, this, false);
- textView.setCompoundDrawablesWithIntrinsicBounds(null,
- new FastBitmapDrawable(item.getIcon(mIconCache)), null, null);
+ textView.setCompoundDrawables(null,
+ Utilities.createIconDrawable(item.getIcon(mIconCache)), null, null);
textView.setText(item.title);
textView.setTag(item);
textView.setTextColor(getResources().getColor(R.color.folder_items_text_color));
@@ -888,7 +888,7 @@
int centerY = (int) (mTempRect.top + mTempRect.height() * scale / 2);
int centeredLeft = centerX - width / 2;
int centeredTop = centerY - height / 2;
- int currentPage = mLauncher.getWorkspace().getCurrentPage();
+ int currentPage = mLauncher.getWorkspace().getNextPage();
// In case the workspace is scrolling, we need to use the final scroll to compute
// the folders bounds.
mLauncher.getWorkspace().setFinalScrollForPageChange(currentPage);
diff --git a/src/com/android/launcher3/FolderIcon.java b/src/com/android/launcher3/FolderIcon.java
index 7c791b9..cd1ff2c 100644
--- a/src/com/android/launcher3/FolderIcon.java
+++ b/src/com/android/launcher3/FolderIcon.java
@@ -98,6 +98,7 @@
private int mPreviewOffsetY;
private float mMaxPerspectiveShift;
boolean mAnimating = false;
+ private Rect mOldBounds = new Rect();
private PreviewItemDrawingParams mParams = new PreviewItemDrawingParams(0, 0, 0, 0);
private PreviewItemDrawingParams mAnimParams = new PreviewItemDrawingParams(0, 0, 0, 0);
@@ -534,12 +535,15 @@
Drawable d = params.drawable;
if (d != null) {
+ mOldBounds.set(d.getBounds());
d.setBounds(0, 0, mIntrinsicIconSize, mIntrinsicIconSize);
d.setFilterBitmap(true);
- d.setColorFilter(Color.argb(params.overlayAlpha, 0, 0, 0), PorterDuff.Mode.SRC_ATOP);
+ d.setColorFilter(Color.argb(params.overlayAlpha, 255, 255, 255),
+ PorterDuff.Mode.SRC_ATOP);
d.draw(canvas);
d.clearColorFilter();
d.setFilterBitmap(false);
+ d.setBounds(mOldBounds);
}
canvas.restore();
}
diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java
index fbbb09f..094e188 100644
--- a/src/com/android/launcher3/Hotseat.java
+++ b/src/com/android/launcher3/Hotseat.java
@@ -20,7 +20,7 @@
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.graphics.Bitmap;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
@@ -28,6 +28,7 @@
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
+import android.widget.TextView;
import java.util.ArrayList;
@@ -101,6 +102,25 @@
}
}
+ /** This returns the coordinates of an app in a given cell, relative to the DragLayer */
+ Rect getCellCoordinates(int cellX, int cellY) {
+ Rect coords = new Rect();
+ mContent.cellToRect(cellX, cellY, 1, 1, coords);
+ int[] hotseatInParent = new int[2];
+ Utilities.getDescendantCoordRelativeToParent(this, mLauncher.getDragLayer(),
+ hotseatInParent, false);
+ coords.offset(hotseatInParent[0], hotseatInParent[1]);
+
+ // Center the icon
+ int cWidth = mContent.getShortcutsAndWidgets().getCellContentWidth();
+ int cHeight = mContent.getShortcutsAndWidgets().getCellContentHeight();
+ int cellPaddingX = (int) Math.max(0, ((coords.width() - cWidth) / 2f));
+ int cellPaddingY = (int) Math.max(0, ((coords.height() - cHeight) / 2f));
+ coords.offset(cellPaddingX, cellPaddingY);
+
+ return coords;
+ }
+
@Override
protected void onFinishInflate() {
super.onFinishInflate();
@@ -126,27 +146,17 @@
// Add the Apps button
Context context = getContext();
- Drawable rawIcon =
- context.getResources().getDrawable(R.drawable.all_apps_button_icon);
- Bitmap icon = Utilities.createIconBitmap(rawIcon, context);
-
LayoutInflater inflater = LayoutInflater.from(context);
- BubbleTextView allAppsButton = (BubbleTextView)
- inflater.inflate(R.layout.application, mContent, false);
- allAppsButton.setCompoundDrawablesWithIntrinsicBounds(null,
- new FastBitmapDrawable(icon), null, null);
- allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_label));
- allAppsButton.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (mLauncher != null &&
- (event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) {
- mLauncher.onTouchDownAllAppsButton(v);
- }
- return false;
- }
- });
+ TextView allAppsButton = (TextView)
+ inflater.inflate(R.layout.all_apps_button, mContent, false);
+ Drawable d = context.getResources().getDrawable(R.drawable.all_apps_button_icon);
+ Utilities.resizeIconDrawable(d);
+ allAppsButton.setCompoundDrawables(null, d, null, null);
+ allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_label));
+ if (mLauncher != null) {
+ allAppsButton.setOnTouchListener(mLauncher.getHapticFeedbackTouchListener());
+ }
allAppsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View v) {
@@ -166,6 +176,16 @@
}
}
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ // We don't want any clicks to go through to the hotseat unless the workspace is in
+ // the normal state.
+ if (mLauncher.getWorkspace().isSmall()) {
+ return true;
+ }
+ return false;
+ }
+
void addAllAppsFolder(IconCache iconCache,
ArrayList<AppInfo> allApps, ArrayList<ComponentName> onWorkspace,
Launcher launcher, Workspace workspace) {
diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java
index 1797826..543b8ee 100644
--- a/src/com/android/launcher3/IconCache.java
+++ b/src/com/android/launcher3/IconCache.java
@@ -29,6 +29,8 @@
import android.graphics.drawable.Drawable;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
/**
* Cache of application icons. Icons can be made from any thread.
@@ -147,6 +149,21 @@
}
/**
+ * Empty out the cache that aren't of the correct grid size
+ */
+ public void flushInvalidIcons(DeviceProfile grid) {
+ synchronized (mCache) {
+ Iterator<Entry<ComponentName, CacheEntry>> it = mCache.entrySet().iterator();
+ while (it.hasNext()) {
+ final CacheEntry e = it.next().getValue();
+ if (e.icon.getWidth() != grid.iconSizePx || e.icon.getHeight() != grid.iconSizePx) {
+ it.remove();
+ }
+ }
+ }
+ }
+
+ /**
* Fill in "application" with the icon and label for "info."
*/
public void getTitleAndIcon(AppInfo application, ResolveInfo info,
diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java
index 821c15f..7df73b1 100644
--- a/src/com/android/launcher3/InstallShortcutReceiver.java
+++ b/src/com/android/launcher3/InstallShortcutReceiver.java
@@ -36,6 +36,9 @@
import org.json.*;
public class InstallShortcutReceiver extends BroadcastReceiver {
+ private static final String TAG = "InstallShortcutReceiver";
+ private static final boolean DBG = false;
+
public static final String ACTION_INSTALL_SHORTCUT =
"com.android.launcher.action.INSTALL_SHORTCUT";
@@ -94,10 +97,11 @@
}
json = json.endObject();
SharedPreferences.Editor editor = sharedPrefs.edit();
+ if (DBG) Log.d(TAG, "Adding to APPS_PENDING_INSTALL: " + json);
addToStringSet(sharedPrefs, editor, APPS_PENDING_INSTALL, json.toString());
editor.commit();
} catch (org.json.JSONException e) {
- Log.d("InstallShortcutReceiver", "Exception when adding shortcut: " + e);
+ Log.d(TAG, "Exception when adding shortcut: " + e);
}
}
}
@@ -106,9 +110,15 @@
ArrayList<String> packageNames) {
synchronized(sLock) {
Set<String> strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null);
+ if (DBG) {
+ Log.d(TAG, "APPS_PENDING_INSTALL: " + strings
+ + ", removing packages: " + packageNames);
+ }
if (strings != null) {
Set<String> newStrings = new HashSet<String>(strings);
- for (String json : newStrings) {
+ Iterator<String> newStringsIter = newStrings.iterator();
+ while (newStringsIter.hasNext()) {
+ String json = newStringsIter.next();
try {
JSONObject object = (JSONObject) new JSONTokener(json).nextValue();
Intent launchIntent = Intent.parseUri(object.getString(LAUNCH_INTENT_KEY), 0);
@@ -117,12 +127,12 @@
pn = launchIntent.getComponent().getPackageName();
}
if (packageNames.contains(pn)) {
- newStrings.remove(json);
+ newStringsIter.remove();
}
} catch (org.json.JSONException e) {
- Log.d("InstallShortcutReceiver", "Exception reading shortcut to remove: " + e);
+ Log.d(TAG, "Exception reading shortcut to remove: " + e);
} catch (java.net.URISyntaxException e) {
- Log.d("InstallShortcutReceiver", "Exception reading shortcut to remove: " + e);
+ Log.d(TAG, "Exception reading shortcut to remove: " + e);
}
}
sharedPrefs.edit().putStringSet(APPS_PENDING_INSTALL,
@@ -135,6 +145,7 @@
SharedPreferences sharedPrefs) {
synchronized(sLock) {
Set<String> strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null);
+ if (DBG) Log.d(TAG, "Getting and clearing APPS_PENDING_INSTALL: " + strings);
if (strings == null) {
return new ArrayList<PendingInstallShortcutInfo>();
}
@@ -167,11 +178,9 @@
new PendingInstallShortcutInfo(data, name, launchIntent);
infos.add(info);
} catch (org.json.JSONException e) {
- Log.d("InstallShortcutReceiver",
- "Exception reading shortcut to add: " + e);
+ Log.d(TAG, "Exception reading shortcut to add: " + e);
} catch (java.net.URISyntaxException e) {
- Log.d("InstallShortcutReceiver",
- "Exception reading shortcut to add: " + e);
+ Log.d(TAG, "Exception reading shortcut to add: " + e);
}
}
sharedPrefs.edit().putStringSet(APPS_PENDING_INSTALL, new HashSet<String>()).commit();
@@ -203,6 +212,8 @@
return;
}
+ if (DBG) Log.d(TAG, "Got INSTALL_SHORTCUT: " + data.toUri(0));
+
Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
if (intent == null) {
return;
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 9f7b021..b0e4968 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -87,8 +87,8 @@
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.inputmethod.InputMethodManager;
import android.widget.Advanceable;
@@ -103,12 +103,9 @@
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileDescriptor;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.ArrayList;
@@ -273,6 +270,7 @@
private IconCache mIconCache;
private boolean mUserPresent = true;
private boolean mVisible = false;
+ private boolean mHasFocus = false;
private boolean mAttached = false;
private static final boolean DISABLE_CLINGS = false;
private static final boolean DISABLE_CUSTOM_CLINGS = true;
@@ -281,7 +279,7 @@
private static HashMap<Long, FolderInfo> sFolders = new HashMap<Long, FolderInfo>();
- private Intent mAppMarketIntent = null;
+ private View.OnTouchListener mHapticFeedbackTouchListener;
// Related to the auto-advancing of widgets
private final int ADVANCE_MSG = 1;
@@ -301,6 +299,9 @@
private static Drawable.ConstantState[] sVoiceSearchIcon = new Drawable.ConstantState[2];
private static Drawable.ConstantState[] sAppMarketIcon = new Drawable.ConstantState[2];
+ private Intent mAppMarketIntent = null;
+ private static final boolean DISABLE_MARKET_BUTTON = true;
+
private Drawable mWorkspaceBackgroundDrawable;
private final ArrayList<Integer> mSynchronouslyBoundPages = new ArrayList<Integer>();
@@ -341,7 +342,7 @@
private static ArrayList<PendingAddArguments> sPendingAddList
= new ArrayList<PendingAddArguments>();
- private static boolean sForceEnableRotation = isPropertyEnabled(FORCE_ENABLE_ROTATION_PROPERTY);
+ public static boolean sForceEnableRotation = isPropertyEnabled(FORCE_ENABLE_ROTATION_PROPERTY);
private static class PendingAddArguments {
int requestCode;
@@ -401,12 +402,14 @@
Context.MODE_PRIVATE);
mModel = app.setLauncher(this);
mIconCache = app.getIconCache();
+ mIconCache.flushInvalidIcons(grid);
mDragController = new DragController(this);
mInflater = getLayoutInflater();
mStats = new Stats(this);
mAppWidgetManager = AppWidgetManager.getInstance(this);
+
mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);
mAppWidgetHost.startListening();
@@ -420,8 +423,10 @@
Environment.getExternalStorageDirectory() + "/launcher");
}
+
checkForLocaleChange();
setContentView(R.layout.launcher);
+
setupViews();
grid.layout(this);
@@ -492,7 +497,7 @@
* ensure the custom content page is added or removed if necessary.
*/
protected void invalidateHasCustomContentToLeft() {
- if (mWorkspace.getScreenOrder().isEmpty()) {
+ if (mWorkspace == null || mWorkspace.getScreenOrder().isEmpty()) {
// Not bound yet, wait for bindScreens to be called.
return;
}
@@ -513,7 +518,9 @@
int coi = getCurrentOrientationIndexForGlobalIcons();
if (sGlobalSearchIcon[coi] == null || sVoiceSearchIcon[coi] == null ||
sAppMarketIcon[coi] == null) {
- updateAppMarketIcon();
+ if (!DISABLE_MARKET_BUTTON) {
+ updateAppMarketIcon();
+ }
searchVisible = updateGlobalSearchIcon();
voiceVisible = updateVoiceSearchIcon(searchVisible);
}
@@ -525,7 +532,7 @@
updateVoiceSearchIcon(sVoiceSearchIcon[coi]);
voiceVisible = true;
}
- if (sAppMarketIcon[coi] != null) {
+ if (!DISABLE_MARKET_BUTTON && sAppMarketIcon[coi] != null) {
updateAppMarketIcon(sAppMarketIcon[coi]);
}
if (mSearchDropTargetBar != null) {
@@ -730,6 +737,7 @@
Log.e(TAG, "Error: appWidgetId (EXTRA_APPWIDGET_ID) was not returned from the \\" +
"widget configuration activity.");
completeTwoStageWidgetDrop(RESULT_CANCELED, appWidgetId);
+ mWorkspace.stripEmptyScreens();
} else {
completeTwoStageWidgetDrop(resultCode, appWidgetId);
}
@@ -754,6 +762,8 @@
} else {
delayExitSpringLoadedMode = completeAdd(args);
}
+ } else if (resultCode == RESULT_CANCELED) {
+ mWorkspace.stripEmptyScreens();
}
mDragLayer.clearAnimatedView();
// Exit spring loaded mode if necessary after cancelling the configuration of a widget
@@ -827,7 +837,7 @@
if (mOnResumeState == State.WORKSPACE) {
showWorkspace(false);
} else if (mOnResumeState == State.APPS_CUSTOMIZE) {
- showAllApps(false, AppsCustomizePagedView.ContentType.Applications);
+ showAllApps(false, AppsCustomizePagedView.ContentType.Applications, false);
}
mOnResumeState = State.NONE;
@@ -882,10 +892,7 @@
// Resets the previous all apps icon press state
mAppsCustomizeContent.resetDrawableState();
}
- // Reset AllApps to its initial state
- if (mAppsCustomizeTabHost != null) {
- mAppsCustomizeTabHost.reset();
- }
+
// It is possible that widgets can receive updates while launcher is not in the foreground.
// Consequently, the widgets will be inflated in the orientation of the foreground activity
// (framework issue). On resuming, we ensure that any widgets are inflated for the current
@@ -895,12 +902,26 @@
// Process any items that were added while Launcher was away.
InstallShortcutReceiver.disableAndFlushInstallQueue(this);
+ // Update the voice search button proxy
+ updateVoiceButtonProxyVisible(false);
+
// Again, as with the above scenario, it's possible that one or more of the global icons
// were updated in the wrong orientation.
updateGlobalIcons();
if (DEBUG_RESUME_TIME) {
Log.d(TAG, "Time spent in onResume: " + (System.currentTimeMillis() - startTime));
}
+
+ if (mWorkspace.getCustomContentCallbacks() != null) {
+ // If we are resuming and the custom content is the current page, we call onShow().
+ // It is also poassible that onShow will instead be called slightly after first layout
+ // if PagedView#setRestorePage was set to the custom content page in onCreate().
+ if (mWorkspace.isOnOrMovingToCustomContent()) {
+ mWorkspace.getCustomContentCallbacks().onShow();
+ }
+ }
+ mWorkspace.updateInteractionForState();
+ mWorkspace.onResume();
}
@Override
@@ -912,10 +933,16 @@
mPaused = true;
mDragController.cancelDrag();
mDragController.resetLastGestureUpTime();
+
+ // We call onHide() aggressively. The custom content callbacks should be able to
+ // debounce excess onHide calls.
+ if (mWorkspace.getCustomContentCallbacks() != null) {
+ mWorkspace.getCustomContentCallbacks().onHide();
+ }
}
protected void onFinishBindingItems() {
- if (hasCustomContentToLeft() && mWorkspace.hasCustomContent()) {
+ if (mWorkspace != null && hasCustomContentToLeft() && mWorkspace.hasCustomContent()) {
addCustomContentToLeft();
}
}
@@ -957,14 +984,9 @@
public void setScrollY(int scrollY);
}
- // Add a fullscreen unpadded view to the workspace to the left all other screens.
- public QSBScroller addToCustomContentPage(View customContent) {
- return addToCustomContentPage(customContent, null);
- }
-
public QSBScroller addToCustomContentPage(View customContent,
- CustomContentCallbacks callbacks) {
- mWorkspace.addToCustomContentPage(customContent, callbacks);
+ CustomContentCallbacks callbacks, String description) {
+ mWorkspace.addToCustomContentPage(customContent, callbacks, description);
return mQsbScroller;
}
@@ -984,25 +1006,11 @@
}
// We can't hide the IME if it was forced open. So don't bother
- /*
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
-
- if (hasFocus) {
- final InputMethodManager inputManager = (InputMethodManager)
- getSystemService(Context.INPUT_METHOD_SERVICE);
- WindowManager.LayoutParams lp = getWindow().getAttributes();
- inputManager.hideSoftInputFromWindow(lp.token, 0, new android.os.ResultReceiver(new
- android.os.Handler()) {
- protected void onReceiveResult(int resultCode, Bundle resultData) {
- Log.d(TAG, "ResultReceiver got resultCode=" + resultCode);
- }
- });
- Log.d(TAG, "called hideSoftInputFromWindow from onWindowFocusChanged");
- }
+ mHasFocus = hasFocus;
}
- */
private boolean acceptFilter() {
final InputMethodManager inputManager = (InputMethodManager)
@@ -1078,8 +1086,9 @@
mOnResumeState = State.APPS_CUSTOMIZE;
}
- int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, -1);
- if (currentScreen > -1) {
+ int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN,
+ PagedView.INVALID_RESTORE_PAGE);
+ if (currentScreen != PagedView.INVALID_RESTORE_PAGE) {
mWorkspace.setRestorePage(currentScreen);
}
@@ -1145,24 +1154,32 @@
}
mOverviewPanel = findViewById(R.id.overview_panel);
- findViewById(R.id.widget_button).setOnClickListener(new OnClickListener() {
+ View widgetButton = findViewById(R.id.widget_button);
+ widgetButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
- showAllApps(true, AppsCustomizePagedView.ContentType.Widgets);
+ showAllApps(true, AppsCustomizePagedView.ContentType.Widgets, true);
}
});
- findViewById(R.id.wallpaper_button).setOnClickListener(new OnClickListener() {
+ widgetButton.setOnTouchListener(getHapticFeedbackTouchListener());
+
+ View wallpaperButton = findViewById(R.id.wallpaper_button);
+ wallpaperButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
startWallpaper();
}
});
- findViewById(R.id.settings_button).setOnClickListener(new OnClickListener() {
+ wallpaperButton.setOnTouchListener(getHapticFeedbackTouchListener());
+
+ View settingsButton = findViewById(R.id.settings_button);
+ settingsButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
startSettings();
}
});
+ settingsButton.setOnTouchListener(getHapticFeedbackTouchListener());
mOverviewPanel.setAlpha(0f);
// Setup the workspace
@@ -1452,7 +1469,7 @@
// Reset AllApps to its initial state only if we are not in the middle of
// processing a multi-step drop
if (mAppsCustomizeTabHost != null && mPendingAddInfo.container == ItemInfo.NO_ID) {
- showWorkspaceAndExitOverviewMode(false);
+ showWorkspace(false);
}
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {
mUserPresent = true;
@@ -1527,7 +1544,9 @@
}
// When Launcher comes back to foreground, a different Activity might be responsible for
// the app market intent, so refresh the icon
- updateAppMarketIcon();
+ if (!DISABLE_MARKET_BUTTON) {
+ updateAppMarketIcon();
+ }
clearTypedText();
}
}
@@ -1634,74 +1653,51 @@
// also will cancel mWaitingForResult.
closeSystemDialogs();
- final boolean alreadyOnHome =
- ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
- != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
+ final boolean alreadyOnHome = mHasFocus && ((intent.getFlags() &
+ Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
+ != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
- Runnable processIntent = new Runnable() {
- public void run() {
- if (mWorkspace == null) {
- // Can be cases where mWorkspace is null, this prevents a NPE
- return;
- }
- Folder openFolder = mWorkspace.getOpenFolder();
- // In all these cases, only animate if we're already on home
- mWorkspace.exitWidgetResizeMode();
- if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isTouchActive() &&
- openFolder == null) {
- mWorkspace.moveToDefaultScreen(true);
- }
-
- closeFolder();
- exitSpringLoadedDragMode();
-
- // If we are already on home, then just animate back to the workspace,
- // otherwise, just wait until onResume to set the state back to Workspace
- if (alreadyOnHome) {
- showWorkspaceAndExitOverviewMode(true);
- } else {
- mOnResumeState = State.WORKSPACE;
- }
-
- final View v = getWindow().peekDecorView();
- if (v != null && v.getWindowToken() != null) {
- InputMethodManager imm = (InputMethodManager)getSystemService(
- INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
- }
-
- // Reset the apps customize page
- if (mAppsCustomizeTabHost != null) {
- mAppsCustomizeTabHost.reset();
- }
- }
- };
-
- if (alreadyOnHome && !mWorkspace.hasWindowFocus()) {
- // Delay processing of the intent to allow the status bar animation to finish
- // first in order to avoid janky animations.
- mWorkspace.postDelayed(processIntent, 350);
- } else {
- // Process the intent immediately.
- processIntent.run();
+ if (mWorkspace == null) {
+ // Can be cases where mWorkspace is null, this prevents a NPE
+ return;
+ }
+ Folder openFolder = mWorkspace.getOpenFolder();
+ // In all these cases, only animate if we're already on home
+ mWorkspace.exitWidgetResizeMode();
+ if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isTouchActive() &&
+ openFolder == null) {
+ mWorkspace.moveToDefaultScreen(true);
}
+ closeFolder();
+ exitSpringLoadedDragMode();
+
+ // If we are already on home, then just animate back to the workspace,
+ // otherwise, just wait until onResume to set the state back to Workspace
+ if (alreadyOnHome) {
+ showWorkspace(true);
+ } else {
+ mOnResumeState = State.WORKSPACE;
+ }
+
+ final View v = getWindow().peekDecorView();
+ if (v != null && v.getWindowToken() != null) {
+ InputMethodManager imm = (InputMethodManager)getSystemService(
+ INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+ }
+
+ // Reset the apps customize page
+ if (mAppsCustomizeTabHost != null) {
+ mAppsCustomizeTabHost.reset();
+ }
}
+
if (DEBUG_RESUME_TIME) {
Log.d(TAG, "Time spent in onNewIntent: " + (System.currentTimeMillis() - startTime));
}
}
- protected void showWorkspaceAndExitOverviewMode(boolean animate) {
- showWorkspace(animate);
- if (mWorkspace.isInOverviewMode()) {
- mWorkspace.exitOverviewMode(animate);
- }
- }
- protected void showWorkspaceAndExitOverviewMode() {
- showWorkspaceAndExitOverviewMode(true);
- }
-
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
@@ -1712,7 +1708,9 @@
@Override
protected void onSaveInstanceState(Bundle outState) {
- outState.putInt(RUNTIME_STATE_CURRENT_SCREEN, mWorkspace.getNextPage());
+ if (mWorkspace.getChildCount() > 0) {
+ outState.putInt(RUNTIME_STATE_CURRENT_SCREEN, mWorkspace.getRestorePage());
+ }
super.onSaveInstanceState(outState);
outState.putInt(RUNTIME_STATE, mState.ordinal());
@@ -1922,6 +1920,8 @@
}
protected void moveToCustomContentScreen(boolean animate) {
+ // Close any folders that may be open.
+ closeFolder();
mWorkspace.moveToCustomContentScreen(animate);
}
/**
@@ -2056,7 +2056,6 @@
}
protected void startWallpaper() {
- showWorkspace(true);
final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
pickWallpaper.setComponent(getWallpaperPickerComponent());
startActivityForResult(pickWallpaper, REQUEST_PICK_WALLPAPER);
@@ -2102,7 +2101,12 @@
@Override
public void onBackPressed() {
if (isAllAppsVisible()) {
- showWorkspace(true);
+ if (mAppsCustomizeContent.getContentType() ==
+ AppsCustomizePagedView.ContentType.Applications) {
+ showWorkspace(true);
+ } else {
+ showOverviewMode(true);
+ }
} else if (mWorkspace.isInOverviewMode()) {
mWorkspace.exitOverviewMode(true);
} else if (mWorkspace.getOpenFolder() != null) {
@@ -2169,7 +2173,7 @@
final String shortcutClass = intent.getComponent().getClassName();
if (shortcutClass.equals(WidgetAdder.class.getName())) {
- showAllApps(true, AppsCustomizePagedView.ContentType.Widgets);
+ showAllApps(true, AppsCustomizePagedView.ContentType.Widgets, true);
return;
} else if (shortcutClass.equals(MemoryDumpActivity.class.getName())) {
MemoryDumpActivity.startDump(this);
@@ -2259,7 +2263,7 @@
* @param v The view that was clicked.
*/
public void onClickAllAppsButton(View v) {
- showAllApps(true, AppsCustomizePagedView.ContentType.Applications);
+ showAllApps(true, AppsCustomizePagedView.ContentType.Applications, true);
}
public void onTouchDownAllAppsButton(View v) {
@@ -2267,11 +2271,33 @@
v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
}
+ public void performHapticFeedbackOnTouchDown(View v) {
+ // Provide the same haptic feedback that the system offers for virtual keys.
+ v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
+ }
+
+ public View.OnTouchListener getHapticFeedbackTouchListener() {
+ if (mHapticFeedbackTouchListener == null) {
+ mHapticFeedbackTouchListener = new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) {
+ v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
+ }
+ return false;
+ }
+ };
+ }
+ return mHapticFeedbackTouchListener;
+ }
+
public void onClickAppMarketButton(View v) {
- if (mAppMarketIntent != null) {
- startActivitySafely(v, mAppMarketIntent, "app market");
- } else {
- Log.e(TAG, "Invalid app market intent.");
+ if (!DISABLE_MARKET_BUTTON) {
+ if (mAppMarketIntent != null) {
+ startActivitySafely(v, mAppMarketIntent, "app market");
+ } else {
+ Log.e(TAG, "Invalid app market intent.");
+ }
}
}
@@ -2809,8 +2835,6 @@
mStateAnimation.play(alphaAnim).after(startDelay);
mStateAnimation.addListener(new AnimatorListenerAdapter() {
- boolean animationCancelled = false;
-
@Override
public void onAnimationStart(Animator animation) {
// Prepare the position
@@ -2829,11 +2853,6 @@
mSearchDropTargetBar.hideSearchBar(false);
}
}
-
- @Override
- public void onAnimationCancel(Animator animation) {
- animationCancelled = true;
- }
});
if (workspaceAnim != null) {
@@ -2905,7 +2924,7 @@
* This is the opposite of showAppsCustomizeHelper.
* @param animated If true, the transition will be animated.
*/
- private void hideAppsCustomizeHelper(State toState, final boolean animated,
+ private void hideAppsCustomizeHelper(Workspace.State toState, final boolean animated,
final boolean springLoaded, final Runnable onCompleteRunnable) {
if (mStateAnimation != null) {
@@ -2923,13 +2942,14 @@
final View fromView = mAppsCustomizeTabHost;
final View toView = mWorkspace;
Animator workspaceAnim = null;
- if (toState == State.WORKSPACE) {
+ if (toState == Workspace.State.NORMAL) {
int stagger = res.getInteger(R.integer.config_appsCustomizeWorkspaceAnimationStagger);
workspaceAnim = mWorkspace.getChangeStateAnimation(
- Workspace.State.NORMAL, animated, stagger, -1);
- } else if (toState == State.APPS_CUSTOMIZE_SPRING_LOADED) {
+ toState, animated, stagger, -1);
+ } else if (toState == Workspace.State.SPRING_LOADED ||
+ toState == Workspace.State.OVERVIEW) {
workspaceAnim = mWorkspace.getChangeStateAnimation(
- Workspace.State.SPRING_LOADED, animated);
+ toState, animated);
}
setPivotsForZoom(fromView, scaleFactor);
@@ -3001,20 +3021,27 @@
}
}
- void showWorkspace(boolean animated) {
+ protected void showWorkspace(boolean animated) {
showWorkspace(animated, null);
}
+ protected void showWorkspace() {
+ showWorkspace(true);
+ }
+
void showWorkspace(boolean animated, Runnable onCompleteRunnable) {
+ if (mWorkspace.isInOverviewMode()) {
+ mWorkspace.exitOverviewMode(animated);
+ }
if (mState != State.WORKSPACE) {
boolean wasInSpringLoadedMode = (mState != State.WORKSPACE);
mWorkspace.setVisibility(View.VISIBLE);
- hideAppsCustomizeHelper(State.WORKSPACE, animated, false, onCompleteRunnable);
+ hideAppsCustomizeHelper(Workspace.State.NORMAL, animated, false, onCompleteRunnable);
// Show the search bar (only animate if we were showing the drop target bar in spring
// loaded mode)
if (mSearchDropTargetBar != null) {
- mSearchDropTargetBar.showSearchBar(wasInSpringLoadedMode);
+ mSearchDropTargetBar.showSearchBar(animated && wasInSpringLoadedMode);
}
// Set focus to the AppsCustomize button
@@ -3035,22 +3062,30 @@
.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
onWorkspaceShown(animated);
- onInteractionEnd();
+ }
+
+ void showOverviewMode(boolean animated) {
+ mWorkspace.setVisibility(View.VISIBLE);
+ hideAppsCustomizeHelper(Workspace.State.OVERVIEW, animated, false, null);
+ mState = State.WORKSPACE;
+ onWorkspaceShown(animated);
}
public void onWorkspaceShown(boolean animated) {
}
- void showAllApps(boolean animated,
- AppsCustomizePagedView.ContentType contentType) {
+ void showAllApps(boolean animated, AppsCustomizePagedView.ContentType contentType,
+ boolean resetPageToZero) {
if (mState != State.WORKSPACE) return;
+ if (resetPageToZero) {
+ mAppsCustomizeTabHost.reset();
+ }
showAppsCustomizeHelper(animated, false, contentType);
mAppsCustomizeTabHost.requestFocus();
// Change the state *after* we've called all the transition code
mState = State.APPS_CUSTOMIZE;
- onInteractionBegin();
// Pause the auto-advance of widgets until we are out of AllApps
mUserPresent = false;
@@ -3064,7 +3099,7 @@
void enterSpringLoadedDragMode() {
if (isAllAppsVisible()) {
- hideAppsCustomizeHelper(State.APPS_CUSTOMIZE_SPRING_LOADED, true, true, null);
+ hideAppsCustomizeHelper(Workspace.State.SPRING_LOADED, true, true, null);
mState = State.APPS_CUSTOMIZE_SPRING_LOADED;
}
}
@@ -3299,7 +3334,7 @@
if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.GONE);
if (searchButton != null) searchButton.setVisibility(View.GONE);
if (voiceButton != null) voiceButton.setVisibility(View.GONE);
- setVoiceButtonProxyVisible(false);
+ updateVoiceButtonProxyVisible(false);
return false;
}
}
@@ -3346,13 +3381,13 @@
}
if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.VISIBLE);
voiceButton.setVisibility(View.VISIBLE);
- setVoiceButtonProxyVisible(true);
+ updateVoiceButtonProxyVisible(false);
invalidatePressedFocusedStates(voiceButtonContainer, voiceButton);
return true;
} else {
if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.GONE);
if (voiceButton != null) voiceButton.setVisibility(View.GONE);
- setVoiceButtonProxyVisible(false);
+ updateVoiceButtonProxyVisible(false);
return false;
}
}
@@ -3364,45 +3399,60 @@
invalidatePressedFocusedStates(voiceButtonContainer, voiceButton);
}
- public void setVoiceButtonProxyVisible(boolean visible) {
+ public void updateVoiceButtonProxyVisible(boolean forceDisableVoiceButtonProxy) {
final View voiceButtonProxy = findViewById(R.id.voice_button_proxy);
if (voiceButtonProxy != null) {
+ boolean visible = !forceDisableVoiceButtonProxy &&
+ mWorkspace.shouldVoiceButtonProxyBeVisible();
voiceButtonProxy.setVisibility(visible ? View.VISIBLE : View.GONE);
+ voiceButtonProxy.bringToFront();
}
}
+
+ /**
+ * This is an overrid eot disable the voice button proxy. If disabled is true, then the voice button proxy
+ * will be hidden regardless of what shouldVoiceButtonProxyBeVisible() returns.
+ */
+ public void disableVoiceButtonProxy(boolean disabled) {
+ updateVoiceButtonProxyVisible(disabled);
+ }
/**
* Sets the app market icon
*/
private void updateAppMarketIcon() {
- final View marketButton = findViewById(R.id.market_button);
- Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_APP_MARKET);
- // Find the app market activity by resolving an intent.
- // (If multiple app markets are installed, it will return the ResolverActivity.)
- ComponentName activityName = intent.resolveActivity(getPackageManager());
- if (activityName != null) {
- int coi = getCurrentOrientationIndexForGlobalIcons();
- mAppMarketIntent = intent;
- sAppMarketIcon[coi] = updateTextButtonWithIconFromExternalActivity(
- R.id.market_button, activityName, R.drawable.ic_launcher_market_holo,
- TOOLBAR_ICON_METADATA_NAME);
- marketButton.setVisibility(View.VISIBLE);
- } else {
- // We should hide and disable the view so that we don't try and restore the visibility
- // of it when we swap between drag & normal states from IconDropTarget subclasses.
- marketButton.setVisibility(View.GONE);
- marketButton.setEnabled(false);
+ if (!DISABLE_MARKET_BUTTON) {
+ final View marketButton = findViewById(R.id.market_button);
+ Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_APP_MARKET);
+ // Find the app market activity by resolving an intent.
+ // (If multiple app markets are installed, it will return the ResolverActivity.)
+ ComponentName activityName = intent.resolveActivity(getPackageManager());
+ if (activityName != null) {
+ int coi = getCurrentOrientationIndexForGlobalIcons();
+ mAppMarketIntent = intent;
+ sAppMarketIcon[coi] = updateTextButtonWithIconFromExternalActivity(
+ R.id.market_button, activityName, R.drawable.ic_launcher_market_holo,
+ TOOLBAR_ICON_METADATA_NAME);
+ marketButton.setVisibility(View.VISIBLE);
+ } else {
+ // We should hide and disable the view so that we don't try and restore the visibility
+ // of it when we swap between drag & normal states from IconDropTarget subclasses.
+ marketButton.setVisibility(View.GONE);
+ marketButton.setEnabled(false);
+ }
}
}
private void updateAppMarketIcon(Drawable.ConstantState d) {
- // Ensure that the new drawable we are creating has the approprate toolbar icon bounds
- Resources r = getResources();
- Drawable marketIconDrawable = d.newDrawable(r);
- int w = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_width);
- int h = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_height);
- marketIconDrawable.setBounds(0, 0, w, h);
+ if (!DISABLE_MARKET_BUTTON) {
+ // Ensure that the new drawable we are creating has the approprate toolbar icon bounds
+ Resources r = getResources();
+ Drawable marketIconDrawable = d.newDrawable(r);
+ int w = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_width);
+ int h = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_height);
+ marketIconDrawable.setBounds(0, 0, w, h);
- updateTextButtonWithDrawable(R.id.market_button, marketIconDrawable);
+ updateTextButtonWithDrawable(R.id.market_button, marketIconDrawable);
+ }
}
@Override
@@ -3412,7 +3462,7 @@
text.clear();
// Populate event with a fake title based on the current state.
if (mState == State.APPS_CUSTOMIZE) {
- text.add(getString(R.string.all_apps_button_label));
+ text.add(mAppsCustomizeTabHost.getCurrentTabView().getContentDescription());
} else {
text.add(getString(R.string.all_apps_home_button_label));
}
@@ -3568,22 +3618,6 @@
return show;
}
- private boolean emailSent() {
- String spKey = LauncherAppState.getSharedPreferencesKey();
- SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
- boolean show = sp.getBoolean(CORRUPTION_EMAIL_SENT_KEY, false);
- return show;
- }
-
- private void setEmailSent(boolean sent) {
- String spKey = LauncherAppState.getSharedPreferencesKey();
- SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
-
- SharedPreferences.Editor editor = sp.edit();
- editor.putBoolean(CORRUPTION_EMAIL_SENT_KEY, sent);
- editor.commit();
- }
-
private void toggleShowWeightWatcher() {
String spKey = LauncherAppState.getSharedPreferencesKey();
SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
@@ -3627,6 +3661,9 @@
addAnimated.size(), true);
}
+ // Remove the extra empty screen
+ mWorkspace.removeExtraEmptyScreen();
+
if (!AppsCustomizePagedView.DISABLE_ALL_APPS &&
addedApps != null && mAppsCustomizeContent != null) {
mAppsCustomizeContent.addApps(addedApps);
@@ -3708,20 +3745,24 @@
if (newShortcutsScreenId > -1) {
long currentScreenId = mWorkspace.getScreenIdForPageIndex(mWorkspace.getNextPage());
final int newScreenIndex = mWorkspace.getPageIndexForScreenId(newShortcutsScreenId);
+ final Runnable startBounceAnimRunnable = new Runnable() {
+ public void run() {
+ anim.playTogether(bounceAnims);
+ anim.start();
+ }
+ };
if (newShortcutsScreenId != currentScreenId) {
// We post the animation slightly delayed to prevent slowdowns
// when we are loading right after we return to launcher.
mWorkspace.postDelayed(new Runnable() {
public void run() {
mWorkspace.snapToPage(newScreenIndex);
- mWorkspace.postDelayed(new Runnable() {
- public void run() {
- anim.playTogether(bounceAnims);
- anim.start();
- }
- }, NEW_APPS_ANIMATION_DELAY);
+ mWorkspace.postDelayed(startBounceAnimRunnable,
+ NEW_APPS_ANIMATION_DELAY);
}
}, NEW_APPS_PAGE_MOVE_DELAY);
+ } else {
+ mWorkspace.postDelayed(startBounceAnimRunnable, NEW_APPS_ANIMATION_DELAY);
}
}
}
@@ -3824,7 +3865,9 @@
// Update the market app icon as necessary (the other icons will be managed in response to
// package changes in bindSearchablesChanged()
- updateAppMarketIcon();
+ if (!DISABLE_MARKET_BUTTON) {
+ updateAppMarketIcon();
+ }
mWorkspaceLoading = false;
if (upgradePath) {
@@ -3887,18 +3930,12 @@
mIntentsOnWorkspaceFromUpgradePath = null;
}
} else {
- if (!AppsCustomizePagedView.DISABLE_ALL_APPS &&
- mAppsCustomizeContent != null) {
+ if (mAppsCustomizeContent != null) {
mAppsCustomizeContent.setApps(apps);
}
}
}
- @Override
- public boolean shouldShowApp(ResolveInfo app) {
- return true;
- }
-
/**
* A package was updated.
*
@@ -4047,9 +4084,23 @@
return false;
}
+ // For now, limit only to phones
+ LauncherAppState app = LauncherAppState.getInstance();
+ DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+ if (grid.isTablet()) {
+ return false;
+ }
+
// disable clings when running in a test harness
if(ActivityManager.isRunningInTestHarness()) return false;
+ // Disable clings for accessibility when explore by touch is enabled
+ final AccessibilityManager a11yManager = (AccessibilityManager) getSystemService(
+ ACCESSIBILITY_SERVICE);
+ if (a11yManager.isTouchExplorationEnabled()) {
+ return false;
+ }
+
// Restricted secondary users (child mode) will potentially have very few apps
// seeded when they start up for the first time. Clings won't work well with that
// boolean supportsLimitedUsers =
@@ -4145,6 +4196,57 @@
return false;
}
+ public void updateCustomContentHintVisibility() {
+ Cling cling = (Cling) findViewById(R.id.first_run_cling);
+ String ccHintStr = getFirstRunCustomContentHint();
+
+ if (mWorkspace.hasCustomContent()) {
+ // Show the custom content hint if ccHintStr is not empty
+ if (cling != null) {
+ setCustomContentHintVisibility(cling, ccHintStr, true, true);
+ }
+ } else {
+ // Hide the custom content hint
+ if (cling != null) {
+ setCustomContentHintVisibility(cling, ccHintStr, false, true);
+ }
+ }
+ }
+
+ private void setCustomContentHintVisibility(Cling cling, String ccHintStr, boolean visible,
+ boolean animate) {
+ final TextView ccHint = (TextView) cling.findViewById(R.id.custom_content_hint);
+ if (ccHint != null) {
+ if (visible && !ccHintStr.isEmpty()) {
+ ccHint.setText(ccHintStr);
+ ccHint.setVisibility(View.VISIBLE);
+ if (animate) {
+ ccHint.setAlpha(0f);
+ ccHint.animate().alpha(1f)
+ .setDuration(SHOW_CLING_DURATION)
+ .start();
+ } else {
+ ccHint.setAlpha(1f);
+ }
+ } else {
+ if (animate) {
+ ccHint.animate().alpha(0f)
+ .setDuration(SHOW_CLING_DURATION)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ ccHint.setVisibility(View.GONE);
+ }
+ })
+ .start();
+ } else {
+ ccHint.setAlpha(0f);
+ ccHint.setVisibility(View.GONE);
+ }
+ }
+ }
+ }
+
public void showFirstRunCling() {
if (isClingsEnabled() &&
!mSharedPrefs.getBoolean(Cling.FIRST_RUN_CLING_DISMISSED_KEY, false) &&
@@ -4174,11 +4276,7 @@
sbHint.setText(sbHintStr);
sbHint.setVisibility(View.VISIBLE);
}
- if (!ccHintStr.isEmpty()) {
- TextView ccHint = (TextView) cling.findViewById(R.id.custom_content_hint);
- ccHint.setText(ccHintStr);
- ccHint.setVisibility(View.VISIBLE);
- }
+ setCustomContentHintVisibility(cling, ccHintStr, true, false);
}
initCling(R.id.first_run_cling, 0, false, true);
} else {
@@ -4192,12 +4290,34 @@
protected String getFirstRunCustomContentHint() {
return "";
}
+ protected int getFirstRunFocusedHotseatAppDrawableId() {
+ return -1;
+ }
+ protected ComponentName getFirstRunFocusedHotseatAppComponentName() {
+ return null;
+ }
+ protected int getFirstRunFocusedHotseatAppRank() {
+ return -1;
+ }
+ protected String getFirstRunFocusedHotseatAppBubbleTitle() {
+ return "";
+ }
+ protected String getFirstRunFocusedHotseatAppBubbleDescription() {
+ return "";
+ }
public void showFirstRunWorkspaceCling() {
// Enable the clings only if they have not been dismissed before
if (isClingsEnabled() &&
!mSharedPrefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) {
- initCling(R.id.workspace_cling, 0, false, true);
+ Cling c = initCling(R.id.workspace_cling, 0, false, true);
+
+ // Set the focused hotseat app if there is one
+ c.setFocusedHotseatApp(getFirstRunFocusedHotseatAppDrawableId(),
+ getFirstRunFocusedHotseatAppRank(),
+ getFirstRunFocusedHotseatAppComponentName(),
+ getFirstRunFocusedHotseatAppBubbleTitle(),
+ getFirstRunFocusedHotseatAppBubbleDescription());
} else {
removeCling(R.id.workspace_cling);
}
@@ -4234,6 +4354,9 @@
};
dismissCling(cling, cb, Cling.FIRST_RUN_CLING_DISMISSED_KEY,
DISMISS_CLING_DURATION, false);
+
+ // Fade out the search bar for the workspace cling coming up
+ mSearchDropTargetBar.hideSearchBar(true);
}
public void dismissWorkspaceCling(View v) {
Cling cling = (Cling) findViewById(R.id.workspace_cling);
@@ -4247,6 +4370,9 @@
}
dismissCling(cling, cb, Cling.WORKSPACE_CLING_DISMISSED_KEY,
DISMISS_CLING_DURATION, true);
+
+ // Fade in the search bar
+ mSearchDropTargetBar.showSearchBar(true);
}
public void dismissFolderCling(View v) {
Cling cling = (Cling) findViewById(R.id.folder_cling);
diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java
index 01f72a7..5d4f9c6 100644
--- a/src/com/android/launcher3/LauncherAnimUtils.java
+++ b/src/com/android/launcher3/LauncherAnimUtils.java
@@ -30,6 +30,7 @@
static HashSet<Animator> sAnimators = new HashSet<Animator>();
static Animator.AnimatorListener sEndAnimListener = new Animator.AnimatorListener() {
public void onAnimationStart(Animator animation) {
+ sAnimators.add(animation);
}
public void onAnimationRepeat(Animator animation) {
@@ -45,7 +46,6 @@
};
public static void cancelOnDestroyActivity(Animator a) {
- sAnimators.add(a);
a.addListener(sEndAnimListener);
}
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index ed96310..a255b89 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -34,6 +34,7 @@
private LauncherModel mModel;
private IconCache mIconCache;
+ private AppFilter mAppFilter;
private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb;
private boolean mIsScreenLarge;
private float mScreenDensity;
@@ -53,6 +54,10 @@
return INSTANCE;
}
+ public static LauncherAppState getInstanceNoCreate() {
+ return INSTANCE;
+ }
+
public Context getContext() {
return sContext;
}
@@ -81,7 +86,9 @@
mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);
mIconCache = new IconCache(sContext);
- mModel = new LauncherModel(this, mIconCache);
+
+ mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class));
+ mModel = new LauncherModel(this, mIconCache, mAppFilter);
// Register intent receivers
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
@@ -147,6 +154,10 @@
return mModel;
}
+ boolean shouldShowAppOrWidgetProvider(ComponentName componentName) {
+ return mAppFilter == null || mAppFilter.shouldShowApp(componentName);
+ }
+
WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() {
return mWidgetPreviewCacheDb;
}
@@ -167,7 +178,8 @@
int width, int height,
int availableWidth, int availableHeight) {
if (mDynamicGrid == null) {
- mDynamicGrid = new DynamicGrid(context.getResources(),
+ mDynamicGrid = new DynamicGrid(context,
+ context.getResources(),
minWidth, minHeight, width, height,
availableWidth, availableHeight);
}
diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java
index 59bd307..83aef1a 100644
--- a/src/com/android/launcher3/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java
@@ -24,20 +24,24 @@
import android.view.ViewGroup;
import android.widget.RemoteViews;
+import com.android.launcher3.DragLayer.TouchCompleteListener;
+
/**
* {@inheritDoc}
*/
-public class LauncherAppWidgetHostView extends AppWidgetHostView {
+public class LauncherAppWidgetHostView extends AppWidgetHostView implements TouchCompleteListener {
private CheckLongPressHelper mLongPressHelper;
private LayoutInflater mInflater;
private Context mContext;
private int mPreviousOrientation;
+ private DragLayer mDragLayer;
public LauncherAppWidgetHostView(Context context) {
super(context);
mContext = context;
mLongPressHelper = new CheckLongPressHelper(this);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mDragLayer = ((Launcher) context).getDragLayer();
}
@Override
@@ -72,6 +76,7 @@
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: {
mLongPressHelper.postCheckForLongPress();
+ mDragLayer.setTouchCompleteListener(this);
break;
}
@@ -100,7 +105,11 @@
@Override
public void cancelLongPress() {
super.cancelLongPress();
+ mLongPressHelper.cancelLongPress();
+ }
+ @Override
+ public void onTouchComplete() {
mLongPressHelper.cancelLongPress();
}
@@ -108,4 +117,6 @@
public int getDescendantFocusability() {
return ViewGroup.FOCUS_BLOCK_DESCENDANTS;
}
+
+
}
diff --git a/src/com/android/launcher3/LauncherBackupAgent.java b/src/com/android/launcher3/LauncherBackupAgent.java
deleted file mode 100644
index bb15ca1..0000000
--- a/src/com/android/launcher3/LauncherBackupAgent.java
+++ /dev/null
@@ -1,655 +0,0 @@
-/*
- * Copyright (C) 2013 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.launcher3;
-
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-import com.google.protobuf.nano.MessageNano;
-
-import com.android.launcher3.LauncherSettings.ChangeLogColumns;
-import com.android.launcher3.LauncherSettings.Favorites;
-import com.android.launcher3.LauncherSettings.WorkspaceScreens;
-import com.android.launcher3.backup.BackupProtos;
-import com.android.launcher3.backup.BackupProtos.CheckedMessage;
-import com.android.launcher3.backup.BackupProtos.Favorite;
-import com.android.launcher3.backup.BackupProtos.Journal;
-import com.android.launcher3.backup.BackupProtos.Key;
-import com.android.launcher3.backup.BackupProtos.Screen;
-
-import android.app.backup.BackupAgent;
-import android.app.backup.BackupDataInput;
-import android.app.backup.BackupDataOutput;
-import android.app.backup.BackupManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.Cursor;
-import android.os.ParcelFileDescriptor;
-import android.provider.BaseColumns;
-import android.text.TextUtils;
-import android.util.Base64;
-import android.util.Log;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.zip.CRC32;
-
-/**
- * Persist the launcher home state across calamities.
- */
-public class LauncherBackupAgent extends BackupAgent {
-
- private static final String TAG = "LauncherBackupAgent";
- private static final boolean DEBUG = false;
-
- private static final int MAX_JOURNAL_SIZE = 1000000;
-
- private static BackupManager sBackupManager;
-
- private static final String[] FAVORITE_PROJECTION = {
- Favorites._ID, // 0
- Favorites.APPWIDGET_ID, // 1
- Favorites.APPWIDGET_PROVIDER, // 2
- Favorites.CELLX, // 3
- Favorites.CELLY, // 4
- Favorites.CONTAINER, // 5
- Favorites.ICON, // 6
- Favorites.ICON_PACKAGE, // 7
- Favorites.ICON_RESOURCE, // 8
- Favorites.ICON_TYPE, // 9
- Favorites.ITEM_TYPE, // 10
- Favorites.INTENT, // 11
- Favorites.SCREEN, // 12
- Favorites.SPANX, // 13
- Favorites.SPANY, // 14
- Favorites.TITLE, // 15
- };
-
- private static final int ID_INDEX = 0;
- private static final int APPWIDGET_ID_INDEX = 1;
- private static final int APPWIDGET_PROVIDER_INDEX = 2;
- private static final int CELLX_INDEX = 3;
- private static final int CELLY_INDEX = 4;
- private static final int CONTAINER_INDEX = 5;
- private static final int ICON_INDEX = 6;
- private static final int ICON_PACKAGE_INDEX = 7;
- private static final int ICON_RESOURCE_INDEX = 8;
- private static final int ICON_TYPE_INDEX = 9;
- private static final int ITEM_TYPE_INDEX = 10;
- private static final int INTENT_INDEX = 11;
- private static final int SCREEN_INDEX = 12;
- private static final int SPANX_INDEX = 13 ;
- private static final int SPANY_INDEX = 14;
- private static final int TITLE_INDEX = 15;
-
- private static final String[] SCREEN_PROJECTION = {
- WorkspaceScreens._ID, // 0
- WorkspaceScreens.SCREEN_RANK // 1
- };
-
- private static final int SCREEN_RANK_INDEX = 1;
-
- private static final String[] ID_ONLY_PROJECTION = {
- BaseColumns._ID
- };
-
-
- /**
- * Notify the backup manager that out database is dirty.
- *
- * <P>This does not force an immediate backup.
- *
- * @param context application context
- */
- public static void dataChanged(Context context) {
- if (sBackupManager == null) {
- sBackupManager = new BackupManager(context);
- }
- sBackupManager.dataChanged();
- }
-
- /**
- * Back up launcher data so we can restore the user's state on a new device.
- *
- * <P>The journal is a timestamp and a list of keys that were saved as of that time.
- *
- * <P>Keys may come back in any order, so each key/value is one complete row of the database.
- *
- * @param oldState notes from the last backup
- * @param data incremental key/value pairs to persist off-device
- * @param newState notes for the next backup
- * @throws IOException
- */
- @Override
- public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
- ParcelFileDescriptor newState)
- throws IOException {
- Log.v(TAG, "onBackup");
-
- Journal in = readJournal(oldState);
- Journal out = new Journal();
-
- long lastBackupTime = in.t;
- out.t = System.currentTimeMillis();
- out.rows = 0;
- out.bytes = 0;
-
- Log.v(TAG, "lastBackupTime=" + lastBackupTime);
-
- ArrayList<Key> keys = new ArrayList<Key>();
- backupFavorites(in, data, out, keys);
- backupScreens(in, data, out, keys);
-
- out.key = keys.toArray(BackupProtos.Key.EMPTY_ARRAY);
- writeJournal(newState, out);
- Log.v(TAG, "onBackup: wrote " + out.bytes + "b in " + out.rows + " rows.");
-
- Log.v(TAG, "onBackup: finished");
- }
-
- /**
- * Restore home screen from the restored data stream.
- *
- * <P>Keys may arrive in any order.
- *
- * @param data the key/value pairs from the server
- * @param versionCode the version of the app that generated the data
- * @param newState notes for the next backup
- * @throws IOException
- */
- @Override
- public void onRestore(BackupDataInput data, int versionCode, ParcelFileDescriptor newState)
- throws IOException {
- Log.v(TAG, "onRestore");
- int numRows = 0;
- Journal out = new Journal();
-
- ArrayList<Key> keys = new ArrayList<Key>();
- byte[] buffer = new byte[512];
- while (data.readNextHeader()) {
- numRows++;
- String backupKey = data.getKey();
- int dataSize = data.getDataSize();
- if (buffer.length < dataSize) {
- buffer = new byte[dataSize];
- }
- Key key = null;
- int bytesRead = data.readEntityData(buffer, 0, dataSize);
- if (DEBUG) {
- Log.d(TAG, "read " + bytesRead + " of " + dataSize + " available");
- }
- try {
- key = backupKeyToKey(backupKey);
- switch (key.type) {
- case Key.FAVORITE:
- restoreFavorite(key, buffer, dataSize, keys);
- break;
-
- case Key.SCREEN:
- restoreScreen(key, buffer, dataSize, keys);
- break;
-
- default:
- Log.w(TAG, "unknown restore entity type: " + key.type);
- break;
- }
- } catch (KeyParsingException e) {
- Log.w(TAG, "ignoring unparsable backup key: " + backupKey);
- }
- }
-
- // clear the output journal time, to force a full backup to
- // will catch any changes the restore process might have made
- out.t = 0;
- out.key = keys.toArray(BackupProtos.Key.EMPTY_ARRAY);
- writeJournal(newState, out);
- Log.v(TAG, "onRestore: read " + numRows + " rows");
- }
-
- /**
- * Write all modified favorites to the data stream.
- *
- *
- * @param in notes from last backup
- * @param data output stream for key/value pairs
- * @param out notes about this backup
- * @param keys keys to mark as clean in the notes for next backup
- * @throws IOException
- */
- private void backupFavorites(Journal in, BackupDataOutput data, Journal out,
- ArrayList<Key> keys)
- throws IOException {
- // read the old ID set
- Set<String> savedIds = new HashSet<String>();
- for(int i = 0; i < in.key.length; i++) {
- Key key = in.key[i];
- if (key.type == Key.FAVORITE) {
- savedIds.add(keyToBackupKey(key));
- }
- }
- if (DEBUG) Log.d(TAG, "favorite savedIds.size()=" + savedIds.size());
-
- // persist things that have changed since the last backup
- ContentResolver cr = getContentResolver();
- String where = ChangeLogColumns.MODIFIED + " > ?";
- String[] args = {Long.toString(in.t)};
- String updateOrder = ChangeLogColumns.MODIFIED;
- Cursor updated = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION,
- where, args, updateOrder);
- if (DEBUG) Log.d(TAG, "favorite updated.getCount()=" + updated.getCount());
- try {
- updated.moveToPosition(-1);
- while(updated.moveToNext()) {
- final long id = updated.getLong(ID_INDEX);
- Key key = getKey(Key.FAVORITE, id);
- byte[] blob = packFavorite(updated);
- String backupKey = keyToBackupKey(key);
- data.writeEntityHeader(backupKey, blob.length);
- data.writeEntityData(blob, blob.length);
- out.rows++;
- out.bytes += blob.length;
- Log.v(TAG, "saving favorite " + backupKey + ": " + id + "/" + blob.length);
- if(DEBUG) Log.d(TAG, "wrote " +
- Base64.encodeToString(blob, 0, blob.length, Base64.NO_WRAP));
- // remember that is was a new column, so we don't delete it.
- savedIds.add(backupKey);
- }
- } finally {
- updated.close();
- }
- if (DEBUG) Log.d(TAG, "favorite savedIds.size()=" + savedIds.size());
-
- // build the current ID set
- String idOrder = BaseColumns._ID;
- Cursor idCursor = cr.query(Favorites.CONTENT_URI, ID_ONLY_PROJECTION,
- null, null, idOrder);
- Set<String> currentIds = new HashSet<String>(idCursor.getCount());
- try {
- idCursor.moveToPosition(-1);
- while(idCursor.moveToNext()) {
- Key key = getKey(Key.FAVORITE, idCursor.getLong(ID_INDEX));
- currentIds.add(keyToBackupKey(key));
- // save the IDs for next time
- keys.add(key);
- }
- } finally {
- idCursor.close();
- }
- if (DEBUG) Log.d(TAG, "favorite currentIds.size()=" + currentIds.size());
-
- // these IDs must have been deleted
- savedIds.removeAll(currentIds);
- for (String deleted : savedIds) {
- Log.v(TAG, "dropping favorite " + deleted);
- data.writeEntityHeader(deleted, -1);
- out.rows++;
- }
- }
-
- /**
- * Read a favorite from the stream.
- *
- * <P>Keys arrive in any order, so screens and containers may not exist yet.
- *
- * @param key identifier for the row
- * @param buffer the serialized proto from the stream, may be larger than dataSize
- * @param dataSize the size of the proto from the stream
- * @param keys keys to mark as clean in the notes for next backup
- */
- private void restoreFavorite(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
- Log.v(TAG, "unpacking favorite " + key.id + " (" + dataSize + " bytes)");
- if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
- Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
-
- try {
- Favorite favorite = unpackFavorite(buffer, 0, dataSize);
- if (DEBUG) Log.d(TAG, "unpacked " + favorite.itemType);
- } catch (InvalidProtocolBufferNanoException e) {
- Log.w(TAG, "failed to decode proto", e);
- }
- }
-
- /**
- * Write all modified screens to the data stream.
- *
- *
- * @param in notes from last backup
- * @param data output stream for key/value pairs
- * @param out notes about this backup
- * @param keys keys to mark as clean in the notes for next backup @throws IOException
- */
- private void backupScreens(Journal in, BackupDataOutput data, Journal out,
- ArrayList<Key> keys)
- throws IOException {
- // read the old ID set
- Set<String> savedIds = new HashSet<String>();
- for(int i = 0; i < in.key.length; i++) {
- Key key = in.key[i];
- if (key.type == Key.SCREEN) {
- savedIds.add(keyToBackupKey(key));
- }
- }
- if (DEBUG) Log.d(TAG, "screens savedIds.size()=" + savedIds.size());
-
- // persist things that have changed since the last backup
- ContentResolver cr = getContentResolver();
- String where = ChangeLogColumns.MODIFIED + " > ?";
- String[] args = {Long.toString(in.t)};
- String updateOrder = ChangeLogColumns.MODIFIED;
- Cursor updated = cr.query(WorkspaceScreens.CONTENT_URI, SCREEN_PROJECTION,
- where, args, updateOrder);
- updated.moveToPosition(-1);
- if (DEBUG) Log.d(TAG, "screens updated.getCount()=" + updated.getCount());
- try {
- while(updated.moveToNext()) {
- final long id = updated.getLong(ID_INDEX);
- Key key = getKey(Key.SCREEN, id);
- byte[] blob = packScreen(updated);
- String backupKey = keyToBackupKey(key);
- data.writeEntityHeader(backupKey, blob.length);
- data.writeEntityData(blob, blob.length);
- out.rows++;
- out.bytes += blob.length;
- Log.v(TAG, "saving screen " + backupKey + ": " + id + "/" + blob.length);
- if(DEBUG) Log.d(TAG, "wrote " +
- Base64.encodeToString(blob, 0, blob.length, Base64.NO_WRAP));
- // remember that is was a new column, so we don't delete it.
- savedIds.add(backupKey);
- }
- } finally {
- updated.close();
- }
- if (DEBUG) Log.d(TAG, "screen savedIds.size()=" + savedIds.size());
-
- // build the current ID set
- String idOrder = BaseColumns._ID;
- Cursor idCursor = cr.query(WorkspaceScreens.CONTENT_URI, ID_ONLY_PROJECTION,
- null, null, idOrder);
- idCursor.moveToPosition(-1);
- Set<String> currentIds = new HashSet<String>(idCursor.getCount());
- try {
- while(idCursor.moveToNext()) {
- Key key = getKey(Key.SCREEN, idCursor.getLong(ID_INDEX));
- currentIds.add(keyToBackupKey(key));
- // save the IDs for next time
- keys.add(key);
- }
- } finally {
- idCursor.close();
- }
- if (DEBUG) Log.d(TAG, "screen currentIds.size()=" + currentIds.size());
-
- // these IDs must have been deleted
- savedIds.removeAll(currentIds);
- for(String deleted: savedIds) {
- Log.v(TAG, "dropping screen " + deleted);
- data.writeEntityHeader(deleted, -1);
- out.rows++;
- }
- }
-
- /**
- * Read a screen from the stream.
- *
- * <P>Keys arrive in any order, so children of this screen may already exist.
- *
- * @param key identifier for the row
- * @param buffer the serialized proto from the stream, may be larger than dataSize
- * @param dataSize the size of the proto from the stream
- * @param keys keys to mark as clean in the notes for next backup
- */
- private void restoreScreen(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
- Log.v(TAG, "unpacking screen " + key.id);
- if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
- Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
- try {
- Screen screen = unpackScreen(buffer, 0, dataSize);
- if (DEBUG) Log.d(TAG, "unpacked " + screen.rank);
- } catch (InvalidProtocolBufferNanoException e) {
- Log.w(TAG, "failed to decode proto", e);
- }
- }
-
- /** create a new key object.
- *
- * <P> Keys contain their own checksum instead of using
- * the heavy-weight CheckedMessage wrapper.
- */
- private Key getKey(int type, long id) {
- Key key = new Key();
- key.type = type;
- key.id = id;
- key.checksum = checkKey(key);
- return key;
- }
-
- /** keys need to be strings, serialize and encode. */
- private String keyToBackupKey(Key key) {
- return Base64.encodeToString(Key.toByteArray(key), Base64.NO_WRAP | Base64.NO_PADDING);
- }
-
- /** keys need to be strings, decode and parse. */
- private Key backupKeyToKey(String backupKey) throws KeyParsingException {
- try {
- Key key = Key.parseFrom(Base64.decode(backupKey, Base64.DEFAULT));
- if (key.checksum != checkKey(key)) {
- key = null;
- throw new KeyParsingException("invalid key read from stream" + backupKey);
- }
- return key;
- } catch (InvalidProtocolBufferNanoException e) {
- throw new KeyParsingException(e);
- } catch (IllegalArgumentException e) {
- throw new KeyParsingException(e);
- }
- }
-
- /** Compute the checksum over the important bits of a key. */
- private long checkKey(Key key) {
- CRC32 checksum = new CRC32();
- checksum.update(key.type);
- checksum.update((int) (key.id & 0xffff));
- checksum.update((int) ((key.id >> 32) & 0xffff));
- if (!TextUtils.isEmpty(key.name)) {
- checksum.update(key.name.getBytes());
- }
- return checksum.getValue();
- }
-
- /** Serialize a Favorite for persistence, including a checksum wrapper. */
- private byte[] packFavorite(Cursor c) {
- Favorite favorite = new Favorite();
- favorite.id = c.getLong(ID_INDEX);
- favorite.screen = c.getInt(SCREEN_INDEX);
- favorite.container = c.getInt(CONTAINER_INDEX);
- favorite.cellX = c.getInt(CELLX_INDEX);
- favorite.cellY = c.getInt(CELLY_INDEX);
- favorite.spanX = c.getInt(SPANX_INDEX);
- favorite.spanY = c.getInt(SPANY_INDEX);
- favorite.iconType = c.getInt(ICON_TYPE_INDEX);
- if (favorite.iconType == Favorites.ICON_TYPE_RESOURCE) {
- String iconPackage = c.getString(ICON_PACKAGE_INDEX);
- if (!TextUtils.isEmpty(iconPackage)) {
- favorite.iconPackage = iconPackage;
- }
- String iconResource = c.getString(ICON_RESOURCE_INDEX);
- if (!TextUtils.isEmpty(iconResource)) {
- favorite.iconResource = iconResource;
- }
- }
- if (favorite.iconType == Favorites.ICON_TYPE_BITMAP) {
- byte[] blob = c.getBlob(ICON_INDEX);
- if (blob != null && blob.length > 0) {
- favorite.icon = blob;
- }
- }
- String title = c.getString(TITLE_INDEX);
- if (!TextUtils.isEmpty(title)) {
- favorite.title = title;
- }
- String intent = c.getString(INTENT_INDEX);
- if (!TextUtils.isEmpty(intent)) {
- favorite.intent = intent;
- }
- favorite.itemType = c.getInt(ITEM_TYPE_INDEX);
- if (favorite.itemType == Favorites.ITEM_TYPE_APPWIDGET) {
- favorite.appWidgetId = c.getInt(APPWIDGET_ID_INDEX);
- String appWidgetProvider = c.getString(APPWIDGET_PROVIDER_INDEX);
- if (!TextUtils.isEmpty(appWidgetProvider)) {
- favorite.appWidgetProvider = appWidgetProvider;
- }
- }
-
- return writeCheckedBytes(favorite);
- }
-
- /** Deserialize a Favorite from persistence, after verifying checksum wrapper. */
- private Favorite unpackFavorite(byte[] buffer, int offset, int dataSize)
- throws InvalidProtocolBufferNanoException {
- Favorite favorite = new Favorite();
- MessageNano.mergeFrom(favorite, readCheckedBytes(buffer, offset, dataSize));
- return favorite;
- }
-
- /** Serialize a Screen for persistence, including a checksum wrapper. */
- private byte[] packScreen(Cursor c) {
- Screen screen = new Screen();
- screen.id = c.getLong(ID_INDEX);
- screen.rank = c.getInt(SCREEN_RANK_INDEX);
-
- return writeCheckedBytes(screen);
- }
-
- /** Deserialize a Screen from persistence, after verifying checksum wrapper. */
- private Screen unpackScreen(byte[] buffer, int offset, int dataSize)
- throws InvalidProtocolBufferNanoException {
- Screen screen = new Screen();
- MessageNano.mergeFrom(screen, readCheckedBytes(buffer, offset, dataSize));
- return screen;
- }
-
- /**
- * Read the old journal from the input file.
- *
- * In the event of any error, just pretend we didn't have a journal,
- * in that case, do a full backup.
- *
- * @param oldState the read-0only file descriptor pointing to the old journal
- * @return a Journal protocol bugffer
- */
- private Journal readJournal(ParcelFileDescriptor oldState) {
- int fileSize = (int) oldState.getStatSize();
- int remaining = fileSize;
- byte[] buffer = null;
- Journal journal = new Journal();
- if (remaining < MAX_JOURNAL_SIZE) {
- FileInputStream inStream = new FileInputStream(oldState.getFileDescriptor());
- int offset = 0;
-
- buffer = new byte[remaining];
- while (remaining > 0) {
- int bytesRead = 0;
- try {
- bytesRead = inStream.read(buffer, offset, remaining);
- } catch (IOException e) {
- Log.w(TAG, "failed to read the journal", e);
- buffer = null;
- remaining = 0;
- }
- if (bytesRead > 0) {
- remaining -= bytesRead;
- } else {
- // act like there is not journal
- Log.w(TAG, "failed to read the journal");
- buffer = null;
- remaining = 0;
- }
- }
-
- if (buffer != null) {
- try {
- MessageNano.mergeFrom(journal, readCheckedBytes(buffer, 0, fileSize));
- } catch (InvalidProtocolBufferNanoException e) {
- Log.d(TAG, "failed to read the journal", e);
- journal.clear();
- }
- }
-
- try {
- inStream.close();
- } catch (IOException e) {
- Log.d(TAG, "failed to close the journal", e);
- }
- }
- return journal;
- }
-
- /**
- * Write the new journal to the output file.
- *
- * In the event of any error, just pretend we didn't have a journal,
- * in that case, do a full backup.
-
- * @param newState the write-only file descriptor pointing to the new journal
- * @param journal a Journal protocol buffer
- */
- private void writeJournal(ParcelFileDescriptor newState, Journal journal) {
- FileOutputStream outStream = null;
- try {
- outStream = new FileOutputStream(newState.getFileDescriptor());
- outStream.write(writeCheckedBytes(journal));
- outStream.close();
- } catch (IOException e) {
- Log.d(TAG, "failed to write backup journal", e);
- }
- }
-
- /** Wrap a proto in a CheckedMessage and compute the checksum. */
- private byte[] writeCheckedBytes(MessageNano proto) {
- CheckedMessage wrapper = new CheckedMessage();
- wrapper.payload = MessageNano.toByteArray(proto);
- CRC32 checksum = new CRC32();
- checksum.update(wrapper.payload);
- wrapper.checksum = checksum.getValue();
- return MessageNano.toByteArray(wrapper);
- }
-
- /** Unwrap a proto message from a CheckedMessage, verifying the checksum. */
- private byte[] readCheckedBytes(byte[] buffer, int offset, int dataSize)
- throws InvalidProtocolBufferNanoException {
- CheckedMessage wrapper = new CheckedMessage();
- MessageNano.mergeFrom(wrapper, buffer, offset, dataSize);
- CRC32 checksum = new CRC32();
- checksum.update(wrapper.payload);
- if (wrapper.checksum != checksum.getValue()) {
- throw new InvalidProtocolBufferNanoException("checksum does not match");
- }
- return wrapper.payload;
- }
-
- private class KeyParsingException extends Throwable {
- private KeyParsingException(Throwable cause) {
- super(cause);
- }
-
- public KeyParsingException(String reason) {
- super(reason);
- }
- }
-}
diff --git a/src/com/android/launcher3/LauncherBackupAgentHelper.java b/src/com/android/launcher3/LauncherBackupAgentHelper.java
new file mode 100644
index 0000000..2b5059b
--- /dev/null
+++ b/src/com/android/launcher3/LauncherBackupAgentHelper.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2013 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.launcher3;
+
+import android.app.backup.BackupAgentHelper;
+import android.app.backup.BackupManager;
+import android.content.Context;
+
+public class LauncherBackupAgentHelper extends BackupAgentHelper {
+
+ private static BackupManager sBackupManager;
+
+ /**
+ * Notify the backup manager that out database is dirty.
+ *
+ * <P>This does not force an immediate backup.
+ *
+ * @param context application context
+ */
+ public static void dataChanged(Context context) {
+ if (sBackupManager == null) {
+ sBackupManager = new BackupManager(context);
+ }
+ sBackupManager.dataChanged();
+ }
+
+
+ @Override
+ public void onCreate() {
+ addHelper(LauncherBackupHelper.LAUNCHER_PREFIX, new LauncherBackupHelper(this));
+ }
+}
diff --git a/src/com/android/launcher3/LauncherBackupHelper.java b/src/com/android/launcher3/LauncherBackupHelper.java
new file mode 100644
index 0000000..9b901ee
--- /dev/null
+++ b/src/com/android/launcher3/LauncherBackupHelper.java
@@ -0,0 +1,1016 @@
+/*
+ * Copyright (C) 2013 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.launcher3;
+
+import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
+import com.google.protobuf.nano.MessageNano;
+
+import com.android.launcher3.LauncherSettings.Favorites;
+import com.android.launcher3.LauncherSettings.WorkspaceScreens;
+import com.android.launcher3.backup.BackupProtos;
+import com.android.launcher3.backup.BackupProtos.CheckedMessage;
+import com.android.launcher3.backup.BackupProtos.Favorite;
+import com.android.launcher3.backup.BackupProtos.Journal;
+import com.android.launcher3.backup.BackupProtos.Key;
+import com.android.launcher3.backup.BackupProtos.Resource;
+import com.android.launcher3.backup.BackupProtos.Screen;
+import com.android.launcher3.backup.BackupProtos.Widget;
+
+import android.app.backup.BackupDataInputStream;
+import android.app.backup.BackupHelper;
+import android.app.backup.BackupDataInput;
+import android.app.backup.BackupDataOutput;
+import android.app.backup.BackupManager;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.Drawable;
+import android.os.ParcelFileDescriptor;
+import android.text.TextUtils;
+import android.util.Base64;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.zip.CRC32;
+
+/**
+ * Persist the launcher home state across calamities.
+ */
+public class LauncherBackupHelper implements BackupHelper {
+
+ private static final String TAG = "LauncherBackupHelper";
+ private static final boolean DEBUG = false;
+ private static final boolean DEBUG_PAYLOAD = false;
+
+ private static final int MAX_JOURNAL_SIZE = 1000000;
+
+ /** icons are large, dribble them out */
+ private static final int MAX_ICONS_PER_PASS = 10;
+
+ /** widgets contain previews, which are very large, dribble them out */
+ private static final int MAX_WIDGETS_PER_PASS = 5;
+
+ public static final int IMAGE_COMPRESSION_QUALITY = 75;
+
+ public static final String LAUNCHER_PREFIX = "L";
+
+ private static final Bitmap.CompressFormat IMAGE_FORMAT =
+ android.graphics.Bitmap.CompressFormat.PNG;
+
+ private static BackupManager sBackupManager;
+
+ private static final String[] FAVORITE_PROJECTION = {
+ Favorites._ID, // 0
+ Favorites.MODIFIED, // 1
+ Favorites.INTENT, // 2
+ Favorites.APPWIDGET_PROVIDER, // 3
+ Favorites.APPWIDGET_ID, // 4
+ Favorites.CELLX, // 5
+ Favorites.CELLY, // 6
+ Favorites.CONTAINER, // 7
+ Favorites.ICON, // 8
+ Favorites.ICON_PACKAGE, // 9
+ Favorites.ICON_RESOURCE, // 10
+ Favorites.ICON_TYPE, // 11
+ Favorites.ITEM_TYPE, // 12
+ Favorites.SCREEN, // 13
+ Favorites.SPANX, // 14
+ Favorites.SPANY, // 15
+ Favorites.TITLE, // 16
+ };
+
+ private static final int ID_INDEX = 0;
+ private static final int ID_MODIFIED = 1;
+ private static final int INTENT_INDEX = 2;
+ private static final int APPWIDGET_PROVIDER_INDEX = 3;
+ private static final int APPWIDGET_ID_INDEX = 4;
+ private static final int CELLX_INDEX = 5;
+ private static final int CELLY_INDEX = 6;
+ private static final int CONTAINER_INDEX = 7;
+ private static final int ICON_INDEX = 8;
+ private static final int ICON_PACKAGE_INDEX = 9;
+ private static final int ICON_RESOURCE_INDEX = 10;
+ private static final int ICON_TYPE_INDEX = 11;
+ private static final int ITEM_TYPE_INDEX = 12;
+ private static final int SCREEN_INDEX = 13;
+ private static final int SPANX_INDEX = 14;
+ private static final int SPANY_INDEX = 15;
+ private static final int TITLE_INDEX = 16;
+
+ private static final String[] SCREEN_PROJECTION = {
+ WorkspaceScreens._ID, // 0
+ WorkspaceScreens.MODIFIED, // 1
+ WorkspaceScreens.SCREEN_RANK // 2
+ };
+
+ private static final int SCREEN_RANK_INDEX = 2;
+
+ private final Context mContext;
+
+ private HashMap<ComponentName, AppWidgetProviderInfo> mWidgetMap;
+
+ private ArrayList<Key> mKeys;
+
+ public LauncherBackupHelper(Context context) {
+ mContext = context;
+ }
+
+ private void dataChanged() {
+ if (sBackupManager == null) {
+ sBackupManager = new BackupManager(mContext);
+ }
+ sBackupManager.dataChanged();
+ }
+
+ /**
+ * Back up launcher data so we can restore the user's state on a new device.
+ *
+ * <P>The journal is a timestamp and a list of keys that were saved as of that time.
+ *
+ * <P>Keys may come back in any order, so each key/value is one complete row of the database.
+ *
+ * @param oldState notes from the last backup
+ * @param data incremental key/value pairs to persist off-device
+ * @param newState notes for the next backup
+ * @throws IOException
+ */
+ @Override
+ public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+ ParcelFileDescriptor newState) {
+ Log.v(TAG, "onBackup");
+
+ Journal in = readJournal(oldState);
+ Journal out = new Journal();
+
+ long lastBackupTime = in.t;
+ out.t = System.currentTimeMillis();
+ out.rows = 0;
+ out.bytes = 0;
+
+ Log.v(TAG, "lastBackupTime=" + lastBackupTime);
+
+ ArrayList<Key> keys = new ArrayList<Key>();
+ try {
+ backupFavorites(in, data, out, keys);
+ backupScreens(in, data, out, keys);
+ backupIcons(in, data, out, keys);
+ backupWidgets(in, data, out, keys);
+ } catch (IOException e) {
+ Log.e(TAG, "launcher backup has failed", e);
+ }
+
+ out.key = keys.toArray(BackupProtos.Key.EMPTY_ARRAY);
+ writeJournal(newState, out);
+ Log.v(TAG, "onBackup: wrote " + out.bytes + "b in " + out.rows + " rows.");
+ }
+
+ /**
+ * Restore launcher configuration from the restored data stream.
+ *
+ * <P>Keys may arrive in any order.
+ *
+ * @param data the key/value pair from the server
+ */
+ @Override
+ public void restoreEntity(BackupDataInputStream data) {
+ Log.v(TAG, "restoreEntity");
+ if (mKeys == null) {
+ mKeys = new ArrayList<Key>();
+ }
+ byte[] buffer = new byte[512];
+ String backupKey = data.getKey();
+ int dataSize = data.size();
+ if (buffer.length < dataSize) {
+ buffer = new byte[dataSize];
+ }
+ Key key = null;
+ int bytesRead = 0;
+ try {
+ bytesRead = data.read(buffer, 0, dataSize);
+ if (DEBUG) Log.d(TAG, "read " + bytesRead + " of " + dataSize + " available");
+ } catch (IOException e) {
+ Log.d(TAG, "failed to read entity from restore data", e);
+ }
+ try {
+ key = backupKeyToKey(backupKey);
+ switch (key.type) {
+ case Key.FAVORITE:
+ restoreFavorite(key, buffer, dataSize, mKeys);
+ break;
+
+ case Key.SCREEN:
+ restoreScreen(key, buffer, dataSize, mKeys);
+ break;
+
+ case Key.ICON:
+ restoreIcon(key, buffer, dataSize, mKeys);
+ break;
+
+ case Key.WIDGET:
+ restoreWidget(key, buffer, dataSize, mKeys);
+ break;
+
+ default:
+ Log.w(TAG, "unknown restore entity type: " + key.type);
+ break;
+ }
+ } catch (KeyParsingException e) {
+ Log.w(TAG, "ignoring unparsable backup key: " + backupKey);
+ }
+
+ }
+
+ /**
+ * Record the restore state for the next backup.
+ *
+ * @param newState notes about the backup state after restore.
+ */
+ @Override
+ public void writeNewStateDescription(ParcelFileDescriptor newState) {
+ // clear the output journal time, to force a full backup to
+ // will catch any changes the restore process might have made
+ Journal out = new Journal();
+ out.t = 0;
+ out.key = mKeys.toArray(BackupProtos.Key.EMPTY_ARRAY);
+ writeJournal(newState, out);
+ Log.v(TAG, "onRestore: read " + mKeys.size() + " rows");
+ mKeys.clear();
+ }
+
+ /**
+ * Write all modified favorites to the data stream.
+ *
+ *
+ * @param in notes from last backup
+ * @param data output stream for key/value pairs
+ * @param out notes about this backup
+ * @param keys keys to mark as clean in the notes for next backup
+ * @throws IOException
+ */
+ private void backupFavorites(Journal in, BackupDataOutput data, Journal out,
+ ArrayList<Key> keys)
+ throws IOException {
+ // read the old ID set
+ Set<String> savedIds = getSavedIdsByType(Key.FAVORITE, in);
+ if (DEBUG) Log.d(TAG, "favorite savedIds.size()=" + savedIds.size());
+
+ // persist things that have changed since the last backup
+ ContentResolver cr = mContext.getContentResolver();
+ Cursor cursor = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION,
+ null, null, null);
+ Set<String> currentIds = new HashSet<String>(cursor.getCount());
+ try {
+ cursor.moveToPosition(-1);
+ while(cursor.moveToNext()) {
+ final long id = cursor.getLong(ID_INDEX);
+ final long updateTime = cursor.getLong(ID_MODIFIED);
+ Key key = getKey(Key.FAVORITE, id);
+ keys.add(key);
+ currentIds.add(keyToBackupKey(key));
+ if (updateTime > in.t) {
+ byte[] blob = packFavorite(cursor);
+ writeRowToBackup(key, blob, out, data);
+ }
+ }
+ } finally {
+ cursor.close();
+ }
+ if (DEBUG) Log.d(TAG, "favorite currentIds.size()=" + currentIds.size());
+
+ // these IDs must have been deleted
+ savedIds.removeAll(currentIds);
+ out.rows += removeDeletedKeysFromBackup(savedIds, data);
+ }
+
+ /**
+ * Read a favorite from the stream.
+ *
+ * <P>Keys arrive in any order, so screens and containers may not exist yet.
+ *
+ * @param key identifier for the row
+ * @param buffer the serialized proto from the stream, may be larger than dataSize
+ * @param dataSize the size of the proto from the stream
+ * @param keys keys to mark as clean in the notes for next backup
+ */
+ private void restoreFavorite(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
+ Log.v(TAG, "unpacking favorite " + key.id + " (" + dataSize + " bytes)");
+ if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
+ Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+
+ try {
+ Favorite favorite = unpackFavorite(buffer, 0, dataSize);
+ if (DEBUG) Log.d(TAG, "unpacked " + favorite.itemType);
+ } catch (InvalidProtocolBufferNanoException e) {
+ Log.w(TAG, "failed to decode proto", e);
+ }
+ }
+
+ /**
+ * Write all modified screens to the data stream.
+ *
+ *
+ * @param in notes from last backup
+ * @param data output stream for key/value pairs
+ * @param out notes about this backup
+ * @param keys keys to mark as clean in the notes for next backup
+ * @throws IOException
+ */
+ private void backupScreens(Journal in, BackupDataOutput data, Journal out,
+ ArrayList<Key> keys)
+ throws IOException {
+ // read the old ID set
+ Set<String> savedIds = getSavedIdsByType(Key.SCREEN, in);
+ if (DEBUG) Log.d(TAG, "screen savedIds.size()=" + savedIds.size());
+
+ // persist things that have changed since the last backup
+ ContentResolver cr = mContext.getContentResolver();
+ Cursor cursor = cr.query(WorkspaceScreens.CONTENT_URI, SCREEN_PROJECTION,
+ null, null, null);
+ Set<String> currentIds = new HashSet<String>(cursor.getCount());
+ try {
+ cursor.moveToPosition(-1);
+ while(cursor.moveToNext()) {
+ final long id = cursor.getLong(ID_INDEX);
+ final long updateTime = cursor.getLong(ID_MODIFIED);
+ Key key = getKey(Key.SCREEN, id);
+ keys.add(key);
+ currentIds.add(keyToBackupKey(key));
+ if (updateTime > in.t) {
+ byte[] blob = packScreen(cursor);
+ writeRowToBackup(key, blob, out, data);
+ }
+ }
+ } finally {
+ cursor.close();
+ }
+ if (DEBUG) Log.d(TAG, "screen currentIds.size()=" + currentIds.size());
+
+ // these IDs must have been deleted
+ savedIds.removeAll(currentIds);
+ out.rows += removeDeletedKeysFromBackup(savedIds, data);
+ }
+
+ /**
+ * Read a screen from the stream.
+ *
+ * <P>Keys arrive in any order, so children of this screen may already exist.
+ *
+ * @param key identifier for the row
+ * @param buffer the serialized proto from the stream, may be larger than dataSize
+ * @param dataSize the size of the proto from the stream
+ * @param keys keys to mark as clean in the notes for next backup
+ */
+ private void restoreScreen(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
+ Log.v(TAG, "unpacking screen " + key.id);
+ if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
+ Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+ try {
+ Screen screen = unpackScreen(buffer, 0, dataSize);
+ if (DEBUG) Log.d(TAG, "unpacked " + screen.rank);
+ } catch (InvalidProtocolBufferNanoException e) {
+ Log.w(TAG, "failed to decode proto", e);
+ }
+ }
+
+ /**
+ * Write all the static icon resources we need to render placeholders
+ * for a package that is not installed.
+ *
+ * @param in notes from last backup
+ * @param data output stream for key/value pairs
+ * @param out notes about this backup
+ * @param keys keys to mark as clean in the notes for next backup
+ * @throws IOException
+ */
+ private void backupIcons(Journal in, BackupDataOutput data, Journal out,
+ ArrayList<Key> keys) throws IOException {
+ // persist icons that haven't been persisted yet
+ final LauncherAppState appState = LauncherAppState.getInstanceNoCreate();
+ if (appState == null) {
+ dataChanged(); // try again later
+ if (DEBUG) Log.d(TAG, "Launcher is not initialized, delaying icon backup");
+ return;
+ }
+ final ContentResolver cr = mContext.getContentResolver();
+ final IconCache iconCache = appState.getIconCache();
+ final int dpi = mContext.getResources().getDisplayMetrics().densityDpi;
+
+ // read the old ID set
+ Set<String> savedIds = getSavedIdsByType(Key.ICON, in);
+ if (DEBUG) Log.d(TAG, "icon savedIds.size()=" + savedIds.size());
+
+ int startRows = out.rows;
+ if (DEBUG) Log.d(TAG, "starting here: " + startRows);
+ String where = Favorites.ITEM_TYPE + "=" + Favorites.ITEM_TYPE_APPLICATION;
+ Cursor cursor = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION,
+ where, null, null);
+ Set<String> currentIds = new HashSet<String>(cursor.getCount());
+ try {
+ cursor.moveToPosition(-1);
+ while(cursor.moveToNext()) {
+ final long id = cursor.getLong(ID_INDEX);
+ final String intentDescription = cursor.getString(INTENT_INDEX);
+ try {
+ Intent intent = Intent.parseUri(intentDescription, 0);
+ ComponentName cn = intent.getComponent();
+ Key key = null;
+ String backupKey = null;
+ if (cn != null) {
+ key = getKey(Key.ICON, cn.flattenToShortString());
+ backupKey = keyToBackupKey(key);
+ currentIds.add(backupKey);
+ } else {
+ Log.w(TAG, "empty intent on application favorite: " + id);
+ }
+ if (savedIds.contains(backupKey)) {
+ if (DEBUG) Log.d(TAG, "already saved icon " + backupKey);
+
+ // remember that we already backed this up previously
+ keys.add(key);
+ } else if (backupKey != null) {
+ if (DEBUG) Log.d(TAG, "I can count this high: " + out.rows);
+ if ((out.rows - startRows) < MAX_ICONS_PER_PASS) {
+ if (DEBUG) Log.d(TAG, "saving icon " + backupKey);
+ Bitmap icon = iconCache.getIcon(intent);
+ keys.add(key);
+ if (icon != null && !iconCache.isDefaultIcon(icon)) {
+ byte[] blob = packIcon(dpi, icon);
+ writeRowToBackup(key, blob, out, data);
+ }
+ } else {
+ if (DEBUG) Log.d(TAG, "scheduling another run for icon " + backupKey);
+ // too many icons for this pass, request another.
+ dataChanged();
+ }
+ }
+ } catch (URISyntaxException e) {
+ Log.w(TAG, "invalid URI on application favorite: " + id);
+ } catch (IOException e) {
+ Log.w(TAG, "unable to save application icon for favorite: " + id);
+ }
+
+ }
+ } finally {
+ cursor.close();
+ }
+ if (DEBUG) Log.d(TAG, "icon currentIds.size()=" + currentIds.size());
+
+ // these IDs must have been deleted
+ savedIds.removeAll(currentIds);
+ out.rows += removeDeletedKeysFromBackup(savedIds, data);
+ }
+
+ /**
+ * Read an icon from the stream.
+ *
+ * <P>Keys arrive in any order, so shortcuts that use this icon may already exist.
+ *
+ * @param key identifier for the row
+ * @param buffer the serialized proto from the stream, may be larger than dataSize
+ * @param dataSize the size of the proto from the stream
+ * @param keys keys to mark as clean in the notes for next backup
+ */
+ private void restoreIcon(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
+ Log.v(TAG, "unpacking icon " + key.id);
+ if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
+ Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+ try {
+ Resource res = unpackIcon(buffer, 0, dataSize);
+ if (DEBUG) Log.d(TAG, "unpacked " + res.dpi);
+ if (DEBUG) Log.d(TAG, "read " +
+ Base64.encodeToString(res.data, 0, res.data.length,
+ Base64.NO_WRAP));
+ Bitmap icon = BitmapFactory.decodeByteArray(res.data, 0, res.data.length);
+ if (icon == null) {
+ Log.w(TAG, "failed to unpack icon for " + key.name);
+ }
+ } catch (InvalidProtocolBufferNanoException e) {
+ Log.w(TAG, "failed to decode proto", e);
+ }
+ }
+
+ /**
+ * Write all the static widget resources we need to render placeholders
+ * for a package that is not installed.
+ *
+ * @param in notes from last backup
+ * @param data output stream for key/value pairs
+ * @param out notes about this backup
+ * @param keys keys to mark as clean in the notes for next backup
+ * @throws IOException
+ */
+ private void backupWidgets(Journal in, BackupDataOutput data, Journal out,
+ ArrayList<Key> keys) throws IOException {
+ // persist static widget info that hasn't been persisted yet
+ final LauncherAppState appState = LauncherAppState.getInstanceNoCreate();
+ if (appState == null) {
+ dataChanged(); // try again later
+ if (DEBUG) Log.d(TAG, "Launcher is not initialized, delaying widget backup");
+ return;
+ }
+ final ContentResolver cr = mContext.getContentResolver();
+ final WidgetPreviewLoader previewLoader = new WidgetPreviewLoader(mContext);
+ final PagedViewCellLayout widgetSpacingLayout = new PagedViewCellLayout(mContext);
+ final IconCache iconCache = appState.getIconCache();
+ final int dpi = mContext.getResources().getDisplayMetrics().densityDpi;
+ final DeviceProfile profile = appState.getDynamicGrid().getDeviceProfile();
+ if (DEBUG) Log.d(TAG, "cellWidthPx: " + profile.cellWidthPx);
+
+ // read the old ID set
+ Set<String> savedIds = getSavedIdsByType(Key.WIDGET, in);
+ if (DEBUG) Log.d(TAG, "widgets savedIds.size()=" + savedIds.size());
+
+ int startRows = out.rows;
+ if (DEBUG) Log.d(TAG, "starting here: " + startRows);
+ String where = Favorites.ITEM_TYPE + "=" + Favorites.ITEM_TYPE_APPWIDGET;
+ Cursor cursor = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION,
+ where, null, null);
+ Set<String> currentIds = new HashSet<String>(cursor.getCount());
+ try {
+ cursor.moveToPosition(-1);
+ while(cursor.moveToNext()) {
+ final long id = cursor.getLong(ID_INDEX);
+ final String providerName = cursor.getString(APPWIDGET_PROVIDER_INDEX);
+ final int spanX = cursor.getInt(SPANX_INDEX);
+ final int spanY = cursor.getInt(SPANY_INDEX);
+ final ComponentName provider = ComponentName.unflattenFromString(providerName);
+ Key key = null;
+ String backupKey = null;
+ if (provider != null) {
+ key = getKey(Key.WIDGET, providerName);
+ backupKey = keyToBackupKey(key);
+ currentIds.add(backupKey);
+ } else {
+ Log.w(TAG, "empty intent on appwidget: " + id);
+ }
+ if (savedIds.contains(backupKey)) {
+ if (DEBUG) Log.d(TAG, "already saved widget " + backupKey);
+
+ // remember that we already backed this up previously
+ keys.add(key);
+ } else if (backupKey != null) {
+ if (DEBUG) Log.d(TAG, "I can count this high: " + out.rows);
+ if ((out.rows - startRows) < MAX_WIDGETS_PER_PASS) {
+ if (DEBUG) Log.d(TAG, "saving widget " + backupKey);
+ previewLoader.setPreviewSize(spanX * profile.cellWidthPx,
+ spanY * profile.cellHeightPx, widgetSpacingLayout);
+ byte[] blob = packWidget(dpi, previewLoader, iconCache, provider);
+ keys.add(key);
+ writeRowToBackup(key, blob, out, data);
+
+ } else {
+ if (DEBUG) Log.d(TAG, "scheduling another run for widget " + backupKey);
+ // too many widgets for this pass, request another.
+ dataChanged();
+ }
+ }
+ }
+ } finally {
+ cursor.close();
+ }
+ if (DEBUG) Log.d(TAG, "widget currentIds.size()=" + currentIds.size());
+
+ // these IDs must have been deleted
+ savedIds.removeAll(currentIds);
+ out.rows += removeDeletedKeysFromBackup(savedIds, data);
+ }
+
+ /**
+ * Read a widget from the stream.
+ *
+ * <P>Keys arrive in any order, so widgets that use this data may already exist.
+ *
+ * @param key identifier for the row
+ * @param buffer the serialized proto from the stream, may be larger than dataSize
+ * @param dataSize the size of the proto from the stream
+ * @param keys keys to mark as clean in the notes for next backup
+ */
+ private void restoreWidget(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
+ Log.v(TAG, "unpacking widget " + key.id);
+ if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
+ Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+ try {
+ Widget widget = unpackWidget(buffer, 0, dataSize);
+ if (DEBUG) Log.d(TAG, "unpacked " + widget.provider);
+ if (widget.icon.data != null) {
+ Bitmap icon = BitmapFactory
+ .decodeByteArray(widget.icon.data, 0, widget.icon.data.length);
+ if (icon == null) {
+ Log.w(TAG, "failed to unpack widget icon for " + key.name);
+ }
+ }
+ } catch (InvalidProtocolBufferNanoException e) {
+ Log.w(TAG, "failed to decode proto", e);
+ }
+ }
+
+ /** create a new key, with an integer ID.
+ *
+ * <P> Keys contain their own checksum instead of using
+ * the heavy-weight CheckedMessage wrapper.
+ */
+ private Key getKey(int type, long id) {
+ Key key = new Key();
+ key.type = type;
+ key.id = id;
+ key.checksum = checkKey(key);
+ return key;
+ }
+
+ /** create a new key for a named object.
+ *
+ * <P> Keys contain their own checksum instead of using
+ * the heavy-weight CheckedMessage wrapper.
+ */
+ private Key getKey(int type, String name) {
+ Key key = new Key();
+ key.type = type;
+ key.name = name;
+ key.checksum = checkKey(key);
+ return key;
+ }
+
+ /** keys need to be strings, serialize and encode. */
+ private String keyToBackupKey(Key key) {
+ return Base64.encodeToString(Key.toByteArray(key), Base64.NO_WRAP);
+ }
+
+ /** keys need to be strings, decode and parse. */
+ private Key backupKeyToKey(String backupKey) throws KeyParsingException {
+ try {
+ Key key = Key.parseFrom(Base64.decode(backupKey, Base64.DEFAULT));
+ if (key.checksum != checkKey(key)) {
+ key = null;
+ throw new KeyParsingException("invalid key read from stream" + backupKey);
+ }
+ return key;
+ } catch (InvalidProtocolBufferNanoException e) {
+ throw new KeyParsingException(e);
+ } catch (IllegalArgumentException e) {
+ throw new KeyParsingException(e);
+ }
+ }
+
+ private String getKeyName(Key key) {
+ if (TextUtils.isEmpty(key.name)) {
+ return Long.toString(key.id);
+ } else {
+ return key.name;
+ }
+
+ }
+
+ private String geKeyType(Key key) {
+ switch (key.type) {
+ case Key.FAVORITE:
+ return "favorite";
+ case Key.SCREEN:
+ return "screen";
+ case Key.ICON:
+ return "icon";
+ case Key.WIDGET:
+ return "widget";
+ default:
+ return "anonymous";
+ }
+ }
+
+ /** Compute the checksum over the important bits of a key. */
+ private long checkKey(Key key) {
+ CRC32 checksum = new CRC32();
+ checksum.update(key.type);
+ checksum.update((int) (key.id & 0xffff));
+ checksum.update((int) ((key.id >> 32) & 0xffff));
+ if (!TextUtils.isEmpty(key.name)) {
+ checksum.update(key.name.getBytes());
+ }
+ return checksum.getValue();
+ }
+
+ /** Serialize a Favorite for persistence, including a checksum wrapper. */
+ private byte[] packFavorite(Cursor c) {
+ Favorite favorite = new Favorite();
+ favorite.id = c.getLong(ID_INDEX);
+ favorite.screen = c.getInt(SCREEN_INDEX);
+ favorite.container = c.getInt(CONTAINER_INDEX);
+ favorite.cellX = c.getInt(CELLX_INDEX);
+ favorite.cellY = c.getInt(CELLY_INDEX);
+ favorite.spanX = c.getInt(SPANX_INDEX);
+ favorite.spanY = c.getInt(SPANY_INDEX);
+ favorite.iconType = c.getInt(ICON_TYPE_INDEX);
+ if (favorite.iconType == Favorites.ICON_TYPE_RESOURCE) {
+ String iconPackage = c.getString(ICON_PACKAGE_INDEX);
+ if (!TextUtils.isEmpty(iconPackage)) {
+ favorite.iconPackage = iconPackage;
+ }
+ String iconResource = c.getString(ICON_RESOURCE_INDEX);
+ if (!TextUtils.isEmpty(iconResource)) {
+ favorite.iconResource = iconResource;
+ }
+ }
+ if (favorite.iconType == Favorites.ICON_TYPE_BITMAP) {
+ byte[] blob = c.getBlob(ICON_INDEX);
+ if (blob != null && blob.length > 0) {
+ favorite.icon = blob;
+ }
+ }
+ String title = c.getString(TITLE_INDEX);
+ if (!TextUtils.isEmpty(title)) {
+ favorite.title = title;
+ }
+ String intent = c.getString(INTENT_INDEX);
+ if (!TextUtils.isEmpty(intent)) {
+ favorite.intent = intent;
+ }
+ favorite.itemType = c.getInt(ITEM_TYPE_INDEX);
+ if (favorite.itemType == Favorites.ITEM_TYPE_APPWIDGET) {
+ favorite.appWidgetId = c.getInt(APPWIDGET_ID_INDEX);
+ String appWidgetProvider = c.getString(APPWIDGET_PROVIDER_INDEX);
+ if (!TextUtils.isEmpty(appWidgetProvider)) {
+ favorite.appWidgetProvider = appWidgetProvider;
+ }
+ }
+
+ return writeCheckedBytes(favorite);
+ }
+
+ /** Deserialize a Favorite from persistence, after verifying checksum wrapper. */
+ private Favorite unpackFavorite(byte[] buffer, int offset, int dataSize)
+ throws InvalidProtocolBufferNanoException {
+ Favorite favorite = new Favorite();
+ MessageNano.mergeFrom(favorite, readCheckedBytes(buffer, offset, dataSize));
+ return favorite;
+ }
+
+ /** Serialize a Screen for persistence, including a checksum wrapper. */
+ private byte[] packScreen(Cursor c) {
+ Screen screen = new Screen();
+ screen.id = c.getLong(ID_INDEX);
+ screen.rank = c.getInt(SCREEN_RANK_INDEX);
+
+ return writeCheckedBytes(screen);
+ }
+
+ /** Deserialize a Screen from persistence, after verifying checksum wrapper. */
+ private Screen unpackScreen(byte[] buffer, int offset, int dataSize)
+ throws InvalidProtocolBufferNanoException {
+ Screen screen = new Screen();
+ MessageNano.mergeFrom(screen, readCheckedBytes(buffer, offset, dataSize));
+ return screen;
+ }
+
+ /** Serialize an icon Resource for persistence, including a checksum wrapper. */
+ private byte[] packIcon(int dpi, Bitmap icon) {
+ Resource res = new Resource();
+ res.dpi = dpi;
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ if (icon.compress(IMAGE_FORMAT, IMAGE_COMPRESSION_QUALITY, os)) {
+ res.data = os.toByteArray();
+ }
+ return writeCheckedBytes(res);
+ }
+
+ /** Deserialize an icon resource from persistence, after verifying checksum wrapper. */
+ private Resource unpackIcon(byte[] buffer, int offset, int dataSize)
+ throws InvalidProtocolBufferNanoException {
+ Resource res = new Resource();
+ MessageNano.mergeFrom(res, readCheckedBytes(buffer, offset, dataSize));
+ return res;
+ }
+
+ /** Serialize a widget for persistence, including a checksum wrapper. */
+ private byte[] packWidget(int dpi, WidgetPreviewLoader previewLoader, IconCache iconCache,
+ ComponentName provider) {
+ final AppWidgetProviderInfo info = findAppWidgetProviderInfo(provider);
+ Widget widget = new Widget();
+ widget.provider = provider.flattenToShortString();
+ widget.label = info.label;
+ widget.configure = info.configure != null;
+ if (info.icon != 0) {
+ widget.icon = new Resource();
+ Drawable fullResIcon = iconCache.getFullResIcon(provider.getPackageName(), info.icon);
+ Bitmap icon = Utilities.createIconBitmap(fullResIcon, mContext);
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ if (icon.compress(IMAGE_FORMAT, IMAGE_COMPRESSION_QUALITY, os)) {
+ widget.icon.data = os.toByteArray();
+ widget.icon.dpi = dpi;
+ }
+ }
+ if (info.previewImage != 0) {
+ widget.preview = new Resource();
+ Bitmap preview = previewLoader.generateWidgetPreview(info, null);
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ if (preview.compress(IMAGE_FORMAT, IMAGE_COMPRESSION_QUALITY, os)) {
+ widget.preview.data = os.toByteArray();
+ widget.preview.dpi = dpi;
+ }
+ }
+ return writeCheckedBytes(widget);
+ }
+
+ /** Deserialize a widget from persistence, after verifying checksum wrapper. */
+ private Widget unpackWidget(byte[] buffer, int offset, int dataSize)
+ throws InvalidProtocolBufferNanoException {
+ Widget widget = new Widget();
+ MessageNano.mergeFrom(widget, readCheckedBytes(buffer, offset, dataSize));
+ return widget;
+ }
+
+ /**
+ * Read the old journal from the input file.
+ *
+ * In the event of any error, just pretend we didn't have a journal,
+ * in that case, do a full backup.
+ *
+ * @param oldState the read-0only file descriptor pointing to the old journal
+ * @return a Journal protocol bugffer
+ */
+ private Journal readJournal(ParcelFileDescriptor oldState) {
+ Journal journal = new Journal();
+ if (oldState == null) {
+ return journal;
+ }
+ FileInputStream inStream = new FileInputStream(oldState.getFileDescriptor());
+ try {
+ int remaining = inStream.available();
+ if (DEBUG) Log.d(TAG, "available " + remaining);
+ if (remaining < MAX_JOURNAL_SIZE) {
+ byte[] buffer = new byte[remaining];
+ int bytesRead = 0;
+ while (remaining > 0) {
+ try {
+ int result = inStream.read(buffer, bytesRead, remaining);
+ if (result > 0) {
+ if (DEBUG) Log.d(TAG, "read some bytes: " + result);
+ remaining -= result;
+ bytesRead += result;
+ } else {
+ // stop reading ands see what there is to parse
+ Log.w(TAG, "read error: " + result);
+ remaining = 0;
+ }
+ } catch (IOException e) {
+ Log.w(TAG, "failed to read the journal", e);
+ buffer = null;
+ remaining = 0;
+ }
+ }
+ if (DEBUG) Log.d(TAG, "journal bytes read: " + bytesRead);
+
+ if (buffer != null) {
+ try {
+ MessageNano.mergeFrom(journal, readCheckedBytes(buffer, 0, bytesRead));
+ } catch (InvalidProtocolBufferNanoException e) {
+ Log.d(TAG, "failed to read the journal", e);
+ journal.clear();
+ }
+ }
+ }
+ } catch (IOException e) {
+ Log.d(TAG, "failed to close the journal", e);
+ } finally {
+ try {
+ inStream.close();
+ } catch (IOException e) {
+ Log.d(TAG, "failed to close the journal", e);
+ }
+ }
+ return journal;
+ }
+
+ private void writeRowToBackup(Key key, byte[] blob, Journal out,
+ BackupDataOutput data) throws IOException {
+ String backupKey = keyToBackupKey(key);
+ data.writeEntityHeader(backupKey, blob.length);
+ data.writeEntityData(blob, blob.length);
+ out.rows++;
+ out.bytes += blob.length;
+ Log.v(TAG, "saving " + geKeyType(key) + " " + backupKey + ": " +
+ getKeyName(key) + "/" + blob.length);
+ if(DEBUG_PAYLOAD) {
+ String encoded = Base64.encodeToString(blob, 0, blob.length, Base64.NO_WRAP);
+ final int chunkSize = 1024;
+ for (int offset = 0; offset < encoded.length(); offset += chunkSize) {
+ int end = offset + chunkSize;
+ end = Math.min(end, encoded.length());
+ Log.d(TAG, "wrote " + encoded.substring(offset, end));
+ }
+ }
+ }
+
+ private Set<String> getSavedIdsByType(int type, Journal in) {
+ Set<String> savedIds = new HashSet<String>();
+ for(int i = 0; i < in.key.length; i++) {
+ Key key = in.key[i];
+ if (key.type == type) {
+ savedIds.add(keyToBackupKey(key));
+ }
+ }
+ return savedIds;
+ }
+
+ private int removeDeletedKeysFromBackup(Set<String> deletedIds, BackupDataOutput data)
+ throws IOException {
+ int rows = 0;
+ for(String deleted: deletedIds) {
+ Log.v(TAG, "dropping icon " + deleted);
+ data.writeEntityHeader(deleted, -1);
+ rows++;
+ }
+ return rows;
+ }
+
+ /**
+ * Write the new journal to the output file.
+ *
+ * In the event of any error, just pretend we didn't have a journal,
+ * in that case, do a full backup.
+
+ * @param newState the write-only file descriptor pointing to the new journal
+ * @param journal a Journal protocol buffer
+ */
+ private void writeJournal(ParcelFileDescriptor newState, Journal journal) {
+ FileOutputStream outStream = null;
+ try {
+ outStream = new FileOutputStream(newState.getFileDescriptor());
+ outStream.write(writeCheckedBytes(journal));
+ outStream.close();
+ } catch (IOException e) {
+ Log.d(TAG, "failed to write backup journal", e);
+ }
+ }
+
+ /** Wrap a proto in a CheckedMessage and compute the checksum. */
+ private byte[] writeCheckedBytes(MessageNano proto) {
+ CheckedMessage wrapper = new CheckedMessage();
+ wrapper.payload = MessageNano.toByteArray(proto);
+ CRC32 checksum = new CRC32();
+ checksum.update(wrapper.payload);
+ wrapper.checksum = checksum.getValue();
+ return MessageNano.toByteArray(wrapper);
+ }
+
+ /** Unwrap a proto message from a CheckedMessage, verifying the checksum. */
+ private byte[] readCheckedBytes(byte[] buffer, int offset, int dataSize)
+ throws InvalidProtocolBufferNanoException {
+ CheckedMessage wrapper = new CheckedMessage();
+ MessageNano.mergeFrom(wrapper, buffer, offset, dataSize);
+ CRC32 checksum = new CRC32();
+ checksum.update(wrapper.payload);
+ if (wrapper.checksum != checksum.getValue()) {
+ throw new InvalidProtocolBufferNanoException("checksum does not match");
+ }
+ return wrapper.payload;
+ }
+
+ private AppWidgetProviderInfo findAppWidgetProviderInfo(ComponentName component) {
+ if (mWidgetMap == null) {
+ List<AppWidgetProviderInfo> widgets =
+ AppWidgetManager.getInstance(mContext).getInstalledProviders();
+ mWidgetMap = new HashMap<ComponentName, AppWidgetProviderInfo>(widgets.size());
+ for (AppWidgetProviderInfo info : widgets) {
+ mWidgetMap.put(info.provider, info);
+ }
+ }
+ return mWidgetMap.get(component);
+ }
+
+ private class KeyParsingException extends Throwable {
+ private KeyParsingException(Throwable cause) {
+ super(cause);
+ }
+
+ public KeyParsingException(String reason) {
+ super(reason);
+ }
+ }
+}
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index f8644b1..7e1442d 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -158,7 +158,6 @@
public void bindFolders(HashMap<Long,FolderInfo> folders);
public void finishBindingItems(boolean upgradePath);
public void bindAppWidget(LauncherAppWidgetInfo info);
- public boolean shouldShowApp(ResolveInfo app);
public void bindAllApplications(ArrayList<AppInfo> apps);
public void bindAppsAdded(ArrayList<Long> newScreens,
ArrayList<ItemInfo> addNotAnimated,
@@ -179,12 +178,12 @@
public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn);
}
- LauncherModel(LauncherAppState app, IconCache iconCache) {
+ LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) {
final Context context = app.getContext();
mAppsCanBeOnRemoveableStorage = Environment.isExternalStorageRemovable();
mApp = app;
- mBgAllAppsList = new AllAppsList(iconCache);
+ mBgAllAppsList = new AllAppsList(iconCache, appFilter);
mIconCache = iconCache;
mDefaultIcon = Utilities.createIconBitmap(
@@ -319,8 +318,10 @@
continue;
}
- // Add this icon to the db, creating a new page if necessary
- int startSearchPageIndex = 1;
+ // Add this icon to the db, creating a new page if necessary. If there
+ // is only the empty page then we just add items to the first page.
+ // Otherwise, we add them to the next pages.
+ int startSearchPageIndex = workspaceScreens.isEmpty() ? 0 : 1;
Pair<Long, int[]> coords = LauncherModel.findNextAvailableIconSpace(context,
name, launchIntent, startSearchPageIndex, workspaceScreens);
if (coords == null) {
@@ -694,6 +695,7 @@
*/
static void modifyItemInDatabase(Context context, final ItemInfo item, final long container,
final long screenId, final int cellX, final int cellY, final int spanX, final int spanY) {
+ item.container = container;
item.cellX = cellX;
item.cellY = cellY;
item.spanX = spanX;
@@ -1621,6 +1623,7 @@
final ArrayList<Long> itemsToRemove = new ArrayList<Long>();
final Uri contentUri = LauncherSettings.Favorites.CONTENT_URI;
+ if (DEBUG_LOADERS) Log.d(TAG, "loading model from " + contentUri);
final Cursor c = contentResolver.query(contentUri, null, null, null, null);
// +1 for the hotseat (it can be larger than the workspace)
@@ -2396,11 +2399,9 @@
// Create the ApplicationInfos
for (int i = 0; i < apps.size(); i++) {
ResolveInfo app = apps.get(i);
- if (oldCallbacks.shouldShowApp(app)) {
- // This builds the icon bitmaps.
- mBgAllAppsList.add(new AppInfo(packageManager, app,
- mIconCache, mLabelCache));
- }
+ // This builds the icon bitmaps.
+ mBgAllAppsList.add(new AppInfo(packageManager, app,
+ mIconCache, mLabelCache));
}
// Huh? Shouldn't this be inside the Runnable below?
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 471d2d2..d0f6770 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -49,8 +49,8 @@
import android.util.Log;
import android.util.Xml;
-import com.android.launcher3.LauncherSettings.BaseLauncherColumns;
import com.android.launcher3.LauncherSettings.Favorites;
+import com.android.launcher3.config.ProviderConfig;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -69,7 +69,7 @@
private static final int DATABASE_VERSION = 15;
static final String OLD_AUTHORITY = "com.android.launcher2.settings";
- static final String AUTHORITY = "com.android.launcher3.settings";
+ static final String AUTHORITY = ProviderConfig.AUTHORITY;
static final String TABLE_FAVORITES = "favorites";
static final String TABLE_WORKSPACE_SCREENS = "workspaceScreens";
@@ -210,7 +210,7 @@
}
// always notify the backup agent
- LauncherBackupAgent.dataChanged(getContext());
+ LauncherBackupAgentHelper.dataChanged(getContext());
}
private void addModifiedTime(ContentValues values) {
@@ -296,6 +296,7 @@
private static final String TAG_SHORTCUT = "shortcut";
private static final String TAG_FOLDER = "folder";
private static final String TAG_EXTRA = "extra";
+ private static final String TAG_INCLUDE = "include";
private final Context mContext;
private final AppWidgetHost mAppWidgetHost;
@@ -1011,6 +1012,8 @@
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ContentValues values = new ContentValues();
+ if (LOGD) Log.v(TAG, String.format("Loading favorites from resid=0x%08x", workspaceResourceId));
+
PackageManager packageManager = mContext.getPackageManager();
int i = 0;
try {
@@ -1031,6 +1034,30 @@
boolean added = false;
final String name = parser.getName();
+ if (TAG_INCLUDE.equals(name)) {
+ final TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Include);
+
+ final int resId = a.getResourceId(R.styleable.Include_workspace, 0);
+
+ if (LOGD) Log.v(TAG, String.format(("%" + (2*(depth+1)) + "s<include workspace=%08x>"),
+ "", resId));
+
+ if (resId != 0 && resId != workspaceResourceId) {
+ // recursively load some more favorites, why not?
+ i += loadFavorites(db, resId);
+ added = false;
+ mMaxItemId = -1;
+ } else {
+ Log.w(TAG, String.format("Skipping <include workspace=0x%08x>", resId));
+ }
+
+ a.recycle();
+
+ if (LOGD) Log.v(TAG, String.format(("%" + (2*(depth+1)) + "s</include>"), ""));
+ continue;
+ }
+
+ // Assuming it's a <favorite> at this point
TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Favorite);
long container = LauncherSettings.Favorites.CONTAINER_DESKTOP;
@@ -1048,6 +1075,17 @@
values.put(LauncherSettings.Favorites.CELLX, x);
values.put(LauncherSettings.Favorites.CELLY, y);
+ if (LOGD) {
+ final String title = a.getString(R.styleable.Favorite_title);
+ final String pkg = a.getString(R.styleable.Favorite_packageName);
+ final String something = title != null ? title : pkg;
+ Log.v(TAG, String.format(
+ ("%" + (2*(depth+1)) + "s<%s%s c=%d s=%s x=%s y=%s>"),
+ "", name,
+ (something == null ? "" : (" \"" + something + "\"")),
+ container, screen, x, y));
+ }
+
if (TAG_FAVORITE.equals(name)) {
long id = addAppShortcut(db, values, a, packageManager, intent);
added = id >= 0;
@@ -1087,6 +1125,13 @@
values.clear();
values.put(LauncherSettings.Favorites.CONTAINER, folderId);
+ if (LOGD) {
+ final String pkg = ar.getString(R.styleable.Favorite_packageName);
+ final String uri = ar.getString(R.styleable.Favorite_uri);
+ Log.v(TAG, String.format(("%" + (2*(folderDepth+1)) + "s<%s \"%s\">"), "",
+ folder_item_name, uri != null ? uri : pkg));
+ }
+
if (TAG_FAVORITE.equals(folder_item_name) && folderId >= 0) {
long id =
addAppShortcut(db, values, ar, packageManager, intent);
diff --git a/src/com/android/launcher3/LauncherViewPropertyAnimator.java b/src/com/android/launcher3/LauncherViewPropertyAnimator.java
index 8a9c35d..4cafbbf 100644
--- a/src/com/android/launcher3/LauncherViewPropertyAnimator.java
+++ b/src/com/android/launcher3/LauncherViewPropertyAnimator.java
@@ -35,7 +35,8 @@
ALPHA,
START_DELAY,
DURATION,
- INTERPOLATOR
+ INTERPOLATOR,
+ WITH_LAYER
}
EnumSet<Properties> mPropertiesToSet = EnumSet.noneOf(Properties.class);
ViewPropertyAnimator mViewPropertyAnimator;
@@ -223,6 +224,9 @@
if (mPropertiesToSet.contains(Properties.INTERPOLATOR)) {
mViewPropertyAnimator.setInterpolator(mInterpolator);
}
+ if (mPropertiesToSet.contains(Properties.WITH_LAYER)) {
+ mViewPropertyAnimator.withLayer();
+ }
mViewPropertyAnimator.setListener(this);
mViewPropertyAnimator.start();
LauncherAnimUtils.cancelOnDestroyActivity(this);
@@ -263,4 +267,9 @@
mAlpha = value;
return this;
}
+
+ public LauncherViewPropertyAnimator withLayer() {
+ mPropertiesToSet.add(Properties.WITH_LAYER);
+ return this;
+ }
}
diff --git a/src/com/android/launcher3/LiveWallpaperListAdapter.java b/src/com/android/launcher3/LiveWallpaperListAdapter.java
index e9e5e79..54e0af7 100644
--- a/src/com/android/launcher3/LiveWallpaperListAdapter.java
+++ b/src/com/android/launcher3/LiveWallpaperListAdapter.java
@@ -85,7 +85,7 @@
View view;
if (convertView == null) {
- view = mInflater.inflate(R.layout.live_wallpaper_picker_item, parent, false);
+ view = mInflater.inflate(R.layout.wallpaper_picker_live_wallpaper_item, parent, false);
} else {
view = convertView;
}
@@ -93,6 +93,7 @@
WallpaperPickerActivity.setWallpaperItemPaddingToZero((FrameLayout) view);
LiveWallpaperTile wallpaperInfo = mWallpapers.get(position);
+ wallpaperInfo.setView(view);
ImageView image = (ImageView) view.findViewById(R.id.wallpaper_image);
ImageView icon = (ImageView) view.findViewById(R.id.wallpaper_icon);
if (wallpaperInfo.mThumbnail != null) {
@@ -174,46 +175,10 @@
Intent launchIntent = new Intent(WallpaperService.SERVICE_INTERFACE);
launchIntent.setClassName(info.getPackageName(), info.getServiceName());
LiveWallpaperTile wallpaper = new LiveWallpaperTile(thumb, info, launchIntent);
-
- // TODO: generate a default thumb
- /*
- final Resources res = mContext.getResources();
- Canvas canvas = new Canvas();
- Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
- paint.setTextAlign(Paint.Align.CENTER);
- BitmapDrawable galleryIcon = (BitmapDrawable) res.getDrawable(
- R.drawable.livewallpaper_placeholder);
- if (thumb == null) {
- int thumbWidth = res.getDimensionPixelSize(
- R.dimen.live_wallpaper_thumbnail_width);
- int thumbHeight = res.getDimensionPixelSize(
- R.dimen.live_wallpaper_thumbnail_height);
-
- Bitmap thumbnail = Bitmap.createBitmap(thumbWidth, thumbHeight,
- Bitmap.Config.ARGB_8888);
-
- paint.setColor(res.getColor(R.color.live_wallpaper_thumbnail_background));
- canvas.setBitmap(thumbnail);
- canvas.drawPaint(paint);
-
- galleryIcon.setBounds(0, 0, thumbWidth, thumbHeight);
- galleryIcon.setGravity(Gravity.CENTER);
- galleryIcon.draw(canvas);
-
- String title = info.loadLabel(packageManager).toString();
-
- paint.setColor(res.getColor(R.color.live_wallpaper_thumbnail_text_color));
- paint.setTextSize(
- res.getDimensionPixelSize(R.dimen.live_wallpaper_thumbnail_text_size));
-
- canvas.drawText(title, (int) (thumbWidth * 0.5),
- thumbHeight - res.getDimensionPixelSize(
- R.dimen.live_wallpaper_thumbnail_text_offset), paint);
-
- thumb = new BitmapDrawable(res, thumbnail);
- }*/
publishProgress(wallpaper);
}
+ // Send a null object to show loading is finished
+ publishProgress((LiveWallpaperTile) null);
return null;
}
@@ -221,6 +186,10 @@
@Override
protected void onProgressUpdate(LiveWallpaperTile...infos) {
for (LiveWallpaperTile info : infos) {
+ if (info == null) {
+ LiveWallpaperListAdapter.this.notifyDataSetChanged();
+ break;
+ }
info.mThumbnail.setDither(true);
if (mWallpaperPosition < mWallpapers.size()) {
mWallpapers.set(mWallpaperPosition, info);
@@ -228,9 +197,6 @@
mWallpapers.add(info);
}
mWallpaperPosition++;
- if (mWallpaperPosition == getCount()) {
- LiveWallpaperListAdapter.this.notifyDataSetChanged();
- }
}
}
}
diff --git a/src/com/android/launcher3/MarketUpdateReceiver.java b/src/com/android/launcher3/MarketUpdateReceiver.java
deleted file mode 100644
index c41bf3e..0000000
--- a/src/com/android/launcher3/MarketUpdateReceiver.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2013 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.launcher3;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.util.Log;
-
-public class MarketUpdateReceiver extends BroadcastReceiver {
- private static final String TAG = "MarketUpdateReceiver";
-
- private static final String ACTION_PACKAGE_ENQUEUED =
- "com.android.launcher.action.ACTION_PACKAGE_ENQUEUED";
- private static final String ACTION_PACKAGE_DOWNLOADING =
- "com.android.launcher.action.ACTION_PACKAGE_DOWNLOADING";
- private static final String ACTION_PACKAGE_INSTALLING =
- "com.android.launcher.action.ACTION_PACKAGE_INSTALLING";
- private static final String ACTION_PACKAGE_DEQUEUED =
- "com.android.launcher.action.ACTION_PACKAGE_DEQUEUED";
-
- /** extra for {@link #ACTION_PACKAGE_ENQUEUED}, send on of the following values **/
- private static final String EXTRA_KEY_REASON = "reason";
- private static final String EXTRA_VALUE_REASON_INSTALL = "install";
- private static final String EXTRA_VALUE_REASON_UPDATE = "update";
- private static final String EXTRA_VALUE_REASON_RESTORE = "restore";
-
- /** extra for {@link #ACTION_PACKAGE_DOWNLOADING}, send an int in the range [0-100]. **/
- private static final String EXTRA_KEY_PROGRESS = "progress";
-
- /**
- * extra for {@link #ACTION_PACKAGE_DEQUEUED}
- * send {@link android.app.Activity#RESULT_OK} on success.
- * or {@link android.app.Activity#RESULT_CANCELED} if the package was abandoned.
- * **/
- private static final String EXTRA_KEY_STATUS =
- "com.android.launcher.action.EXTRA_STATUS";
-
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- String pkgName = "none";
- Uri uri = intent.getData();
- if (uri != null) {
- pkgName = uri.getSchemeSpecificPart();;
- }
- if (ACTION_PACKAGE_ENQUEUED.equals(action)) {
- String reason = "unknown";
- if (intent.hasExtra(EXTRA_KEY_REASON)) {
- reason = intent.getStringExtra(EXTRA_KEY_REASON);
- }
- Log.d(TAG, "market has promised to " + reason + ": " + pkgName);
- } else if (ACTION_PACKAGE_DOWNLOADING.equals(action)) {
- int progress = intent.getIntExtra(EXTRA_KEY_PROGRESS, 0);
- Log.d(TAG, "market is downloading (" + progress + "%): " + pkgName);
- } else if (ACTION_PACKAGE_INSTALLING.equals(action)) {
- Log.d(TAG, "market is installing: " + pkgName);
- } else if ( ACTION_PACKAGE_DEQUEUED.equals(action)) {
- boolean success = Activity.RESULT_OK == intent.getIntExtra(EXTRA_KEY_STATUS,
- Activity.RESULT_CANCELED);
- if (success) {
- Log.d(TAG, "market has installed: " + pkgName);
- } else {
- Log.d(TAG, "market has decided not to install: " + pkgName);
- }
- } else {
- Log.d(TAG, "unknown message " + action);
- }
- }
-}
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index 8cdd8e2..e982985 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -32,6 +32,7 @@
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
+import android.support.v4.view.accessibility.AccessibilityEventCompat;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -96,6 +97,8 @@
private static final boolean DISABLE_TOUCH_SIDE_PAGES = true;
private static final boolean DISABLE_FLING_TO_DELETE = true;
+ public static final int INVALID_RESTORE_PAGE = -1001;
+
private boolean mFreeScroll = false;
private int mFreeScrollMinScrollX = -1;
private int mFreeScrollMaxScrollX = -1;
@@ -114,7 +117,7 @@
private int mNormalChildHeight;
protected int mCurrentPage;
- protected int mRestorePage = -1;
+ protected int mRestorePage = INVALID_RESTORE_PAGE;
protected int mChildCountOnLastLayout;
protected int mNextPage = INVALID_PAGE;
@@ -265,6 +268,8 @@
protected final Rect mInsets = new Rect();
+ protected int mFirstChildLeft;
+
public interface PageSwitchListener {
void onPageSwitch(View newPage, int newPageIndex);
}
@@ -332,6 +337,8 @@
}
protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
// Hook up the page indicator
ViewGroup parent = (ViewGroup) getParent();
if (mPageIndicator == null && mPageIndicatorViewId > -1) {
@@ -345,9 +352,23 @@
}
mPageIndicator.addMarkers(markers, mAllowPagedViewAnimations);
+
+ OnClickListener listener = getPageIndicatorClickListener();
+ if (listener != null) {
+ mPageIndicator.setOnClickListener(listener);
+ }
+ mPageIndicator.setContentDescription(getPageIndicatorDescription());
}
}
+ protected String getPageIndicatorDescription() {
+ return getCurrentPageDescription();
+ }
+
+ protected OnClickListener getPageIndicatorClickListener() {
+ return null;
+ }
+
protected void onDetachedFromWindow() {
// Unhook the page indicator
mPageIndicator = null;
@@ -518,13 +539,15 @@
void setCurrentPage(int currentPage) {
if (!mScroller.isFinished()) {
mScroller.abortAnimation();
+ // We need to clean up the next page here to avoid computeScrollHelper from
+ // updating current page on the pass.
+ mNextPage = INVALID_PAGE;
}
// don't introduce any checks like mCurrentPage == currentPage here-- if we change the
// the default
if (getChildCount() == 0) {
return;
}
-
mForceScreenScrolled = true;
mCurrentPage = Math.max(0, Math.min(currentPage, getPageCount() - 1));
updateCurrentPageScroll();
@@ -644,6 +667,27 @@
}
}
+ private void sendScrollAccessibilityEvent() {
+ AccessibilityManager am =
+ (AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+ if (am.isEnabled()) {
+ AccessibilityEvent ev =
+ AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED);
+ ev.setItemCount(getChildCount());
+ ev.setFromIndex(mCurrentPage);
+
+ final int action;
+ if (getNextPage() >= mCurrentPage) {
+ action = AccessibilityNodeInfo.ACTION_SCROLL_FORWARD;
+ } else {
+ action = AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD;
+ }
+
+ ev.setAction(action);
+ sendAccessibilityEventUnchecked(ev);
+ }
+ }
+
// we moved this functionality to a helper function so SmoothPagedView can reuse it
protected boolean computeScrollHelper() {
if (mScroller.computeScrollOffset()) {
@@ -658,6 +702,8 @@
invalidate();
return true;
} else if (mNextPage != INVALID_PAGE) {
+ sendScrollAccessibilityEvent();
+
mCurrentPage = Math.max(0, Math.min(mNextPage, getPageCount() - 1));
mNextPage = INVALID_PAGE;
notifyPageSwitchListener();
@@ -675,14 +721,11 @@
}
onPostReorderingAnimationCompleted();
- // Notify the user when the page changes
- AccessibilityManager accessibilityManager = (AccessibilityManager)
+ AccessibilityManager am = (AccessibilityManager)
getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
- if (accessibilityManager.isEnabled()) {
- AccessibilityEvent ev =
- AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED);
- ev.getText().add(getCurrentPageDescription());
- sendAccessibilityEventUnchecked(ev);
+ if (am.isEnabled()) {
+ // Notify the user when the page changes
+ announceForAccessibility(getCurrentPageDescription());
}
return true;
}
@@ -788,48 +831,50 @@
for (int i = 0; i < childCount; i++) {
// disallowing padding in paged view (just pass 0)
final View child = getPageAt(i);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (child.getVisibility() != GONE) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- int childWidthMode;
- int childHeightMode;
- int childWidth;
- int childHeight;
+ int childWidthMode;
+ int childHeightMode;
+ int childWidth;
+ int childHeight;
- if (!lp.isFullScreenPage) {
- if (lp.width == LayoutParams.WRAP_CONTENT) {
- childWidthMode = MeasureSpec.AT_MOST;
+ if (!lp.isFullScreenPage) {
+ if (lp.width == LayoutParams.WRAP_CONTENT) {
+ childWidthMode = MeasureSpec.AT_MOST;
+ } else {
+ childWidthMode = MeasureSpec.EXACTLY;
+ }
+
+ if (lp.height == LayoutParams.WRAP_CONTENT) {
+ childHeightMode = MeasureSpec.AT_MOST;
+ } else {
+ childHeightMode = MeasureSpec.EXACTLY;
+ }
+
+ childWidth = widthSize - horizontalPadding;
+ childHeight = heightSize - verticalPadding - mInsets.top - mInsets.bottom;
+ mNormalChildHeight = childHeight;
+
} else {
childWidthMode = MeasureSpec.EXACTLY;
- }
-
- if (lp.height == LayoutParams.WRAP_CONTENT) {
- childHeightMode = MeasureSpec.AT_MOST;
- } else {
childHeightMode = MeasureSpec.EXACTLY;
+
+ if (mUseMinScale) {
+ childWidth = getViewportWidth();
+ childHeight = getViewportHeight();
+ } else {
+ childWidth = widthSize - getPaddingLeft() - getPaddingRight();
+ childHeight = heightSize - getPaddingTop() - getPaddingBottom();
+ }
}
- childWidth = widthSize - horizontalPadding;
- childHeight = heightSize - verticalPadding - mInsets.top - mInsets.bottom;
- mNormalChildHeight = childHeight;
-
- } else {
- childWidthMode = MeasureSpec.EXACTLY;
- childHeightMode = MeasureSpec.EXACTLY;
-
- if (mUseMinScale) {
- childWidth = getViewportWidth();
- childHeight = getViewportHeight();
- } else {
- childWidth = widthSize - getPaddingLeft() - getPaddingRight();
- childHeight = heightSize - getPaddingTop() - getPaddingBottom();
- }
+ final int childWidthMeasureSpec =
+ MeasureSpec.makeMeasureSpec(childWidth, childWidthMode);
+ final int childHeightMeasureSpec =
+ MeasureSpec.makeMeasureSpec(childHeight, childHeightMode);
+ child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
-
- final int childWidthMeasureSpec =
- MeasureSpec.makeMeasureSpec(childWidth, childWidthMode);
- final int childHeightMeasureSpec =
- MeasureSpec.makeMeasureSpec(childHeight, childHeightMode);
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
setMeasuredDimension(scaledWidthSize, scaledHeightSize);
@@ -854,6 +899,10 @@
requestLayout();
}
+ protected int getFirstChildLeft() {
+ return mFirstChildLeft;
+ }
+
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
if (!mIsDataReady || getChildCount() == 0) {
@@ -878,26 +927,26 @@
final int delta = isRtl ? -1 : 1;
int verticalPadding = getPaddingTop() + getPaddingBottom();
- int childLeft = offsetX + (screenWidth - getChildWidth(startIndex)) / 2;
+ int childLeft = mFirstChildLeft = offsetX + (screenWidth - getChildWidth(startIndex)) / 2;
if (mPageScrolls == null || getChildCount() != mChildCountOnLastLayout) {
mPageScrolls = new int[getChildCount()];
}
for (int i = startIndex; i != endIndex; i += delta) {
final View child = getPageAt(i);
- LayoutParams lp = (LayoutParams) child.getLayoutParams();
- int childTop;
- if (lp.isFullScreenPage) {
- childTop = offsetY;
- } else {
- childTop = offsetY + getPaddingTop() + mInsets.top;
- if (mCenterPagesVertically) {
- childTop += (getViewportHeight() - mInsets.top - mInsets.bottom - verticalPadding - child.getMeasuredHeight()) / 2;
- }
- }
-
if (child.getVisibility() != View.GONE) {
+ LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ int childTop;
+ if (lp.isFullScreenPage) {
+ childTop = offsetY;
+ } else {
+ childTop = offsetY + getPaddingTop() + mInsets.top;
+ if (mCenterPagesVertically) {
+ childTop += (getViewportHeight() - mInsets.top - mInsets.bottom - verticalPadding - child.getMeasuredHeight()) / 2;
+ }
+ }
+
final int childWidth = child.getMeasuredWidth();
final int childHeight = child.getMeasuredHeight();
@@ -925,12 +974,6 @@
mFirstLayout = false;
}
- if (isPageMoving()) {
- // If the page is moving, then snap it to the final position to ensure we don't get
- // stuck between pages
- snapToDestination();
- }
-
if (childCount > 0) {
final int index = isLayoutRtl() ? 0 : childCount - 1;
mMaxScrollX = getScrollForPage(index);
@@ -940,9 +983,9 @@
if (mScroller.isFinished() && mChildCountOnLastLayout != getChildCount() &&
!mDeferringForDelete) {
- if (mRestorePage > -1) {
+ if (mRestorePage != INVALID_RESTORE_PAGE) {
setCurrentPage(mRestorePage);
- mRestorePage = -1;
+ mRestorePage = INVALID_RESTORE_PAGE;
} else {
setCurrentPage(getNextPage());
}
@@ -993,13 +1036,14 @@
// in accordance with any scroll effects.
mForceScreenScrolled = true;
mRecomputePageSpacing = true;
-
+ updateFreescrollBounds();
invalidate();
}
@Override
public void onChildViewRemoved(View parent, View child) {
mForceScreenScrolled = true;
+ updateFreescrollBounds();
invalidate();
}
@@ -1053,7 +1097,7 @@
protected void getOverviewModePages(int[] range) {
range[0] = 0;
- range[1] = getChildCount() - 1;
+ range[1] = Math.max(0, getChildCount() - 1);
}
protected void getVisiblePages(int[] range) {
@@ -1478,13 +1522,26 @@
}
public int getScrollForPage(int index) {
- if (mPageScrolls == null || index >= mPageScrolls.length) {
+ if (mPageScrolls == null || index >= mPageScrolls.length || index < 0) {
return 0;
} else {
return mPageScrolls[index];
}
}
+ // While layout transitions are occurring, a child's position may stray from its baseline
+ // position. This method returns the magnitude of this stray at any given time.
+ public int getLayoutTransitionOffsetForPage(int index) {
+ if (mPageScrolls == null || index >= mPageScrolls.length || index < 0) {
+ return 0;
+ } else {
+ View child = getChildAt(index);
+ int scrollOffset = (getViewportWidth() - child.getMeasuredWidth()) / 2;
+ int baselineX = mPageScrolls[index] + scrollOffset + getViewportOffsetX();
+ return (int) (child.getX() - baselineX);
+ }
+ }
+
// This curve determines how the effect of scrolling over the limits of the page dimishes
// as the user pulls further and further from the bounds
private float overScrollInfluenceCurve(float f) {
@@ -1561,6 +1618,17 @@
setEnableFreeScroll(false, snapPage);
}
+ void updateFreescrollBounds() {
+ getOverviewModePages(mTempVisiblePagesRange);
+ if (isLayoutRtl()) {
+ mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
+ mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
+ } else {
+ mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
+ mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
+ }
+ }
+
private void setEnableFreeScroll(boolean freeScroll, int snapPage) {
mFreeScroll = freeScroll;
@@ -1568,18 +1636,11 @@
snapPage = getPageNearestToCenterOfScreen();
}
- getOverviewModePages(mTempVisiblePagesRange);
if (!mFreeScroll) {
snapToPage(snapPage);
} else {
- if (isLayoutRtl()) {
- mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
- mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
- } else {
- mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
- mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
- }
-
+ updateFreescrollBounds();
+ getOverviewModePages(mTempVisiblePagesRange);
if (getCurrentPage() < mTempVisiblePagesRange[0]) {
setCurrentPage(mTempVisiblePagesRange[0]);
} else if (getCurrentPage() > mTempVisiblePagesRange[1]) {
@@ -2125,6 +2186,8 @@
focusedChild.clearFocus();
}
+ sendScrollAccessibilityEvent();
+
pageBeginMoving();
awakenScrollBars(duration);
if (immediate) {
@@ -2153,19 +2216,11 @@
}
public void scrollLeft() {
- if (mScroller.isFinished()) {
- if (mCurrentPage > 0) snapToPage(mCurrentPage - 1);
- } else {
- if (mNextPage > 0) snapToPage(mNextPage - 1);
- }
+ if (getNextPage() > 0) snapToPage(getNextPage() - 1);
}
public void scrollRight() {
- if (mScroller.isFinished()) {
- if (mCurrentPage < getChildCount() -1) snapToPage(mCurrentPage + 1);
- } else {
- if (mNextPage < getChildCount() -1) snapToPage(mNextPage + 1);
- }
+ if (getNextPage() < getChildCount() -1) snapToPage(getNextPage() + 1);
}
public int getPageForView(View v) {
@@ -2332,6 +2387,11 @@
loadAssociatedPages(mCurrentPage, immediateAndOnly);
requestLayout();
}
+ if (isPageMoving()) {
+ // If the page is moving, then snap it to the final position to ensure we don't get
+ // stuck between pages
+ snapToDestination();
+ }
}
// Animate the drag view back to the original position
@@ -2711,14 +2771,17 @@
}
@Override
+ public void sendAccessibilityEvent(int eventType) {
+ // Don't let the view send real scroll events.
+ if (eventType != AccessibilityEvent.TYPE_VIEW_SCROLLED) {
+ super.sendAccessibilityEvent(eventType);
+ }
+ }
+
+ @Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
event.setScrollable(true);
- if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
- event.setFromIndex(mCurrentPage);
- event.setToIndex(mCurrentPage);
- event.setItemCount(getChildCount());
- }
}
@Override
diff --git a/src/com/android/launcher3/PagedViewIcon.java b/src/com/android/launcher3/PagedViewIcon.java
index c6d5e49..8bfe42d 100644
--- a/src/com/android/launcher3/PagedViewIcon.java
+++ b/src/com/android/launcher3/PagedViewIcon.java
@@ -69,7 +69,8 @@
PagedViewIcon.PressedCallback cb) {
mIcon = info.iconBitmap;
mPressedCallback = cb;
- setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null);
+ setCompoundDrawables(null, Utilities.createIconDrawable(mIcon),
+ null, null);
setText(info.title);
setTag(info);
}
diff --git a/src/com/android/launcher3/SavedWallpaperImages.java b/src/com/android/launcher3/SavedWallpaperImages.java
index 531672a..8d5b005 100644
--- a/src/com/android/launcher3/SavedWallpaperImages.java
+++ b/src/com/android/launcher3/SavedWallpaperImages.java
@@ -61,7 +61,9 @@
String imageFilename = a.getSavedImages().getImageFilename(mDbId);
File file = new File(a.getFilesDir(), imageFilename);
CropView v = a.getCropView();
- v.setTileSource(new BitmapRegionTileSource(a, file.getAbsolutePath(), 1024, 0), null);
+ int rotation = WallpaperCropActivity.getRotationFromExif(file.getAbsolutePath());
+ v.setTileSource(
+ new BitmapRegionTileSource(a, file.getAbsolutePath(), 1024, rotation), null);
v.moveToLeft();
v.setTouchEnabled(false);
}
@@ -79,6 +81,10 @@
public boolean isSelectable() {
return true;
}
+ @Override
+ public boolean isNamelessWallpaper() {
+ return true;
+ }
}
public SavedWallpaperImages(Activity context) {
diff --git a/src/com/android/launcher3/SearchDropTargetBar.java b/src/com/android/launcher3/SearchDropTargetBar.java
index e681aa1..435dbda 100644
--- a/src/com/android/launcher3/SearchDropTargetBar.java
+++ b/src/com/android/launcher3/SearchDropTargetBar.java
@@ -138,7 +138,8 @@
* Shows and hides the search bar.
*/
public void showSearchBar(boolean animated) {
- if (!mIsSearchBarHidden) return;
+ boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated;
+ if (!mIsSearchBarHidden && !needToCancelOngoingAnimation) return;
if (animated) {
prepareStartAnimation(mQSBSearchBar);
mQSBSearchBarAnim.reverse();
@@ -153,7 +154,8 @@
mIsSearchBarHidden = false;
}
public void hideSearchBar(boolean animated) {
- if (mIsSearchBarHidden) return;
+ boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated;
+ if (mIsSearchBarHidden && !needToCancelOngoingAnimation) return;
if (animated) {
prepareStartAnimation(mQSBSearchBar);
mQSBSearchBarAnim.start();
diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java
index b951100..bb5601e 100644
--- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java
+++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java
@@ -103,7 +103,9 @@
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
- measureChild(child);
+ if (child.getVisibility() != GONE) {
+ measureChild(child);
+ }
}
}
@@ -121,6 +123,20 @@
mIsHotseatLayout = isHotseat;
}
+ int getCellContentWidth() {
+ final LauncherAppState app = LauncherAppState.getInstance();
+ final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+ return Math.min(getMeasuredHeight(), mIsHotseatLayout ?
+ grid.hotseatCellWidthPx: grid.cellWidthPx);
+ }
+
+ int getCellContentHeight() {
+ final LauncherAppState app = LauncherAppState.getInstance();
+ final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+ return Math.min(getMeasuredHeight(), mIsHotseatLayout ?
+ grid.hotseatCellHeightPx : grid.cellHeightPx);
+ }
+
public void measureChild(View child) {
final LauncherAppState app = LauncherAppState.getInstance();
final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
@@ -135,7 +151,7 @@
// Widgets have their own padding, so skip
} else {
// Otherwise, center the icon
- int cHeight = mIsHotseatLayout ? grid.hotseatCellHeightPx : Math.min(getMeasuredHeight(), grid.cellHeightPx);
+ int cHeight = getCellContentHeight();
int cellPaddingY = (int) Math.max(0, ((lp.height - cHeight) / 2f));
int cellPaddingX = (int) (grid.edgeMarginPx / 2f);
child.setPadding(cellPaddingX, cellPaddingY, cellPaddingX, 0);
diff --git a/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java b/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java
index 7ed1c1b..494694c 100644
--- a/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java
+++ b/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java
@@ -22,6 +22,8 @@
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -38,8 +40,10 @@
private final LayoutInflater mInflater;
private final PackageManager mPackageManager;
+ private final int mIconSize;
- private List<ResolveInfo> mThirdPartyWallpaperPickers = new ArrayList<ResolveInfo>();
+ private List<ThirdPartyWallpaperTile> mThirdPartyWallpaperPickers =
+ new ArrayList<ThirdPartyWallpaperTile>();
public static class ThirdPartyWallpaperTile extends WallpaperPickerActivity.WallpaperTileInfo {
private ResolveInfo mResolveInfo;
@@ -60,6 +64,7 @@
public ThirdPartyWallpaperPickerListAdapter(Context context) {
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mPackageManager = context.getPackageManager();
+ mIconSize = context.getResources().getDimensionPixelSize(R.dimen.wallpaperItemIconSize);
final PackageManager pm = mPackageManager;
final Intent pickWallpaperIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
@@ -96,7 +101,7 @@
continue outerLoop;
}
}
- mThirdPartyWallpaperPickers.add(info);
+ mThirdPartyWallpaperPickers.add(new ThirdPartyWallpaperTile(info));
}
}
@@ -104,7 +109,7 @@
return mThirdPartyWallpaperPickers.size();
}
- public ResolveInfo getItem(int position) {
+ public ThirdPartyWallpaperTile getItem(int position) {
return mThirdPartyWallpaperPickers.get(position);
}
@@ -116,18 +121,19 @@
View view;
if (convertView == null) {
- view = mInflater.inflate(R.layout.third_party_wallpaper_picker_item, parent, false);
+ view = mInflater.inflate(R.layout.wallpaper_picker_third_party_item, parent, false);
} else {
view = convertView;
}
WallpaperPickerActivity.setWallpaperItemPaddingToZero((FrameLayout) view);
- ResolveInfo info = mThirdPartyWallpaperPickers.get(position);
+ ResolveInfo info = mThirdPartyWallpaperPickers.get(position).mResolveInfo;
TextView label = (TextView) view.findViewById(R.id.wallpaper_item_label);
label.setText(info.loadLabel(mPackageManager));
- label.setCompoundDrawablesWithIntrinsicBounds(
- null, info.loadIcon(mPackageManager), null, null);
+ Drawable icon = info.loadIcon(mPackageManager);
+ icon.setBounds(new Rect(0, 0, mIconSize, mIconSize));
+ label.setCompoundDrawables(null, icon, null, null);
return view;
}
}
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 4a8a237..21c546d 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -48,8 +48,8 @@
private static int sIconWidth = -1;
private static int sIconHeight = -1;
- private static int sIconTextureWidth = -1;
- private static int sIconTextureHeight = -1;
+ public static int sIconTextureWidth = -1;
+ public static int sIconTextureHeight = -1;
private static final Paint sBlurPaint = new Paint();
private static final Paint sGlowColorPressedPaint = new Paint();
@@ -66,6 +66,23 @@
static int sColorIndex = 0;
/**
+ * Returns a FastBitmapDrawable with the icon, accurately sized.
+ */
+ static Drawable createIconDrawable(Bitmap icon) {
+ FastBitmapDrawable d = new FastBitmapDrawable(icon);
+ d.setFilterBitmap(true);
+ resizeIconDrawable(d);
+ return d;
+ }
+
+ /**
+ * Resizes an icon drawable to the correct icon size.
+ */
+ static void resizeIconDrawable(Drawable icon) {
+ icon.setBounds(0, 0, sIconTextureWidth, sIconTextureHeight);
+ }
+
+ /**
* Returns a bitmap suitable for the all apps view. Used to convert pre-ICS
* icon bitmaps that are stored in the database (which were 74x74 pixels at hdpi size)
* to the proper size (48dp)
@@ -295,6 +312,23 @@
sIconTextureWidth = sIconTextureHeight = widthPx;
}
+ public static void scaleRect(Rect r, float scale) {
+ if (scale != 1.0f) {
+ r.left = (int) (r.left * scale + 0.5f);
+ r.top = (int) (r.top * scale + 0.5f);
+ r.right = (int) (r.right * scale + 0.5f);
+ r.bottom = (int) (r.bottom * scale + 0.5f);
+ }
+ }
+
+ public static void scaleRectAboutCenter(Rect r, float scale) {
+ int cx = r.centerX();
+ int cy = r.centerY();
+ r.offset(-cx, -cy);
+ Utilities.scaleRect(r, scale);
+ r.offset(cx, cy);
+ }
+
public static void startActivityForResultSafely(
Activity activity, Intent intent, int requestCode) {
try {
diff --git a/src/com/android/launcher3/WallpaperCropActivity.java b/src/com/android/launcher3/WallpaperCropActivity.java
index bc8df6c..30ec340 100644
--- a/src/com/android/launcher3/WallpaperCropActivity.java
+++ b/src/com/android/launcher3/WallpaperCropActivity.java
@@ -37,12 +37,14 @@
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.util.FloatMath;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import com.android.gallery3d.common.Utils;
+import com.android.gallery3d.exif.ExifInterface;
import com.android.photos.BitmapRegionTileSource;
import java.io.BufferedInputStream;
@@ -75,6 +77,9 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
+ if (!enableRotation()) {
+ setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
+ }
}
protected void init() {
@@ -82,10 +87,17 @@
mCropView = (CropView) findViewById(R.id.cropView);
- Intent cropIntent = this.getIntent();
+ Intent cropIntent = getIntent();
final Uri imageUri = cropIntent.getData();
- mCropView.setTileSource(new BitmapRegionTileSource(this, imageUri, 1024, 0), null);
+ if (imageUri == null) {
+ Log.e(LOGTAG, "No URI passed in intent, exiting WallpaperCropActivity");
+ finish();
+ return;
+ }
+
+ int rotation = getRotationFromExif(this, imageUri);
+ mCropView.setTileSource(new BitmapRegionTileSource(this, imageUri, 1024, rotation), null);
mCropView.setTouchEnabled(true);
// Action bar
// Show the custom action bar view
@@ -101,6 +113,10 @@
});
}
+ public boolean enableRotation() {
+ return getResources().getBoolean(R.bool.allow_rotation);
+ }
+
public static String getSharedPreferencesKey() {
return WallpaperCropActivity.class.getName();
}
@@ -161,9 +177,47 @@
return new Point(defaultWidth, defaultHeight);
}
+ public static int getRotationFromExif(String path) {
+ return getRotationFromExifHelper(path, null, 0, null, null);
+ }
+
+ public static int getRotationFromExif(Context context, Uri uri) {
+ return getRotationFromExifHelper(null, null, 0, context, uri);
+ }
+
+ public static int getRotationFromExif(Resources res, int resId) {
+ return getRotationFromExifHelper(null, res, resId, null, null);
+ }
+
+ private static int getRotationFromExifHelper(
+ String path, Resources res, int resId, Context context, Uri uri) {
+ ExifInterface ei = new ExifInterface();
+ try {
+ if (path != null) {
+ ei.readExif(path);
+ } else if (uri != null) {
+ InputStream is = context.getContentResolver().openInputStream(uri);
+ BufferedInputStream bis = new BufferedInputStream(is);
+ ei.readExif(bis);
+ } else {
+ InputStream is = res.openRawResource(resId);
+ BufferedInputStream bis = new BufferedInputStream(is);
+ ei.readExif(bis);
+ }
+ Integer ori = ei.getTagIntValue(ExifInterface.TAG_ORIENTATION);
+ if (ori != null) {
+ return ExifInterface.getRotationForOrientationValue(ori.shortValue());
+ }
+ } catch (IOException e) {
+ Log.w(LOGTAG, "Getting exif data failed", e);
+ }
+ return 0;
+ }
+
protected void setWallpaper(String filePath, final boolean finishActivityWhenDone) {
- BitmapCropTask cropTask = new BitmapCropTask(this,
- filePath, null, 0, 0, true, false, null);
+ int rotation = getRotationFromExif(filePath);
+ BitmapCropTask cropTask = new BitmapCropTask(
+ this, filePath, null, rotation, 0, 0, true, false, null);
final Point bounds = cropTask.getImageBounds();
Runnable onEndCrop = new Runnable() {
public void run() {
@@ -183,6 +237,7 @@
Resources res, int resId, final boolean finishActivityWhenDone) {
// crop this image and scale it down to the default wallpaper size for
// this device
+ int rotation = getRotationFromExif(res, resId);
Point inSize = mCropView.getSourceDimensions();
Point outSize = getDefaultWallpaperSize(getResources(),
getWindowManager());
@@ -200,8 +255,7 @@
}
};
BitmapCropTask cropTask = new BitmapCropTask(this, res, resId,
- crop, outSize.x, outSize.y,
- true, false, onEndCrop);
+ crop, rotation, outSize.x, outSize.y, true, false, onEndCrop);
cropTask.execute();
}
@@ -212,8 +266,8 @@
protected void cropImageAndSetWallpaper(Uri uri,
OnBitmapCroppedHandler onBitmapCroppedHandler, final boolean finishActivityWhenDone) {
- // Get the crop
- Point inSize = mCropView.getSourceDimensions();
+ // Get the crop
+ boolean ltr = mCropView.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
Point minDims = new Point();
Point maxDims = new Point();
@@ -225,12 +279,12 @@
int maxDim = Math.max(maxDims.x, maxDims.y);
final int minDim = Math.min(minDims.x, minDims.y);
- int defaultWidth;
+ int defaultWallpaperWidth;
if (isScreenLarge(getResources())) {
- defaultWidth = (int) (maxDim *
+ defaultWallpaperWidth = (int) (maxDim *
wallpaperTravelToScreenWidthRatio(maxDim, minDim));
} else {
- defaultWidth = Math.max((int)
+ defaultWallpaperWidth = Math.max((int)
(minDim * WALLPAPER_SCREENS_SPAN), maxDim);
}
@@ -251,16 +305,30 @@
}
// Get the crop
RectF cropRect = mCropView.getCrop();
+ int cropRotation = mCropView.getImageRotation();
float cropScale = mCropView.getWidth() / (float) cropRect.width();
+ Point inSize = mCropView.getSourceDimensions();
+ Matrix rotateMatrix = new Matrix();
+ rotateMatrix.setRotate(cropRotation);
+ float[] rotatedInSize = new float[] { inSize.x, inSize.y };
+ rotateMatrix.mapPoints(rotatedInSize);
+ rotatedInSize[0] = Math.abs(rotatedInSize[0]);
+ rotatedInSize[1] = Math.abs(rotatedInSize[1]);
+
// ADJUST CROP WIDTH
// Extend the crop all the way to the right, for parallax
- float extraSpaceToRight = inSize.x - cropRect.right;
+ // (or all the way to the left, in RTL)
+ float extraSpace = ltr ? rotatedInSize[0] - cropRect.right : cropRect.left;
// Cap the amount of extra width
- float maxExtraSpace = defaultWidth / cropScale - cropRect.width();
- extraSpaceToRight = Math.min(extraSpaceToRight, maxExtraSpace);
+ float maxExtraSpace = defaultWallpaperWidth / cropScale - cropRect.width();
+ extraSpace = Math.min(extraSpace, maxExtraSpace);
- cropRect.right += extraSpaceToRight;
+ if (ltr) {
+ cropRect.right += extraSpace;
+ } else {
+ cropRect.left -= extraSpace;
+ }
// ADJUST CROP HEIGHT
if (isPortrait) {
@@ -269,7 +337,7 @@
float extraPortraitHeight =
portraitHeight / cropScale - cropRect.height();
float expandHeight =
- Math.min(Math.min(inSize.y - cropRect.bottom, cropRect.top),
+ Math.min(Math.min(rotatedInSize[1] - cropRect.bottom, cropRect.top),
extraPortraitHeight / 2);
cropRect.top -= expandHeight;
cropRect.bottom += expandHeight;
@@ -287,7 +355,7 @@
}
};
BitmapCropTask cropTask = new BitmapCropTask(this, uri,
- cropRect, outWidth, outHeight, true, false, onEndCrop);
+ cropRect, cropRotation, outWidth, outHeight, true, false, onEndCrop);
if (onBitmapCroppedHandler != null) {
cropTask.setOnBitmapCropped(onBitmapCroppedHandler);
}
@@ -307,7 +375,7 @@
InputStream mInStream;
RectF mCropBounds = null;
int mOutWidth, mOutHeight;
- int mRotation = 0; // for now
+ int mRotation;
String mOutputFormat = "jpg"; // for now
boolean mSetWallpaper;
boolean mSaveCroppedBitmap;
@@ -318,40 +386,45 @@
boolean mNoCrop;
public BitmapCropTask(Context c, String filePath,
- RectF cropBounds, int outWidth, int outHeight,
+ RectF cropBounds, int rotation, int outWidth, int outHeight,
boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
mContext = c;
mInFilePath = filePath;
- init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
+ init(cropBounds, rotation,
+ outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
}
public BitmapCropTask(byte[] imageBytes,
- RectF cropBounds, int outWidth, int outHeight,
+ RectF cropBounds, int rotation, int outWidth, int outHeight,
boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
mInImageBytes = imageBytes;
- init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
+ init(cropBounds, rotation,
+ outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
}
public BitmapCropTask(Context c, Uri inUri,
- RectF cropBounds, int outWidth, int outHeight,
+ RectF cropBounds, int rotation, int outWidth, int outHeight,
boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
mContext = c;
mInUri = inUri;
- init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
+ init(cropBounds, rotation,
+ outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
}
public BitmapCropTask(Context c, Resources res, int inResId,
- RectF cropBounds, int outWidth, int outHeight,
+ RectF cropBounds, int rotation, int outWidth, int outHeight,
boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
mContext = c;
mInResId = inResId;
mResources = res;
- init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
+ init(cropBounds, rotation,
+ outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
}
- private void init(RectF cropBounds, int outWidth, int outHeight,
+ private void init(RectF cropBounds, int rotation, int outWidth, int outHeight,
boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
mCropBounds = cropBounds;
+ mRotation = rotation;
mOutWidth = outWidth;
mOutHeight = outHeight;
mSetWallpaper = setWallpaper;
@@ -438,6 +511,29 @@
if (mInStream != null) {
// Find crop bounds (scaled to original image size)
Rect roundedTrueCrop = new Rect();
+ Matrix rotateMatrix = new Matrix();
+ Matrix inverseRotateMatrix = new Matrix();
+ if (mRotation > 0) {
+ rotateMatrix.setRotate(mRotation);
+ inverseRotateMatrix.setRotate(-mRotation);
+
+ mCropBounds.roundOut(roundedTrueCrop);
+ mCropBounds = new RectF(roundedTrueCrop);
+
+ Point bounds = getImageBounds();
+
+ float[] rotatedBounds = new float[] { bounds.x, bounds.y };
+ rotateMatrix.mapPoints(rotatedBounds);
+ rotatedBounds[0] = Math.abs(rotatedBounds[0]);
+ rotatedBounds[1] = Math.abs(rotatedBounds[1]);
+
+ mCropBounds.offset(-rotatedBounds[0]/2, -rotatedBounds[1]/2);
+ inverseRotateMatrix.mapRect(mCropBounds);
+ mCropBounds.offset(bounds.x/2, bounds.y/2);
+
+ regenerateInputStream();
+ }
+
mCropBounds.roundOut(roundedTrueCrop);
if (roundedTrueCrop.width() <= 0 || roundedTrueCrop.height() <= 0) {
@@ -481,6 +577,12 @@
fullSize = BitmapFactory.decodeStream(mInStream, null, options);
}
if (fullSize != null) {
+ mCropBounds.left /= scaleDownSampleSize;
+ mCropBounds.top /= scaleDownSampleSize;
+ mCropBounds.bottom /= scaleDownSampleSize;
+ mCropBounds.right /= scaleDownSampleSize;
+ mCropBounds.roundOut(roundedTrueCrop);
+
crop = Bitmap.createBitmap(fullSize, roundedTrueCrop.left,
roundedTrueCrop.top, roundedTrueCrop.width(),
roundedTrueCrop.height());
@@ -492,29 +594,47 @@
failure = true;
return false;
}
- if (mOutWidth > 0 && mOutHeight > 0) {
- Matrix m = new Matrix();
- RectF cropRect = new RectF(0, 0, crop.getWidth(), crop.getHeight());
- if (mRotation > 0) {
- m.setRotate(mRotation);
- m.mapRect(cropRect);
+ if (mOutWidth > 0 && mOutHeight > 0 || mRotation > 0) {
+ float[] dimsAfter = new float[] { crop.getWidth(), crop.getHeight() };
+ rotateMatrix.mapPoints(dimsAfter);
+ dimsAfter[0] = Math.abs(dimsAfter[0]);
+ dimsAfter[1] = Math.abs(dimsAfter[1]);
+
+ if (!(mOutWidth > 0 && mOutHeight > 0)) {
+ mOutWidth = Math.round(dimsAfter[0]);
+ mOutHeight = Math.round(dimsAfter[1]);
}
+
+ RectF cropRect = new RectF(0, 0, dimsAfter[0], dimsAfter[1]);
RectF returnRect = new RectF(0, 0, mOutWidth, mOutHeight);
- m.setRectToRect(cropRect, returnRect, Matrix.ScaleToFit.FILL);
- m.preRotate(mRotation);
+
+ Matrix m = new Matrix();
+ if (mRotation == 0) {
+ m.setRectToRect(cropRect, returnRect, Matrix.ScaleToFit.FILL);
+ } else {
+ Matrix m1 = new Matrix();
+ m1.setTranslate(-crop.getWidth() / 2f, -crop.getHeight() / 2f);
+ Matrix m2 = new Matrix();
+ m2.setRotate(mRotation);
+ Matrix m3 = new Matrix();
+ m3.setTranslate(dimsAfter[0] / 2f, dimsAfter[1] / 2f);
+ Matrix m4 = new Matrix();
+ m4.setRectToRect(cropRect, returnRect, Matrix.ScaleToFit.FILL);
+
+ Matrix c1 = new Matrix();
+ c1.setConcat(m2, m1);
+ Matrix c2 = new Matrix();
+ c2.setConcat(m4, m3);
+ m.setConcat(c2, c1);
+ }
+
Bitmap tmp = Bitmap.createBitmap((int) returnRect.width(),
(int) returnRect.height(), Bitmap.Config.ARGB_8888);
if (tmp != null) {
Canvas c = new Canvas(tmp);
- c.drawBitmap(crop, m, new Paint());
- crop = tmp;
- }
- } else if (mRotation > 0) {
- Matrix m = new Matrix();
- m.setRotate(mRotation);
- Bitmap tmp = Bitmap.createBitmap(crop, 0, 0, crop.getWidth(),
- crop.getHeight(), m, true);
- if (tmp != null) {
+ Paint p = new Paint();
+ p.setFilterBitmap(true);
+ c.drawBitmap(crop, m, p);
crop = tmp;
}
}
@@ -585,8 +705,7 @@
final SharedPreferences sharedPrefs,
WindowManager windowManager,
final WallpaperManager wallpaperManager) {
- final Point defaultWallpaperSize =
- WallpaperCropActivity.getDefaultWallpaperSize(res, windowManager);
+ final Point defaultWallpaperSize = getDefaultWallpaperSize(res, windowManager);
new Thread("suggestWallpaperDimension") {
public void run() {
@@ -598,7 +717,6 @@
}.start();
}
-
protected static RectF getMaxCropRect(
int inWidth, int inHeight, int outWidth, int outHeight, boolean leftAligned) {
RectF cropRect = new RectF();
diff --git a/src/com/android/launcher3/WallpaperPickerActivity.java b/src/com/android/launcher3/WallpaperPickerActivity.java
index ef94fe8..e71a26b 100644
--- a/src/com/android/launcher3/WallpaperPickerActivity.java
+++ b/src/com/android/launcher3/WallpaperPickerActivity.java
@@ -16,6 +16,7 @@
package com.android.launcher3;
+import android.animation.Animator;
import android.animation.LayoutTransition;
import android.app.ActionBar;
import android.app.Activity;
@@ -30,6 +31,7 @@
import android.database.DataSetObserver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.Rect;
@@ -50,18 +52,26 @@
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
+import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
+import com.android.gallery3d.exif.ExifInterface;
import com.android.photos.BitmapRegionTileSource;
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
public class WallpaperPickerActivity extends WallpaperCropActivity {
@@ -77,6 +87,7 @@
private OnClickListener mThumbnailOnClickListener;
private LinearLayout mWallpapersView;
+ private View mWallpaperStrip;
private ActionMode.Callback mActionModeCallback;
private ActionMode mActionMode;
@@ -88,10 +99,20 @@
private WallpaperInfo mLiveWallpaperInfoOnPickerLaunch;
public static abstract class WallpaperTileInfo {
+ protected View mView;
+ public void setView(View v) {
+ mView = v;
+ }
public void onClick(WallpaperPickerActivity a) {}
public void onSave(WallpaperPickerActivity a) {}
public void onDelete(WallpaperPickerActivity a) {}
public boolean isSelectable() { return false; }
+ public boolean isNamelessWallpaper() { return false; }
+ public void onIndexUpdated(CharSequence label) {
+ if (isNamelessWallpaper()) {
+ mView.setContentDescription(label);
+ }
+ }
}
public static class PickImageInfo extends WallpaperTileInfo {
@@ -111,8 +132,8 @@
@Override
public void onClick(WallpaperPickerActivity a) {
CropView v = a.getCropView();
- v.setTileSource(new BitmapRegionTileSource(
- a, mUri, 1024, 0), null);
+ int rotation = WallpaperCropActivity.getRotationFromExif(a, mUri);
+ v.setTileSource(new BitmapRegionTileSource(a, mUri, 1024, rotation), null);
v.setTouchEnabled(true);
}
@Override
@@ -121,8 +142,9 @@
OnBitmapCroppedHandler h = new OnBitmapCroppedHandler() {
public void onBitmapCropped(byte[] imageBytes) {
Point thumbSize = getDefaultThumbnailSize(a.getResources());
- Bitmap thumb =
- createThumbnail(thumbSize, null, null, imageBytes, null, 0, true);
+ // rotation is set to 0 since imageBytes has already been correctly rotated
+ Bitmap thumb = createThumbnail(
+ thumbSize, null, null, imageBytes, null, 0, 0, true);
a.getSavedImages().writeImage(thumb, imageBytes);
}
};
@@ -132,6 +154,10 @@
public boolean isSelectable() {
return true;
}
+ @Override
+ public boolean isNamelessWallpaper() {
+ return true;
+ }
}
public static class ResourceWallpaperInfo extends WallpaperTileInfo {
@@ -146,8 +172,9 @@
}
@Override
public void onClick(WallpaperPickerActivity a) {
+ int rotation = WallpaperCropActivity.getRotationFromExif(mResources, mResId);
BitmapRegionTileSource source = new BitmapRegionTileSource(
- mResources, a, mResId, 1024, 0);
+ mResources, a, mResId, 1024, rotation);
CropView v = a.getCropView();
v.setTileSource(source, null);
Point wallpaperSize = WallpaperCropActivity.getDefaultWallpaperSize(
@@ -167,6 +194,14 @@
public boolean isSelectable() {
return true;
}
+ @Override
+ public boolean isNamelessWallpaper() {
+ return true;
+ }
+ }
+
+ public void setWallpaperStripYOffset(float offset) {
+ mWallpaperStrip.setPadding(0, 0, 0, (int) offset);
}
// called by onCreate; this is subclassed to overwrite WallpaperCropActivity
@@ -174,7 +209,7 @@
setContentView(R.layout.wallpaper_picker);
mCropView = (CropView) findViewById(R.id.cropView);
- final View wallpaperStrip = findViewById(R.id.wallpaper_strip);
+ mWallpaperStrip = findViewById(R.id.wallpaper_strip);
mCropView.setTouchCallback(new CropView.TouchCallback() {
LauncherViewPropertyAnimator mAnim;
@Override
@@ -182,12 +217,21 @@
if (mAnim != null) {
mAnim.cancel();
}
- if (wallpaperStrip.getTranslationY() == 0) {
+ if (mWallpaperStrip.getAlpha() == 1f) {
mIgnoreNextTap = true;
}
- mAnim = new LauncherViewPropertyAnimator(wallpaperStrip);
- mAnim.translationY(wallpaperStrip.getHeight()).alpha(0f)
- .setInterpolator(new DecelerateInterpolator(0.75f));
+ mAnim = new LauncherViewPropertyAnimator(mWallpaperStrip);
+ mAnim.alpha(0f)
+ .setDuration(150)
+ .addListener(new Animator.AnimatorListener() {
+ public void onAnimationStart(Animator animator) { }
+ public void onAnimationEnd(Animator animator) {
+ mWallpaperStrip.setVisibility(View.INVISIBLE);
+ }
+ public void onAnimationCancel(Animator animator) { }
+ public void onAnimationRepeat(Animator animator) { }
+ });
+ mAnim.setInterpolator(new AccelerateInterpolator(0.75f));
mAnim.start();
}
@Override
@@ -202,9 +246,11 @@
if (mAnim != null) {
mAnim.cancel();
}
- mAnim = new LauncherViewPropertyAnimator(wallpaperStrip);
- mAnim.translationY(0).alpha(1f)
- .setInterpolator(new DecelerateInterpolator(0.75f));
+ mWallpaperStrip.setVisibility(View.VISIBLE);
+ mAnim = new LauncherViewPropertyAnimator(mWallpaperStrip);
+ mAnim.alpha(1f)
+ .setDuration(150)
+ .setInterpolator(new DecelerateInterpolator(0.75f));
mAnim.start();
}
}
@@ -227,6 +273,10 @@
}
mSelectedThumb = v;
v.setSelected(true);
+ // TODO: Remove this once the accessibility framework and
+ // services have better support for selection state.
+ v.announceForAccessibility(
+ getString(R.string.announce_selection, v.getContentDescription()));
}
info.onClick(WallpaperPickerActivity.this);
}
@@ -270,6 +320,8 @@
public void onChanged() {
liveWallpapersView.removeAllViews();
populateWallpapersFromAdapter(liveWallpapersView, a, false, false);
+ initializeScrollForRtl();
+ updateTileIndices();
}
});
@@ -282,24 +334,32 @@
// Add a tile for the Gallery
LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
- FrameLayout galleryThumbnail = (FrameLayout) getLayoutInflater().
- inflate(R.layout.wallpaper_picker_gallery_item, masterWallpaperList, false);
- setWallpaperItemPaddingToZero(galleryThumbnail);
- masterWallpaperList.addView(galleryThumbnail, 0);
+ FrameLayout pickImageTile = (FrameLayout) getLayoutInflater().
+ inflate(R.layout.wallpaper_picker_image_picker_item, masterWallpaperList, false);
+ setWallpaperItemPaddingToZero(pickImageTile);
+ masterWallpaperList.addView(pickImageTile, 0);
// Make its background the last photo taken on external storage
Bitmap lastPhoto = getThumbnailOfLastPhoto();
if (lastPhoto != null) {
ImageView galleryThumbnailBg =
- (ImageView) galleryThumbnail.findViewById(R.id.wallpaper_image);
+ (ImageView) pickImageTile.findViewById(R.id.wallpaper_image);
galleryThumbnailBg.setImageBitmap(getThumbnailOfLastPhoto());
int colorOverlay = getResources().getColor(R.color.wallpaper_picker_translucent_gray);
galleryThumbnailBg.setColorFilter(colorOverlay, PorterDuff.Mode.SRC_ATOP);
+
}
PickImageInfo pickImageInfo = new PickImageInfo();
- galleryThumbnail.setTag(pickImageInfo);
- galleryThumbnail.setOnClickListener(mThumbnailOnClickListener);
+ pickImageTile.setTag(pickImageInfo);
+ pickImageInfo.setView(pickImageTile);
+ pickImageTile.setOnClickListener(mThumbnailOnClickListener);
+ pickImageInfo.setView(pickImageTile);
+
+ updateTileIndices();
+
+ // Update the scroll for RTL
+ initializeScrollForRtl();
// Create smooth layout transitions for when items are deleted
final LayoutTransition transitioner = new LayoutTransition();
@@ -380,6 +440,7 @@
for (View v : viewsToRemove) {
mWallpapersView.removeView(v);
}
+ updateTileIndices();
mode.finish(); // Action picked, so close the CAB
return true;
} else {
@@ -401,6 +462,27 @@
};
}
+ private void initializeScrollForRtl() {
+ final HorizontalScrollView scroll =
+ (HorizontalScrollView) findViewById(R.id.wallpaper_scroll_container);
+
+ if (scroll.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
+ final ViewTreeObserver observer = scroll.getViewTreeObserver();
+ observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+ public void onGlobalLayout() {
+ LinearLayout masterWallpaperList =
+ (LinearLayout) findViewById(R.id.master_wallpaper_list);
+ scroll.scrollTo(masterWallpaperList.getWidth(), 0);
+ scroll.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ }
+ });
+ }
+ }
+
+ public boolean enableRotation() {
+ return super.enableRotation() || Launcher.sForceEnableRotation;
+ }
+
protected Bitmap getThumbnailOfLastPhoto() {
Cursor cursor = MediaStore.Images.Media.query(getContentResolver(),
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
@@ -419,10 +501,10 @@
protected void onStop() {
super.onStop();
- final View wallpaperStrip = findViewById(R.id.wallpaper_strip);
- if (wallpaperStrip.getTranslationY() > 0) {
- wallpaperStrip.setTranslationY(0);
- wallpaperStrip.setAlpha(1f);
+ mWallpaperStrip = findViewById(R.id.wallpaper_strip);
+ if (mWallpaperStrip.getAlpha() < 1f) {
+ mWallpaperStrip.setAlpha(1f);
+ mWallpaperStrip.setVisibility(View.VISIBLE);
}
}
@@ -442,7 +524,9 @@
for (int i = 0; i < adapter.getCount(); i++) {
FrameLayout thumbnail = (FrameLayout) adapter.getView(i, null, parent);
parent.addView(thumbnail, i);
- thumbnail.setTag(adapter.getItem(i));
+ WallpaperTileInfo info = (WallpaperTileInfo) adapter.getItem(i);
+ thumbnail.setTag(info);
+ info.setView(thumbnail);
if (addLongPressHandler) {
addLongPressHandler(thumbnail);
}
@@ -453,6 +537,47 @@
}
}
+ private void updateTileIndices() {
+ LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
+ final int childCount = masterWallpaperList.getChildCount();
+ final Resources res = getResources();
+
+ // Do two passes; the first pass gets the total number of tiles
+ int numTiles = 0;
+ for (int passNum = 0; passNum < 2; passNum++) {
+ int tileIndex = 0;
+ for (int i = 0; i < childCount; i++) {
+ View child = masterWallpaperList.getChildAt(i);
+ LinearLayout subList;
+
+ int subListStart;
+ int subListEnd;
+ if (child.getTag() instanceof WallpaperTileInfo) {
+ subList = masterWallpaperList;
+ subListStart = i;
+ subListEnd = i + 1;
+ } else { // if (child instanceof LinearLayout) {
+ subList = (LinearLayout) child;
+ subListStart = 0;
+ subListEnd = subList.getChildCount();
+ }
+
+ for (int j = subListStart; j < subListEnd; j++) {
+ WallpaperTileInfo info = (WallpaperTileInfo) subList.getChildAt(j).getTag();
+ if (info.isNamelessWallpaper()) {
+ if (passNum == 0) {
+ numTiles++;
+ } else {
+ CharSequence label = res.getString(
+ R.string.wallpaper_accessibility_name, ++tileIndex, numTiles);
+ info.onIndexUpdated(label);
+ }
+ }
+ }
+ }
+ }
+ }
+
private static Point getDefaultThumbnailSize(Resources res) {
return new Point(res.getDimensionPixelSize(R.dimen.wallpaperThumbnailWidth),
res.getDimensionPixelSize(R.dimen.wallpaperThumbnailHeight));
@@ -460,26 +585,35 @@
}
private static Bitmap createThumbnail(Point size, Context context, Uri uri, byte[] imageBytes,
- Resources res, int resId, boolean leftAligned) {
+ Resources res, int resId, int rotation, boolean leftAligned) {
int width = size.x;
int height = size.y;
BitmapCropTask cropTask;
if (uri != null) {
- cropTask = new BitmapCropTask(context, uri, null, width, height, false, true, null);
+ cropTask = new BitmapCropTask(
+ context, uri, null, rotation, width, height, false, true, null);
} else if (imageBytes != null) {
- cropTask = new BitmapCropTask(imageBytes, null, width, height, false, true, null);
+ cropTask = new BitmapCropTask(
+ imageBytes, null, rotation, width, height, false, true, null);
} else {
- cropTask =
- new BitmapCropTask(context, res, resId, null, width, height, false, true, null);
+ cropTask = new BitmapCropTask(
+ context, res, resId, null, rotation, width, height, false, true, null);
}
Point bounds = cropTask.getImageBounds();
if (bounds == null || bounds.x == 0 || bounds.y == 0) {
return null;
}
+ Matrix rotateMatrix = new Matrix();
+ rotateMatrix.setRotate(rotation);
+ float[] rotatedBounds = new float[] { bounds.x, bounds.y };
+ rotateMatrix.mapPoints(rotatedBounds);
+ rotatedBounds[0] = Math.abs(rotatedBounds[0]);
+ rotatedBounds[1] = Math.abs(rotatedBounds[1]);
+
RectF cropRect = WallpaperCropActivity.getMaxCropRect(
- bounds.x, bounds.y, width, height, leftAligned);
+ (int) rotatedBounds[0], (int) rotatedBounds[1], width, height, leftAligned);
cropTask.setCropBounds(cropRect);
if (cropTask.cropBitmap()) {
@@ -499,7 +633,8 @@
// Load the thumbnail
ImageView image = (ImageView) pickedImageThumbnail.findViewById(R.id.wallpaper_image);
Point defaultSize = getDefaultThumbnailSize(this.getResources());
- Bitmap thumb = createThumbnail(defaultSize, this, uri, null, null, 0, false);
+ int rotation = WallpaperCropActivity.getRotationFromExif(this, uri);
+ Bitmap thumb = createThumbnail(defaultSize, this, uri, null, null, 0, rotation, false);
if (thumb != null) {
image.setImageBitmap(thumb);
Drawable thumbDrawable = image.getDrawable();
@@ -511,14 +646,19 @@
UriWallpaperInfo info = new UriWallpaperInfo(uri);
pickedImageThumbnail.setTag(info);
+ info.setView(pickedImageThumbnail);
+ addLongPressHandler(pickedImageThumbnail);
+ updateTileIndices();
pickedImageThumbnail.setOnClickListener(mThumbnailOnClickListener);
mThumbnailOnClickListener.onClick(pickedImageThumbnail);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMAGE_PICK && resultCode == RESULT_OK) {
- Uri uri = data.getData();
- addTemporaryWallpaperTile(uri);
+ if (data != null && data.getData() != null) {
+ Uri uri = data.getData();
+ addTemporaryWallpaperTile(uri);
+ }
} else if (requestCode == PICK_WALLPAPER_THIRD_PARTY_ACTIVITY) {
setResult(RESULT_OK);
finish();
@@ -578,8 +718,11 @@
thumb = BitmapFactory.decodeFile(defaultThumbFile.getAbsolutePath());
defaultWallpaperExists = true;
} else {
- Point defaultThumbSize = getDefaultThumbnailSize(getResources());
- thumb = createThumbnail(defaultThumbSize, this, null, null, sysRes, resId, false);
+ Resources res = getResources();
+ Point defaultThumbSize = getDefaultThumbnailSize(res);
+ int rotation = WallpaperCropActivity.getRotationFromExif(res, resId);
+ thumb = createThumbnail(
+ defaultThumbSize, this, null, null, sysRes, resId, rotation, false);
if (thumb != null) {
try {
defaultThumbFile.createNewFile();
diff --git a/src/com/android/launcher3/WallpaperRootView.java b/src/com/android/launcher3/WallpaperRootView.java
new file mode 100644
index 0000000..ceaa043
--- /dev/null
+++ b/src/com/android/launcher3/WallpaperRootView.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2013 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.launcher3;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.widget.RelativeLayout;
+
+public class WallpaperRootView extends RelativeLayout {
+ private final WallpaperPickerActivity a;
+ public WallpaperRootView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ a = (WallpaperPickerActivity) context;
+ }
+ public WallpaperRootView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ a = (WallpaperPickerActivity) context;
+ }
+
+ protected boolean fitSystemWindows(Rect insets) {
+ a.setWallpaperStripYOffset(insets.bottom);
+ return true;
+ }
+}
diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java
index 1910ab7..07b4f6f 100644
--- a/src/com/android/launcher3/WidgetPreviewLoader.java
+++ b/src/com/android/launcher3/WidgetPreviewLoader.java
@@ -105,7 +105,6 @@
private int mPreviewBitmapHeight;
private String mSize;
private Context mContext;
- private Launcher mLauncher;
private PackageManager mPackageManager;
private PagedViewCellLayout mWidgetSpacingLayout;
@@ -137,11 +136,11 @@
sInvalidPackages = new HashSet<String>();
}
- public WidgetPreviewLoader(Launcher launcher) {
+ public WidgetPreviewLoader(Context context) {
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
- mContext = mLauncher = launcher;
+ mContext = context;
mPackageManager = mContext.getPackageManager();
mAppIconSize = grid.iconSizePx;
mIconCache = app.getIconCache();
@@ -417,7 +416,7 @@
}
public Bitmap generateWidgetPreview(AppWidgetProviderInfo info, Bitmap preview) {
- int[] cellSpans = Launcher.getSpanForWidget(mLauncher, info);
+ int[] cellSpans = Launcher.getSpanForWidget(mContext, info);
int maxWidth = maxWidthForWidgetPreview(cellSpans[0]);
int maxHeight = maxHeightForWidgetPreview(cellSpans[1]);
return generateWidgetPreview(info.provider, info.previewImage, info.icon,
@@ -464,12 +463,12 @@
if (cellVSpan < 1) cellVSpan = 1;
BitmapDrawable previewDrawable = (BitmapDrawable) mContext.getResources()
- .getDrawable(R.drawable.widget_preview_tile);
+ .getDrawable(R.drawable.widget_tile);
final int previewDrawableWidth = previewDrawable
.getIntrinsicWidth();
final int previewDrawableHeight = previewDrawable
.getIntrinsicHeight();
- previewWidth = previewDrawableWidth * cellHSpan; // subtract 2 dips
+ previewWidth = previewDrawableWidth * cellHSpan;
previewHeight = previewDrawableHeight * cellVSpan;
defaultPreview = Bitmap.createBitmap(previewWidth, previewHeight,
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index ab52c4e..f6416c8 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -17,6 +17,7 @@
package com.android.launcher3;
import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.LayoutTransition;
@@ -44,6 +45,7 @@
import android.net.Uri;
import android.os.IBinder;
import android.os.Parcelable;
+import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
@@ -52,6 +54,10 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.widget.TextView;
@@ -113,6 +119,7 @@
private int mDefaultPage;
private ShortcutAndWidgetContainer mDragSourceInternal;
+ private static boolean sAccessibilityEnabled;
// The screen id used for the empty screen always present to the right.
private final static long EXTRA_EMPTY_SCREEN_ID = -201;
@@ -139,6 +146,7 @@
CustomContentCallbacks mCustomContentCallbacks;
boolean mCustomContentShowing;
private float mLastCustomContentScrollProgress = -1f;
+ private String mCustomContentDescription = "";
/**
* The CellLayout that is currently being dragged over
@@ -318,11 +326,7 @@
// Disable multitouch across the workspace/all apps/customize tray
setMotionEventSplittingEnabled(true);
-
- // Unless otherwise specified this view is important for accessibility.
- if (getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
- }
+ setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
@Override
@@ -336,7 +340,8 @@
ItemInfo itemInfo, boolean springLoaded) {
int[] size = new int[2];
if (getChildCount() > 0) {
- CellLayout cl = (CellLayout) mLauncher.getWorkspace().getChildAt(0);
+ // Use the first non-custom page to estimate the child position
+ CellLayout cl = (CellLayout) getChildAt(numCustomPages());
Rect r = estimateItemPosition(cl, itemInfo, 0, 0, hSpan, vSpan);
size[0] = r.width();
size[1] = r.height();
@@ -437,6 +442,13 @@
setLayoutTransition(mLayoutTransition);
}
+ void enableLayoutTransitions() {
+ setLayoutTransition(mLayoutTransition);
+ }
+ void disableLayoutTransitions() {
+ setLayoutTransition(null);
+ }
+
@Override
protected int getScrollMode() {
return SmoothPagedView.X_LARGE_MODE;
@@ -450,16 +462,15 @@
CellLayout cl = ((CellLayout) child);
cl.setOnInterceptTouchListener(this);
cl.setClickable(true);
- cl.setContentDescription(getContext().getString(
- R.string.workspace_description_format, getChildCount()));
-
+ cl.setImportantForAccessibility(ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
super.onChildViewAdded(parent, child);
}
protected boolean shouldDrawChild(View child) {
final CellLayout cl = (CellLayout) child;
return super.shouldDrawChild(child) &&
- (cl.getShortcutsAndWidgets().getAlpha() > 0 ||
+ (mIsSwitchingState ||
+ cl.getShortcutsAndWidgets().getAlpha() > 0 ||
cl.getBackgroundAlpha() > 0);
}
@@ -485,10 +496,24 @@
}
public void removeAllWorkspaceScreens() {
+ // Disable all layout transitions before removing all pages to ensure that we don't get the
+ // transition animations competing with us changing the scroll when we add pages or the
+ // custom content screen
+ disableLayoutTransitions();
+
+ // Since we increment the current page when we call addCustomContentPage via bindScreens
+ // (and other places), we need to adjust the current page back when we clear the pages
+ if (hasCustomContent()) {
+ removeCustomContentPage();
+ }
+
// Remove the pages and clear the screen models
removeAllViews();
mScreenOrder.clear();
mWorkspaceScreens.clear();
+
+ // Re-enable the layout transitions
+ enableLayoutTransitions();
}
public long insertNewWorkspaceScreenBeforeEmptyScreen(long screenId) {
@@ -536,7 +561,14 @@
// Ensure that the current page and default page are maintained.
mDefaultPage = mOriginalDefaultPage + 1;
- setCurrentPage(getCurrentPage() + 1);
+
+ // Update the custom content hint
+ mLauncher.updateCustomContentHintVisibility();
+ if (mRestorePage != INVALID_RESTORE_PAGE) {
+ mRestorePage = mRestorePage + 1;
+ } else {
+ setCurrentPage(getCurrentPage() + 1);
+ }
}
public void removeCustomContentPage() {
@@ -548,14 +580,28 @@
mWorkspaceScreens.remove(CUSTOM_CONTENT_SCREEN_ID);
mScreenOrder.remove(CUSTOM_CONTENT_SCREEN_ID);
removeView(customScreen);
+
+ if (mCustomContentCallbacks != null) {
+ mCustomContentCallbacks.onScrollProgressChanged(0);
+ mCustomContentCallbacks.onHide();
+ }
+
mCustomContentCallbacks = null;
// Ensure that the current page and default page are maintained.
mDefaultPage = mOriginalDefaultPage - 1;
- setCurrentPage(getCurrentPage() - 1);
+
+ // Update the custom content hint
+ mLauncher.updateCustomContentHintVisibility();
+ if (mRestorePage != INVALID_RESTORE_PAGE) {
+ mRestorePage = mRestorePage - 1;
+ } else {
+ setCurrentPage(getCurrentPage() - 1);
+ }
}
- public void addToCustomContentPage(View customContent, CustomContentCallbacks callbacks) {
+ public void addToCustomContentPage(View customContent, CustomContentCallbacks callbacks,
+ String description) {
if (getPageIndexForScreenId(CUSTOM_CONTENT_SCREEN_ID) < 0) {
throw new RuntimeException("Expected custom content screen to exist");
}
@@ -570,7 +616,9 @@
if (customContent instanceof Insettable) {
((Insettable)customContent).setInsets(mInsets);
}
+ customScreen.removeAllViews();
customScreen.addViewToCellLayout(customContent, 0, 0, lp, true);
+ mCustomContentDescription = description;
mCustomContentCallbacks = callbacks;
}
@@ -617,7 +665,7 @@
public boolean hasExtraEmptyScreen() {
int nScreens = getChildCount();
- nScreens = hasCustomContent() ? nScreens - 1 : nScreens;
+ nScreens = nScreens - numCustomPages();
return mWorkspaceScreens.containsKey(EXTRA_EMPTY_SCREEN_ID) && nScreens > 1;
}
@@ -642,7 +690,6 @@
return newId;
}
-
public CellLayout getScreenWithId(long screenId) {
CellLayout layout = mWorkspaceScreens.get(screenId);
return layout;
@@ -691,7 +738,7 @@
// We enforce at least one page to add new items to. In the case that we remove the last
// such screen, we convert the last screen to the empty screen
- int minScreens = hasCustomContent() ? 2 : 1;
+ int minScreens = 1 + numCustomPages();
int pageShift = 0;
for (Long id: removeScreens) {
@@ -853,13 +900,6 @@
protected void onWindowVisibilityChanged (int visibility) {
mLauncher.onWindowVisibilityChanged(visibility);
- if (mCustomContentShowing && mCustomContentCallbacks != null) {
- if (visibility == View.VISIBLE) {
- mCustomContentCallbacks.onShow();
- } else if (visibility == View.GONE) {
- mCustomContentCallbacks.onHide();
- }
- }
}
@Override
@@ -1024,29 +1064,36 @@
stripEmptyScreens();
mStripScreensOnPageStopMoving = false;
}
-
- if (hasCustomContent() && getNextPage() == 0 && !mCustomContentShowing) {
- mCustomContentShowing = true;
- if (mCustomContentCallbacks != null) {
- mCustomContentCallbacks.onShow();
- mCustomContentShowTime = System.currentTimeMillis();
- mLauncher.setVoiceButtonProxyVisible(false);
- }
- } else if (hasCustomContent() && getNextPage() != 0 && mCustomContentShowing) {
- mCustomContentShowing = false;
- if (mCustomContentCallbacks != null) {
- mCustomContentCallbacks.onHide();
- mLauncher.resetQSBScroll();
- mLauncher.setVoiceButtonProxyVisible(true);
- }
- }
}
@Override
protected void notifyPageSwitchListener() {
super.notifyPageSwitchListener();
Launcher.setScreen(mCurrentPage);
- };
+
+ if (hasCustomContent() && getNextPage() == 0 && !mCustomContentShowing) {
+ mCustomContentShowing = true;
+ if (mCustomContentCallbacks != null) {
+ mCustomContentCallbacks.onShow();
+ mCustomContentShowTime = System.currentTimeMillis();
+ mLauncher.updateVoiceButtonProxyVisible(false);
+ }
+ } else if (hasCustomContent() && getNextPage() != 0 && mCustomContentShowing) {
+ mCustomContentShowing = false;
+ if (mCustomContentCallbacks != null) {
+ mCustomContentCallbacks.onHide();
+ mLauncher.resetQSBScroll();
+ mLauncher.updateVoiceButtonProxyVisible(false);
+ }
+ }
+ if (getPageIndicator() != null) {
+ getPageIndicator().setContentDescription(getPageIndicatorDescription());
+ }
+ }
+
+ protected CustomContentCallbacks getCustomContentCallbacks() {
+ return mCustomContentCallbacks;
+ }
protected void setWallpaperDimension() {
String spKey = WallpaperCropActivity.getSharedPreferencesKey();
@@ -1070,7 +1117,6 @@
class WallpaperOffsetInterpolator implements Choreographer.FrameCallback {
float mFinalOffset = 0.0f;
float mCurrentOffset = 0.5f; // to force an initial update
- //long mLastWallpaperOffsetUpdateTime;
boolean mWaitingForUpdate;
Choreographer mChoreographer;
Interpolator mInterpolator;
@@ -1079,7 +1125,7 @@
float mAnimationStartOffset;
private final int ANIMATION_DURATION = 250;
// Don't use all the wallpaper for parallax until you have at least this many pages
- private final int MIN_PARALLAX_PAGE_SPAN = 4;
+ private final int MIN_PARALLAX_PAGE_SPAN = 3;
int mNumScreens;
public WallpaperOffsetInterpolator() {
@@ -1135,10 +1181,15 @@
}
// Exclude the leftmost page
- final int firstIndex = isLayoutRtl() ? getChildCount() - 2 : 1;
+ int emptyExtraPages = numEmptyScreensToIgnore();
+ int firstIndex = numCustomPages();
// Exclude the last extra empty screen (if we have > MIN_PARALLAX_PAGE_SPAN pages)
- int extra = numExtraScreensToIgnore();
- final int lastIndex = isLayoutRtl() ? 0 + extra : getChildCount() - 1 - extra;
+ int lastIndex = getChildCount() - 1 - emptyExtraPages;
+ if (isLayoutRtl()) {
+ int temp = firstIndex;
+ firstIndex = lastIndex;
+ lastIndex = temp;
+ }
int firstPageScrollX = getScrollForPage(firstIndex);
int scrollRange = getScrollForPage(lastIndex) - firstPageScrollX;
@@ -1146,27 +1197,36 @@
return 0;
} else {
// TODO: do different behavior if it's a live wallpaper?
- float offset = Math.min(1, (getScrollX() - firstPageScrollX) / (float) scrollRange);
+ // Sometimes the left parameter of the pages is animated during a layout transition;
+ // this parameter offsets it to keep the wallpaper from animating as well
+ int offsetForLayoutTransitionAnimation = isLayoutRtl() ?
+ getPageAt(getChildCount() - 1).getLeft() - getFirstChildLeft() : 0;
+ int adjustedScroll =
+ getScrollX() - firstPageScrollX - offsetForLayoutTransitionAnimation;
+ float offset = Math.min(1, adjustedScroll / (float) scrollRange);
offset = Math.max(0, offset);
// Don't use up all the wallpaper parallax until you have at least
// MIN_PARALLAX_PAGE_SPAN pages
- int numScrollingPages = getNumScreensExcludingExtraEmptyScreenAndLeftmost();
- int parallaxPageSpan = Math.max(MIN_PARALLAX_PAGE_SPAN, numScrollingPages) - 1;
- return offset * (numScrollingPages - 1) / parallaxPageSpan;
+ int numScrollingPages = getNumScreensExcludingEmptyAndCustom();
+ int parallaxPageSpan = Math.max(MIN_PARALLAX_PAGE_SPAN, numScrollingPages - 1);
+ // On RTL devices, push the wallpaper offset to the right if we don't have enough
+ // pages (ie if numScrollingPages < MIN_PARALLAX_PAGE_SPAN)
+ int padding = isLayoutRtl() ? parallaxPageSpan - numScrollingPages + 1 : 0;
+ return offset * (padding + numScrollingPages - 1) / parallaxPageSpan;
}
}
- private int numExtraScreensToIgnore() {
- int numScrollingPages = getChildCount() - 1;
- if (numScrollingPages > MIN_PARALLAX_PAGE_SPAN && hasExtraEmptyScreen()) {
+ private int numEmptyScreensToIgnore() {
+ int numScrollingPages = getChildCount() - numCustomPages();
+ if (numScrollingPages >= MIN_PARALLAX_PAGE_SPAN && hasExtraEmptyScreen()) {
return 1;
} else {
return 0;
}
}
- private int getNumScreensExcludingExtraEmptyScreenAndLeftmost() {
- int numScrollingPages = getChildCount() - 1 - numExtraScreensToIgnore();
+ private int getNumScreensExcludingEmptyAndCustom() {
+ int numScrollingPages = getChildCount() - numEmptyScreensToIgnore() - numCustomPages();
return numScrollingPages;
}
@@ -1198,12 +1258,12 @@
public void setFinalX(float x) {
scheduleUpdate();
mFinalOffset = Math.max(0f, Math.min(x, 1.0f));
- if (getNumScreensExcludingExtraEmptyScreenAndLeftmost() != mNumScreens) {
+ if (getNumScreensExcludingEmptyAndCustom() != mNumScreens) {
if (mNumScreens > 0) {
// Don't animate if we're going from 0 screens
animateToFinal();
}
- mNumScreens = getNumScreensExcludingExtraEmptyScreenAndLeftmost();
+ mNumScreens = getNumScreensExcludingEmptyAndCustom();
}
}
@@ -1357,6 +1417,10 @@
return (mScreenOrder.size() > 0 && mScreenOrder.get(0) == CUSTOM_CONTENT_SCREEN_ID);
}
+ public int numCustomPages() {
+ return hasCustomContent() ? 1 : 0;
+ }
+
public boolean isOnOrMovingToCustomContent() {
return hasCustomContent() && getNextPage() == 0;
}
@@ -1366,10 +1430,12 @@
float progress = 0;
if (hasCustomContent()) {
int index = mScreenOrder.indexOf(CUSTOM_CONTENT_SCREEN_ID);
- int scrollDelta = getScrollForPage(index + 1) - getScrollX();
- translationX = scrollDelta;
- progress = (1.0f * scrollDelta) /
- (getScrollForPage(index + 1) - getScrollForPage(index));
+
+ int scrollDelta = getScrollX() - getScrollForPage(index) -
+ getLayoutTransitionOffsetForPage(index);
+ float scrollRange = getScrollForPage(index + 1) - getScrollForPage(index);
+ translationX = scrollRange - scrollDelta;
+ progress = (scrollRange - scrollDelta) / scrollRange;
if (isLayoutRtl()) {
translationX = Math.min(0, translationX);
@@ -1380,6 +1446,12 @@
}
if (Float.compare(progress, mLastCustomContentScrollProgress) == 0) return;
+
+ CellLayout cc = mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID);
+ if (progress > 0 && cc.getVisibility() != VISIBLE && !isSmall()) {
+ cc.setVisibility(VISIBLE);
+ }
+
mLastCustomContentScrollProgress = progress;
setBackgroundAlpha(progress * 0.8f);
@@ -1398,6 +1470,22 @@
}
@Override
+ protected OnClickListener getPageIndicatorClickListener() {
+ AccessibilityManager am = (AccessibilityManager)
+ getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+ if (!am.isTouchExplorationEnabled()) {
+ return null;
+ }
+ OnClickListener listener = new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ enterOverviewMode();
+ }
+ };
+ return listener;
+ }
+
+ @Override
protected void screenScrolled(int screenCenter) {
final boolean isRtl = isLayoutRtl();
super.screenScrolled(screenCenter);
@@ -1461,6 +1549,20 @@
mWindowToken = null;
}
+ protected void onResume() {
+ if (getPageIndicator() != null) {
+ // In case accessibility state has changed, we need to perform this on every
+ // attach to window
+ OnClickListener listener = getPageIndicatorClickListener();
+ if (listener != null) {
+ getPageIndicator().setOnClickListener(listener);
+ }
+ }
+ AccessibilityManager am = (AccessibilityManager)
+ getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+ sAccessibilityEnabled = am.isEnabled();
+ }
+
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) {
@@ -1570,7 +1672,7 @@
} else {
for (int i = 0; i < getPageCount(); i++) {
final CellLayout cl = (CellLayout) getChildAt(i);
- cl.disableHardwareLayers();
+ cl.enableHardwareLayer(false);
}
}
}
@@ -1590,17 +1692,16 @@
leftScreen--;
}
}
+
+ final CellLayout customScreen = mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID);
for (int i = 0; i < screenCount; i++) {
final CellLayout layout = (CellLayout) getPageAt(i);
- if (!(leftScreen <= i && i <= rightScreen && shouldDrawChild(layout))) {
- layout.disableHardwareLayers();
- }
- }
- for (int i = 0; i < screenCount; i++) {
- final CellLayout layout = (CellLayout) getPageAt(i);
- if (leftScreen <= i && i <= rightScreen && shouldDrawChild(layout)) {
- layout.enableHardwareLayers();
- }
+
+ // enable layers between left and right screen inclusive, except for the
+ // customScreen, which may animate its content during transitions.
+ boolean enableLayer = layout != customScreen &&
+ leftScreen <= i && i <= rightScreen && shouldDrawChild(layout);
+ layout.enableHardwareLayer(enableLayer);
}
}
}
@@ -1737,9 +1838,7 @@
@Override
protected void getOverviewModePages(int[] range) {
- int count = mScreenOrder.size();
-
- int start = hasCustomContent() ? 1 : 0;
+ int start = numCustomPages();
int end = getChildCount() - 1;
range[0] = Math.max(0, Math.min(start, getChildCount() - 1));
@@ -1748,25 +1847,17 @@
protected void onStartReordering() {
super.onStartReordering();
- int count = getChildCount();
- for (int i = 0; i < count; i++) {
- ((CellLayout) getChildAt(i)).setUseActiveGlowBackground(true);
- }
showOutlines();
-
// Reordering handles its own animations, disable the automatic ones.
- setLayoutTransition(null);
+ disableLayoutTransitions();
}
protected void onEndReordering() {
super.onEndReordering();
- int count = getChildCount();
- for (int i = 0; i < count; i++) {
- ((CellLayout) getChildAt(i)).setUseActiveGlowBackground(false);
- }
- hideOutlines();
+ hideOutlines();
mScreenOrder.clear();
+ int count = getChildCount();
for (int i = 0; i < count; i++) {
CellLayout cl = ((CellLayout) getChildAt(i));
mScreenOrder.add(getIdForScreen(cl));
@@ -1775,7 +1866,7 @@
mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder);
// Re-enable auto layout transitions for page deletion.
- setLayoutTransition(mLayoutTransition);
+ enableLayoutTransitions();
}
public boolean isInOverviewMode() {
@@ -1786,19 +1877,16 @@
if (mTouchState != TOUCH_STATE_REST) {
return false;
}
- mLauncher.onInteractionBegin();
enableOverviewMode(true, -1, true);
return true;
}
public void exitOverviewMode(boolean animated) {
exitOverviewMode(-1, animated);
- mLauncher.onInteractionEnd();
}
public void exitOverviewMode(int snapPage, boolean animated) {
enableOverviewMode(false, snapPage, animated);
- mLauncher.onInteractionEnd();
}
private void enableOverviewMode(boolean enable, int snapPage, boolean animated) {
@@ -1831,6 +1919,37 @@
return offsetDelta;
}
+ boolean shouldVoiceButtonProxyBeVisible() {
+ if (isOnOrMovingToCustomContent()) {
+ return false;
+ }
+ if (mState != State.NORMAL) {
+ return false;
+ }
+ return true;
+ }
+
+ public void updateInteractionForState() {
+ if (mState != State.NORMAL) {
+ mLauncher.onInteractionBegin();
+ } else {
+ mLauncher.onInteractionEnd();
+ }
+ }
+
+ private void setState(State state) {
+ mState = state;
+ updateInteractionForState();
+ updateAccessibilityFlags();
+ }
+
+ private void updateAccessibilityFlags() {
+ int accessible = mState == State.NORMAL ?
+ ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES :
+ ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
+ setImportantForAccessibility(accessible);
+ }
+
Animator getChangeStateAnimation(final State state, boolean animated, int delay, int snapPage) {
if (mState == state) {
return null;
@@ -1846,7 +1965,7 @@
final boolean oldStateIsSpringLoaded = (oldState == State.SPRING_LOADED);
final boolean oldStateIsSmall = (oldState == State.SMALL);
final boolean oldStateIsOverview = (oldState == State.OVERVIEW);
- mState = state;
+ setState(state);
final boolean stateIsNormal = (state == State.NORMAL);
final boolean stateIsSpringLoaded = (state == State.SPRING_LOADED);
final boolean stateIsSmall = (state == State.SMALL);
@@ -1857,7 +1976,11 @@
float finalSearchBarAlpha = !stateIsNormal ? 0f : 1f;
float finalWorkspaceTranslationY = stateIsOverview ? getOverviewModeTranslationY() : 0;
- boolean zoomIn = true;
+ boolean workspaceToAllApps = (oldStateIsNormal && stateIsSmall);
+ boolean allAppsToWorkspace = (oldStateIsSmall && stateIsNormal);
+ boolean workspaceToOverview = (oldStateIsNormal && stateIsOverview);
+ boolean overviewToWorkspace = (oldStateIsOverview && stateIsNormal);
+
mNewScale = 1.0f;
if (oldStateIsOverview) {
@@ -1874,19 +1997,38 @@
} else if (stateIsSmall){
mNewScale = mOverviewModeShrinkFactor - 0.3f;
}
- if (oldStateIsNormal && stateIsSmall) {
- zoomIn = false;
+ if (workspaceToAllApps) {
updateChildrenLayersEnabled(false);
}
}
- final int duration = zoomIn ?
- getResources().getInteger(R.integer.config_workspaceUnshrinkTime) :
- getResources().getInteger(R.integer.config_appsCustomizeWorkspaceShrinkTime);
+
+ final int duration;
+ if (workspaceToAllApps) {
+ duration = getResources().getInteger(R.integer.config_workspaceUnshrinkTime);
+ } else if (workspaceToOverview || overviewToWorkspace) {
+ duration = getResources().getInteger(R.integer.config_overviewTransitionTime);
+ } else {
+ duration = getResources().getInteger(R.integer.config_appsCustomizeWorkspaceShrinkTime);
+ }
+
for (int i = 0; i < getChildCount(); i++) {
final CellLayout cl = (CellLayout) getChildAt(i);
- float finalAlpha = (!mWorkspaceFadeInAdjacentScreens ||
- (i == mCurrentPage)) && !stateIsSmall ? 1f : 0f;
+ boolean isCurrentPage = (i == getNextPage());
float initialAlpha = cl.getShortcutsAndWidgets().getAlpha();
+ float finalAlpha = stateIsSmall ? 0f : 1f;
+
+ // If we are animating to/from the small state, then hide the side pages and fade the
+ // current page in
+ if (!mIsSwitchingState) {
+ if (workspaceToAllApps || allAppsToWorkspace) {
+ if (allAppsToWorkspace && isCurrentPage) {
+ initialAlpha = 0f;
+ } else if (!isCurrentPage) {
+ initialAlpha = finalAlpha = 0f;
+ }
+ cl.setShortcutAndWidgetAlpha(initialAlpha);
+ }
+ }
mOldAlphas[i] = initialAlpha;
mNewAlphas[i] = finalAlpha;
@@ -1903,6 +2045,7 @@
final View overviewPanel = mLauncher.getOverviewPanel();
final View hotseat = mLauncher.getHotseat();
if (animated) {
+ anim.setDuration(duration);
LauncherViewPropertyAnimator scale = new LauncherViewPropertyAnimator(this);
scale.scaleX(mNewScale)
.scaleY(mNewScale)
@@ -1921,14 +2064,13 @@
LauncherViewPropertyAnimator alphaAnim =
new LauncherViewPropertyAnimator(cl.getShortcutsAndWidgets());
alphaAnim.alpha(mNewAlphas[i])
- .setDuration(duration)
.setInterpolator(mZoomInInterpolator);
anim.play(alphaAnim);
}
if (mOldBackgroundAlphas[i] != 0 ||
mNewBackgroundAlphas[i] != 0) {
ValueAnimator bgAnim =
- LauncherAnimUtils.ofFloat(cl, 0f, 1f).setDuration(duration);
+ LauncherAnimUtils.ofFloat(cl, 0f, 1f);
bgAnim.setInterpolator(mZoomInInterpolator);
bgAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
public void onAnimationUpdate(float a, float b) {
@@ -1953,14 +2095,19 @@
ObjectAnimator overviewPanelAlpha = ObjectAnimator.ofFloat(overviewPanel,
"alpha", finalOverviewPanelAlpha);
- overviewPanelAlpha.addUpdateListener(new AlphaUpdateListener(overviewPanel));
- hotseatAlpha.addUpdateListener(new AlphaUpdateListener(hotseat));
- searchBarAlpha.addUpdateListener(new AlphaUpdateListener(searchBar));
+ overviewPanelAlpha.addListener(new AlphaUpdateListener(overviewPanel));
+ hotseatAlpha.addListener(new AlphaUpdateListener(hotseat));
+ searchBarAlpha.addListener(new AlphaUpdateListener(searchBar));
- if (getPageIndicator() != null) {
- pageIndicatorAlpha.addUpdateListener(new AlphaUpdateListener(getPageIndicator()));
+ if (workspaceToOverview) {
+ hotseatAlpha.setInterpolator(new DecelerateInterpolator(2));
+ } else if (overviewToWorkspace) {
+ overviewPanelAlpha.setInterpolator(new DecelerateInterpolator(2));
}
+ if (getPageIndicator() != null) {
+ pageIndicatorAlpha.addListener(new AlphaUpdateListener(getPageIndicator()));
+ }
anim.play(overviewPanelAlpha);
anim.play(hotseatAlpha);
@@ -1983,11 +2130,7 @@
setScaleY(mNewScale);
setTranslationY(finalWorkspaceTranslationY);
}
- if (finalSearchBarAlpha == 0) {
- mLauncher.setVoiceButtonProxyVisible(false);
- } else {
- mLauncher.setVoiceButtonProxyVisible(true);
- }
+ mLauncher.updateVoiceButtonProxyVisible(false);
if (stateIsSpringLoaded) {
// Right now we're covered by Apps Customize
@@ -2000,12 +2143,12 @@
R.integer.config_appsCustomizeSpringLoadedBgAlpha) / 100f, true);
} else {
// Fade the background gradient away
- animateBackgroundGradient(0f, true);
+ animateBackgroundGradient(0f, animated);
}
return anim;
}
- static class AlphaUpdateListener implements AnimatorUpdateListener {
+ static class AlphaUpdateListener implements AnimatorUpdateListener, AnimatorListener {
View view;
public AlphaUpdateListener(View v) {
view = v;
@@ -2017,13 +2160,35 @@
}
public static void updateVisibility(View view) {
- if (view.getAlpha() < ALPHA_CUTOFF_THRESHOLD && view.getVisibility() != INVISIBLE) {
- view.setVisibility(INVISIBLE);
+ // We want to avoid the extra layout pass by setting the views to GONE unless
+ // accessibility is on, in which case not setting them to GONE causes a glitch.
+ int invisibleState = sAccessibilityEnabled ? GONE : INVISIBLE;
+ if (view.getAlpha() < ALPHA_CUTOFF_THRESHOLD && view.getVisibility() != invisibleState) {
+ view.setVisibility(invisibleState);
} else if (view.getAlpha() > ALPHA_CUTOFF_THRESHOLD
&& view.getVisibility() != VISIBLE) {
view.setVisibility(VISIBLE);
}
}
+
+ @Override
+ public void onAnimationCancel(Animator arg0) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animator arg0) {
+ updateVisibility(view);
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator arg0) {
+ }
+
+ @Override
+ public void onAnimationStart(Animator arg0) {
+ // We want the views to be visible for animation, so fade-in/out is visible
+ view.setVisibility(VISIBLE);
+ }
}
@Override
@@ -2047,6 +2212,10 @@
private void onTransitionPrepare() {
mIsSwitchingState = true;
+
+ // Invalidate here to ensure that the pages are rendered during the state change transition.
+ invalidate();
+
updateChildrenLayersEnabled(false);
hideCustomContentIfNecessary();
}
@@ -2649,8 +2818,8 @@
}
}
- LauncherModel.moveItemInDatabase(mLauncher, info, container, screenId, lp.cellX,
- lp.cellY);
+ LauncherModel.modifyItemInDatabase(mLauncher, info, container, screenId, lp.cellX,
+ lp.cellY, item.spanX, item.spanY);
} else {
// If we can't find a drop location, we return the item to its original position
CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams();
@@ -2883,7 +3052,9 @@
private void cleanupFolderCreation() {
if (mDragFolderRingAnimator != null) {
mDragFolderRingAnimator.animateToNaturalState();
+ mDragFolderRingAnimator = null;
}
+ mFolderCreationAlarm.setOnAlarmListener(null);
mFolderCreationAlarm.cancelAlarm();
}
@@ -3125,9 +3296,18 @@
ItemInfo info = (ItemInfo) d.dragInfo;
+ int minSpanX = item.spanX;
+ int minSpanY = item.spanY;
+ if (item.minSpanX > 0 && item.minSpanY > 0) {
+ minSpanX = item.minSpanX;
+ minSpanY = item.minSpanY;
+ }
+
mTargetCell = findNearestArea((int) mDragViewVisualCenter[0],
- (int) mDragViewVisualCenter[1], item.spanX, item.spanY,
+ (int) mDragViewVisualCenter[1], minSpanX, minSpanY,
mDragTargetLayout, mTargetCell);
+ int reorderX = mTargetCell[0];
+ int reorderY = mTargetCell[1];
setCurrentDropOverCell(mTargetCell[0], mTargetCell[1]);
@@ -3140,13 +3320,6 @@
manageFolderFeedback(info, mDragTargetLayout, mTargetCell,
targetCellDistance, dragOverView);
- int minSpanX = item.spanX;
- int minSpanY = item.spanY;
- if (item.minSpanX > 0 && item.minSpanY > 0) {
- minSpanX = item.minSpanX;
- minSpanY = item.minSpanY;
- }
-
boolean nearestDropOccupied = mDragTargetLayout.isNearestDropLocationOccupied((int)
mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1], item.spanX,
item.spanY, child, mTargetCell);
@@ -3157,8 +3330,8 @@
mTargetCell[0], mTargetCell[1], item.spanX, item.spanY, false,
d.dragView.getDragVisualizeOffset(), d.dragView.getDragRegion());
} else if ((mDragMode == DRAG_MODE_NONE || mDragMode == DRAG_MODE_REORDER)
- && !mReorderAlarm.alarmPending() && (mLastReorderX != mTargetCell[0] ||
- mLastReorderY != mTargetCell[1])) {
+ && !mReorderAlarm.alarmPending() && (mLastReorderX != reorderX ||
+ mLastReorderY != reorderY)) {
// Otherwise, if we aren't adding to or creating a folder and there's no pending
// reorder, then we schedule a reorder
@@ -3225,9 +3398,11 @@
}
public void onAlarm(Alarm alarm) {
- if (mDragFolderRingAnimator == null) {
- mDragFolderRingAnimator = new FolderRingAnimator(mLauncher, null);
+ if (mDragFolderRingAnimator != null) {
+ // This shouldn't happen ever, but just in case, make sure we clean up the mess.
+ mDragFolderRingAnimator.animateToNaturalState();
}
+ mDragFolderRingAnimator = new FolderRingAnimator(mLauncher, null);
mDragFolderRingAnimator.setCell(cellX, cellY);
mDragFolderRingAnimator.setCellLayout(layout);
mDragFolderRingAnimator.animateToAcceptState();
@@ -3257,7 +3432,8 @@
public void onAlarm(Alarm alarm) {
int[] resultSpan = new int[2];
mTargetCell = findNearestArea((int) mDragViewVisualCenter[0],
- (int) mDragViewVisualCenter[1], spanX, spanY, mDragTargetLayout, mTargetCell);
+ (int) mDragViewVisualCenter[1], minSpanX, minSpanY, mDragTargetLayout,
+ mTargetCell);
mLastReorderX = mTargetCell[0];
mLastReorderY = mTargetCell[1];
@@ -3629,6 +3805,10 @@
return mDragInfo;
}
+ public int getRestorePage() {
+ return getNextPage() - numCustomPages();
+ }
+
/**
* Calculate the nearest cell where the given object would be dropped.
*
@@ -3907,6 +4087,7 @@
}
}
mRestoredPages.clear();
+ mSavedStates = null;
}
@Override
@@ -4268,9 +4449,9 @@
protected PageIndicator.PageMarkerResources getPageIndicatorMarker(int pageIndex) {
long screenId = getScreenIdForPageIndex(pageIndex);
if (screenId == EXTRA_EMPTY_SCREEN_ID) {
- int count = mScreenOrder.size() - (hasCustomContent() ? 1 : 0);
+ int count = mScreenOrder.size() - numCustomPages();
if (count > 1) {
- return new PageIndicator.PageMarkerResources(R.drawable.ic_pageindicator_add,
+ return new PageIndicator.PageMarkerResources(R.drawable.ic_pageindicator_current,
R.drawable.ic_pageindicator_add);
}
}
@@ -4286,10 +4467,19 @@
public void syncPageItems(int page, boolean immediate) {
}
+ protected String getPageIndicatorDescription() {
+ String settings = getResources().getString(R.string.settings_button_text);
+ return getCurrentPageDescription() + ", " + settings;
+ }
+
protected String getCurrentPageDescription() {
int page = (mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage;
+ int delta = numCustomPages();
+ if (hasCustomContent() && getNextPage() == 0) {
+ return mCustomContentDescription;
+ }
return String.format(getContext().getString(R.string.workspace_scroll_format),
- page + 1, getChildCount());
+ page + 1 - delta, getChildCount() - delta);
}
public void getLocationInDragLayer(int[] loc) {
diff --git a/src/com/android/launcher3/config/ProviderConfig.java b/src/com/android/launcher3/config/ProviderConfig.java
new file mode 100644
index 0000000..db25076
--- /dev/null
+++ b/src/com/android/launcher3/config/ProviderConfig.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2013 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.launcher3.config;
+
+public class ProviderConfig {
+
+ public static final String AUTHORITY = "com.android.launcher3.settings";
+}
diff --git a/src/com/android/photos/views/TiledImageView.java b/src/com/android/photos/views/TiledImageView.java
index 36cb438..af4199c 100644
--- a/src/com/android/photos/views/TiledImageView.java
+++ b/src/com/android/photos/views/TiledImageView.java
@@ -63,7 +63,7 @@
// Guarded by locks
public float scale;
public int centerX, centerY;
- int rotation;
+ public int rotation;
public TileSource source;
Runnable isReadyCallback;
diff --git a/util/com/android/launcher3/DecoderRing.java b/util/com/android/launcher3/DecoderRing.java
new file mode 100644
index 0000000..1d9e0de
--- /dev/null
+++ b/util/com/android/launcher3/DecoderRing.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2013 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.launcher3;
+
+import com.android.launcher3.backup.BackupProtos.CheckedMessage;
+import com.android.launcher3.backup.BackupProtos.Favorite;
+import com.android.launcher3.backup.BackupProtos.Key;
+import com.android.launcher3.backup.BackupProtos.Journal;
+import com.android.launcher3.backup.BackupProtos.Resource;
+import com.android.launcher3.backup.BackupProtos.Screen;
+import com.android.launcher3.backup.BackupProtos.Widget;
+
+import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
+import com.google.protobuf.nano.MessageNano;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.System;
+import java.util.zip.CRC32;
+
+/**
+ * Commandline utility for decoding protos written to the android logs during debugging.
+ *
+ * base64 -D icon.log > icon.bin
+ * java -classpath $ANDROID_HOST_OUT/framework/protoutil.jar:$ANDROID_HOST_OUT/../common/obj/JAVA_LIBRARIES/host-libprotobuf-java-2.3.0-nano_intermediates/javalib.jar \
+ * com.android.launcher3.DecoderRing -i icon.bin
+ *
+ * TODO: write a wrapper to setup the classpath
+ */
+class DecoderRing {
+ public static void main(String[ ] args)
+ throws Exception {
+ File source = null;
+ Class type = Key.class;
+ int skip = 0;
+
+ for (int i = 0; i < args.length; i++) {
+ if ("-k".equals(args[i])) {
+ type = Key.class;
+ } else if ("-f".equals(args[i])) {
+ type = Favorite.class;
+ } else if ("-j".equals(args[i])) {
+ type = Journal.class;
+ } else if ("-i".equals(args[i])) {
+ type = Resource.class;
+ } else if ("-s".equals(args[i])) {
+ type = Screen.class;
+ } else if ("-w".equals(args[i])) {
+ type = Widget.class;
+ } else if ("-S".equals(args[i])) {
+ if ((i + 1) < args.length) {
+ skip = Integer.valueOf(args[++i]);
+ } else {
+ usage(args);
+ }
+ } else if (args[i] != null && !args[i].startsWith("-")) {
+ source = new File(args[i]);
+ } else {
+ System.err.println("Unsupported flag: " + args[i]);
+ usage(args);
+ }
+ }
+
+
+ // read in the bytes
+ ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+ BufferedInputStream input = null;
+ if (source == null) {
+ input = new BufferedInputStream(System.in);
+ } else {
+ try {
+ input = new BufferedInputStream(new FileInputStream(source));
+ } catch (FileNotFoundException e) {
+ System.err.println("failed to open file: " + source + ", " + e);
+ System.exit(1);
+ }
+ }
+ byte[] buffer = new byte[1024];
+ try {
+ while (input.available() > 0) {
+ int n = input.read(buffer);
+ int offset = 0;
+ if (skip > 0) {
+ offset = Math.min(skip, n);
+ n -= offset;
+ skip -= offset;
+ }
+ if (n > 0) {
+ byteStream.write(buffer, offset, n);
+ }
+ }
+ } catch (IOException e) {
+ System.err.println("failed to read input: " + e);
+ System.exit(1);
+ }
+ System.err.println("read this many bytes: " + byteStream.size());
+
+ MessageNano proto = null;
+ if (type == Key.class) {
+ Key key = new Key();
+ try {
+ key = Key.parseFrom(byteStream.toByteArray());
+ } catch (InvalidProtocolBufferNanoException e) {
+ System.err.println("failed to parse proto: " + e);
+ System.exit(1);
+ }
+ // keys are self-checked
+ if (key.checksum != checkKey(key)) {
+ System.err.println("key ckecksum failed");
+ System.exit(1);
+ }
+ proto = key;
+ } else {
+ // other types are wrapped in a checksum message
+ CheckedMessage wrapper = new CheckedMessage();
+ try {
+ MessageNano.mergeFrom(wrapper, byteStream.toByteArray());
+ } catch (InvalidProtocolBufferNanoException e) {
+ System.err.println("failed to parse wrapper: " + e);
+ System.exit(1);
+ }
+ CRC32 checksum = new CRC32();
+ checksum.update(wrapper.payload);
+ if (wrapper.checksum != checksum.getValue()) {
+ System.err.println("wrapper ckecksum failed");
+ System.exit(1);
+ }
+ // decode the actual message
+ proto = (MessageNano) type.newInstance();
+ try {
+ MessageNano.mergeFrom(proto, wrapper.payload);
+ } catch (InvalidProtocolBufferNanoException e) {
+ System.err.println("failed to parse proto: " + e);
+ System.exit(1);
+ }
+ }
+
+ // Generic string output
+ System.out.println(proto.toString());
+
+ // save off the icon bits in a file for inspection
+ if (proto instanceof Resource) {
+ Resource icon = (Resource) proto;
+ final String path = "icon.webp";
+ FileOutputStream iconFile = new FileOutputStream(path);
+ iconFile.write(icon.data);
+ iconFile.close();
+ System.err.println("wrote " + path);
+ }
+
+ // save off the widget icon and preview bits in files for inspection
+ if (proto instanceof Widget) {
+ Widget widget = (Widget) proto;
+ if (widget.icon != null) {
+ final String path = "widget_icon.webp";
+ FileOutputStream iconFile = new FileOutputStream(path);
+ iconFile.write(widget.icon.data);
+ iconFile.close();
+ System.err.println("wrote " + path);
+ }
+ if (widget.preview != null) {
+ final String path = "widget_preview.webp";
+ FileOutputStream iconFile = new FileOutputStream(path);
+ iconFile.write(widget.preview.data);
+ iconFile.close();
+ System.err.println("wrote " + path);
+ }
+ }
+
+ // success
+ System.exit(0);
+ }
+
+ private static long checkKey(Key key) {
+ CRC32 checksum = new CRC32();
+ checksum.update(key.type);
+ checksum.update((int) (key.id & 0xffff));
+ checksum.update((int) ((key.id >> 32) & 0xffff));
+ if (key.name != null && key.name.length() > 0) {
+ checksum.update(key.name.getBytes());
+ }
+ return checksum.getValue();
+ }
+
+ private static void usage(String[] args) {
+ System.err.println("DecoderRing type [input]");
+ System.err.println("\t-k\tdecode a key");
+ System.err.println("\t-f\tdecode a favorite");
+ System.err.println("\t-i\tdecode a icon");
+ System.err.println("\t-s\tdecode a screen");
+ System.err.println("\t-w\tdecode a widget");
+ System.err.println("\t-s b\tskip b bytes");
+ System.err.println("\tfilename\tread from filename, not stdin");
+ System.exit(1);
+ }
+}
\ No newline at end of file