diff options
92 files changed, 494 insertions, 292 deletions
diff --git a/WallpaperPicker/res/drawable-hdpi/tile_picker_focused.9.png b/WallpaperPicker/res/drawable-hdpi/tile_picker_focused.9.png Binary files differdeleted file mode 100644 index c72d6a2c6..000000000 --- a/WallpaperPicker/res/drawable-hdpi/tile_picker_focused.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-hdpi/tile_picker_pressed.9.png b/WallpaperPicker/res/drawable-hdpi/tile_picker_pressed.9.png Binary files differdeleted file mode 100644 index 44c65ac3c..000000000 --- a/WallpaperPicker/res/drawable-hdpi/tile_picker_pressed.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-hdpi/tile_picker_selected.9.png b/WallpaperPicker/res/drawable-hdpi/tile_picker_selected.9.png Binary files differdeleted file mode 100644 index 461bacbcb..000000000 --- a/WallpaperPicker/res/drawable-hdpi/tile_picker_selected.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-mdpi/tile_picker_focused.9.png b/WallpaperPicker/res/drawable-mdpi/tile_picker_focused.9.png Binary files differdeleted file mode 100644 index 13b325b87..000000000 --- a/WallpaperPicker/res/drawable-mdpi/tile_picker_focused.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-mdpi/tile_picker_pressed.9.png b/WallpaperPicker/res/drawable-mdpi/tile_picker_pressed.9.png Binary files differdeleted file mode 100644 index 4e8196d36..000000000 --- a/WallpaperPicker/res/drawable-mdpi/tile_picker_pressed.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-mdpi/tile_picker_selected.9.png b/WallpaperPicker/res/drawable-mdpi/tile_picker_selected.9.png Binary files differdeleted file mode 100644 index eee69ec6d..000000000 --- a/WallpaperPicker/res/drawable-mdpi/tile_picker_selected.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-v21/ic_tick.xml b/WallpaperPicker/res/drawable-v21/ic_tick.xml new file mode 100644 index 000000000..5b270279d --- /dev/null +++ b/WallpaperPicker/res/drawable-v21/ic_tick.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="48dp" + android:viewportHeight="48" + android:viewportWidth="48" + android:width="48dp" > + + <group> + <path + android:name="tick" + android:fillColor="#FFFFFFFF" + android:pathData="M18 32.34l-8.34-8.34-2.83 2.83 11.17 11.17 24-24-2.83-2.83z" /> + </group> + +</vector>
\ No newline at end of file diff --git a/WallpaperPicker/res/drawable-v21/wallpaper_tile_fg.xml b/WallpaperPicker/res/drawable-v21/wallpaper_tile_fg.xml new file mode 100644 index 000000000..97cdcd637 --- /dev/null +++ b/WallpaperPicker/res/drawable-v21/wallpaper_tile_fg.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="#66FFFFFF" > + + <item + android:id="@android:id/mask" + android:drawable="@android:color/white"/> + <item + android:bottom="23.25dp" + android:left="29.25dp" + android:right="29.25dp" + android:top="23.25dp"> + <selector> + <item + android:drawable="@drawable/ic_tick" + android:state_selected="true"/> + <item + android:drawable="@drawable/ic_tick" + android:state_checked="true"/> + </selector> + </item> + +</ripple>
\ No newline at end of file diff --git a/WallpaperPicker/res/drawable-xhdpi/tile_picker_focused.9.png b/WallpaperPicker/res/drawable-xhdpi/tile_picker_focused.9.png Binary files differdeleted file mode 100644 index 279e85963..000000000 --- a/WallpaperPicker/res/drawable-xhdpi/tile_picker_focused.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-xhdpi/tile_picker_pressed.9.png b/WallpaperPicker/res/drawable-xhdpi/tile_picker_pressed.9.png Binary files differdeleted file mode 100644 index abe0e0080..000000000 --- a/WallpaperPicker/res/drawable-xhdpi/tile_picker_pressed.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-xhdpi/tile_picker_selected.9.png b/WallpaperPicker/res/drawable-xhdpi/tile_picker_selected.9.png Binary files differdeleted file mode 100644 index b047591ac..000000000 --- a/WallpaperPicker/res/drawable-xhdpi/tile_picker_selected.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-xxhdpi/tile_picker_focused.9.png b/WallpaperPicker/res/drawable-xxhdpi/tile_picker_focused.9.png Binary files differdeleted file mode 100644 index 1004c14b8..000000000 --- a/WallpaperPicker/res/drawable-xxhdpi/tile_picker_focused.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-xxhdpi/tile_picker_pressed.9.png b/WallpaperPicker/res/drawable-xxhdpi/tile_picker_pressed.9.png Binary files differdeleted file mode 100644 index 9658444a1..000000000 --- a/WallpaperPicker/res/drawable-xxhdpi/tile_picker_pressed.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable-xxhdpi/tile_picker_selected.9.png b/WallpaperPicker/res/drawable-xxhdpi/tile_picker_selected.9.png Binary files differdeleted file mode 100644 index a3cd30369..000000000 --- a/WallpaperPicker/res/drawable-xxhdpi/tile_picker_selected.9.png +++ /dev/null diff --git a/WallpaperPicker/res/drawable/wallpaper_tile_fg.xml b/WallpaperPicker/res/drawable/wallpaper_tile_fg.xml index c299f32c6..c66fa50ad 100644 --- a/WallpaperPicker/res/drawable/wallpaper_tile_fg.xml +++ b/WallpaperPicker/res/drawable/wallpaper_tile_fg.xml @@ -15,9 +15,33 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_checked="true" android:drawable="@drawable/tile_picker_selected" /> - <item android:state_focused="true" android:drawable="@drawable/tile_picker_focused" /> - <item android:state_pressed="true" android:drawable="@drawable/tile_picker_pressed" /> - <item android:state_selected="true" android:drawable="@drawable/tile_picker_selected" /> + <item android:state_checked="true" > + <shape> + <stroke + android:width="2dp" + android:color="#FFFFFFFF" /> + <solid android:color="#33FFFFFF"/> + </shape> + </item> + <item android:state_focused="true" > + <shape> + <stroke + android:width="2dp" + android:color="#FFFFFFFF" /> + </shape> + </item> + <item android:state_pressed="true"> + <shape android:shape="rectangle"> + <solid android:color="#33FFFFFF"/> + </shape> + </item> + <item android:state_selected="true" > + <shape> + <stroke + android:width="2dp" + android:color="#FFFFFFFF" /> + <solid android:color="#33FFFFFF"/> + </shape> + </item> <item android:drawable="@android:color/transparent" /> </selector> diff --git a/WallpaperPicker/res/values-am/strings.xml b/WallpaperPicker/res/values-am/strings.xml index 59c3bf733..394161634 100644 --- a/WallpaperPicker/res/values-am/strings.xml +++ b/WallpaperPicker/res/values-am/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="wallpaper_instructions" msgid="3524143401182707094">"ልጣፍ አዘጋጅ"</string> + <string name="wallpaper_instructions" msgid="3524143401182707094">"የግድግዳ ወረቀት አዘጋጅ"</string> <string name="image_load_fail" msgid="7538534580694411837">"ምስሉን መጫን አልተቻለም"</string> <string name="wallpaper_load_fail" msgid="4800700444605404650">"ምስሉን እንደ ግድግዳ ወረቀት መጫን አልተቻለም"</string> <plurals name="number_of_items_selected"> @@ -27,10 +27,10 @@ <item quantity="one" msgid="8409622005831789373">"%1$d ተመርጧል"</item> <item quantity="other" msgid="479468347731745357">"%1$d ተመርጧል"</item> </plurals> - <string name="wallpaper_accessibility_name" msgid="4093221025304876354">"ልጣፍ %1$d የ%2$d"</string> + <string name="wallpaper_accessibility_name" msgid="4093221025304876354">"የግድግዳ ወረቀት %1$d የ%2$d"</string> <string name="announce_selection" msgid="123723511662250539">"<xliff:g id="LABEL">%1$s</xliff:g> ተመርጧል"</string> <string name="wallpaper_delete" msgid="1459353972739215344">"ሰርዝ"</string> <string name="pick_image" msgid="6704438906027442697">"ምስል ይምረጡ"</string> <string name="pick_wallpaper" msgid="4628969645948454559">"የግድግዳ ወረቀቶች"</string> - <string name="crop_wallpaper" msgid="4882870800623585836">"ልጣፍ ይከርክሙ"</string> + <string name="crop_wallpaper" msgid="4882870800623585836">"የግድግዳ ወረቀት ይከርክሙ"</string> </resources> diff --git a/WallpaperPicker/res/values-th/strings.xml b/WallpaperPicker/res/values-th/strings.xml index 6b4c23536..c81720563 100644 --- a/WallpaperPicker/res/values-th/strings.xml +++ b/WallpaperPicker/res/values-th/strings.xml @@ -29,7 +29,7 @@ </plurals> <string name="wallpaper_accessibility_name" msgid="4093221025304876354">"วอลเปเปอร์ %1$d จาก %2$d"</string> <string name="announce_selection" msgid="123723511662250539">"เลือก <xliff:g id="LABEL">%1$s</xliff:g> แล้ว"</string> - <string name="wallpaper_delete" msgid="1459353972739215344">"ลบ"</string> + <string name="wallpaper_delete" msgid="1459353972739215344">"นำออก"</string> <string name="pick_image" msgid="6704438906027442697">"เลือกรูปภาพ"</string> <string name="pick_wallpaper" msgid="4628969645948454559">"วอลเปเปอร์"</string> <string name="crop_wallpaper" msgid="4882870800623585836">"ครอบตัดวอลเปเปอร์"</string> diff --git a/WallpaperPicker/res/values-v19/styles.xml b/WallpaperPicker/res/values-v19/styles.xml index 85a989d55..136cf012c 100644 --- a/WallpaperPicker/res/values-v19/styles.xml +++ b/WallpaperPicker/res/values-v19/styles.xml @@ -18,14 +18,14 @@ --> <resources> - <style name="Theme.WallpaperCropper" parent="@android:style/Theme.Holo"> + <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault"> <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="Theme" parent="@android:style/Theme.Holo.Wallpaper.NoTitleBar"> + <style name="Theme" parent="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> </style> diff --git a/WallpaperPicker/res/values/styles.xml b/WallpaperPicker/res/values/styles.xml index 16b11f279..f4008f159 100644 --- a/WallpaperPicker/res/values/styles.xml +++ b/WallpaperPicker/res/values/styles.xml @@ -18,7 +18,7 @@ --> <resources> - <style name="Theme.WallpaperCropper" parent="@android:style/Theme.Holo"> + <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault"> <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item> <item name="android:windowFullscreen">true</item> <item name="android:windowActionBarOverlay">true</item> @@ -30,15 +30,15 @@ <item name="android:windowShowWallpaper">true</item> </style> - <style name="WallpaperCropperActionBar" parent="android:style/Widget.Holo.ActionBar"> + <style name="WallpaperCropperActionBar" parent="@android:style/Widget.DeviceDefault.ActionBar"> <item name="android:displayOptions">showCustom</item> <item name="android:background">#88000000</item> </style> - <style name="Theme" parent="@android:style/Theme.Holo.Wallpaper.NoTitleBar"> + <style name="Theme" parent="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar"> </style> - <style name="ActionBarSetWallpaperStyle" parent="@android:style/Widget.Holo.ActionButton"> + <style name="ActionBarSetWallpaperStyle" parent="@android:style/Widget.DeviceDefault.ActionButton"> <item name="android:textColor">#ffffffff</item> </style> </resources> diff --git a/WallpaperPicker/src/com/android/launcher3/SavedWallpaperImages.java b/WallpaperPicker/src/com/android/launcher3/SavedWallpaperImages.java index 2bdf8f1cd..9f92bc105 100644 --- a/WallpaperPicker/src/com/android/launcher3/SavedWallpaperImages.java +++ b/WallpaperPicker/src/com/android/launcher3/SavedWallpaperImages.java @@ -180,7 +180,6 @@ public class SavedWallpaperImages extends BaseAdapter implements ListAdapter { static class ImageDb extends SQLiteOpenHelper { final static int DB_VERSION = 1; - final static String DB_NAME = "saved_wallpaper_images.db"; final static String TABLE_NAME = "saved_wallpaper_images"; final static String COLUMN_ID = "id"; final static String COLUMN_IMAGE_THUMBNAIL_FILENAME = "image_thumbnail"; @@ -189,7 +188,8 @@ public class SavedWallpaperImages extends BaseAdapter implements ListAdapter { Context mContext; public ImageDb(Context context) { - super(context, context.getDatabasePath(DB_NAME).getPath(), null, DB_VERSION); + super(context, context.getDatabasePath(LauncherFiles.WALLPAPER_IMAGES_DB).getPath(), + null, DB_VERSION); // Store the context for later use mContext = context; } @@ -197,8 +197,9 @@ public class SavedWallpaperImages extends BaseAdapter implements ListAdapter { public static void moveFromCacheDirectoryIfNecessary(Context context) { // We used to store the saved images in the cache directory, but that meant they'd get // deleted sometimes-- move them to the data directory - File oldSavedImagesFile = new File(context.getCacheDir(), ImageDb.DB_NAME); - File savedImagesFile = context.getDatabasePath(ImageDb.DB_NAME); + File oldSavedImagesFile = new File(context.getCacheDir(), + LauncherFiles.WALLPAPER_IMAGES_DB); + File savedImagesFile = context.getDatabasePath(LauncherFiles.WALLPAPER_IMAGES_DB); if (oldSavedImagesFile.exists()) { oldSavedImagesFile.renameTo(savedImagesFile); } diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 4a4bb78a2..1c75b5a97 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android-kernprogramme"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Program is nie geïnstalleer nie."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Program is nie beskikbaar nie"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Afgelaaide program in veiligmodus gedeaktiveer"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Legstukke"</string> <string name="widget_adder" msgid="3201040140710381657">"Legstukke"</string> diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 25931db7d..5938bf06e 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android ዋና መተግበሪያዎች"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"መተግበሪያ አልተጫነም።"</string> + <string name="activity_not_available" msgid="7456344436509528827">"መተግበሪያ አይገኝም"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"የወረደው መተግበሪያ ደህንነቱ በተጠበቀ ሁኔታ ውስጥ ተሰናክሏል"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"ፍርግሞች"</string> <string name="widget_adder" msgid="3201040140710381657">"ፍርግሞች"</string> diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 8b6aa025c..41184a5f4 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"تطبيقات Android الأساسية"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"لم يتم تثبيت التطبيق."</string> + <string name="activity_not_available" msgid="7456344436509528827">"التطبيق ليس متاحًا"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"تم تعطيل التطبيق الذي تم تنزيله في الوضع الآمن"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"الأدوات"</string> <string name="widget_adder" msgid="3201040140710381657">"الأدوات"</string> diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index dcd193050..05c5a7dc5 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Основни приложения на Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Приложението не е инсталирано."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Приложението не е налично"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Изтегленото приложение е деактивирано в безопасния режим"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Приспособления"</string> <string name="widget_adder" msgid="3201040140710381657">"Приспособления"</string> diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 6d1023545..616a3160b 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Aplicacions principals d\'Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"L\'aplicació no s\'ha instal·lat."</string> + <string name="activity_not_available" msgid="7456344436509528827">"L\'aplicació no està disponible."</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"L\'aplicació que has baixat està desactivada al mode segur."</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index f729a460e..9bce2e3ae 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Aplikace není nainstalována."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplikace není k dispozici."</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Stažená aplikace je v nouzovém režimu zakázána"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgety"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgety"</string> diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 85159b2e1..216a01dd7 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Kerneapps i Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Appen er ikke installeret."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Appen er ikke tilgængelig"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Downloadet app er deaktiveret i sikker tilstand"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> @@ -58,7 +59,7 @@ <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Afinstaller"</string> <string name="info_target_label" msgid="8053346143994679532">"Oplysninger om appen"</string> <string name="accessibility_search_button" msgid="1628520399424565142">"Søg"</string> - <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Stemmesøgning"</string> + <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Talesøgning"</string> <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string> <string name="accessibility_delete_button" msgid="6466114477993744621">"Fjern"</string> <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Afinstaller opdatering"</string> diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 698a25413..eda4920c8 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"App ist nicht installiert."</string> + <string name="activity_not_available" msgid="7456344436509528827">"App nicht verfügbar"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Heruntergeladene App im abgesicherten Modus deaktiviert"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 3eec27d4f..4567ea6a9 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Βασικές εφαρμογές Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Η εφαρμογή δεν έχει εγκατασταθεί."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Η εφαρμογή δεν είναι διαθέσιμη"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Η λήψη εφαρμογών απενεργοποήθηκε στην Ασφαλή λειτουργία"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Γραφικά στοιχεία"</string> <string name="widget_adder" msgid="3201040140710381657">"Γραφικά στοιχεία"</string> diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 615e5c90d..bf10a22c5 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"App isn\'t installed."</string> + <string name="activity_not_available" msgid="7456344436509528827">"App isn\'t available"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Downloaded app disabled in Safe mode"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 615e5c90d..bf10a22c5 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"App isn\'t installed."</string> + <string name="activity_not_available" msgid="7456344436509528827">"App isn\'t available"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Downloaded app disabled in Safe mode"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 31afa3e52..79eb9a19b 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Aplicaciones básicas de Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"No se instaló la aplicación."</string> + <string name="activity_not_available" msgid="7456344436509528827">"La aplicación no está disponible."</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Aplicación descargada inhabilitada en modo seguro"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 4e9141208..29144826f 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Aplicaciones básicas de Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"La aplicación no está instalada."</string> + <string name="activity_not_available" msgid="7456344436509528827">"La aplicación no está disponible"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Aplicación descargada inhabilitada en modo seguro"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index fa352a1a3..8943b34d7 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Androidi tuumrakendused"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Rakendus pole installitud."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Rakendus ei ole saadaval"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Allalaetud rakendus on turvarežiimis keelatud"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Vidinad"</string> <string name="widget_adder" msgid="3201040140710381657">"Vidinad"</string> diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 13f40e223..6607843dd 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"برنامههای Android Core"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"برنامه نصب نشده است."</string> + <string name="activity_not_available" msgid="7456344436509528827">"برنامه در دسترس نیست"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"برنامه دانلود شده در حالت ایمن غیرفعال شد"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"ابزارکها"</string> <string name="widget_adder" msgid="3201040140710381657">"ابزارکها"</string> diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 3990a163c..eccb06e1a 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Androidin ydinsovellukset"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Sovellusta ei ole asennettu."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Sovellus ei ole käytettävissä"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Ladattu sovellus poistettiin käytöstä suojatussa tilassa"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgetit"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgetit"</string> diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index f42835014..aac11ed92 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Applications de base Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"L\'application n\'est pas installée."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Application indisponible"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"L\'application téléchargée est désactivée en mode sécurisé."</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 31448f18b..b2eee9955 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Applications de base Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"L\'application n\'est pas installée."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Application indisponible"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"L\'application téléchargée est désactivée en mode sécurisé."</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 0ae90d469..ac0681fab 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android के मुख्य ऐप्लिकेशन"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"एप्लिकेशन इंस्टॉल नहीं है."</string> + <string name="activity_not_available" msgid="7456344436509528827">"ऐप्स उपलब्ध नहीं है"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"डाउनलोड किए गए ऐप्स सुरक्षित मोड में अक्षम है"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"विजेट"</string> <string name="widget_adder" msgid="3201040140710381657">"विजेट"</string> diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index c881077b1..6e69684d9 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Matične aplikacije za Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Aplikacija nije instalirana."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplikacija nije dostupna"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Preuzeta aplikacija onemogućena je u Sigurnom načinu rada"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgeti"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgeti"</string> diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 08d309558..1c11865fe 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Alap Android-alkalmazások"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Az alkalmazás nincs telepítve."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Az alkalmazás nem érhető el"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"A letöltött alkalmazás Csökkentett módban ki van kapcsolva"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Modulok"</string> <string name="widget_adder" msgid="3201040140710381657">"Modulok"</string> diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml index 4ec39c88c..be5568c35 100644 --- a/res/values-hy-rAM/strings.xml +++ b/res/values-hy-rAM/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Ծրագիրը տեղադրված չէ:"</string> + <string name="activity_not_available" msgid="7456344436509528827">"Հավելվածը հասանելի չէ"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Ներբեռնված ծրագիրն անջատված է Անվտանգ ռեժիմում"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Վիջեթներ"</string> <string name="widget_adder" msgid="3201040140710381657">"Վիջեթներ"</string> diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 137e3cc7d..0aadeb340 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Aplikasi Inti Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Aplikasi tidak dipasang."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplikasi tidak tersedia"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Aplikasi yang diunduh dinonaktifkan dalam mode Aman"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widget"</string> <string name="widget_adder" msgid="3201040140710381657">"Widget"</string> diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index b01b25174..77242dd57 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Applicazioni di base Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"App non installata."</string> + <string name="activity_not_available" msgid="7456344436509528827">"App non disponibile"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"L\'app scaricata è stata disattivata in modalità provvisoria"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widget"</string> <string name="widget_adder" msgid="3201040140710381657">"Widget"</string> diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 6318207ff..02012ce42 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"אפליקציות הליבה של Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"האפליקציה לא מותקנת."</string> + <string name="activity_not_available" msgid="7456344436509528827">"האפליקציה אינה זמינה"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"אפליקציה שהורדת הושבתה במצב בטוח"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"רכיבי ווידג\'ט"</string> <string name="widget_adder" msgid="3201040140710381657">"רכיבי ווידג\'ט"</string> diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 232845af0..3ce781b8e 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"このアプリはインストールされていません。"</string> + <string name="activity_not_available" msgid="7456344436509528827">"このアプリは使用できません"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"ダウンロードしたアプリは、セーフモードでは無効です"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"ウィジェット"</string> <string name="widget_adder" msgid="3201040140710381657">"ウィジェット"</string> diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml index 2fb51f541..31cdb40a5 100644 --- a/res/values-ka-rGE/strings.xml +++ b/res/values-ka-rGE/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android-ის ბირთვის აპები"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"აპი არ არის დაყენებული."</string> + <string name="activity_not_available" msgid="7456344436509528827">"აპი მიუწვდომელია"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"უსაფრთხო რეჟიმში ჩამოტვირთული აპი გაუქმებულია"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"ვიჯეტები"</string> <string name="widget_adder" msgid="3201040140710381657">"ვიჯეტები"</string> diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml index bcd606000..19dd31e58 100644 --- a/res/values-km-rKH/strings.xml +++ b/res/values-km-rKH/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"កម្មវិធីសំខាន់ៗរបស់ Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"មិនបានដំឡើងកម្មវិធី។"</string> + <string name="activity_not_available" msgid="7456344436509528827">"មិនមានកម្មវិធី"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"បានបិទកម្មវិធីដែលបានទាញយកក្នុងរបៀបសុវត្ថិភាព"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"ធាតុក្រាហ្វិក"</string> <string name="widget_adder" msgid="3201040140710381657">"ធាតុក្រាហ្វិក"</string> diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 41c854ec3..88ea54e53 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android 핵심 앱"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"앱이 설치되지 않았습니다."</string> + <string name="activity_not_available" msgid="7456344436509528827">"앱을 사용할 수 없음"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"다운로드한 앱은 안전 모드에서 사용할 수 없습니다."</string> <string name="widgets_tab_label" msgid="2921133187116603919">"위젯"</string> <string name="widget_adder" msgid="3201040140710381657">"위젯"</string> diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml index 1d953ffde..b30a69d1b 100644 --- a/res/values-lo-rLA/strings.xml +++ b/res/values-lo-rLA/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"ແອັບພລິເຄຊັນຫຼັກຂອງ Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"ແອັບຯບໍ່ໄດ້ຖືກຕິດຕັ້ງ."</string> + <string name="activity_not_available" msgid="7456344436509528827">"ແອັບຯໃຊ້ບໍ່ໄດ້"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"ແອັບຯທີ່ດາວໂຫລດແລ້ວຖືກປິດການນຳໃຊ້ໃນ Safe mode"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"ວິດເຈັດ"</string> <string name="widget_adder" msgid="3201040140710381657">"ວິດເຈັດ"</string> diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index f7db79291..72b029c8e 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Pagrindinės „Android“ programos"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Programa neįdiegta."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Programa nepasiekiama"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Atsisiųsta programa išjungta Saugos režimu"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Valdikliai"</string> <string name="widget_adder" msgid="3201040140710381657">"Valdikliai"</string> diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 75eb0548b..280bc0c40 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android pamatlietotnes"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Lietotne nav instalēta."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Lietotne nav pieejama."</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Lejupielādētā lietotne ir atspējota drošajā režīmā."</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Logrīki"</string> <string name="widget_adder" msgid="3201040140710381657">"Logrīki"</string> diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml index 34fb79423..816803af0 100644 --- a/res/values-mn-rMN/strings.xml +++ b/res/values-mn-rMN/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Андройд үндсэн апп"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Апп суугаагүй байна."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Апп-г ашиглах боломжгүй"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Татаж авсан апп-г Аюулгүй горим дотроос идэвхгүйжүүлсэн"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Виджет"</string> <string name="widget_adder" msgid="3201040140710381657">"Виджет"</string> diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml index 3c5876268..07236d658 100644 --- a/res/values-ms-rMY/strings.xml +++ b/res/values-ms-rMY/strings.xml @@ -24,6 +24,8 @@ <string name="uid_name" msgid="7820867637514617527">"Apl Teras Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Apl tidak dipasang."</string> + <!-- no translation found for activity_not_available (7456344436509528827) --> + <skip /> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Apl yang dimuat turun dilumpuhkan dalam mod Selamat"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widget"</string> <string name="widget_adder" msgid="3201040140710381657">"Widget"</string> diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index ff8280e73..13d8843a7 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Kjerneapper for Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Appen er ikke installert."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Appen er ikke tilgjengelig"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"En nedlastet app er deaktivert i sikker modus"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Moduler"</string> <string name="widget_adder" msgid="3201040140710381657">"Moduler"</string> diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 470eb8722..c9f7e6714 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android-kernapps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"App is niet geïnstalleerd."</string> + <string name="activity_not_available" msgid="7456344436509528827">"App is niet beschikbaar"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Gedownloade app uitgeschakeld in veilige modus"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 61a51e0a5..44e46e034 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Główne aplikacje Androida"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Aplikacja nie jest zainstalowana."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplikacja niedostępna"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Pobrana aplikacja została wyłączona w trybie awaryjnym"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widżety"</string> <string name="widget_adder" msgid="3201040140710381657">"Widżety"</string> diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 2fe062a4a..fb3367803 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Aplicações principais do Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"A aplicação não está instalada."</string> + <string name="activity_not_available" msgid="7456344436509528827">"A aplicação não está disponível"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Aplicação transferida desativada no Modo de segurança"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index ddbb25310..2f86d0bbe 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Principais apps do Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"O app não está instalado."</string> + <string name="activity_not_available" msgid="7456344436509528827">"O app não está disponível"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"App transferido por download desativado no modo de segurança"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string> diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 04aebc8b9..c6000ee2b 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Aplicația nu este instalată."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplicația nu este disponibilă"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Aplicația descărcată este dezactivată în modul de siguranță"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgeturi"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgeturi"</string> diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index b1d7713a0..134582d9f 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Основные приложения Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Приложение удалено"</string> + <string name="activity_not_available" msgid="7456344436509528827">"Приложение недоступно"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Скачанное приложение отключено в безопасном режиме"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Виджеты"</string> <string name="widget_adder" msgid="3201040140710381657">"Виджеты"</string> diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index a00367949..d80b5ac41 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Aplikácia nie je nainštalovaná."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplikácia nie je k dispozícii"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Stiahnutá aplikácia je v núdzovom režime zakázaná"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Miniaplikácie"</string> <string name="widget_adder" msgid="3201040140710381657">"Miniaplikácie"</string> @@ -86,7 +87,7 @@ <string name="workspace_scroll_format" msgid="8458889198184077399">"Plocha %1$d z %2$d"</string> <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="2459738000155917941">"Vitajte"</string> + <string name="first_run_cling_title" msgid="2459738000155917941">"Vitajte!"</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> diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 9c5bebd15..882ddb4b5 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Osnovne aplikacije sistema Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Aplikacija ni nameščena."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Aplikacija ni na voljo"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Prenesena aplikacija je onemogočena v Varnem načinu"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Pripomočki"</string> <string name="widget_adder" msgid="3201040140710381657">"Pripomočki"</string> diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 421f8d3ac..63f48f512 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Основне Android апликације"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Апликација није инсталирана."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Апликација није доступна"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Преузета апликација је онемогућена у Безбедном режиму"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Виџети"</string> <string name="widget_adder" msgid="3201040140710381657">"Виџети"</string> diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index e149c9efa..674f1dff2 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Appen är inte installerad."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Appen är inte tillgänglig"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Den hämtade appen inaktiverades i säkert läge"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widgetar"</string> <string name="widget_adder" msgid="3201040140710381657">"Widgetar"</string> diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 07d091393..94f53cebe 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Programu Msingi za Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Programu haijasakinishwa."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Programu haipatikani"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Programu iliyopakuliwa imezimwa katika Hali Salama"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Wijeti"</string> <string name="widget_adder" msgid="3201040140710381657">"Wijeti"</string> diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index beed89844..06ed6ec92 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"แอปหลักของ Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"ไม่ได้ติดตั้งแอป"</string> + <string name="activity_not_available" msgid="7456344436509528827">"แอปไม่พร้อมใช้งาน"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"แอปที่ดาวน์โหลดถูกปิดในโหมดปลอดภัย"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"วิดเจ็ต"</string> <string name="widget_adder" msgid="3201040140710381657">"วิดเจ็ต"</string> diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 7c6acd2ab..3c877d074 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Hindi naka-install ang app."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Hindi available ang app"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Naka-disable ang na-download na app sa Safe mode"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Mga Widget"</string> <string name="widget_adder" msgid="3201040140710381657">"Mga Widget"</string> diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 6c0bb69a7..2f67ad25d 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android Çekirdek Uygulamaları"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Uygulama yüklü değil."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Uygulama kullanılamıyor"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"İndirilen uygulama Güvenli modda devre dışı bırakıldı"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Widget\'lar"</string> <string name="widget_adder" msgid="3201040140710381657">"Widget\'lar"</string> diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index e5b5cd8d2..12c9dd49c 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Базові програми Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Додаток видалено."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Додаток недоступний"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Завантажений додаток вимкнено в безпечному режимі"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Віджети"</string> <string name="widget_adder" msgid="3201040140710381657">"Віджети"</string> diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 489123089..79db2c5e5 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Ứng dụng lõi Android"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Ứng dụng chưa được cài đặt."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Ứng dụng không có sẵn"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Ứng dụng đã tải xuống bị tắt ở chế độ An toàn"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Tiện ích con"</string> <string name="widget_adder" msgid="3201040140710381657">"Tiện ích con"</string> diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 3365581be..37923dd2a 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android 核心应用"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"未安装该应用。"</string> + <string name="activity_not_available" msgid="7456344436509528827">"应用不可用"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"安全模式下不允许使用下载的此应用"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"小部件"</string> <string name="widget_adder" msgid="3201040140710381657">"小部件"</string> diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 457d5be9e..346e60a02 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android 核心應用程式"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"尚未安裝應用程式。"</string> + <string name="activity_not_available" msgid="7456344436509528827">"目前無法使用這個應用程式"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"在安全模式中無法使用「已下載的應用程式」功能"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"小工具"</string> <string name="widget_adder" msgid="3201040140710381657">"小工具"</string> diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 2d400596f..a63fb69ef 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Android 核心應用程式"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"應用程式未安裝。"</string> + <string name="activity_not_available" msgid="7456344436509528827">"應用程式目前無法使用"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"在安全模式中無法使用「已下載的應用程式」功能"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"小工具"</string> <string name="widget_adder" msgid="3201040140710381657">"小工具"</string> diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 89cd5cc12..f94b166e0 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -24,6 +24,7 @@ <string name="uid_name" msgid="7820867637514617527">"Izinhlelo zokusebenza ze-Android Core"</string> <string name="folder_name" msgid="7371454440695724752"></string> <string name="activity_not_found" msgid="8071924732094499514">"Uhlelo lokusebenza alufakiwe."</string> + <string name="activity_not_available" msgid="7456344436509528827">"Uhlelo lokusebenza alutholakali"</string> <string name="safemode_shortcut_error" msgid="9160126848219158407">"Uhlelo lokusebenza olulandiwe lukhutshaziwe kumodi ephephile"</string> <string name="widgets_tab_label" msgid="2921133187116603919">"Amawijethi"</string> <string name="widget_adder" msgid="3201040140710381657">"Amawijethi"</string> diff --git a/res/values/strings.xml b/res/values/strings.xml index ff3509bc5..dd9b170f3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -40,6 +40,8 @@ <string name="folder_name"></string> <!-- Displayed when user selects a shortcut for an app that was uninstalled [CHAR_LIMIT=none]--> <string name="activity_not_found">App isn\'t installed.</string> + <!-- Displayed when user selects a shortcut for an app that is current not available [CHAR_LIMIT=none]--> + <string name="activity_not_available">App isn\'t available</string> <!-- SafeMode shortcut error string --> <string name="safemode_shortcut_error">Downloaded app disabled in Safe mode</string> <!-- Labels for the tabs in the customize drawer --> diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index 38d2fa541..72c6693b3 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -18,10 +18,6 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; @@ -101,17 +97,15 @@ class AllAppsList { final List<LauncherActivityInfoCompat> matches = launcherApps.getActivityList(packageName, user); - if (matches.size() > 0) { - for (LauncherActivityInfoCompat info : matches) { - add(new AppInfo(context, info, user, mIconCache, null)); - } + for (LauncherActivityInfoCompat info : matches) { + add(new AppInfo(context, info, user, mIconCache, null)); } } /** * Remove the apps for the given apk identified by packageName. */ - public void removePackage(String packageName, UserHandleCompat user) { + public void removePackage(String packageName, UserHandleCompat user, boolean clearCache) { final List<AppInfo> data = this.data; for (int i = data.size() - 1; i >= 0; i--) { AppInfo info = data.get(i); @@ -121,7 +115,9 @@ class AllAppsList { data.remove(i); } } - mIconCache.remove(packageName, user); + if (clearCache) { + mIconCache.remove(packageName, user); + } } /** @@ -149,9 +145,7 @@ class AllAppsList { // Find enabled activities and add them to the adapter // Also updates existing activities with new labels/icons - int count = matches.size(); - for (int i = 0; i < count; i++) { - final LauncherActivityInfoCompat info = matches.get(i); + for (final LauncherActivityInfoCompat info : matches) { AppInfo applicationInfo = findApplicationInfoLocked( info.getComponentName().getPackageName(), user, info.getComponentName().getClassName()); diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index 00f0cf36f..08ed89b43 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -142,7 +142,7 @@ public class AutoInstallsLayout implements WorkspaceLoader { mDb = db; try { return parseLayout(mRes, mLayoutId, screenIds); - } catch (XmlPullParserException | IOException | RuntimeException e) { + } catch (Exception e) { Log.w(TAG, "Got exception parsing layout.", e); return -1; } diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index a368796bd..07f3045a5 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -40,7 +40,7 @@ import android.widget.TextView; */ public class BubbleTextView extends TextView { - private static SparseArray<Theme> sPreloaderThemes = new SparseArray<>(2); + private static SparseArray<Theme> sPreloaderThemes = new SparseArray<Theme>(2); private static final float SHADOW_LARGE_RADIUS = 4.0f; private static final float SHADOW_SMALL_RADIUS = 1.75f; @@ -122,7 +122,7 @@ public class BubbleTextView extends TextView { LauncherAppState app = LauncherAppState.getInstance(); FastBitmapDrawable iconDrawable = Utilities.createIconDrawable(b); - iconDrawable.setGhostModeEnabled(info.isDisabled); + iconDrawable.setGhostModeEnabled(info.isDisabled != 0); setCompoundDrawables(null, iconDrawable, null, null); if (setDefaultPadding) { diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index bb71d776c..06f9f2941 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -29,7 +29,6 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.Log; @@ -122,7 +121,7 @@ public class IconCache { android.R.mipmap.sym_def_app_icon); } - public Drawable getFullResIcon(Resources resources, int iconId) { + private Drawable getFullResIcon(Resources resources, int iconId) { Drawable d; try { d = resources.getDrawableForDensity(iconId, mIconDpi); @@ -390,8 +389,7 @@ public class IconCache { entry.title = title; } if (icon != null) { - entry.icon = Utilities.createIconBitmap( - new BitmapDrawable(mContext.getResources(), icon), mContext); + entry.icon = Utilities.createIconBitmap(icon, mContext); } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 42ec4fb48..ec1c0aa67 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -73,7 +73,6 @@ import android.text.TextUtils; import android.text.method.TextKeyListener; import android.util.DisplayMetrics; import android.util.Log; -import android.view.ContextThemeWrapper; import android.view.Display; import android.view.Gravity; import android.view.HapticFeedbackConstants; @@ -88,13 +87,11 @@ import android.view.View.OnLongClickListener; import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.Window; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; -import android.view.animation.Interpolator; import android.view.inputmethod.InputMethodManager; import android.widget.Advanceable; import android.widget.FrameLayout; @@ -168,7 +165,6 @@ public class Launcher extends Activity static final int SCREEN_COUNT = 5; static final int DEFAULT_SCREEN = 2; - private static final String PREFERENCES = "launcher.preferences"; // To turn on these properties, type // adb shell setprop log.tag.PROPERTY_NAME [VERBOSE | SUPPRESS] static final String FORCE_ENABLE_ROTATION_PROPERTY = "launcher_force_rotate"; @@ -620,7 +616,7 @@ public class Launcher extends Activity private static void readConfiguration(Context context, LocaleConfiguration configuration) { DataInputStream in = null; try { - in = new DataInputStream(context.openFileInput(PREFERENCES)); + in = new DataInputStream(context.openFileInput(LauncherFiles.LAUNCHER_PREFS)); configuration.locale = in.readUTF(); configuration.mcc = in.readInt(); configuration.mnc = in.readInt(); @@ -642,7 +638,8 @@ public class Launcher extends Activity private static void writeConfiguration(Context context, LocaleConfiguration configuration) { DataOutputStream out = null; try { - out = new DataOutputStream(context.openFileOutput(PREFERENCES, MODE_PRIVATE)); + out = new DataOutputStream(context.openFileOutput( + LauncherFiles.LAUNCHER_PREFS, MODE_PRIVATE)); out.writeUTF(configuration.locale); out.writeInt(configuration.mcc); out.writeInt(configuration.mnc); @@ -651,7 +648,7 @@ public class Launcher extends Activity // Ignore } catch (IOException e) { //noinspection ResultOfMethodCallIgnored - context.getFileStreamPath(PREFERENCES).delete(); + context.getFileStreamPath(LauncherFiles.LAUNCHER_PREFS).delete(); } finally { if (out != null) { try { @@ -2564,7 +2561,7 @@ public class Launcher extends Activity private void showBrokenAppInstallDialog(final String packageName, DialogInterface.OnClickListener onSearchClickListener) { - new AlertDialog.Builder(new ContextThemeWrapper(this, android.R.style.Theme_DeviceDefault)) + new AlertDialog.Builder(this) .setTitle(R.string.abandoned_promises_title) .setMessage(R.string.abandoned_promise_explanation) .setPositiveButton(R.string.abandoned_search, onSearchClickListener) @@ -2593,6 +2590,16 @@ public class Launcher extends Activity // Open shortcut final ShortcutInfo shortcut = (ShortcutInfo) tag; + + if (shortcut.isDisabled != 0) { + int error = R.string.activity_not_available; + if ((shortcut.isDisabled & ShortcutInfo.FLAG_DISABLED_SAFEMODE) != 0) { + error = R.string.safemode_shortcut_error; + } + Toast.makeText(this, error, Toast.LENGTH_SHORT).show(); + return; + } + final Intent intent = shortcut.intent; // Check for special shortcuts @@ -4610,7 +4617,6 @@ public class Launcher extends Activity mIntentsOnWorkspaceFromUpgradePath = mWorkspace.getUniqueComponents(true, null); } PackageInstallerCompat.getInstance(this).onFinishBind(); - mModel.recheckRestoredItems(this); } private void sendLoadingCompleteBroadcastIfNecessary() { @@ -4720,12 +4726,14 @@ public class Launcher extends Activity } /** - * Packages were restored + * Some shortcuts were updated in the background. + * + * Implementation of the method from LauncherModel.Callbacks. */ - public void bindAppsRestored(final ArrayList<AppInfo> apps) { + public void bindShortcutsUpdated(final ArrayList<ShortcutInfo> shortcuts) { Runnable r = new Runnable() { public void run() { - bindAppsRestored(apps); + bindShortcutsUpdated(shortcuts); } }; if (waitUntilResume(r)) { @@ -4733,7 +4741,7 @@ public class Launcher extends Activity } if (mWorkspace != null) { - mWorkspace.updateShortcutsAndWidgets(apps); + mWorkspace.updateShortcuts(shortcuts); } } @@ -4768,24 +4776,30 @@ public class Launcher extends Activity * we only remove specific components from the workspace, where as * package-removal should clear all items by package name. * + * @param reason if non-zero, the icons are not permanently removed, rather marked as disabled. * Implementation of the method from LauncherModel.Callbacks. */ + @Override public void bindComponentsRemoved(final ArrayList<String> packageNames, - final ArrayList<AppInfo> appInfos, final UserHandleCompat user) { + final ArrayList<AppInfo> appInfos, final UserHandleCompat user, final int reason) { Runnable r = new Runnable() { public void run() { - bindComponentsRemoved(packageNames, appInfos, user); + bindComponentsRemoved(packageNames, appInfos, user, reason); } }; if (waitUntilResume(r)) { return; } - if (!packageNames.isEmpty()) { - mWorkspace.removeItemsByPackageName(packageNames, user); - } - if (!appInfos.isEmpty()) { - mWorkspace.removeItemsByApplicationInfo(appInfos, user); + if (reason == 0) { + if (!packageNames.isEmpty()) { + mWorkspace.removeItemsByPackageName(packageNames, user); + } + if (!appInfos.isEmpty()) { + mWorkspace.removeItemsByApplicationInfo(appInfos, user); + } + } else { + mWorkspace.disableShortcutsByPackageName(packageNames, user, reason); } // Notify the drag controller @@ -4909,31 +4923,6 @@ public class Launcher extends Activity return true; } - protected boolean shouldClingFocusHotseatApp() { - return false; - } - protected String getFirstRunClingSearchBarHint() { - return ""; - } - 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 ""; - } - /** * To be overridden by subclasses to indicate that there is an activity to launch * before showing the standard launcher experience. diff --git a/src/com/android/launcher3/LauncherClings.java b/src/com/android/launcher3/LauncherClings.java index 458d81f61..ef8e8abcf 100644 --- a/src/com/android/launcher3/LauncherClings.java +++ b/src/com/android/launcher3/LauncherClings.java @@ -27,7 +27,6 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserManager; import android.provider.Settings; -import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -56,8 +55,7 @@ class LauncherClings implements OnClickListener { /** Ctor */ public LauncherClings(Launcher launcher) { mLauncher = launcher; - mInflater = LayoutInflater.from(new - ContextThemeWrapper(mLauncher, android.R.style.Theme_DeviceDefault)); + mInflater = LayoutInflater.from(mLauncher); } @Override diff --git a/src/com/android/launcher3/LauncherFiles.java b/src/com/android/launcher3/LauncherFiles.java new file mode 100644 index 000000000..89600c2df --- /dev/null +++ b/src/com/android/launcher3/LauncherFiles.java @@ -0,0 +1,27 @@ +package com.android.launcher3; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Central list of files the Launcher writes to the application data directory. + * + * To add a new Launcher file, create a String constant referring to the filename, and add it to + * ALL_FILES, as shown below. + */ +public class LauncherFiles { + + public static final String SHARED_PREFS = "com.android.launcher3.prefs.xml"; + public static final String LAUNCHER_DB = "launcher.db"; + public static final String LAUNCHER_PREFS = "launcher.preferences"; + public static final String WALLPAPER_IMAGES_DB = "saved_wallpaper_images.db"; + public static final String WIDGET_PREVIEWS_DB = "widgetpreviews.db"; + + public static final List<String> ALL_FILES = Collections.unmodifiableList(Arrays.asList( + SHARED_PREFS, + LAUNCHER_DB, + LAUNCHER_PREFS, + WALLPAPER_IMAGES_DB, + WIDGET_PREVIEWS_DB)); +} diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index c64506d80..0b7ee2e1f 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -198,11 +198,11 @@ public class LauncherModel extends BroadcastReceiver ArrayList<ItemInfo> addAnimated, ArrayList<AppInfo> addedApps); public void bindAppsUpdated(ArrayList<AppInfo> apps); - public void bindAppsRestored(ArrayList<AppInfo> apps); + public void bindShortcutsUpdated(ArrayList<ShortcutInfo> shortcuts); public void updatePackageState(ArrayList<PackageInstallInfo> installInfo); public void updatePackageBadge(String packageName); public void bindComponentsRemoved(ArrayList<String> packageNames, - ArrayList<AppInfo> appInfos, UserHandleCompat user); + ArrayList<AppInfo> appInfos, UserHandleCompat user, int reason); public void bindPackagesUpdated(ArrayList<Object> widgetsAndShortcuts); public void bindSearchablesChanged(); public boolean isAllAppsButtonRank(int rank); @@ -1981,6 +1981,7 @@ public class LauncherModel extends BroadcastReceiver long serialNumber = c.getInt(profileIdIndex); user = mUserManager.getUserForSerialNumber(serialNumber); int promiseType = c.getInt(restoredIndex); + int disabledState = 0; if (user == null) { // User has been deleted remove the item. itemsToRemove.add(id); @@ -2054,14 +2055,13 @@ public class LauncherModel extends BroadcastReceiver itemsToRemove.add(id); continue; } - } else if (isSdCardReady) { - // Do not wait for external media load anymore. - // Log the invalid package, and remove it - Launcher.addDumpLog(TAG, - "Invalid package removed: " + cn, true); - itemsToRemove.add(id); - continue; - } else { + } else if (launcherApps.isAppEnabled( + manager, cn.getPackageName(), + PackageManager.GET_UNINSTALLED_PACKAGES)) { + // Package is present but not available. + allowMissingTarget = true; + disabledState = ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE; + } else if (!isSdCardReady) { // SdCard is not ready yet. Package might get available, // once it is ready. Launcher.addDumpLog(TAG, "Invalid package: " + cn @@ -2074,6 +2074,14 @@ public class LauncherModel extends BroadcastReceiver pkgs.add(cn.getPackageName()); allowMissingTarget = true; // Add the icon on the workspace anyway. + + } else { + // Do not wait for external media load anymore. + // Log the invalid package, and remove it + Launcher.addDumpLog(TAG, + "Invalid package removed: " + cn, true); + itemsToRemove.add(id); + continue; } } else if (cn == null) { // For shortcuts with no component, keep them as they are @@ -2131,8 +2139,10 @@ public class LauncherModel extends BroadcastReceiver info.spanX = 1; info.spanY = 1; info.intent.putExtra(ItemInfo.EXTRA_PROFILE, serialNumber); - info.isDisabled = isSafeMode - && !Utilities.isSystemApp(context, intent); + info.isDisabled = disabledState; + if (isSafeMode && !Utilities.isSystemApp(context, intent)) { + info.isDisabled |= ShortcutInfo.FLAG_DISABLED_SAFEMODE; + } // check & update map of what's occupied deleteOnInvalidPlacement.set(false); @@ -2930,84 +2940,40 @@ public class LauncherModel extends BroadcastReceiver synchronized (sBgLock) { final LauncherAppsCompat launcherApps = LauncherAppsCompat .getInstance(mApp.getContext()); - ArrayList<String> packagesRemoved; + final PackageManager manager = context.getPackageManager(); + final ArrayList<String> packagesRemoved = new ArrayList<String>(); + final ArrayList<String> packagesUnavailable = new ArrayList<String>(); for (Entry<UserHandleCompat, HashSet<String>> entry : sPendingPackages.entrySet()) { UserHandleCompat user = entry.getKey(); - packagesRemoved = new ArrayList<String>(); + packagesRemoved.clear(); + packagesUnavailable.clear(); for (String pkg : entry.getValue()) { if (!launcherApps.isPackageEnabledForProfile(pkg, user)) { - Launcher.addDumpLog(TAG, "Package not found: " + pkg, true); - packagesRemoved.add(pkg); + boolean packageOnSdcard = launcherApps.isAppEnabled( + manager, pkg, PackageManager.GET_UNINSTALLED_PACKAGES); + if (packageOnSdcard) { + Launcher.addDumpLog(TAG, "Package found on sd-card: " + pkg, true); + packagesUnavailable.add(pkg); + } else { + Launcher.addDumpLog(TAG, "Package not found: " + pkg, true); + packagesRemoved.add(pkg); + } } } if (!packagesRemoved.isEmpty()) { enqueuePackageUpdated(new PackageUpdatedTask(PackageUpdatedTask.OP_REMOVE, packagesRemoved.toArray(new String[packagesRemoved.size()]), user)); } + if (!packagesUnavailable.isEmpty()) { + enqueuePackageUpdated(new PackageUpdatedTask(PackageUpdatedTask.OP_UNAVAILABLE, + packagesUnavailable.toArray(new String[packagesUnavailable.size()]), user)); + } } sPendingPackages.clear(); } } } - /** - * Workaround to re-check unrestored items, in-case they were installed but the Package-ADD - * runnable was missed by the launcher. - */ - public void recheckRestoredItems(final Context context) { - Runnable r = new Runnable() { - - @Override - public void run() { - LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); - HashSet<String> installedPackages = new HashSet<String>(); - UserHandleCompat user = UserHandleCompat.myUserHandle(); - synchronized(sBgLock) { - for (ItemInfo info : sBgItemsIdMap.values()) { - if (info instanceof ShortcutInfo) { - ShortcutInfo si = (ShortcutInfo) info; - if (si.isPromise() && si.getTargetComponent() != null - && launcherApps.isPackageEnabledForProfile( - si.getTargetComponent().getPackageName(), user)) { - installedPackages.add(si.getTargetComponent().getPackageName()); - } - } else if (info instanceof LauncherAppWidgetInfo) { - LauncherAppWidgetInfo widget = (LauncherAppWidgetInfo) info; - if (widget.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY) - && launcherApps.isPackageEnabledForProfile( - widget.providerName.getPackageName(), user)) { - installedPackages.add(widget.providerName.getPackageName()); - } - } - } - } - - if (!installedPackages.isEmpty()) { - final ArrayList<AppInfo> restoredApps = new ArrayList<AppInfo>(); - for (String pkg : installedPackages) { - for (LauncherActivityInfoCompat info : launcherApps.getActivityList(pkg, user)) { - restoredApps.add(new AppInfo(context, info, user, mIconCache, null)); - } - } - - final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; - if (!restoredApps.isEmpty()) { - mHandler.post(new Runnable() { - public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; - if (callbacks == cb && cb != null) { - callbacks.bindAppsRestored(restoredApps); - } - } - }); - } - - } - } - }; - sWorker.post(r); - } - private class PackageUpdatedTask implements Runnable { int mOp; String[] mPackages; @@ -3049,9 +3015,10 @@ public class LauncherModel extends BroadcastReceiver break; case OP_REMOVE: case OP_UNAVAILABLE: + boolean clearCache = mOp == OP_REMOVE; for (int i=0; i<N; i++) { if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.removePackage " + packages[i]); - mBgAllAppsList.removePackage(packages[i], mUser); + mBgAllAppsList.removePackage(packages[i], mUser, clearCache); WidgetPreviewLoader.removePackageFromDb( mApp.getWidgetPreviewCacheDb(), packages[i]); } @@ -3099,7 +3066,7 @@ public class LauncherModel extends BroadcastReceiver ArrayList<ItemInfo> infos = getItemInfoForComponentName(a.componentName, mUser); for (ItemInfo i : infos) { - if (isShortcutInfoUpdateable(i)) { + if (i instanceof ShortcutInfo && isShortcutAppTarget((ShortcutInfo) i)) { ShortcutInfo info = (ShortcutInfo) i; info.title = a.title.toString(); info.contentDescription = a.contentDescription; @@ -3118,30 +3085,74 @@ public class LauncherModel extends BroadcastReceiver }); } + // Update shortcuts which use an iconResource + if (mOp == OP_ADD || mOp == OP_UPDATE) { + final ArrayList<ShortcutInfo> iconsChanged = new ArrayList<ShortcutInfo>(); + HashSet<String> packageSet = new HashSet<String>(Arrays.asList(packages)); + // We need to iterate over the items here, so that we can avoid new Bitmap + // creation on the UI thread. + synchronized (sBgLock) { + for (ItemInfo info : sBgWorkspaceItems) { + if (info instanceof ShortcutInfo && mUser.equals(info.user)) { + ShortcutInfo si = (ShortcutInfo) info; + if ((si.iconResource != null) + && packageSet.contains(si.getTargetComponent().getPackageName())){ + Bitmap icon = Utilities.createIconBitmap(si.iconResource.packageName, + si.iconResource.resourceName, mIconCache, context); + if (icon != null) { + si.setIcon(icon); + si.usingFallbackIcon = false; + iconsChanged.add(si); + updateItemInDatabase(context, si); + } + } + } + } + } + + if (!iconsChanged.isEmpty()) { + mHandler.post(new Runnable() { + public void run() { + Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + if (callbacks == cb && cb != null) { + callbacks.bindShortcutsUpdated(iconsChanged); + } + } + }); + } + } + final ArrayList<String> removedPackageNames = new ArrayList<String>(); - if (mOp == OP_REMOVE) { + if (mOp == OP_REMOVE || mOp == OP_UNAVAILABLE) { // Mark all packages in the broadcast to be removed removedPackageNames.addAll(Arrays.asList(packages)); } else if (mOp == OP_UPDATE) { // Mark disabled packages in the broadcast to be removed - final PackageManager pm = context.getPackageManager(); for (int i=0; i<N; i++) { if (isPackageDisabled(context, packages[i], mUser)) { removedPackageNames.add(packages[i]); } } } - // Remove all the components associated with this package - for (String pn : removedPackageNames) { - deletePackageFromDatabase(context, pn, mUser); - } - // Remove all the specific components - for (AppInfo a : removedApps) { - ArrayList<ItemInfo> infos = getItemInfoForComponentName(a.componentName, mUser); - deleteItemsFromDatabase(context, infos); - } + if (!removedPackageNames.isEmpty() || !removedApps.isEmpty()) { + final int removeReason; + if (mOp == OP_UNAVAILABLE) { + removeReason = ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE; + } else { + // Remove all the components associated with this package + for (String pn : removedPackageNames) { + deletePackageFromDatabase(context, pn, mUser); + } + // Remove all the specific components + for (AppInfo a : removedApps) { + ArrayList<ItemInfo> infos = getItemInfoForComponentName(a.componentName, mUser); + deleteItemsFromDatabase(context, infos); + } + removeReason = 0; + } + // Remove any queued items from the install queue String spKey = LauncherAppState.getSharedPreferencesKey(); SharedPreferences sp = @@ -3152,7 +3163,8 @@ public class LauncherModel extends BroadcastReceiver public void run() { Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; if (callbacks == cb && cb != null) { - callbacks.bindComponentsRemoved(removedPackageNames, removedApps, mUser); + callbacks.bindComponentsRemoved( + removedPackageNames, removedApps, mUser, removeReason); } } }); @@ -3402,24 +3414,18 @@ public class LauncherModel extends BroadcastReceiver return filterItemInfos(sBgItemsIdMap.values(), filter); } - public static boolean isShortcutInfoUpdateable(ItemInfo i) { - if (i instanceof ShortcutInfo) { - ShortcutInfo info = (ShortcutInfo) i; - // We need to check for ACTION_MAIN otherwise getComponent() might - // return null for some shortcuts (for instance, for shortcuts to - // web pages.) - Intent intent = info.intent; - ComponentName name = intent.getComponent(); - if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION && - Intent.ACTION_MAIN.equals(intent.getAction()) && name != null) { - return true; - } - // placeholder shortcuts get special treatment, let them through too. - if (info.isPromise()) { - return true; - } - } - return false; + /** + * @return true if the ShortcutInfo points to an app shortcut target, i.e. it has been added by + * dragging from AllApps list. + */ + public static boolean isShortcutAppTarget(ShortcutInfo info) { + // We need to check for ACTION_MAIN otherwise getComponent() might + // return null for some shortcuts (for instance, for shortcuts to + // web pages.) + Intent intent = info.promisedIntent != null ? info.promisedIntent : info.intent; + ComponentName name = intent.getComponent(); + return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION && + Intent.ACTION_MAIN.equals(intent.getAction()) && name != null; } /** @@ -3444,19 +3450,9 @@ public class LauncherModel extends BroadcastReceiver case LauncherSettings.Favorites.ICON_TYPE_RESOURCE: String packageName = c.getString(iconPackageIndex); String resourceName = c.getString(iconResourceIndex); - PackageManager packageManager = context.getPackageManager(); info.customIcon = false; // the resource - try { - Resources resources = packageManager.getResourcesForApplication(packageName); - if (resources != null) { - final int id = resources.getIdentifier(resourceName, null, null); - icon = Utilities.createIconBitmap( - mIconCache.getFullResIcon(resources, id), context); - } - } catch (Exception e) { - // drop this. we have other places to look for icons - } + icon = Utilities.createIconBitmap(packageName, resourceName, mIconCache, context); // the db if (icon == null) { icon = getIconFromCursor(c, iconIndex, context); @@ -3544,24 +3540,15 @@ public class LauncherModel extends BroadcastReceiver boolean customIcon = false; ShortcutIconResource iconResource = null; - if (bitmap != null && bitmap instanceof Bitmap) { - icon = Utilities.createIconBitmap(new FastBitmapDrawable((Bitmap)bitmap), context); + if (bitmap instanceof Bitmap) { + icon = Utilities.createIconBitmap((Bitmap) bitmap, context); customIcon = true; } else { Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); - if (extra != null && extra instanceof ShortcutIconResource) { - try { - iconResource = (ShortcutIconResource) extra; - final PackageManager packageManager = context.getPackageManager(); - Resources resources = packageManager.getResourcesForApplication( - iconResource.packageName); - final int id = resources.getIdentifier(iconResource.resourceName, null, null); - icon = Utilities.createIconBitmap( - mIconCache.getFullResIcon(resources, id), - context); - } catch (Exception e) { - Log.w(TAG, "Could not load shortcut icon: " + extra); - } + if (extra instanceof ShortcutIconResource) { + iconResource = (ShortcutIconResource) extra; + icon = Utilities.createIconBitmap(iconResource.packageName, + iconResource.resourceName, mIconCache, context); } } diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java index c0e648758..44ccb6cb3 100644 --- a/src/com/android/launcher3/LauncherProvider.java +++ b/src/com/android/launcher3/LauncherProvider.java @@ -73,8 +73,6 @@ public class LauncherProvider extends ContentProvider { private static final String TAG = "Launcher.LauncherProvider"; private static final boolean LOGD = false; - private static final String DATABASE_NAME = "launcher.db"; - private static final int DATABASE_VERSION = 20; static final String OLD_AUTHORITY = "com.android.launcher2.settings"; @@ -431,7 +429,7 @@ public class LauncherProvider extends ContentProvider { private boolean mNewDbCreated = false; DatabaseHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); + super(context, LauncherFiles.LAUNCHER_DB, null, DATABASE_VERSION); mContext = context; mPackageManager = context.getPackageManager(); mAppWidgetHost = new AppWidgetHost(context, Launcher.APPWIDGET_HOST_ID); @@ -1052,7 +1050,7 @@ public class LauncherProvider extends ContentProvider { long id = c.getLong(idIndex); byte[] data = c.getBlob(iconIndex); try { - Bitmap bitmap = Utilities.resampleIconBitmap( + Bitmap bitmap = Utilities.createIconBitmap( BitmapFactory.decodeByteArray(data, 0, data.length), mContext); if (bitmap != null) { diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index daf343460..01f79314e 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -88,10 +88,20 @@ public class ShortcutInfo extends ItemInfo { private Bitmap mIcon; /** + * Indicates that the icon is disabled due to safe mode restrictions. + */ + public static final int FLAG_DISABLED_SAFEMODE = 1; + + /** + * Indicates that the icon is disabled as the app is not available. + */ + public static final int FLAG_DISABLED_NOT_AVAILABLE = 2; + + /** * Could be disabled, if the the app is installed but unavailable (eg. in safe mode or when * sd-card is not available). */ - boolean isDisabled = false; + int isDisabled = DEFAULT; int status; diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 80d4b22ce..6caa1cf56 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -54,8 +54,6 @@ public final class Utilities { private static int sIconWidth = -1; private static int sIconHeight = -1; - public static int sIconTextureWidth = -1; - public static int sIconTextureHeight = -1; private static final Rect sOldBounds = new Rect(); private static final Canvas sCanvas = new Canvas(); @@ -89,7 +87,7 @@ public final class Utilities { * Resizes an icon drawable to the correct icon size. */ static void resizeIconDrawable(Drawable icon) { - icon.setBounds(0, 0, sIconTextureWidth, sIconTextureHeight); + icon.setBounds(0, 0, sIconWidth, sIconHeight); } private static boolean isPropertyEnabled(String propertyName) { @@ -110,29 +108,39 @@ public final class Utilities { } /** - * 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) + * Returns a bitmap suitable for the all apps view. If the package or the resource do not + * exist, it returns null. + */ + static Bitmap createIconBitmap(String packageName, String resourceName, IconCache cache, + Context context) { + PackageManager packageManager = context.getPackageManager(); + // the resource + try { + Resources resources = packageManager.getResourcesForApplication(packageName); + if (resources != null) { + final int id = resources.getIdentifier(resourceName, null, null); + return createIconBitmap( + resources.getDrawableForDensity(id, cache.getFullResIconDpi()), context); + } + } catch (Exception e) { + // Icon not found. + } + return null; + } + + /** + * Returns a bitmap which is of the appropriate size to be displayed as an icon */ static Bitmap createIconBitmap(Bitmap icon, Context context) { - int textureWidth = sIconTextureWidth; - int textureHeight = sIconTextureHeight; - int sourceWidth = icon.getWidth(); - int sourceHeight = icon.getHeight(); - if (sourceWidth > textureWidth && sourceHeight > textureHeight) { - // Icon is bigger than it should be; clip it (solves the GB->ICS migration case) - return Bitmap.createBitmap(icon, - (sourceWidth - textureWidth) / 2, - (sourceHeight - textureHeight) / 2, - textureWidth, textureHeight); - } else if (sourceWidth == textureWidth && sourceHeight == textureHeight) { - // Icon is the right size, no need to change it + synchronized (sCanvas) { // we share the statics :-( + if (sIconWidth == -1) { + initStatics(context); + } + } + if (sIconWidth == icon.getWidth() && sIconHeight == icon.getHeight()) { return icon; - } else { - // Icon is too small, render to a larger bitmap - final Resources resources = context.getResources(); - return createIconBitmap(new BitmapDrawable(resources, icon), context); } + return createIconBitmap(new BitmapDrawable(context.getResources(), icon), context); } /** @@ -172,8 +180,8 @@ public final class Utilities { } // no intrinsic size --> use default size - int textureWidth = sIconTextureWidth; - int textureHeight = sIconTextureHeight; + int textureWidth = sIconWidth; + int textureHeight = sIconHeight; final Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight, Bitmap.Config.ARGB_8888); @@ -205,30 +213,6 @@ public final class Utilities { } /** - * Returns a Bitmap representing the thumbnail of the specified Bitmap. - * - * @param bitmap The bitmap to get a thumbnail of. - * @param context The application's context. - * - * @return A thumbnail for the specified bitmap or the bitmap itself if the - * thumbnail could not be created. - */ - static Bitmap resampleIconBitmap(Bitmap bitmap, Context context) { - synchronized (sCanvas) { // we share the statics :-( - if (sIconWidth == -1) { - initStatics(context); - } - - if (bitmap.getWidth() == sIconWidth && bitmap.getHeight() == sIconHeight) { - return bitmap; - } else { - final Resources resources = context.getResources(); - return createIconBitmap(new BitmapDrawable(resources, bitmap), context); - } - } - } - - /** * Given a coordinate relative to the descendant, find the coordinate in a parent view's * coordinates. * @@ -330,12 +314,10 @@ public final class Utilities { private static void initStatics(Context context) { final Resources resources = context.getResources(); sIconWidth = sIconHeight = (int) resources.getDimension(R.dimen.app_icon_size); - sIconTextureWidth = sIconTextureHeight = sIconWidth; } public static void setIconSize(int widthPx) { sIconWidth = sIconHeight = widthPx; - sIconTextureWidth = sIconTextureHeight = widthPx; } public static void scaleRect(Rect r, float scale) { diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java index 5aa719027..92d7c7d7f 100644 --- a/src/com/android/launcher3/WidgetPreviewLoader.java +++ b/src/com/android/launcher3/WidgetPreviewLoader.java @@ -130,8 +130,8 @@ public class WidgetPreviewLoader { private final PaintCache mDefaultAppWidgetPreviewPaint = new PaintCache(); private final BitmapFactoryOptionsCache mCachedBitmapFactoryOptions = new BitmapFactoryOptionsCache(); - private final HashMap<String, WeakReference<Bitmap>> mLoadedPreviews = new HashMap<>(); - private final ArrayList<SoftReference<Bitmap>> mUnusedBitmaps = new ArrayList<>(); + private final HashMap<String, WeakReference<Bitmap>> mLoadedPreviews = new HashMap<String, WeakReference<Bitmap>>(); + private final ArrayList<SoftReference<Bitmap>> mUnusedBitmaps = new ArrayList<SoftReference<Bitmap>>(); private final Context mContext; private final int mAppIconSize; @@ -287,7 +287,6 @@ public class WidgetPreviewLoader { static class CacheDb extends SQLiteOpenHelper { final static int DB_VERSION = 2; - final static String DB_NAME = "widgetpreviews.db"; final static String TABLE_NAME = "shortcut_and_widget_previews"; final static String COLUMN_NAME = "name"; final static String COLUMN_SIZE = "size"; @@ -295,7 +294,8 @@ public class WidgetPreviewLoader { Context mContext; public CacheDb(Context context) { - super(context, new File(context.getCacheDir(), DB_NAME).getPath(), null, DB_VERSION); + super(context, new File(context.getCacheDir(), + LauncherFiles.WIDGET_PREVIEWS_DB).getPath(), null, DB_VERSION); // Store the context for later use mContext = context; } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 774996e56..965eaae85 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -4629,6 +4629,34 @@ public class Workspace extends SmoothPagedView }); } + public void disableShortcutsByPackageName(final ArrayList<String> packages, + final UserHandleCompat user, final int reason) { + final HashSet<String> packageNames = new HashSet<String>(); + packageNames.addAll(packages); + + mapOverItems(MAP_RECURSE, new ItemOperator() { + @Override + public boolean evaluate(ItemInfo info, View v, View parent) { + if (info instanceof ShortcutInfo && v instanceof BubbleTextView) { + ShortcutInfo shortcutInfo = (ShortcutInfo) info; + ComponentName cn = shortcutInfo.getTargetComponent(); + if (user.equals(shortcutInfo.user) && cn != null + && packageNames.contains(cn.getPackageName())) { + shortcutInfo.isDisabled |= reason; + BubbleTextView shortcut = (BubbleTextView) v; + shortcut.applyFromShortcutInfo(shortcutInfo, mIconCache, true, false); + + if (parent != null) { + parent.invalidate(); + } + } + } + // process all the shortcuts + return false; + } + }); + } + // Removes ALL items that match a given package name, this is usually called when a package // has been removed and we want to remove all components (widgets, shortcuts, apps) that // belong to that package. @@ -4800,6 +4828,28 @@ public class Workspace extends SmoothPagedView } } + + void updateShortcuts(ArrayList<ShortcutInfo> shortcuts) { + final HashSet<ShortcutInfo> updates = new HashSet<ShortcutInfo>(shortcuts); + mapOverItems(MAP_RECURSE, new ItemOperator() { + @Override + public boolean evaluate(ItemInfo info, View v, View parent) { + if (info instanceof ShortcutInfo && v instanceof BubbleTextView && + updates.contains(info)) { + ShortcutInfo shortcutInfo = (ShortcutInfo) info; + BubbleTextView shortcut = (BubbleTextView) v; + shortcut.applyFromShortcutInfo(shortcutInfo, mIconCache, true, false); + + if (parent != null) { + parent.invalidate(); + } + } + // process all the shortcuts + return false; + } + }); + } + void updateShortcutsAndWidgets(ArrayList<AppInfo> apps) { // Break the appinfo list per user final HashMap<UserHandleCompat, ArrayList<AppInfo>> appsPerUser = @@ -4837,7 +4887,6 @@ public class Workspace extends SmoothPagedView ComponentName cn = shortcutInfo.getTargetComponent(); AppInfo appInfo = appsMap.get(cn); if (user.equals(shortcutInfo.user) && cn != null - && LauncherModel.isShortcutInfoUpdateable(info) && pkgNames.contains(cn.getPackageName())) { boolean promiseStateChanged = false; boolean infoUpdated = false; @@ -4882,8 +4931,14 @@ public class Workspace extends SmoothPagedView LauncherModel.updateItemInDatabase(getContext(), shortcutInfo); } + if ((shortcutInfo.isDisabled & ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE) != 0) { + // Since package was just updated, the target must be available now. + shortcutInfo.isDisabled &= ~ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE; + infoUpdated = true; + } - if (appInfo != null) { + // Only update the icon and labels if the shortcuts points to an app target + if ((appInfo != null) && LauncherModel.isShortcutAppTarget(shortcutInfo)) { shortcutInfo.updateIcon(mIconCache); shortcutInfo.title = appInfo.title.toString(); shortcutInfo.contentDescription = appInfo.contentDescription; diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index 6efcc00fd..5858bc8b9 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -19,8 +19,10 @@ package com.android.launcher3.compat; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.Rect; -import android.os.Build; import android.os.Bundle; import com.android.launcher3.Utilities; @@ -73,4 +75,13 @@ public abstract class LauncherAppsCompat { public abstract boolean isPackageEnabledForProfile(String packageName, UserHandleCompat user); public abstract boolean isActivityEnabledForProfile(ComponentName component, UserHandleCompat user); + + public boolean isAppEnabled(PackageManager pm, String packageName, int flags) { + try { + ApplicationInfo info = pm.getApplicationInfo(packageName, flags); + return info != null && info.enabled; + } catch (NameNotFoundException e) { + return false; + } + } }
\ No newline at end of file diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java index 7e5e6bf2c..e47b9a58d 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java @@ -22,7 +22,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; @@ -112,12 +111,7 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { } public boolean isPackageEnabledForProfile(String packageName, UserHandleCompat user) { - try { - PackageInfo info = mPm.getPackageInfo(packageName, 0); - return info != null && info.applicationInfo.enabled; - } catch (NameNotFoundException e) { - return false; - } + return isAppEnabled(mPm, packageName, 0); } public boolean isActivityEnabledForProfile(ComponentName component, UserHandleCompat user) { @@ -198,8 +192,13 @@ public class LauncherAppsCompatV16 extends LauncherAppsCompat { callback.onPackagesAvailable(packages, user, replacing); } } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { - final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, - Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT); + // This intent is broadcasted when moving a package or mounting/un-mounting + // external storage. + // However on Kitkat this is also sent when a package is being updated, and + // contains an extra Intent.EXTRA_REPLACING=true for that case. + // Using false as default for Intent.EXTRA_REPLACING gives correct value on + // lower devices as the intent is not sent when the app is updating/replacing. + final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); for (OnAppsChangedCallbackCompat callback : getCallbacks()) { callback.onPackagesUnavailable(packages, user, replacing); diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index 16ad3792a..a84bf0224 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -81,6 +81,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { @Override public void onStop() { + mInstaller.unregisterSessionCallback(mCallback); } @Override @@ -111,7 +112,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { // Not yet ready return; } - if ((mPendingReplays.size() == 0) && (newInfo == null) && mPendingBadgeUpdates.isEmpty()) { + if ((mPendingReplays.size() == 0) && (newInfo == null)) { // Nothing to update return; } |