diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index b127e1ea72..e938b73d90 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -29,17 +29,17 @@ "Konfigurace..." "Widgety" "Složky" - - + "Další" "Tapety" - - + "Zástupci aplikací" "Toto bude karta Tapety" "Vše" "Aplikace" "Hry" "Stažené" - + + + "Název složky" "Přejmenovat složku" @@ -60,21 +60,23 @@ "Zástupce %s byl odebrán." "Zástupce %s již existuje." "Vyberte zástupce" + "Výběr aplikace" "Vybrat složku" - "Všechny aplikace" + "Aplikace" "Plocha" "Přidat" + "Spravovat aplikace" "Tapeta" "Hledat" "Oznámení" "Gesta" "Nastavení" - - - - - - + "Odinstalovat aplikaci" + "Podrobnosti o aplikaci" + "Vybrána 1 aplikace" + "Vybrán 1 widget" + "Vybrána 1 složka" + "Vybrán 1 zástupce" "instalovat zástupce" "Povoluje aplikaci přidat zástupce bez zásahu uživatele." "odinstalovat zástupce" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index c3b069ef07..576abce027 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -29,17 +29,17 @@ "Konfigurer ..." "Widgets" "Mapper" - - + "Flere" "Tapeter" - - + "Programgenvej" "Dette er fanen for tapeter" "Alle" "Programmer" "Spil" "Downloadet" - + + + "Mappenavn" "Omdøb mappe" @@ -60,21 +60,23 @@ "Genvejen \"%s\" blev fjernet." "Genvejen \"%s\" findes allerede." "Vælg genvej" + "Vælg program" "Vælg mappe" - "Alle programmer" + "Programmer" "Start" "Tilføj" + "Administrer programmer" "Tapet" "Søg" "Meddelelser" "Gestus" "Indstillinger" - - - - - - + "Afinstaller program" + "Programoplysninger" + "1 program er valgt" + "1 widget er valgt" + "1 mappe er valgt" + "1 genvej er valgt" "installer genveje" "Tillader, at et program tilføjer genveje uden brugerindgriben." "afinstaller genveje" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 6b5401f0b4..575db07149 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -29,17 +29,17 @@ "Konfigurieren..." "Widgets" "Ordner" - - + "Mehr" "Hintergründe" - - + "App-Verknüpfungen" "Dies ist der Tab \"Hintergründe\"" "Alle" - "Anwendungen" + "Apps" "Spiele" "Heruntergeladen" - + + + "Ordnername" "Ordner umbenennen" @@ -60,21 +60,23 @@ "\"%s\"-Verknüpfung wurde entfernt." "\"%s\"-Verknüpfung ist bereits vorhanden." "Tastenkürzel auswählen" + "Anwendung auswählen" "Ordner auswählen" - "Alle Anwendungen" + "Anwendungen" "Startseite" "Hinzufügen" + "Apps verwalten" "Hintergrund" "Suchen" "Benachrichtigungen" "Bewegungen" "Einstellungen" - - - - - - + "Anwendung deinstallieren" + "Anwendungsdetails" + "1 Anwendung ausgewählt" + "1 Widget ausgewählt" + "1 Ordner ausgewählt" + "1 Verknüpfung ausgewählt" "Verknüpfungen installieren" "Ermöglicht einer Anwendung das Hinzufügen von Verknüpfungen ohne Eingriff des Nutzers." "Verknüpfungen deinstallieren" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 9326a932c8..0937c5b587 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -29,17 +29,17 @@ "Διαμόρφωση..." "Γραφικά στοιχεία" "Φάκελοι" - - + "Περισσότερα" "Ταπετσαρίες" - - + "Συντομεύσεις Εφαρμογών" "Αυτή θα είναι η καρτέλα ταπετσαριών" "Κάθε ηλικία" "Εφαρμογές" "Παιχνίδια" "Η λήψη ολοκληρώθηκε" - + + + "Όνομα φακέλου" "Μετονομασία φακέλου" @@ -60,21 +60,23 @@ "Η συντόμευση \"%s\" καταργήθηκε." "Η συντόμευση \"%s\" υπάρχει ήδη." "Επιλογή συντόμευσης" + "Επιλέξτε εφαρμογή" "Επιλογή φακέλου" - "Όλες οι εφαρμογές" + "Εφαρμογές" "Αρχική σελίδα" "Προσθήκη" + "Διαχείριση εφαρμογών" "Ταπετσαρία" "Αναζήτηση" "Ειδοποιήσεις" "Χειρονομίες" "Ρυθμίσεις" - - - - - - + "Κατάργηση εγκατάστασης εφαρμογής" + "Λεπτομέρειες εφαρμογής" + "Επιλέχθηκε 1 εφαρμογή" + "Επιλέχθηκε 1 γραφικό στοιχείο" + "Επιλέχθηκε 1 φάκελος" + "Επιλέχθηκε 1 συντόμευση" "εγκατάσταση συντομεύσεων" "Επιτρέπει σε μια εφαρμογή την προσθήκη συντομεύσεων χωρίς την παρέμβαση του χρήστη." "κατάργηση εγκατάστασης συντομεύσεων" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index b4e65d0f65..d718936230 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -29,18 +29,16 @@ "Configurar..." "Widgets" "Carpetas" - - + "Más" "Papeles tapiz" - - + "Accesos directos a aplicaciones" "Ésta será la pestaña para los papeles tapiz" "Todos" "Google Apps" "Juegos" "Descargado" - - + "No" + "No Google Apps" "Nombre de carpeta" "Cambiar nombre de carpeta" "Aceptar" @@ -60,21 +58,23 @@ "El acceso directo \"%s\" ha sido eliminado." "El acceso directo \"%s\" ya existe." "Seleccionar acceso directo" + "Seleccionar aplicación" "Seleccionar carpeta" - "Todas las aplicaciones" + "Google Apps" "Página principal" "Agregar" + "Administrar aplicaciones" "Papel tapiz" "Buscar" "Notificaciones" "Gestos" "Configuración" - - - - - - + "Desinstalar la aplicación" + "Detalles de la aplicación" + "Se seleccionó 1 aplicación" + "Se seleccionó 1 widget" + "Se seleccionó 1 carpeta" + "Se seleccionó 1 acceso directo" "instalar accesos directos" "Permite a una aplicación agregar accesos directos sin intervención del usuario." "desinstalar papel tapiz" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index ecbe8afe40..ab0485a090 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -29,17 +29,17 @@ "Configurar..." "Widgets" "Carpetas" - - + "Más" "Fondos de pantalla" - - + "Accesos directos de aplicaciones" "Será la carpeta de fondos de pantalla." "Todas las aplicaciones" "Aplicaciones" "Juegos" "Descargadas" - + + + "Nombre de carpeta" "Cambiar nombre de carpeta" @@ -60,21 +60,23 @@ "Se ha eliminado el acceso directo \"%s\"." "El acceso directo \"%s\" ya existe." "Seleccionar acceso directo" + "Seleccionar aplicación" "Seleccionar carpeta" - "Todas las aplicaciones" + "Aplicaciones" "Inicio" "Añadir" + "Administrar aplicaciones" "Fondo de pantalla" "Buscar con Google" "Notificaciones" "Gestos" "Ajustes" - - - - - - + "Desinstalar aplicación" + "Información de la aplicación" + "Se ha seleccionado una aplicación." + "Se ha seleccionado un widget." + "Se ha seleccionado una carpeta." + "Se ha seleccionado un acceso directo." "instalar accesos directos" "Permite que una aplicación añada accesos directos sin intervención del usuario." "desinstalar accesos directos" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index c6d530dd6b..35ee775bec 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -29,17 +29,17 @@ "Configurer..." "Widgets" "Dossiers" - - + "Plus" "Fonds d\'écran" - - + "Raccourcis des applications" "Onglet des fonds d\'écran" "Toutes" "Applications" "Jeux" "Téléchargées" - + + + "Nom du dossier" "Renommer le dossier" @@ -60,21 +60,23 @@ "Le raccourci \"%s\" a été supprimé." "Le raccourci \"%s\" existe déjà." "Sélectionner un raccourci" + "Sélection d\'une application" "Sélectionner le dossier" - "Toutes les applications" + "Applications" "Page d\'accueil" "Ajouter" + "Gérer les applications" "Fond d\'écran" "Rechercher" "Notifications" "Gestes" "Paramètres" - - - - - - + "Désinstaller l\'application" + "Infos sur l\'application" + "1 application sélectionnée" + "1 widget sélectionné" + "1 dossier sélectionné" + "1 raccourci sélectionné" "installer des raccourcis" "Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur." "désinstaller les raccourcis" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index f25156a3d5..7705763ce0 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -29,17 +29,17 @@ "Configura..." "Widget" "Cartelle" - - + "Altro" "Sfondi" - - + "Scorciatoie applicazioni" "Questa sarà la scheda degli sfondi" "Tutte" "Applicazioni" "Giochi" "Scaricate" - + + + "Nome cartella" "Rinomina cartella" @@ -60,21 +60,23 @@ "La scorciatoia \"%s\" è stata rimossa." "Scorciatoia \"%s\" già presente." "Seleziona scorciatoia" + "Seleziona applicazione" "Seleziona cartella" - "Tutte le applicazioni" + "Applicazioni" "Home" "Aggiungi" + "Gestisci applicazioni" "Sfondo" "Cerca" "Notifiche" "Gesti" "Impostazioni" - - - - - - + "Disinstalla applicazione" + "Dettagli applicazione" + "1 applicazione selezionata" + "1 widget selezionato" + "1 cartella selezionata" + "1 scorciatoia selezionata" "aggiungere scorciatoie" "Consente a un\'applicazione di aggiungere scorciatoie automaticamente." "eliminare scorciatoie" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 98f042bec0..2a7a218c46 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -29,17 +29,17 @@ "設定..." "ウィジェット" "フォルダ" - - + "その他" "壁紙" - - + "アプリのショートカット" "ここが壁紙タブになります" "すべて" "アプリ" "ゲーム" "ダウンロード済み" - + + + "フォルダ名" "フォルダ名を変更" @@ -60,21 +60,23 @@ "ショートカット「%s」を削除しました。" "ショートカット「%s」は既に存在します。" "ショートカットを選択" + "アプリを選択" "フォルダの選択" - "すべてのアプリケーション" + "アプリ" "ホーム" "追加" + "アプリの管理" "壁紙" "検索" "通知" "ジェスチャー" "設定" - - - - - - + "アプリケーションのアンインストール" + "アプリケーションの詳細" + "1つのアプリケーションが選択されています" + "1つのウィジェットが選択されています" + "1つのフォルダが選択されています" + "1つのショートカットが選択されています" "ショートカットのインストール" "ユーザー操作なしでショートカットの追加をアプリケーションに許可します。" "ショートカットのアンインストール" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 521332611b..b23450d434 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -29,17 +29,17 @@ "구성..." "위젯" "폴더" - - + "더보기" "배경화면" - - + "앱 바로가기" "배경화면 탭이 됩니다." "모두" "애플리케이션" "게임" "다운로드앱" - + + + "폴더 이름" "폴더 이름 바꾸기" @@ -60,21 +60,23 @@ "바로가기(\'%s\')가 삭제되었습니다." "바로가기(\'%s\')가 이미 있습니다." "바로가기 선택" + "애플리케이션 선택" "폴더 선택" - "모든 애플리케이션" + "애플리케이션" "홈" "추가" + "애플리케이션 관리" "배경화면" "검색" "알림" "동작" "설정" - - - - - - + "애플리케이션 제거" + "애플리케이션 세부정보" + "1개 애플리케이션 선택" + "1개 위젯 선택" + "1개 폴더 선택" + "1개 바로가기 선택" "바로가기 설치" "애플리케이션이 사용자의 작업 없이 바로가기를 추가할 수 있도록 합니다." "바로가기 제거" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 0d24eb9546..5026744f97 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -29,17 +29,17 @@ "Konfigurer" "Moduler" "Mapper" - - + "Mer" "Bakgrunner" - - + "Programsnarveier" "Dette er nå bakgrunnsfanen" "Alle" "Programmer" "Spill" "Nedlastet" - + + + "Mappenavn" "Gi nytt navn til mappe" @@ -60,21 +60,23 @@ "Fjernet snarveien «%s»." "Snarveien «%s» fins allerede." "Velg snarvei" + "Velg program" "Velg mappe" - "Alle programmer" + "Programmer" "Startsiden" "Legg til" + "Administrer programmer" "Bakgrunnsbilde" "Søk" "Varslinger" "Bevegelser" "Innstillinger" - - - - - - + "Avinstaller program" + "Søknadsopplysninger" + "1 program valgt" + "1 modul valgt" + "1 mappe valgt" + "1 snarvei valgt" "installere snarveier" "Lar applikasjonen legge til snarveier uten å involvere brukeren." "avinstallere snarveier" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 5a2a269a83..65625294bb 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -29,17 +29,17 @@ "Configureren..." "Widgets" "Mappen" - - + "Meer" "Achtergronden" - - + "Toepassingssnelkoppelingen" "Dit wordt het tabblad \'Achtergronden\'" "Alle" "Toepassingen" "Games" "Gedownload" - + + + "Mapnaam" "Naam van map wijzigen" @@ -60,21 +60,23 @@ "Snelkoppeling \'%s\' is verwijderd." "Snelkoppeling \'%s\' bestaat al." "Snelkoppeling selecteren" + "Toepassing selecteren" "Map selecteren" - "Alle toepassingen" + "Toepassingen" "Startpagina" "Toevoegen" + "Toepassingen beheren" "Achtergrond" "Zoeken" "Meldingen" "Gebaren" "Instellingen" - - - - - - + "Toepassing verwijderen" + "Toepassingsdetails" + "1 toepassing geselecteerd" + "1 widget geselecteerd" + "1 map geselecteerd" + "1 snelkoppeling geselecteerd" "snelkoppelingen installeren" "Een toepassing toestaan om snelkoppelingen toe te voegen zonder tussenkomst van de gebruiker." "snelkoppelingen verwijderen" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 0c8e91be4b..f2ac81daaf 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -29,17 +29,17 @@ "Konfiguruj..." "Widżety" "Foldery" - - + "Więcej" "Tapety" - - + "Skróty do aplikacji" "To będzie karta tapet" "Wszystkie" "Aplikacje" "Gry" "Pobrane" - + + + "Nazwa folderu" "Zmień nazwę folderu" @@ -60,21 +60,23 @@ "Skrót „%s” został usunięty." "Skrót „%s” już istnieje." "Wybierz skrót" + "Wybierz aplikację" "Wybierz folder" - "Wszystkie aplikacje" + "Aplikacje" "Ekran główny" "Dodaj" + "Zarządzaj aplikacjami" "Tapeta" "Szukaj" "Powiadomienia" "Gesty" "Ustawienia" - - - - - - + "Odinstaluj aplikację" + "Szczegóły aplikacji" + "Zaznaczono 1 aplikację" + "Zaznaczono 1 widżet" + "Zaznaczono 1 folder" + "Zaznaczono 1 skrót" "zainstaluj skróty" "Umożliwia aplikacji dodawanie skrótów bez interwencji użytkownika." "odinstaluj skróty" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index cdff3bfd02..a3c432d6b9 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -29,17 +29,17 @@ "Configurar..." "Widgets" "Pastas" - - + "Mais" "Imagens de fundo" - - + "Atalhos de aplicações" "Isto será o separador de imagens de fundo" "Todas" "Aplicações" "Jogos" "Transferidas" - + + + "Nome da pasta" "Mudar o nome da pasta" @@ -60,21 +60,23 @@ "O atalho \"%s\" foi removido." "O atalho \"%s\" já existe." "Seleccione o atalho" + "Seleccionar aplicação" "Seleccione a pasta" - "Todas as aplicações" + "Aplicações" "Página inicial" "Adicionar" + "Gerir aplicações" "Imagem de fundo" "Pesquisar" "Notificações" "Gestos" "Definições" - - - - - - + "Desinstalar aplicação" + "Detalhes da aplicação" + "1 aplicação seleccionada" + "1 widget seleccionado" + "1 pasta seleccionada" + "1 atalho seleccionado" "instalar atalhos" "Permite que uma aplicação adicione atalhos sem a intervenção do utilizador." "desinstalar atalhos" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index bdebb87c58..3941c4f606 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -29,17 +29,17 @@ "Configurar..." "Widgets" "Pastas" - - + "Mais" "Papéis de parede" - - + "Atalhos de aplicativo" "Esta será a guia de papéis de parede" "Todos" "Aplicativos" "Jogos" "Download concluído" - + + + "Nome da pasta" "Renomear pasta" @@ -60,21 +60,23 @@ "O atalho \"%s\" foi removido." "O atalho \"%s\" já existe." "Selecionar atalho" + "Selecionar aplicativo" "Selecionar pasta" - "Todos os aplicativos" + "Aplicativos" "Página inicial" "Adicionar" + "Gerenciar aplicativos" "Plano de fundo" "Pesquisa" "Notificações" "Gestos" "Configurações" - - - - - - + "Desinstalar aplicativo" + "Detalhes do aplicativo" + "Um aplicativo selecionado" + "Um widget selecionado" + "Uma pasta selecionada" + "Um atalho selecionado" "instalar atalhos" "Permite que um aplicativo adicione os atalhos sem a intervenção do usuário." "desinstalar atalhos" diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml index 0e4e4da7ca..10cbc4ae6c 100644 --- a/res/values-rm/strings.xml +++ b/res/values-rm/strings.xml @@ -47,7 +47,9 @@ - + + + "Num da l\'ordinatur" "Renumnar l\'ordinatur" @@ -68,10 +70,14 @@ "\"La scursanida \"\"%s\"\" è vegnida stizzada.\"" "\"La scursanida \"\"%s\"\" exista gia.\"" "Tscherner ina cumbinaziun da tastas" + + "Tscherner l\'ordinatur" - "Tut las applicaziuns" + "Tut las applicaziuns" "Pagina da partenza" "Agiuntar" + + "Fund davos" "Tschertgar" "Avis" @@ -81,7 +87,13 @@ - + + + + + + + "Installar scursanidas" "Pussibilitescha ch\'ina applicaziun agiunta scursanidas senza l\'intervenziun da l\'utilisader." diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index bb874451d7..fd5b35dcd6 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -29,17 +29,17 @@ "Настроить..." "Виджеты" "Папки" - - + "Еще" "Обои" - - + "Ярлыки приложений" "Это будет вкладка обоев" "Все" "Приложения" "Игры" "Загруженные" - + + + "Название папки" "Переименовать папку" @@ -60,21 +60,23 @@ "Ярлык \"%s\" удален." "Ярлык \"%s\" уже существует." "Выберите ярлык" + "Выбор приложения" "Выбор папки" - "Все приложения" + "Приложения" "Главная" "Добавить" + "Управление приложениями" "Обои" "Поиск" "Уведомления" "Жесты" "Настройки" - - - - - - + "Удалить приложение" + "Сведения о приложении" + "Выбрано 1 приложение" + "Выбран 1 виджет" + "Выбрана 1 папка" + "Выбран 1 ярлык" "устанавливать ярлыки" "Позволяет приложению добавлять ярлыки без вмешательства пользователя" "удалять ярлыки" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index be6ee7fdd0..17a6cdce02 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -29,17 +29,17 @@ "Konfigurera..." "Widgetar" "Mappar" - - + "Mer" "Bakgrundsbilder" - - + "Genvägar för appar" "Det här kommer att vara fliken för bakgrundsbilder" "Alla" "Program" "Spel" "Hämtade" - + + + "Mappnamn" "Byt namn på mapp" @@ -60,21 +60,23 @@ "Genvägen \"%s\" har tagits bort." "Genvägen \"%s\" finns redan." "Välj genväg" + "Välj program" "Välj mapp" - "Alla program" + "Program" "Startsida" "Lägg till" + "Hantera appar" "Bakgrund" "Sök" "Aviseringar" "Gester" "Inställningar" - - - - - - + "Avinstallera program" + "Programinformation" + "1 program har valts" + "1 widget vald" + "1 mapp vald" + "1 genväg har valts" "installera genvägar" "Tillåter att ett program lägger till genvägar utan åtgärd från användaren." "avinstallera genvägar" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 59c816d61c..19417f0fd6 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -29,17 +29,17 @@ "Yapılandır..." "Widget\'lar" "Klasörler" - - + "Diğer" "Duvar Kağıtları" - - + "Uygulama Kısayolları" "Bu duvar kağıdı sekmesi olacaktır" "Tümü" "Uygulamalar" "Oyunlar" "İndirilenler" - + + + "Klasör adı" "Klasörü yeniden adlandır" @@ -60,21 +60,23 @@ "\"%s\" kısayolu kaldırıldı." "\"%s\" kısayolu zaten var." "Kısayolu seçin" + "Uygulama seç" "Klasörü seçin" - "Tüm uygulamalar" + "Uygulamalar" "Ana Sayfa" "Ekle" + "Uyglm yönet" "Duvar Kağıdı" "Ara" "Bildirimler" "Hareketler" "Ayarlar" - - - - - - + "Uygulamanın yüklemesini kaldır" + "Uygulama ayrıntıları" + "1 uygulama seçildi" + "1 widget seçildi" + "1 klasör seçildi" + "1 kısayol seçildi" "kısayolları yükle" "Bir uygulamaya, kısayolları kullanıcı müdahale etmeden ekleme izni verir." "kısayolları kaldır" diff --git a/res/values-xlarge/dimens.xml b/res/values-xlarge/dimens.xml index a84926d07c..a834a2e48f 100644 --- a/res/values-xlarge/dimens.xml +++ b/res/values-xlarge/dimens.xml @@ -22,6 +22,9 @@ 0dp 0dp + + 10dp + 0dip diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 58f61787bf..751474b193 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -29,17 +29,17 @@ "配置..." "窗口小部件" "文件夹" - - + "更多" "壁纸" - - + "应用程序快捷方式" "这将会成为壁纸标签" "全部" "应用程序" "游戏" "已下载" - + + + "文件夹名称" "重命名文件夹" @@ -60,21 +60,23 @@ "已删除“%s”快捷方式。" "“%s”快捷方式已存在。" "选择快捷方式" + "选择应用程序" "选择文件夹" - "所有应用程序" + "应用程序" "主屏幕" "添加" + "管理应用程序" "壁纸" "搜索" "通知" "手势" "设置" - - - - - - + "卸载应用程序" + "应用程序详细信息" + "已选中 1 个应用程序" + "已选中 1 个窗口小部件" + "已选中 1 个文件夹" + "已选中 1 个快捷方式" "安装快捷方式" "允许应用程序在没有用户介入的情况下添加快捷方式。" "卸载快捷方式" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index a7cd0988be..824ec64a25 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -29,23 +29,23 @@ "設定..." "小工具" "資料夾" - - + "更多選項" "桌布" - - + "應用程式捷徑" "桌布標籤保留位" "全部" "應用程式" "遊戲" "下載內容" - + + + "資料夾名稱" "重新命名資料夾" "確定" "取消" - "新增至首頁畫面" + "新增至主畫面" "應用程式" "捷徑" "新資料夾" @@ -60,21 +60,23 @@ "已移除「%s」捷徑。" "「%s」捷徑已經存在。" "選取捷徑" + "選取應用程式" "選取資料夾" - "所有應用程式" + "應用程式" "主螢幕" "新增" + "管理應用程式" "桌布" "搜尋" "通知" "觸控動作" "設定" - - - - - - + "解除安裝應用程式" + "應用程式詳細資料" + "已選取 1 個應用程式" + "已選取 1 個小工具" + "已選取 1 個資料夾" + "已選取 1 個捷徑" "安裝捷徑" "允許應用程式自動新增快速鍵。" "解除安裝捷徑" diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java index 63da108d06..3c82290f82 100644 --- a/src/com/android/launcher2/CellLayout.java +++ b/src/com/android/launcher2/CellLayout.java @@ -16,7 +16,7 @@ package com.android.launcher2; -import com.android.launcher.R; +import java.util.Arrays; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -26,6 +26,7 @@ import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.WallpaperManager; +import android.content.ClipDescription; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; @@ -41,6 +42,7 @@ import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.ContextMenu; +import android.view.DragEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; @@ -49,7 +51,7 @@ import android.view.animation.Animation; import android.view.animation.DecelerateInterpolator; import android.view.animation.LayoutAnimationController; -import java.util.Arrays; +import com.android.launcher.R; public class CellLayout extends ViewGroup implements Dimmable { static final String TAG = "CellLayout"; @@ -972,7 +974,11 @@ public class CellLayout extends ViewGroup implements Dimmable { final int oldDragCellX = mDragCell[0]; final int oldDragCellY = mDragCell[1]; final int[] nearest = findNearestVacantArea(originX, originY, spanX, spanY, v, mDragCell); - mDragCenter.set(originX + (v.getWidth() / 2), originY + (v.getHeight() / 2)); + if (v != null) { + mDragCenter.set(originX + (v.getWidth() / 2), originY + (v.getHeight() / 2)); + } else { + mDragCenter.set(originX, originY); + } if (nearest != null && (nearest[0] != oldDragCellX || nearest[1] != oldDragCellY)) { // Find the top left corner of the rect the object will occupy @@ -982,15 +988,17 @@ public class CellLayout extends ViewGroup implements Dimmable { int left = topLeft[0]; int top = topLeft[1]; - if (v.getParent() instanceof CellLayout) { - LayoutParams lp = (LayoutParams) v.getLayoutParams(); - left += lp.leftMargin; - top += lp.topMargin; - } + if (v != null) { + if (v.getParent() instanceof CellLayout) { + LayoutParams lp = (LayoutParams) v.getLayoutParams(); + left += lp.leftMargin; + top += lp.topMargin; + } - // Offsets due to the size difference between the View and the dragOutline - left += (v.getWidth() - dragOutline.getWidth()) / 2; - top += (v.getHeight() - dragOutline.getHeight()) / 2; + // Offsets due to the size difference between the View and the dragOutline + left += (v.getWidth() - dragOutline.getWidth()) / 2; + top += (v.getHeight() - dragOutline.getHeight()) / 2; + } final int oldIndex = mDragOutlineCurrent; mDragOutlineAnims[oldIndex].animateOut(); @@ -1271,7 +1279,7 @@ public class CellLayout extends ViewGroup implements Dimmable { * It may have begun over this layout (in which case onDragChild is called first), * or it may have begun on another layout. */ - void onDragEnter(View dragView) { + void onDragEnter() { if (!mDragging) { // Fade in the drag indicators if (mCrosshairsAnimator != null) { diff --git a/src/com/android/launcher2/InstallShortcutReceiver.java b/src/com/android/launcher2/InstallShortcutReceiver.java index caeb12b4a5..8d72531d50 100644 --- a/src/com/android/launcher2/InstallShortcutReceiver.java +++ b/src/com/android/launcher2/InstallShortcutReceiver.java @@ -26,7 +26,7 @@ import android.widget.Toast; import com.android.launcher.R; public class InstallShortcutReceiver extends BroadcastReceiver { - private static final String ACTION_INSTALL_SHORTCUT = + public static final String ACTION_INSTALL_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT"; private final int[] mCoordinates = new int[2]; diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 5d45d27146..346e472c52 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -217,6 +217,7 @@ public final class Launcher extends Activity private boolean mPaused = true; private boolean mRestoring; private boolean mWaitingForResult; + private boolean mOnResumeNeedsLoad; private Bundle mSavedInstanceState; @@ -680,13 +681,12 @@ public final class Launcher extends Activity @Override protected void onResume() { super.onResume(); - mPaused = false; - - if (mRestoring) { + if (mRestoring || mOnResumeNeedsLoad) { mWorkspaceLoading = true; mModel.startLoader(this, true); mRestoring = false; + mOnResumeNeedsLoad = false; } // When we resume Launcher, a different Activity might be responsible for the app // market intent, so refresh the icon @@ -703,6 +703,7 @@ public final class Launcher extends Activity if (mNextView != null) { dismissPreview(mNextView); } + mPaused = true; mDragController.cancelDrag(); } @@ -1143,6 +1144,10 @@ public final class Launcher extends Activity return mAppWidgetHost; } + public LauncherModel getModel() { + return mModel; + } + void closeSystemDialogs() { getWindow().closeAllPanels(); @@ -2869,6 +2874,30 @@ public final class Launcher extends Activity } } + /** + * If the activity is currently paused, signal that we need to re-run the loader + * in onResume. + * + * This needs to be called from incoming places where resources might have been loaded + * while we are paused. That is becaues the Configuration might be wrong + * when we're not running, and if it comes back to what it was when we + * were paused, we are not restarted. + * + * Implementation of the method from LauncherModel.Callbacks. + * + * @return true if we are currently paused. The caller might be able to + * skip some work in that case since we will come back again. + */ + public boolean setLoadOnResume() { + if (mPaused) { + Log.i(TAG, "setLoadOnResume"); + mOnResumeNeedsLoad = true; + return true; + } else { + return false; + } + } + /** * Implementation of the method from LauncherModel.Callbacks. */ @@ -2917,6 +2946,8 @@ public final class Launcher extends Activity */ public void bindItems(ArrayList shortcuts, int start, int end) { + setLoadOnResume(); + final Workspace workspace = mWorkspace; for (int i=start; i folders) { + setLoadOnResume(); sFolders.clear(); sFolders.putAll(folders); } @@ -2964,6 +2996,8 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void bindAppWidget(LauncherAppWidgetInfo item) { + setLoadOnResume(); + final long start = DEBUG_WIDGETS ? SystemClock.uptimeMillis() : 0; if (DEBUG_WIDGETS) { Log.d(TAG, "bindAppWidget: " + item); @@ -3000,6 +3034,8 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void finishBindingItems() { + setLoadOnResume(); + if (mSavedState != null) { if (!mWorkspace.hasFocus()) { mWorkspace.getChildAt(mWorkspace.getCurrentPage()).requestFocus(); @@ -3050,6 +3086,7 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void bindAppsAdded(ArrayList apps) { + setLoadOnResume(); removeDialog(DIALOG_CREATE_SHORTCUT); mAllAppsGrid.addApps(apps); if (mCustomizePagedView != null) { @@ -3065,6 +3102,7 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void bindAppsUpdated(ArrayList apps) { + setLoadOnResume(); removeDialog(DIALOG_CREATE_SHORTCUT); mWorkspace.updateShortcuts(apps); mAllAppsGrid.updateApps(apps); diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java index eff5ed63b8..179a5d5c0c 100644 --- a/src/com/android/launcher2/LauncherModel.java +++ b/src/com/android/launcher2/LauncherModel.java @@ -108,6 +108,7 @@ public class LauncherModel extends BroadcastReceiver { private static int mCellCountY; public interface Callbacks { + public boolean setLoadOnResume(); public int getCurrentWorkspaceScreen(); public void startBinding(); public void bindItems(ArrayList shortcuts, int start, int end); @@ -433,7 +434,19 @@ public class LauncherModel extends BroadcastReceiver { String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); enqueuePackageUpdated(new PackageUpdatedTask(PackageUpdatedTask.OP_ADD, packages)); // Then, rebind everything. - startLoader(mApp, false); + boolean runLoader = true; + if (mCallbacks != null) { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + // If they're paused, we can skip loading, because they'll do it again anyway + if (callbacks.setLoadOnResume()) { + runLoader = false; + } + } + } + if (runLoader) { + startLoader(mApp, false); + } } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); @@ -1500,14 +1513,25 @@ public class LauncherModel extends BroadcastReceiver { ShortcutInfo addShortcut(Context context, Intent data, int screen, int cellX, int cellY, boolean notify) { - final ShortcutInfo info = infoFromShortcutIntent(context, data); + final ShortcutInfo info = infoFromShortcutIntent(context, data, null); addItemToDatabase(context, info, LauncherSettings.Favorites.CONTAINER_DESKTOP, screen, cellX, cellY, notify); return info; } - private ShortcutInfo infoFromShortcutIntent(Context context, Intent data) { + /** + * Ensures that a given shortcut intent actually has all the fields that we need to create a + * proper ShortcutInfo. + */ + boolean validateShortcutIntent(Intent data) { + // We don't require Intent.EXTRA_SHORTCUT_ICON, since we can pull a default fallback icon + return InstallShortcutReceiver.ACTION_INSTALL_SHORTCUT.equals(data.getAction()) && + (data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT) != null) && + (data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME) != null); + } + + ShortcutInfo infoFromShortcutIntent(Context context, Intent data, Bitmap fallbackIcon) { Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); Parcelable bitmap = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); @@ -1540,8 +1564,12 @@ public class LauncherModel extends BroadcastReceiver { final ShortcutInfo info = new ShortcutInfo(); if (icon == null) { - icon = getFallbackIcon(); - info.usingFallbackIcon = true; + if (fallbackIcon != null) { + icon = fallbackIcon; + } else { + icon = getFallbackIcon(); + info.usingFallbackIcon = true; + } } info.setIcon(icon); diff --git a/src/com/android/launcher2/PagedViewIcon.java b/src/com/android/launcher2/PagedViewIcon.java index 010c573f1b..be4999d584 100644 --- a/src/com/android/launcher2/PagedViewIcon.java +++ b/src/com/android/launcher2/PagedViewIcon.java @@ -16,6 +16,9 @@ package com.android.launcher2; +import com.android.launcher.R; +import com.android.launcher2.PagedView.PagedViewIconCache; + import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -23,17 +26,14 @@ import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; -import android.graphics.PointF; import android.graphics.Rect; -import android.graphics.Region.Op; -import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Message; import android.util.AttributeSet; import android.widget.Checkable; import android.widget.TextView; -import com.android.launcher.R; -import com.android.launcher2.PagedView.PagedViewIconCache; - /** @@ -49,8 +49,8 @@ public class PagedViewIcon extends TextView implements Checkable { private Bitmap mCheckedOutline; private Bitmap mHolographicOutline; private Canvas mHolographicOutlineCanvas; - private boolean mIsHolographicUpdatePass; private Rect mDrawableClipRect; + private Bitmap mIcon; private Object mIconCacheKey; private PagedViewIconCache mIconCache; @@ -67,6 +67,36 @@ public class PagedViewIcon extends TextView implements Checkable { private int mCheckedBlurColor; private int mCheckedOutlineColor; + private static final HandlerThread sWorkerThread = new HandlerThread("pagedviewicon-helper"); + static { + sWorkerThread.start(); + } + + private static final int MESSAGE_CREATE_HOLOGRAPHIC_OUTLINE = 1; + + private static final Handler sWorker = new Handler(sWorkerThread.getLooper()) { + private DeferredHandler mHandler = new DeferredHandler(); + private Paint mPaint = new Paint(); + public void handleMessage(Message msg) { + final PagedViewIcon icon = (PagedViewIcon) msg.obj; + + final Bitmap holographicOutline = Bitmap.createBitmap( + icon.mIcon.getWidth(), icon.mIcon.getHeight(), Bitmap.Config.ARGB_8888); + Canvas holographicOutlineCanvas = new Canvas(holographicOutline); + holographicOutlineCanvas.drawBitmap(icon.mIcon, 0, 0, mPaint); + + sHolographicOutlineHelper.applyExpensiveOutlineWithBlur(holographicOutline, + holographicOutlineCanvas, icon.mHoloBlurColor, icon.mHoloOutlineColor); + + mHandler.post(new Runnable() { + public void run() { + icon.mHolographicOutline = holographicOutline; + icon.mIconCache.addOutline(icon.mIconCacheKey, holographicOutline); + icon.invalidate(); + } + }); + } + }; public PagedViewIcon(Context context) { this(context, null); @@ -95,23 +125,32 @@ public class PagedViewIcon extends TextView implements Checkable { setBackgroundDrawable(null); } + private void queueHolographicOutlineCreation() { + // Generate the outline in the background + if (mHolographicOutline == null) { + Message m = sWorker.obtainMessage(MESSAGE_CREATE_HOLOGRAPHIC_OUTLINE); + m.obj = this; + sWorker.sendMessage(m); + } + } + public void applyFromApplicationInfo(ApplicationInfo info, PagedViewIconCache cache, boolean scaleUp) { mIconCache = cache; mIconCacheKey = info; mHolographicOutline = mIconCache.getOutline(mIconCacheKey); - Bitmap icon; if (scaleUp) { - icon = Bitmap.createScaledBitmap(info.iconBitmap, mScaledIconSize, + mIcon = Bitmap.createScaledBitmap(info.iconBitmap, mScaledIconSize, mScaledIconSize, true); } else { - icon = info.iconBitmap; + mIcon = info.iconBitmap; } - setCompoundDrawablesWithIntrinsicBounds(null, - new FastBitmapDrawable(icon), null, null); + setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null); setText(info.title); setTag(info); + + queueHolographicOutlineCreation(); } public void applyFromResolveInfo(ResolveInfo info, PackageManager packageManager, @@ -120,11 +159,12 @@ public class PagedViewIcon extends TextView implements Checkable { mIconCacheKey = info; mHolographicOutline = mIconCache.getOutline(mIconCacheKey); - Bitmap image = Utilities.createIconBitmap(info.loadIcon(packageManager), mContext); - setCompoundDrawablesWithIntrinsicBounds(null, - new FastBitmapDrawable(image), null, null); + mIcon = Utilities.createIconBitmap(info.loadIcon(packageManager), mContext); + setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null); setText(info.loadLabel(packageManager)); setTag(info); + + queueHolographicOutlineCreation(); } @Override @@ -144,60 +184,39 @@ public class PagedViewIcon extends TextView implements Checkable { } @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); + protected void onDraw(Canvas canvas) { + if (mAlpha > 0) { + super.onDraw(canvas); + } - if (mIconCache != null && mHolographicOutline == null) { - // update the clipping rect to be used in the holographic pass below - getDrawingRect(mDrawableClipRect); - mDrawableClipRect.bottom = getPaddingTop() + getCompoundPaddingTop(); + Bitmap overlay = null; - // set a flag to indicate that we are going to draw the view at full alpha with the text - // clipped for the generation of the holographic icon - mIsHolographicUpdatePass = true; - mHolographicOutline = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), - Bitmap.Config.ARGB_8888); - mHolographicOutlineCanvas = new Canvas(mHolographicOutline); - mHolographicOutlineCanvas.concat(getMatrix()); - draw(mHolographicOutlineCanvas); - sHolographicOutlineHelper.applyExpensiveOutlineWithBlur(mHolographicOutline, - mHolographicOutlineCanvas, mHoloBlurColor, mHoloOutlineColor); - mIsHolographicUpdatePass = false; - mIconCache.addOutline(mIconCacheKey, mHolographicOutline); - mHolographicOutlineCanvas = null; + // draw any blended overlays + if (mCheckedOutline == null) { + if (mHolographicOutline != null && mHolographicAlpha > 0) { + mPaint.setAlpha(mHolographicAlpha); + overlay = mHolographicOutline; + } + } else { + mPaint.setAlpha(255); + overlay = mCheckedOutline; + } + + if (overlay != null) { + final int compoundPaddingLeft = getCompoundPaddingLeft(); + final int compoundPaddingRight = getCompoundPaddingRight(); + int hspace = getWidth() - compoundPaddingRight - compoundPaddingLeft; + canvas.drawBitmap(overlay, + compoundPaddingLeft + (hspace - overlay.getWidth()) / 2, + mPaddingTop, + mPaint); } } @Override - protected void onDraw(Canvas canvas) { - // draw the view itself - if (mIsHolographicUpdatePass) { - // only clip to the text view (restore its alpha so that we get a proper outline) - canvas.save(); - canvas.clipRect(mDrawableClipRect, Op.REPLACE); - final float alpha = getAlpha(); - super.setAlpha(1.0f); - super.onDraw(canvas); - super.setAlpha(alpha); - canvas.restore(); - } else { - if (mAlpha > 0) { - super.onDraw(canvas); - } - } - - // draw any blended overlays - if (!mIsHolographicUpdatePass) { - if (mCheckedOutline == null) { - if (mHolographicOutline != null && mHolographicAlpha > 0) { - mPaint.setAlpha(mHolographicAlpha); - canvas.drawBitmap(mHolographicOutline, 0, 0, mPaint); - } - } else { - mPaint.setAlpha(255); - canvas.drawBitmap(mCheckedOutline, 0, 0, mPaint); - } - } + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + sWorker.removeMessages(MESSAGE_CREATE_HOLOGRAPHIC_OUTLINE, this); } @Override @@ -211,22 +230,14 @@ public class PagedViewIcon extends TextView implements Checkable { mIsChecked = checked; if (mIsChecked) { - // update the clipping rect to be used in the holographic pass below - getDrawingRect(mDrawableClipRect); - mDrawableClipRect.bottom = getPaddingTop() + getCompoundPaddingTop(); - - // set a flag to indicate that we are going to draw the view at full alpha with the text - // clipped for the generation of the holographic icon - mIsHolographicUpdatePass = true; - mCheckedOutline = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), + mCheckedOutline = Bitmap.createBitmap(mIcon.getWidth(), mIcon.getHeight(), Bitmap.Config.ARGB_8888); - mHolographicOutlineCanvas = new Canvas(mCheckedOutline); - mHolographicOutlineCanvas.concat(getMatrix()); - draw(mHolographicOutlineCanvas); + Canvas checkedOutlineCanvas = new Canvas(mCheckedOutline); + mPaint.setAlpha(255); + checkedOutlineCanvas.drawBitmap(mIcon, 0, 0, mPaint); + sHolographicOutlineHelper.applyExpensiveOutlineWithBlur(mCheckedOutline, - mHolographicOutlineCanvas, mCheckedBlurColor, mCheckedOutlineColor); - mIsHolographicUpdatePass = false; - mHolographicOutlineCanvas = null; + checkedOutlineCanvas, mCheckedBlurColor, mCheckedOutlineColor); } else { invalidateCheckedImage(); } diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index ce613f1353..07faed101a 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -16,7 +16,8 @@ package com.android.launcher2; -import com.android.launcher.R; +import java.util.ArrayList; +import java.util.HashSet; import android.animation.Animator; import android.animation.Animator.AnimatorListener; @@ -27,6 +28,8 @@ import android.animation.PropertyValuesHolder; import android.app.WallpaperManager; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; +import android.content.ClipData; +import android.content.ClipDescription; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -36,8 +39,11 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Matrix; +import android.graphics.Paint; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.Region.Op; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -45,12 +51,13 @@ import android.os.IBinder; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; +import android.view.DragEvent; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; +import android.widget.Toast; -import java.util.ArrayList; -import java.util.HashSet; +import com.android.launcher.R; /** * The workspace is a wide area with a wallpaper and a finite number of pages. @@ -144,6 +151,9 @@ public class Workspace extends SmoothPagedView private final Rect mTempRect = new Rect(); private final int[] mTempXY = new int[2]; + // Paint used to draw external drop outline + private final Paint mExternalDragOutlinePaint = new Paint(); + /** * Used to inflate the Workspace from XML. * @@ -193,6 +203,7 @@ public class Workspace extends SmoothPagedView Launcher.setScreen(mCurrentPage); LauncherApplication app = (LauncherApplication)context.getApplicationContext(); mIconCache = app.getIconCache(); + mExternalDragOutlinePaint.setAntiAlias(true); mUnshrinkAnimationListener = new AnimatorListenerAdapter() { public void onAnimationStart(Animator animation) { @@ -983,6 +994,29 @@ public class Workspace extends SmoothPagedView return b; } + /** + * Creates a drag outline to represent a drop (that we don't have the actual information for + * yet). May be changed in the future to alter the drop outline slightly depending on the + * clip description mime data. + */ + private Bitmap createExternalDragOutline(Canvas canvas, int padding) { + Resources r = getResources(); + final int outlineColor = r.getColor(R.color.drag_outline_color); + final int iconWidth = r.getDimensionPixelSize(R.dimen.workspace_cell_width); + final int iconHeight = r.getDimensionPixelSize(R.dimen.workspace_cell_height); + final int rectRadius = r.getDimensionPixelSize(R.dimen.external_drop_icon_rect_radius); + final int inset = (int) (Math.min(iconWidth, iconHeight) * 0.2f); + final Bitmap b = Bitmap.createBitmap( + iconWidth + padding, iconHeight + padding, Bitmap.Config.ARGB_8888); + + canvas.setBitmap(b); + canvas.drawRoundRect(new RectF(inset, inset, iconWidth - inset, iconHeight - inset), + rectRadius, rectRadius, mExternalDragOutlinePaint); + mOutlineHelper.applyExpensiveOuterOutline(b, canvas, outlineColor, true); + + return b; + } + /** * Returns a new bitmap to show when the given View is being dragged around. * Responsibility for the bitmap is transferred to the caller. @@ -1136,7 +1170,7 @@ public class Workspace extends SmoothPagedView if (!mIsSmall) { mDragTargetLayout = getCurrentDropLayout(); - mDragTargetLayout.onDragEnter(dragView); + mDragTargetLayout.onDragEnter(); showOutlines(); } } @@ -1182,6 +1216,88 @@ public class Workspace extends SmoothPagedView return null; } + /** + * Global drag and drop handler + */ + @Override + public boolean onDragEvent(DragEvent event) { + final CellLayout layout = (CellLayout) getChildAt(mCurrentPage); + final int[] pos = new int[2]; + layout.getLocationOnScreen(pos); + // We need to offset the drag coordinates to layout coordinate space + final int x = (int) event.getX() - pos[0]; + final int y = (int) event.getY() - pos[1]; + + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // Check if we have enough space on this screen to add a new shortcut + if (!layout.findCellForSpan(pos, 1, 1)) { + Toast.makeText(mContext, mContext.getString(R.string.out_of_space), + Toast.LENGTH_SHORT).show(); + return false; + } + + ClipDescription desc = event.getClipDescription(); + if (desc.filterMimeTypes(ClipDescription.MIMETYPE_TEXT_INTENT) != null) { + // Create the drag outline + // We need to add extra padding to the bitmap to make room for the glow effect + final Canvas canvas = new Canvas(); + final int bitmapPadding = HolographicOutlineHelper.OUTER_BLUR_RADIUS; + mDragOutline = createExternalDragOutline(canvas, bitmapPadding); + + // Show the current page outlines to indicate that we can accept this drop + showOutlines(); + layout.setHover(true); + layout.onDragEnter(); + layout.visualizeDropLocation(null, mDragOutline, x, y, 1, 1); + + return true; + } + break; + case DragEvent.ACTION_DRAG_LOCATION: + // Visualize the drop location + layout.visualizeDropLocation(null, mDragOutline, x, y, 1, 1); + return true; + case DragEvent.ACTION_DROP: + // Check if we have enough space on this screen to add a new shortcut + if (!layout.findCellForSpan(pos, 1, 1)) { + Toast.makeText(mContext, mContext.getString(R.string.out_of_space), + Toast.LENGTH_SHORT).show(); + return false; + } + + // Try and add any shortcuts + int newDropCount = 0; + final LauncherModel model = mLauncher.getModel(); + final ClipData data = event.getClipData(); + final int itemCount = data.getItemCount(); + for (int i = 0; i < itemCount; ++i) { + final Intent intent = data.getItem(i).getIntent(); + if (intent != null && model.validateShortcutIntent(intent)) { + ShortcutInfo info = model.infoFromShortcutIntent(mContext, intent, data. + getIcon()); + onDropExternal(x, y, info, layout); + newDropCount++; + } + } + + // Show error message if we couldn't accept any of the items + if (newDropCount <= 0) { + Toast.makeText(mContext, "Only Shortcut Intents accepted.", + Toast.LENGTH_SHORT).show(); + } + + return true; + case DragEvent.ACTION_DRAG_ENDED: + // Hide the page outlines after the drop + layout.setHover(false); + layout.onDragExit(); + hideOutlines(); + return true; + } + return super.onDragEvent(event); + } + /* * * Convert the 2D coordinate xy from the parent View's coordinate space to this CellLayout's @@ -1382,7 +1498,7 @@ public class Workspace extends SmoothPagedView if (mDragTargetLayout != null) { mDragTargetLayout.onDragExit(); } - layout.onDragEnter(dragView); + layout.onDragEnter(); mDragTargetLayout = layout; }