diff options
110 files changed, 1240 insertions, 323 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 16d4ad6..42c9d34 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -1131,6 +1131,19 @@ public final class Pm { } private void runClear() { + int userId = 0; + String option = nextOption(); + if (option != null && option.equals("--user")) { + String optionData = nextOptionData(); + if (optionData == null || !isNumber(optionData)) { + System.err.println("Error: no USER_ID specified"); + showUsage(); + return; + } else { + userId = Integer.parseInt(optionData); + } + } + String pkg = nextArg(); if (pkg == null) { System.err.println("Error: no package specified"); @@ -1140,8 +1153,7 @@ public final class Pm { ClearDataObserver obs = new ClearDataObserver(); try { - // XXX TO DO: add user arg - if (!ActivityManagerNative.getDefault().clearApplicationUserData(pkg, obs, 0)) { + if (!ActivityManagerNative.getDefault().clearApplicationUserData(pkg, obs, userId)) { System.err.println("Failed"); } @@ -1179,7 +1191,7 @@ public final class Pm { return "unknown"; } - private boolean isNumber(String s) { + private static boolean isNumber(String s) { try { Integer.parseInt(s); } catch (NumberFormatException nfe) { @@ -1452,7 +1464,7 @@ public final class Pm { System.err.println(" [--algo <algorithm name> --key <key-in-hex> --iv <IV-in-hex>]"); System.err.println(" [--originating-uri <URI>] [--referrer <URI>] PATH"); System.err.println(" pm uninstall [-k] PACKAGE"); - System.err.println(" pm clear PACKAGE"); + System.err.println(" pm clear [--user USER_ID] PACKAGE"); System.err.println(" pm enable [--user USER_ID] PACKAGE_OR_COMPONENT"); System.err.println(" pm disable [--user USER_ID] PACKAGE_OR_COMPONENT"); System.err.println(" pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT"); diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 37e0a36..ec1695e 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -925,8 +925,17 @@ public abstract class HardwareRenderer { sEgl.eglGetConfigAttrib(sEglDisplay, config, EGL_STENCIL_SIZE, value); Log.d(LOG_TAG, " STENCIL_SIZE = " + value[0]); + sEgl.eglGetConfigAttrib(sEglDisplay, config, EGL_SAMPLE_BUFFERS, value); + Log.d(LOG_TAG, " SAMPLE_BUFFERS = " + value[0]); + + sEgl.eglGetConfigAttrib(sEglDisplay, config, EGL_SAMPLES, value); + Log.d(LOG_TAG, " SAMPLES = " + value[0]); + sEgl.eglGetConfigAttrib(sEglDisplay, config, EGL_SURFACE_TYPE, value); Log.d(LOG_TAG, " SURFACE_TYPE = 0x" + Integer.toHexString(value[0])); + + sEgl.eglGetConfigAttrib(sEglDisplay, config, EGL_CONFIG_CAVEAT, value); + Log.d(LOG_TAG, " CONFIG_CAVEAT = 0x" + Integer.toHexString(value[0])); } GL createEglSurface(Surface surface) throws Surface.OutOfResourcesException { @@ -1433,6 +1442,7 @@ public abstract class HardwareRenderer { EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 0, + EGL_CONFIG_CAVEAT, EGL_NONE, // TODO: Find a better way to choose the stencil size EGL_STENCIL_SIZE, mShowOverdraw ? GLES20Canvas.getStencilSize() : 0, EGL_SURFACE_TYPE, EGL_WINDOW_BIT | diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 07bb8f9..7ef6939 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -245,6 +245,7 @@ public class Surface implements Parcelable { private static native void nativeOpenTransaction(); private static native void nativeCloseTransaction(); + private static native void nativeSetAnimationTransaction(); private native void nativeSetLayer(int zorder); private native void nativeSetPosition(float x, float y); @@ -525,6 +526,11 @@ public class Surface implements Parcelable { nativeCloseTransaction(); } + /** flag the transaction as an animation @hide */ + public static void setAnimationTransaction() { + nativeSetAnimationTransaction(); + } + /** @hide */ public void setLayer(int zorder) { nativeSetLayer(zorder); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index b3c679c..751ed7c 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -367,6 +367,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private boolean mSingleLine; private int mDesiredHeightAtMeasure = -1; private boolean mIncludePad = true; + private int mDeferScroll = -1; // tmp primitives, so we don't alloc them on each draw private Rect mTempRect; @@ -6317,6 +6318,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); + if (mDeferScroll >= 0) { + int curs = mDeferScroll; + mDeferScroll = -1; + bringPointIntoView(curs); + } if (changed && mEditor != null) mEditor.invalidateTextDisplayList(); } @@ -6399,6 +6405,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * This has to be called after layout. Returns true if anything changed. */ public boolean bringPointIntoView(int offset) { + if (isLayoutRequested()) { + mDeferScroll = offset; + return false; + } boolean changed = false; Layout layout = isShowingHint() ? mHintLayout: mLayout; @@ -7108,13 +7118,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener registerForPreDraw(); } + checkForResize(); + if (curs >= 0) { mHighlightPathBogus = true; if (mEditor != null) mEditor.makeBlink(); bringPointIntoView(curs); } - - checkForResize(); } /** @@ -7161,6 +7171,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (oldStart >= 0 || newStart >= 0) { invalidateCursor(Selection.getSelectionStart(buf), oldStart, newStart); + checkForResize(); registerForPreDraw(); if (mEditor != null) mEditor.makeBlink(); } diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 4982f31..531445f 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -526,6 +526,10 @@ static void nativeCloseTransaction(JNIEnv* env, jclass clazz) { SurfaceComposerClient::closeGlobalTransaction(); } +static void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz) { + SurfaceComposerClient::setAnimationTransaction(); +} + static void nativeSetLayer(JNIEnv* env, jobject surfaceObj, jint zorder) { sp<SurfaceControl> surface(getSurfaceControl(env, surfaceObj)); if (surface == NULL) return; @@ -819,6 +823,8 @@ static JNINativeMethod gSurfaceMethods[] = { (void*)nativeOpenTransaction }, {"nativeCloseTransaction", "()V", (void*)nativeCloseTransaction }, + {"nativeSetAnimationTransaction", "()V", + (void*)nativeSetAnimationTransaction }, {"nativeSetLayer", "(I)V", (void*)nativeSetLayer }, {"nativeSetPosition", "(FF)V", diff --git a/core/res/res/layout-land/keyguard_status_area.xml b/core/res/res/layout-land/keyguard_status_area.xml index 78bf931..f562d9f 100644 --- a/core/res/res/layout-land/keyguard_status_area.xml +++ b/core/res/res/layout-land/keyguard_status_area.xml @@ -41,6 +41,8 @@ <TextView android:id="@+id/alarm_status" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="end" android:layout_marginTop="28dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" @@ -53,6 +55,8 @@ <TextView android:id="@+id/owner_info" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="end" android:layout_marginTop="4dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" @@ -64,6 +68,8 @@ <TextView android:id="@+id/status1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="end" android:layout_marginTop="4dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" @@ -75,6 +81,8 @@ <TextView android:id="@+id/status_security_message" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="right" android:layout_marginTop="12dp" diff --git a/core/res/res/layout-port/keyguard_status_area.xml b/core/res/res/layout-port/keyguard_status_area.xml index 00aac7b..e0a49dc 100644 --- a/core/res/res/layout-port/keyguard_status_area.xml +++ b/core/res/res/layout-port/keyguard_status_area.xml @@ -56,6 +56,8 @@ <TextView android:id="@+id/owner_info" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginTop="4dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" @@ -67,6 +69,8 @@ <TextView android:id="@+id/status1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginTop="4dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" @@ -78,6 +82,8 @@ <TextView android:id="@+id/status_security_message" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginTop="4dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" diff --git a/core/res/res/layout-sw600dp-port/keyguard_status_area.xml b/core/res/res/layout-sw600dp-port/keyguard_status_area.xml index 679aebd..f21254a 100644 --- a/core/res/res/layout-sw600dp-port/keyguard_status_area.xml +++ b/core/res/res/layout-sw600dp-port/keyguard_status_area.xml @@ -41,6 +41,8 @@ <TextView android:id="@+id/alarm_status" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="end" android:layout_marginTop="28dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" @@ -53,6 +55,8 @@ <TextView android:id="@+id/owner_info" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="end" android:layout_marginTop="4dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" @@ -64,6 +68,8 @@ <TextView android:id="@+id/status1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="end" android:layout_marginTop="4dp" android:layout_marginEnd="@dimen/kg_status_line_font_right_margin" diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 0f73ff5..c93008d 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerdelik geteken. Na nog <xliff:g id="NUMBER_1">%d</xliff:g> onsuksesvolle pogings, sal jy gevra word om jou tablet te ontsluit deur middel van \'n e-posrekening."\n\n" Probeer weer oor <xliff:g id="NUMBER_2">%d</xliff:g> sekondes."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerdelik geteken. Na nog <xliff:g id="NUMBER_1">%d</xliff:g> onsuksesvolle pogings, sal jy gevra word om jou foon te ontsluit deur middel van \'n e-posrekening."\n\n" Probeer weer oor <xliff:g id="NUMBER_2">%d</xliff:g> sekondes."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Moet volume bo veilige vlak verhoog word?"\n"Deur vir lang tydperke op hoë volume te luister, kan jou gehoor beskadig."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Hou twee vingers in om toeganklikheid te aktiveer."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Toeganklikheid geaktiveer."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Toeganklikheid gekanselleer."</string> <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g> ."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index f60ac3e..495c0e2 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ጡባዊ ቱኮዎን እንዲከፍቱ ይጠየቃሉ።"\n\n" ከ<xliff:g id="NUMBER_2">%d</xliff:g> ከሰከንዶች በኋላ እንደገና ይሞክሩ።"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ስልክዎን እንዲከፍቱ ይጠየቃሉ።"\n\n"እባክዎ ከ<xliff:g id="NUMBER_2">%d</xliff:g> ሰከንዶች በኋላ እንደገና ይሞክሩ።"</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"ድምጽ አደጋ ከሌለው መጠን በላይ ይጨመር??"\n"ለረጅም ጊዜ በከፍተኛ ድምጽ መስማት የመስማት ችሎታዎን ሊጎዳይ ይችላል።"</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"ተደራሽነትን ለማንቃት ሁለት ጣቶችዎን ባሉበት ያቆዩዋቸው።"</string> <string name="accessibility_enabled" msgid="1381972048564547685">"ተደራሽነት ነቅቷል።"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"ተደራሽነት ተሰርዟል።"</string> <string name="user_switched" msgid="3768006783166984410">"የአሁኑ ተጠቃሚ <xliff:g id="NAME">%1$s</xliff:g>።"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 501946b..6fa8b50 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis la tauleta amb un compte de correu electrònic."\n\n" Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis el telèfon amb un compte de correu electrònic."\n\n" Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Vols augmentar el volum per sobre del nivell de seguretat?"\n"Escoltar música a un volum alt durant períodes llargs pot perjudicar l\'oïda."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantén premuts els dos dits per activar l\'accessibilitat."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"S\'ha activat l\'accessibilitat."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibilitat cancel·lada."</string> <string name="user_switched" msgid="3768006783166984410">"Usuari actual: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index e14e7de..db09717 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> yderligere mislykkede forsøg vil du blive bedt om at låse din tablet op ved hjælp af en e-mailkonto"\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> yderligere mislykkede forsøg til vil du blive bedt om at låse din telefon op ved hjælp af en e-mailkonto."\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Skal lydstyrken være over det sikre niveau?"\n"Du kan skade din hørelse ved at lytte ved høj lydstyrke i længere tid."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Hold fortsat to fingre nede for at aktivere tilgængelighed."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Tilgængelighed aktiveret."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Tilgængelighed er annulleret."</string> <string name="user_switched" msgid="3768006783166984410">"Nuværende bruger <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 9ced98c..e55a272 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς προσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το tablet σας με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου."\n\n" Δοκιμάστε να συνδεθείτε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> δευτερόλεπτα."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς προσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το τηλέφωνό σας με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου."\n\n" Δοκιμάστε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> δευτερόλεπτα."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Αύξηση έντασης ήχου πάνω από το επίπεδο ασφαλείας;"\n"Αν ακούτε μουσική σε υψηλή ένταση για μεγάλο χρονικό διάστημα ενδέχεται να προκληθεί βλάβη στην ακοή σας."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Αγγίξτε παρατεταμένα με δύο δάχτυλα για να ενεργοποιήσετε τη λειτουργία προσβασιμότητας."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Ενεργοποιήθηκε η προσβασιμότητα."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Η λειτουργία προσβασιμότητας ακυρώθηκε."</string> <string name="user_switched" msgid="3768006783166984410">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 9011e9d..a96995a 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account."\n\n" Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account."\n\n" Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Raise volume above safe level?"\n"Listening at high volume for long periods may damage your hearing."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Keep holding down two fingers to enable accessibility."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Accessibility enabled."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibility cancelled."</string> <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index b45f001..d41ce82 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el tablet."\n\n" Inténtalo de nuevo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el teléfono."\n\n" Inténtalo de nuevo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"¿Subir el volumen por encima del nivel de seguridad?"\n"Escuchar sonidos a alto volumen durante largos períodos de tiempo puede dañar tus oídos."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantén la pantalla pulsada con dos dedos para habilitar las funciones de accesibilidad."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Accesibilidad habilitada"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accesibilidad cancelada"</string> <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index fbb9f3e..cf237dc 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset palutakse teil tahvelarvuti avada meilikontoga."\n\n" Proovige uuesti <xliff:g id="NUMBER_2">%d</xliff:g> sekundi pärast."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset palutakse teil telefon avada meilikontoga."\n\n" Proovige uuesti <xliff:g id="NUMBER_2">%d</xliff:g> sekundi pärast."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Kas suurendada helitugevust üle ohutu piiri?"\n"Pikaajaline suure helitugevusega muusika kuulamine võib kahjustada kuulmist."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Hõlbustuse lubamiseks hoidke kaht sõrme all."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Hõlbustus on lubatud."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Hõlbustus on tühistatud."</string> <string name="user_switched" msgid="3768006783166984410">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 3a91039..5357009 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il tablet con un account email."\n\n" Riprova tra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il telefono con un account email."\n\n" Riprova tra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Aumentare il volume oltre il livello di sicurezza?"\n"Ascoltare musica ad alto volume per lunghi periodi potrebbe danneggiare l\'udito."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Continua a tenere premuto con due dita per attivare l\'accessibilità."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Accessibilità attivata."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibilità annullata."</string> <string name="user_switched" msgid="3768006783166984410">"Utente corrente <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index ee0260a..1240d6c 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Netinkamai nupiešėte atrakinimo piešinį <xliff:g id="NUMBER_0">%d</xliff:g> k. Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkm. band. būsite paprašyti atrakinti planšetinį kompiuterį naudodami „Google“ prisijungimo duomenis."\n\n" Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Netinkamai nupiešėte atrakinimo piešinį <xliff:g id="NUMBER_0">%d</xliff:g> k. Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkm. band. būsite paprašyti atrakinti telefoną naudodami „Google“ prisijungimo duomenis."\n\n" Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Padidinti garsumą viršijant saugų lygį?"\n"Ilgai klausantis dideliu garsumu gali sutrikti klausa."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Laikykite palietę dviem pirštais, kad įgalintumėte pritaikymo neįgaliesiems režimą."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Pritaikymas neįgaliesiems įgalintas."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Pritaikymo neįgaliesiems režimas atšauktas."</string> <string name="user_switched" msgid="3768006783166984410">"Dabartinis naudotojas: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index dd26946..25c036b 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Jūs nepareizi norādījāt atbloķēšanas kombināciju <xliff:g id="NUMBER_0">%d</xliff:g> reizes. Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem planšetdators būs jāatbloķē, izmantojot e-pasta kontu."\n\n"Mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundēm."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Jūs nepareizi norādījāt atbloķēšanas kombināciju <xliff:g id="NUMBER_0">%d</xliff:g> reizes. Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem tālrunis būs jāatbloķē, izmantojot e-pasta kontu."\n\n"Mēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundēm."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Vai palielināt skaļumu virs drošības līmeņa?"\n"Ilgstoši klausoties skaņu lielā skaļumā, var tikt bojāta dzirde."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Lai iespējotu pieejamību, turiet nospiestus divus pirkstus."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Pieejamības režīms ir iespējots."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Pieejamība ir atcelta."</string> <string name="user_switched" msgid="3768006783166984410">"Pašreizējais lietotājs: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index c10d7b4..78cc0e9 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Du har tegnet opplåsningsmønsteret feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%d</xliff:g> gale forsøk, blir du bedt om å låse opp nettbrettet via en e-postkonto."\n\n" Prøv på nytt om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har tegnet opplåsningsmønsteret feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%d</xliff:g> gale forsøk, blir du bedt om å låse opp telefonen via en e-postkonto."\n\n" Prøv på nytt om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Vil du øke lydnivået over trygt nivå?"\n"Lytting på høyt lydnivå i lange perioder kan skade hørselen din."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Fortsett å holde nede to fingre for å aktivere tilgjengelighet."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Tilgjengelighet er aktivert."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Tilgjengelighetstjenesten ble avbrutt."</string> <string name="user_switched" msgid="3768006783166984410">"Gjeldende bruker: <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 41037d6..df8ec78 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"U heeft uw ontgrendelingspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%d</xliff:g> mislukte pogingen wordt u gevraagd uw tablet te ontgrendelen via een e-mailaccount."\n\n" Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"U heeft uw ontgrendelingspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%d</xliff:g> mislukte pogingen wordt u gevraagd uw telefoon te ontgrendelen via een e-mailaccount."\n\n" Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Wilt u het volume verhogen tot boven het aanbevolen geluidsniveau?"\n"Te lang luisteren op een te hoog volume kan leiden tot gehoorbeschadiging."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Blijf het scherm met twee vingers aanraken om toegankelijkheid in te schakelen."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Toegankelijkheid ingeschakeld."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Toegankelijkheid geannuleerd."</string> <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 9a06263..1a22702 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email."\n\n" Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email."\n\n" Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Aumentar o volume acima do nível de segurança?"\n"Ouvir em volume alto durante longos períodos de tempo poderá prejudicar a sua audição."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Mantenha os dois dedos para ativar a acessibilidade."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Acessibilidade ativada."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Acessibilidade cancelada."</string> <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> do utilizador atual."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index ddc4e04..b712146 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1304,8 +1304,8 @@ <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Songa"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ingiza"</string> <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Chagua programu"</string> - <string name="shareactionprovider_share_with" msgid="806688056141131819">"Gawa na"</string> - <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Gawa na <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="shareactionprovider_share_with" msgid="806688056141131819">"Shiriki na"</string> + <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Shiriki na <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="content_description_sliding_handle" msgid="415975056159262248">"Utambo unaosonga. Gusa & shika"</string> <string name="description_direction_up" msgid="7169032478259485180">"Sogeza juu kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="description_direction_down" msgid="5087739728639014595">"Sogeza chini kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Umekosea katika kuweka mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%d</xliff:g> bila kufaulu, utaombwa kufungua kompyuta yako ndogo kwa kutumia akaunti yako ya barua pepe."\n\n" Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%d</xliff:g>."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Umekosea kuchora mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%d</xliff:g> yasiyofaulu, utaombwa kufungua simu yako kwa kutumia akaunti ya barua pepe."\n\n" Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%d</xliff:g>."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Ongeza sauti zaidi ya kiwango salama? "\n"Kusikiliza kwa sauti ya juu kwa muda mrefu kunaweza kuharibu uwezo wako wa kusikia."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Endelea kushikilia chini kwa vidole vyako viwili ili kuwezesha ufikivu."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Ufikivu umewezeshwa."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Ufikivu umeghairiwa."</string> <string name="user_switched" msgid="3768006783166984410">"Mtumiaji wa sasa <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index ef48346..75142fb 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1418,8 +1418,7 @@ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Udwebe ngokungalungile iphathini yakho yokuvula izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Emva <xliff:g id="NUMBER_1">%d</xliff:g> kweminye imizamo engaphumelelanga, uzocelwa ukuvula ithebhulethi yakho usebenzisa ukungena ngemvume kwi-Google."\n\n" Sicela uzame futhi kwengu-<xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google"\n\n" Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%d</xliff:g> imizuzwana."</string> <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"Khulisa ivolomu ngaphezu kweleveli yokuphepha?"\n"Ukulalela ngevolomu ephezulu izikhathi ezide kungalimaza ukuzwa kwakho."</string> - <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) --> - <skip /> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Gcina ucindezele iminwe yakho emibili ukuze unike amandla ukufinyelela."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Ukufinyelela kunikwe amandla."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Ukufinyelela kukhanseliwe."</string> <string name="user_switched" msgid="3768006783166984410">"Umsebenzisi wamanje <xliff:g id="NAME">%1$s</xliff:g>."</string> diff --git a/data/sounds/AudioPackage10.mk b/data/sounds/AudioPackage10.mk new file mode 100755 index 0000000..cb55bba --- /dev/null +++ b/data/sounds/AudioPackage10.mk @@ -0,0 +1,64 @@ +# +# Audio Package 10 - Mako +# +# Include this file in a product makefile to include these audio files +# +# + +LOCAL_PATH:= frameworks/base/data/sounds + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \ + $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \ + $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \ + $(LOCAL_PATH)/alarms/ogg/Neon.ogg:system/media/audio/alarms/Neon.ogg \ + $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \ + $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \ + $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \ + $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ + $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ + $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \ + $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \ + $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \ + $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \ + $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \ + $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \ + $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \ + $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \ + $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \ + $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \ + $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \ + $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \ + $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \ + $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \ + $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \ + $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \ + $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \ + $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:system/media/audio/notifications/Syrma.ogg \ + $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \ + $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \ + $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Atria.ogg:system/media/audio/ringtones/Atria.ogg \ + $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:system/media/audio/ringtones/Kuma.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Rasalas.ogg:system/media/audio/ringtones/Rasalas.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg diff --git a/data/sounds/alarms/ogg/Argon.ogg b/data/sounds/alarms/ogg/Argon.ogg Binary files differnew file mode 100644 index 0000000..35addf5 --- /dev/null +++ b/data/sounds/alarms/ogg/Argon.ogg diff --git a/data/sounds/alarms/ogg/Carbon.ogg b/data/sounds/alarms/ogg/Carbon.ogg Binary files differnew file mode 100644 index 0000000..b02a1cc --- /dev/null +++ b/data/sounds/alarms/ogg/Carbon.ogg diff --git a/data/sounds/alarms/ogg/Helium.ogg b/data/sounds/alarms/ogg/Helium.ogg Binary files differnew file mode 100644 index 0000000..36694cb --- /dev/null +++ b/data/sounds/alarms/ogg/Helium.ogg diff --git a/data/sounds/alarms/ogg/Krypton.ogg b/data/sounds/alarms/ogg/Krypton.ogg Binary files differnew file mode 100755 index 0000000..48f956b --- /dev/null +++ b/data/sounds/alarms/ogg/Krypton.ogg diff --git a/data/sounds/alarms/ogg/Neon.ogg b/data/sounds/alarms/ogg/Neon.ogg Binary files differnew file mode 100644 index 0000000..3089a27 --- /dev/null +++ b/data/sounds/alarms/ogg/Neon.ogg diff --git a/data/sounds/alarms/ogg/Oxygen.ogg b/data/sounds/alarms/ogg/Oxygen.ogg Binary files differnew file mode 100644 index 0000000..4dc8ade --- /dev/null +++ b/data/sounds/alarms/ogg/Oxygen.ogg diff --git a/data/sounds/alarms/ogg/Platinum.ogg b/data/sounds/alarms/ogg/Platinum.ogg Binary files differnew file mode 100644 index 0000000..d5f0893 --- /dev/null +++ b/data/sounds/alarms/ogg/Platinum.ogg diff --git a/data/sounds/alarms/ogg/Promethium.ogg b/data/sounds/alarms/ogg/Promethium.ogg Binary files differindex 2a195a3..d5f0893 100644 --- a/data/sounds/alarms/ogg/Promethium.ogg +++ b/data/sounds/alarms/ogg/Promethium.ogg diff --git a/data/sounds/alarms/wav/Argon.wav b/data/sounds/alarms/wav/Argon.wav Binary files differnew file mode 100755 index 0000000..56e57fc --- /dev/null +++ b/data/sounds/alarms/wav/Argon.wav diff --git a/data/sounds/alarms/wav/Carbon.wav b/data/sounds/alarms/wav/Carbon.wav Binary files differnew file mode 100755 index 0000000..2b855e1 --- /dev/null +++ b/data/sounds/alarms/wav/Carbon.wav diff --git a/data/sounds/alarms/wav/Helium.wav b/data/sounds/alarms/wav/Helium.wav Binary files differnew file mode 100644 index 0000000..17710b0 --- /dev/null +++ b/data/sounds/alarms/wav/Helium.wav diff --git a/data/sounds/alarms/wav/Krypton.wav b/data/sounds/alarms/wav/Krypton.wav Binary files differnew file mode 100644 index 0000000..9095e30 --- /dev/null +++ b/data/sounds/alarms/wav/Krypton.wav diff --git a/data/sounds/alarms/wav/Neon.wav b/data/sounds/alarms/wav/Neon.wav Binary files differnew file mode 100644 index 0000000..0e9101a --- /dev/null +++ b/data/sounds/alarms/wav/Neon.wav diff --git a/data/sounds/alarms/wav/Oxygen.wav b/data/sounds/alarms/wav/Oxygen.wav Binary files differnew file mode 100644 index 0000000..bd41869 --- /dev/null +++ b/data/sounds/alarms/wav/Oxygen.wav diff --git a/data/sounds/alarms/wav/Platinum.wav b/data/sounds/alarms/wav/Platinum.wav Binary files differnew file mode 100755 index 0000000..08ea03e --- /dev/null +++ b/data/sounds/alarms/wav/Platinum.wav diff --git a/data/sounds/ringtones/ogg/ArgoNavis.ogg b/data/sounds/ringtones/ogg/ArgoNavis.ogg Binary files differindex 8bee29e..d25b5e8 100644 --- a/data/sounds/ringtones/ogg/ArgoNavis.ogg +++ b/data/sounds/ringtones/ogg/ArgoNavis.ogg diff --git a/data/sounds/ringtones/ogg/Perseus.ogg b/data/sounds/ringtones/ogg/Perseus.ogg Binary files differindex e5f3fc2..48348e5 100644 --- a/data/sounds/ringtones/ogg/Perseus.ogg +++ b/data/sounds/ringtones/ogg/Perseus.ogg diff --git a/data/sounds/ringtones/ogg/Rigel.ogg b/data/sounds/ringtones/ogg/Rigel.ogg Binary files differindex 4fcb3c0..de3d92f 100644 --- a/data/sounds/ringtones/ogg/Rigel.ogg +++ b/data/sounds/ringtones/ogg/Rigel.ogg diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index cc536f2..2b50091 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -2427,17 +2427,39 @@ status_t OpenGLRenderer::drawOval(float left, float top, float right, float bott } status_t OpenGLRenderer::drawArc(float left, float top, float right, float bottom, - float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { - if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone; + float startAngle, float sweepAngle, bool useCenter, SkPaint* p) { + if (mSnapshot->isIgnored() || quickRejectPreStroke(left, top, right, bottom, p)) { + return DrawGlInfo::kStatusDone; + } if (fabs(sweepAngle) >= 360.0f) { - return drawOval(left, top, right, bottom, paint); + return drawOval(left, top, right, bottom, p); } - mCaches.activeTexture(0); - const PathTexture* texture = mCaches.arcShapeCache.getArc(right - left, bottom - top, - startAngle, sweepAngle, useCenter, paint); - return drawShape(left, top, texture, paint); + // TODO: support fills (accounting for concavity if useCenter && sweepAngle > 180) + if (p->getStyle() != SkPaint::kStroke_Style || p->getPathEffect() != 0 || p->getStrokeCap() != SkPaint::kButt_Cap) { + mCaches.activeTexture(0); + const PathTexture* texture = mCaches.arcShapeCache.getArc(right - left, bottom - top, + startAngle, sweepAngle, useCenter, p); + return drawShape(left, top, texture, p); + } + + SkRect rect = SkRect::MakeLTRB(left, top, right, bottom); + if (p->getStyle() == SkPaint::kStrokeAndFill_Style) { + rect.outset(p->getStrokeWidth() / 2, p->getStrokeWidth() / 2); + } + + SkPath path; + if (useCenter) { + path.moveTo(rect.centerX(), rect.centerY()); + } + path.arcTo(rect, startAngle, sweepAngle, !useCenter); + if (useCenter) { + path.close(); + } + drawConvexPath(path, p); + + return DrawGlInfo::kStatusDrew; } // See SkPaintDefaults.h diff --git a/libs/hwui/PathRenderer.cpp b/libs/hwui/PathRenderer.cpp index 58d6cb8..dd13d79 100644 --- a/libs/hwui/PathRenderer.cpp +++ b/libs/hwui/PathRenderer.cpp @@ -80,11 +80,24 @@ inline void copyAlphaVertex(AlphaVertex* destPtr, const AlphaVertex* srcPtr) { * * Note that we can't add and normalize the two vectors, that would result in a rectangle having an * offset of (sqrt(2)/2, sqrt(2)/2) at each corner, instead of (1, 1) + * + * NOTE: assumes angles between normals 90 degrees or less */ inline vec2 totalOffsetFromNormals(const vec2& normalA, const vec2& normalB) { return (normalA + normalB) / (1 + fabs(normalA.dot(normalB))); } +inline void scaleOffsetForStrokeWidth(vec2& offset, float halfStrokeWidth, + float inverseScaleX, float inverseScaleY) { + if (halfStrokeWidth == 0.0f) { + // hairline - compensate for scale + offset.x *= 0.5f * inverseScaleX; + offset.y *= 0.5f * inverseScaleY; + } else { + offset *= halfStrokeWidth; + } +} + void getFillVerticesFromPerimeter(const Vector<Vertex>& perimeter, VertexBuffer& vertexBuffer) { Vertex* buffer = vertexBuffer.alloc<Vertex>(perimeter.size()); @@ -119,13 +132,7 @@ void getStrokeVerticesFromPerimeter(const Vector<Vertex>& perimeter, float halfS nextNormal.normalize(); vec2 totalOffset = totalOffsetFromNormals(lastNormal, nextNormal); - if (halfStrokeWidth == 0.0f) { - // hairline - compensate for scale - totalOffset.x *= 0.5f * inverseScaleX; - totalOffset.y *= 0.5f * inverseScaleY; - } else { - totalOffset *= halfStrokeWidth; - } + scaleOffsetForStrokeWidth(totalOffset, halfStrokeWidth, inverseScaleX, inverseScaleY); Vertex::set(&buffer[currentIndex++], current->position[0] + totalOffset.x, @@ -145,6 +152,55 @@ void getStrokeVerticesFromPerimeter(const Vector<Vertex>& perimeter, float halfS copyVertex(&buffer[currentIndex++], &buffer[1]); } +void getStrokeVerticesFromUnclosedVertices(const Vector<Vertex>& vertices, float halfStrokeWidth, + VertexBuffer& vertexBuffer, float inverseScaleX, float inverseScaleY) { + Vertex* buffer = vertexBuffer.alloc<Vertex>(vertices.size() * 2); + + int currentIndex = 0; + const Vertex* current = &(vertices[0]); + vec2 lastNormal; + for (unsigned int i = 0; i < vertices.size() - 1; i++) { + const Vertex* next = &(vertices[i + 1]); + vec2 nextNormal(next->position[1] - current->position[1], + current->position[0] - next->position[0]); + nextNormal.normalize(); + + vec2 totalOffset; + if (i == 0) { + totalOffset = nextNormal; + } else { + totalOffset = totalOffsetFromNormals(lastNormal, nextNormal); + } + scaleOffsetForStrokeWidth(totalOffset, halfStrokeWidth, inverseScaleX, inverseScaleY); + + Vertex::set(&buffer[currentIndex++], + current->position[0] + totalOffset.x, + current->position[1] + totalOffset.y); + + Vertex::set(&buffer[currentIndex++], + current->position[0] - totalOffset.x, + current->position[1] - totalOffset.y); + + current = next; + lastNormal = nextNormal; + } + + vec2 totalOffset = lastNormal; + scaleOffsetForStrokeWidth(totalOffset, halfStrokeWidth, inverseScaleX, inverseScaleY); + + Vertex::set(&buffer[currentIndex++], + current->position[0] + totalOffset.x, + current->position[1] + totalOffset.y); + Vertex::set(&buffer[currentIndex++], + current->position[0] - totalOffset.x, + current->position[1] - totalOffset.y); +#if VERTEX_DEBUG + for (unsigned int i = 0; i < vertexBuffer.getSize(); i++) { + ALOGD("point at %f %f", buffer[i].position[0], buffer[i].position[1]); + } +#endif +} + void getFillVerticesFromPerimeterAA(const Vector<Vertex>& perimeter, VertexBuffer& vertexBuffer, float inverseScaleX, float inverseScaleY) { AlphaVertex* buffer = vertexBuffer.alloc<AlphaVertex>(perimeter.size() * 3 + 2); @@ -202,11 +258,167 @@ void getFillVerticesFromPerimeterAA(const Vector<Vertex>& perimeter, VertexBuffe #if VERTEX_DEBUG for (unsigned int i = 0; i < vertexBuffer.getSize(); i++) { - ALOGD("point at %f %f", buffer[i].position[0], buffer[i].position[1]); + ALOGD("point at %f %f, alpha %f", buffer[i].position[0], buffer[i].position[1], buffer[i].alpha); + } +#endif +} + + +void getStrokeVerticesFromUnclosedVerticesAA(const Vector<Vertex>& vertices, float halfStrokeWidth, + VertexBuffer& vertexBuffer, float inverseScaleX, float inverseScaleY) { + AlphaVertex* buffer = vertexBuffer.alloc<AlphaVertex>(6 * vertices.size() + 2); + + // avoid lines smaller than hairline since they break triangle based sampling. instead reducing + // alpha value (TODO: support different X/Y scale) + float maxAlpha = 1.0f; + if (halfStrokeWidth != 0 && inverseScaleX == inverseScaleY && + halfStrokeWidth * inverseScaleX < 0.5f) { + maxAlpha *= (2 * halfStrokeWidth) / inverseScaleX; + halfStrokeWidth = 0.0f; + } + + // there is no outer/inner here, using them for consistency with below approach + int offset = 2 * (vertices.size() - 2); + int currentAAOuterIndex = 2; + int currentAAInnerIndex = 2 * offset + 5; // reversed + int currentStrokeIndex = currentAAInnerIndex + 7; + + const Vertex* last = &(vertices[0]); + const Vertex* current = &(vertices[1]); + vec2 lastNormal(current->position[1] - last->position[1], + last->position[0] - current->position[0]); + lastNormal.normalize(); + + { + // start cap + vec2 totalOffset = lastNormal; + vec2 AAOffset = totalOffset; + AAOffset.x *= 0.5f * inverseScaleX; + AAOffset.y *= 0.5f * inverseScaleY; + + vec2 innerOffset = totalOffset; + scaleOffsetForStrokeWidth(innerOffset, halfStrokeWidth, inverseScaleX, inverseScaleY); + vec2 outerOffset = innerOffset + AAOffset; + innerOffset -= AAOffset; + + // TODO: support square cap by changing this offset to incorporate halfStrokeWidth + vec2 capAAOffset(AAOffset.y, -AAOffset.x); + AlphaVertex::set(&buffer[0], + last->position[0] + outerOffset.x + capAAOffset.x, + last->position[1] + outerOffset.y + capAAOffset.y, + 0.0f); + AlphaVertex::set(&buffer[1], + last->position[0] + innerOffset.x - capAAOffset.x, + last->position[1] + innerOffset.y - capAAOffset.y, + maxAlpha); + + AlphaVertex::set(&buffer[2 * offset + 6], + last->position[0] - outerOffset.x + capAAOffset.x, + last->position[1] - outerOffset.y + capAAOffset.y, + 0.0f); + AlphaVertex::set(&buffer[2 * offset + 7], + last->position[0] - innerOffset.x - capAAOffset.x, + last->position[1] - innerOffset.y - capAAOffset.y, + maxAlpha); + copyAlphaVertex(&buffer[2 * offset + 8], &buffer[0]); + copyAlphaVertex(&buffer[2 * offset + 9], &buffer[1]); + copyAlphaVertex(&buffer[2 * offset + 10], &buffer[1]); // degenerate tris (the only two!) + copyAlphaVertex(&buffer[2 * offset + 11], &buffer[2 * offset + 7]); + } + + for (unsigned int i = 1; i < vertices.size() - 1; i++) { + const Vertex* next = &(vertices[i + 1]); + vec2 nextNormal(next->position[1] - current->position[1], + current->position[0] - next->position[0]); + nextNormal.normalize(); + + vec2 totalOffset = totalOffsetFromNormals(lastNormal, nextNormal); + vec2 AAOffset = totalOffset; + AAOffset.x *= 0.5f * inverseScaleX; + AAOffset.y *= 0.5f * inverseScaleY; + + vec2 innerOffset = totalOffset; + scaleOffsetForStrokeWidth(innerOffset, halfStrokeWidth, inverseScaleX, inverseScaleY); + vec2 outerOffset = innerOffset + AAOffset; + innerOffset -= AAOffset; + + AlphaVertex::set(&buffer[currentAAOuterIndex++], + current->position[0] + outerOffset.x, + current->position[1] + outerOffset.y, + 0.0f); + AlphaVertex::set(&buffer[currentAAOuterIndex++], + current->position[0] + innerOffset.x, + current->position[1] + innerOffset.y, + maxAlpha); + + AlphaVertex::set(&buffer[currentStrokeIndex++], + current->position[0] + innerOffset.x, + current->position[1] + innerOffset.y, + maxAlpha); + AlphaVertex::set(&buffer[currentStrokeIndex++], + current->position[0] - innerOffset.x, + current->position[1] - innerOffset.y, + maxAlpha); + + AlphaVertex::set(&buffer[currentAAInnerIndex--], + current->position[0] - innerOffset.x, + current->position[1] - innerOffset.y, + maxAlpha); + AlphaVertex::set(&buffer[currentAAInnerIndex--], + current->position[0] - outerOffset.x, + current->position[1] - outerOffset.y, + 0.0f); + + last = current; + current = next; + lastNormal = nextNormal; + } + + { + // end cap + vec2 totalOffset = lastNormal; + vec2 AAOffset = totalOffset; + AAOffset.x *= 0.5f * inverseScaleX; + AAOffset.y *= 0.5f * inverseScaleY; + + vec2 innerOffset = totalOffset; + scaleOffsetForStrokeWidth(innerOffset, halfStrokeWidth, inverseScaleX, inverseScaleY); + vec2 outerOffset = innerOffset + AAOffset; + innerOffset -= AAOffset; + + // TODO: support square cap by changing this offset to incorporate halfStrokeWidth + vec2 capAAOffset(-AAOffset.y, AAOffset.x); + + AlphaVertex::set(&buffer[offset + 2], + current->position[0] + outerOffset.x + capAAOffset.x, + current->position[1] + outerOffset.y + capAAOffset.y, + 0.0f); + AlphaVertex::set(&buffer[offset + 3], + current->position[0] + innerOffset.x - capAAOffset.x, + current->position[1] + innerOffset.y - capAAOffset.y, + maxAlpha); + + AlphaVertex::set(&buffer[offset + 4], + current->position[0] - outerOffset.x + capAAOffset.x, + current->position[1] - outerOffset.y + capAAOffset.y, + 0.0f); + AlphaVertex::set(&buffer[offset + 5], + current->position[0] - innerOffset.x - capAAOffset.x, + current->position[1] - innerOffset.y - capAAOffset.y, + maxAlpha); + + copyAlphaVertex(&buffer[vertexBuffer.getSize() - 2], &buffer[offset + 3]); + copyAlphaVertex(&buffer[vertexBuffer.getSize() - 1], &buffer[offset + 5]); + } + +#if VERTEX_DEBUG + for (unsigned int i = 0; i < vertexBuffer.getSize(); i++) { + ALOGD("point at %f %f, alpha %f", buffer[i].position[0], buffer[i].position[1], buffer[i].alpha); } #endif } + void getStrokeVerticesFromPerimeterAA(const Vector<Vertex>& perimeter, float halfStrokeWidth, VertexBuffer& vertexBuffer, float inverseScaleX, float inverseScaleY) { AlphaVertex* buffer = vertexBuffer.alloc<AlphaVertex>(6 * perimeter.size() + 8); @@ -242,13 +454,7 @@ void getStrokeVerticesFromPerimeterAA(const Vector<Vertex>& perimeter, float hal AAOffset.y *= 0.5f * inverseScaleY; vec2 innerOffset = totalOffset; - if (halfStrokeWidth == 0.0f) { - // hairline! - compensate for scale - innerOffset.x *= 0.5f * inverseScaleX; - innerOffset.y *= 0.5f * inverseScaleY; - } else { - innerOffset *= halfStrokeWidth; - } + scaleOffsetForStrokeWidth(innerOffset, halfStrokeWidth, inverseScaleX, inverseScaleY); vec2 outerOffset = innerOffset + AAOffset; innerOffset -= AAOffset; @@ -296,6 +502,12 @@ void getStrokeVerticesFromPerimeterAA(const Vector<Vertex>& perimeter, float hal copyAlphaVertex(&buffer[currentAAInnerIndex++], &buffer[2 * offset]); copyAlphaVertex(&buffer[currentAAInnerIndex++], &buffer[2 * offset + 1]); // don't need to create last degenerate tri + +#if VERTEX_DEBUG + for (unsigned int i = 0; i < vertexBuffer.getSize(); i++) { + ALOGD("point at %f %f, alpha %f", buffer[i].position[0], buffer[i].position[1], buffer[i].alpha); + } +#endif } void PathRenderer::convexPathVertices(const SkPath &path, const SkPaint* paint, @@ -320,7 +532,10 @@ void PathRenderer::convexPathVertices(const SkPath &path, const SkPaint* paint, threshInvScaleY *= bounds.height() / (bounds.height() + paint->getStrokeWidth()); } } - convexPathPerimeterVertices(path, threshInvScaleX * threshInvScaleX, + + // force close if we're filling the path, since fill path expects closed perimeter. + bool forceClose = style != SkPaint::kStroke_Style; + bool wasClosed = convexPathPerimeterVertices(path, forceClose, threshInvScaleX * threshInvScaleX, threshInvScaleY * threshInvScaleY, tempVertices); if (!tempVertices.size()) { @@ -337,11 +552,22 @@ void PathRenderer::convexPathVertices(const SkPath &path, const SkPaint* paint, if (style == SkPaint::kStroke_Style) { float halfStrokeWidth = paint->getStrokeWidth() * 0.5f; if (!isAA) { - getStrokeVerticesFromPerimeter(tempVertices, halfStrokeWidth, vertexBuffer, - inverseScaleX, inverseScaleY); + if (wasClosed) { + getStrokeVerticesFromPerimeter(tempVertices, halfStrokeWidth, vertexBuffer, + inverseScaleX, inverseScaleY); + } else { + getStrokeVerticesFromUnclosedVertices(tempVertices, halfStrokeWidth, vertexBuffer, + inverseScaleX, inverseScaleY); + } + } else { - getStrokeVerticesFromPerimeterAA(tempVertices, halfStrokeWidth, vertexBuffer, - inverseScaleX, inverseScaleY); + if (wasClosed) { + getStrokeVerticesFromPerimeterAA(tempVertices, halfStrokeWidth, vertexBuffer, + inverseScaleX, inverseScaleY); + } else { + getStrokeVerticesFromUnclosedVerticesAA(tempVertices, halfStrokeWidth, vertexBuffer, + inverseScaleX, inverseScaleY); + } } } else { // For kStrokeAndFill style, the path should be adjusted externally, as it will be treated as a fill here. @@ -354,19 +580,27 @@ void PathRenderer::convexPathVertices(const SkPath &path, const SkPaint* paint, } -void PathRenderer::convexPathPerimeterVertices(const SkPath& path, +void pushToVector(Vector<Vertex>& vertices, float x, float y) { + // TODO: make this not yuck + vertices.push(); + Vertex* newVertex = &(vertices.editArray()[vertices.size() - 1]); + Vertex::set(newVertex, x, y); +} + +bool PathRenderer::convexPathPerimeterVertices(const SkPath& path, bool forceClose, float sqrInvScaleX, float sqrInvScaleY, Vector<Vertex>& outputVertices) { ATRACE_CALL(); - SkPath::Iter iter(path, true); - SkPoint pos; + // TODO: to support joins other than sharp miter, join vertices should be labelled in the + // perimeter, or resolved into more vertices. Reconsider forceClose-ing in that case. + SkPath::Iter iter(path, forceClose); SkPoint pts[4]; SkPath::Verb v; Vertex* newVertex = 0; while (SkPath::kDone_Verb != (v = iter.next(pts))) { switch (v) { case SkPath::kMove_Verb: - pos = pts[0]; + pushToVector(outputVertices, pts[0].x(), pts[0].y()); ALOGV("Move to pos %f %f", pts[0].x(), pts[0].y()); break; case SkPath::kClose_Verb: @@ -377,10 +611,7 @@ void PathRenderer::convexPathPerimeterVertices(const SkPath& path, pts[0].x(), pts[0].y(), pts[1].x(), pts[1].y()); - // TODO: make this not yuck - outputVertices.push(); - newVertex = &(outputVertices.editArray()[outputVertices.size() - 1]); - Vertex::set(newVertex, pts[1].x(), pts[1].y()); + pushToVector(outputVertices, pts[1].x(), pts[1].y()); break; case SkPath::kQuad_Verb: ALOGV("kQuad_Verb"); @@ -403,6 +634,14 @@ void PathRenderer::convexPathPerimeterVertices(const SkPath& path, break; } } + + int size = outputVertices.size(); + if (size >= 2 && outputVertices[0].position[0] == outputVertices[size - 1].position[0] && + outputVertices[0].position[1] == outputVertices[size - 1].position[1]) { + outputVertices.pop(); + return true; + } + return false; } void PathRenderer::recursiveCubicBezierVertices( @@ -419,10 +658,7 @@ void PathRenderer::recursiveCubicBezierVertices( if (d * d < THRESHOLD * THRESHOLD * (dx * dx * sqrInvScaleY + dy * dy * sqrInvScaleX)) { // below thresh, draw line by adding endpoint - // TODO: make this not yuck - outputVertices.push(); - Vertex* newVertex = &(outputVertices.editArray()[outputVertices.size() - 1]); - Vertex::set(newVertex, p2x, p2y); + pushToVector(outputVertices, p2x, p2y); } else { float p1c1x = (p1x + c1x) * 0.5f; float p1c1y = (p1y + c1y) * 0.5f; @@ -463,10 +699,7 @@ void PathRenderer::recursiveQuadraticBezierVertices( if (d * d < THRESHOLD * THRESHOLD * (dx * dx * sqrInvScaleY + dy * dy * sqrInvScaleX)) { // below thresh, draw line by adding endpoint - // TODO: make this not yuck - outputVertices.push(); - Vertex* newVertex = &(outputVertices.editArray()[outputVertices.size() - 1]); - Vertex::set(newVertex, bx, by); + pushToVector(outputVertices, bx, by); } else { float acx = (ax + cx) * 0.5f; float bcx = (bx + cx) * 0.5f; diff --git a/libs/hwui/PathRenderer.h b/libs/hwui/PathRenderer.h index 28a5b90..e9f347b 100644 --- a/libs/hwui/PathRenderer.h +++ b/libs/hwui/PathRenderer.h @@ -71,10 +71,8 @@ public: const mat4 *transform, VertexBuffer& vertexBuffer); private: - static void convexPathPerimeterVertices( - const SkPath &path, - float sqrInvScaleX, float sqrInvScaleY, - Vector<Vertex> &outputVertices); + static bool convexPathPerimeterVertices(const SkPath &path, bool forceClose, + float sqrInvScaleX, float sqrInvScaleY, Vector<Vertex> &outputVertices); /* endpoints a & b, diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index f26d322..f77cbfb 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -153,11 +153,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private static final int MSG_SET_A2DP_CONNECTION_STATE = 22; // end of messages handled under wakelock private static final int MSG_SET_RSX_CONNECTION_STATE = 23; // change remote submix connection - private static final int MSG_SET_FORCE_RSX_USE = 24; // force remote submix audio routing - private static final int MSG_CHECK_MUSIC_ACTIVE = 25; - private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 26; - private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 27; - private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 28; + private static final int MSG_CHECK_MUSIC_ACTIVE = 24; + private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 25; + private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 26; + private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED = 27; // flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be // persisted @@ -2221,13 +2220,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished { on ? 1 : 0 /*arg1*/, address /*arg2*/, null/*obj*/, 0/*delay*/); - - // Note that we are currently forcing use of remote submix as soon as corresponding device - // is made available - sendMsg(mAudioHandler, MSG_SET_FORCE_RSX_USE, SENDMSG_REPLACE, - AudioSystem.FOR_MEDIA, - on ? AudioSystem.FORCE_REMOTE_SUBMIX : AudioSystem.FORCE_NONE, - null/*obj*/, 0/*delay*/); } private void onSetRsxConnectionState(int available, int address) { @@ -3320,7 +3312,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished { case MSG_SET_FORCE_USE: case MSG_SET_FORCE_BT_A2DP_USE: - case MSG_SET_FORCE_RSX_USE: setForceUse(msg.arg1, msg.arg2); break; diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 260ddc7..dde2979 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -360,9 +360,8 @@ public class AudioSystem public static final int FORCE_ANALOG_DOCK = 8; public static final int FORCE_DIGITAL_DOCK = 9; public static final int FORCE_NO_BT_A2DP = 10; - public static final int FORCE_REMOTE_SUBMIX = 11; - public static final int FORCE_SYSTEM_ENFORCED = 12; - private static final int NUM_FORCE_CONFIG = 13; + public static final int FORCE_SYSTEM_ENFORCED = 11; + private static final int NUM_FORCE_CONFIG = 12; public static final int FORCE_DEFAULT = FORCE_NONE; // usage for setForceUse, must match AudioSystem::force_use diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notifications.png b/packages/SystemUI/res/drawable-hdpi/ic_notifications.png Binary files differnew file mode 100644 index 0000000..612ab72 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_notifications.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notifications2.png b/packages/SystemUI/res/drawable-hdpi/ic_notifications2.png Binary files differnew file mode 100644 index 0000000..315c488 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_notifications2.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-hdpi/ic_notify_quicksettings_normal.png Binary files differindex 55c46b0..172fd55 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_notify_quicksettings_normal.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_notify_quicksettings_normal.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notify_quicksettings_pressed.png b/packages/SystemUI/res/drawable-hdpi/ic_notify_quicksettings_pressed.png Binary files differindex e30cb8f..5318a6e 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_notify_quicksettings_pressed.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_notify_quicksettings_pressed.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notifications.png b/packages/SystemUI/res/drawable-mdpi/ic_notifications.png Binary files differnew file mode 100644 index 0000000..612ab72 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_notifications.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notifications2.png b/packages/SystemUI/res/drawable-mdpi/ic_notifications2.png Binary files differnew file mode 100644 index 0000000..1d07cbf --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_notifications2.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-mdpi/ic_notify_quicksettings_normal.png Binary files differindex b1910cf..6104424 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_notify_quicksettings_normal.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_notify_quicksettings_normal.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notify_quicksettings_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_notify_quicksettings_pressed.png Binary files differindex 3abafdd..625da59 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_notify_quicksettings_pressed.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_notify_quicksettings_pressed.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notifications.png b/packages/SystemUI/res/drawable-xhdpi/ic_notifications.png Binary files differnew file mode 100644 index 0000000..28a902c --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_notifications.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notifications2.png b/packages/SystemUI/res/drawable-xhdpi/ic_notifications2.png Binary files differnew file mode 100644 index 0000000..b02e7a1 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_notifications2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-xhdpi/ic_notify_quicksettings_normal.png Binary files differindex 5dc93c2..477c067 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_notify_quicksettings_normal.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_notify_quicksettings_normal.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notify_quicksettings_pressed.png b/packages/SystemUI/res/drawable-xhdpi/ic_notify_quicksettings_pressed.png Binary files differindex a97de79..6e5c4af 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_notify_quicksettings_pressed.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_notify_quicksettings_pressed.png diff --git a/packages/SystemUI/res/drawable/ic_notifications.xml b/packages/SystemUI/res/drawable/ic_notifications.xml new file mode 100644 index 0000000..2c8012e --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_notifications.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2012 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@drawable/ic_notifications" /> + <item + android:drawable="@drawable/ic_notifications" /> +</selector> + diff --git a/packages/SystemUI/res/drawable/ic_notify_button_bg.xml b/packages/SystemUI/res/drawable/ic_notify_button_bg.xml new file mode 100644 index 0000000..85f1ea2 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_notify_button_bg.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2012 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" android:drawable="@*android:drawable/list_selector_pressed_holo_dark" /> + <item android:drawable="@*android:drawable/list_selector_disabled_holo_dark" /> +</selector> diff --git a/packages/SystemUI/res/drawable/ic_notify_clear.xml b/packages/SystemUI/res/drawable/ic_notify_clear.xml index 9c432b2..2163198 100644 --- a/packages/SystemUI/res/drawable/ic_notify_clear.xml +++ b/packages/SystemUI/res/drawable/ic_notify_clear.xml @@ -16,6 +16,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" - android:drawable="@drawable/ic_notify_clear_pressed" /> + android:drawable="@drawable/ic_notify_clear_normal" /> <item android:drawable="@drawable/ic_notify_clear_normal" /> </selector> diff --git a/packages/SystemUI/res/drawable/ic_notify_settings.xml b/packages/SystemUI/res/drawable/ic_notify_settings.xml index 6579d8e..9303ca4 100644 --- a/packages/SystemUI/res/drawable/ic_notify_settings.xml +++ b/packages/SystemUI/res/drawable/ic_notify_settings.xml @@ -16,7 +16,7 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" - android:drawable="@drawable/ic_notify_settings_pressed" /> + android:drawable="@drawable/ic_notify_settings_normal" /> <item android:drawable="@drawable/ic_notify_settings_normal" /> </selector> diff --git a/packages/SystemUI/res/layout/flip_settings.xml b/packages/SystemUI/res/layout/flip_settings.xml new file mode 100644 index 0000000..1b8898c5 --- /dev/null +++ b/packages/SystemUI/res/layout/flip_settings.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2012 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<com.android.systemui.statusbar.phone.QuickSettingsScrollView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/close_handle_underlap" + android:overScrollMode="ifContentScrolls" + > + <com.android.systemui.statusbar.phone.QuickSettingsContainerView + android:id="@+id/quick_settings_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:animateLayoutChanges="true" + android:columnCount="@integer/quick_settings_num_columns" + /> +</com.android.systemui.statusbar.phone.QuickSettingsScrollView>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index cb4c227..5408f76 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -50,7 +50,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="@dimen/close_handle_underlap" android:orientation="vertical" - android:animateLayoutChanges="true" + android:animateLayoutChanges="false" > <include layout="@layout/status_bar_expanded_header" @@ -68,19 +68,30 @@ android:visibility="gone" /> - <ScrollView - android:id="@+id/scroll" + <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:fadingEdge="none" - android:overScrollMode="ifContentScrolls" > - <com.android.systemui.statusbar.policy.NotificationRowLayout - android:id="@+id/latestItems" + <ViewStub android:id="@+id/flip_settings_stub" + android:layout="@layout/flip_settings" android:layout_width="match_parent" android:layout_height="wrap_content" - systemui:rowHeight="@dimen/notification_row_min_height" /> - </ScrollView> + + <ScrollView + android:id="@+id/scroll" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:fadingEdge="none" + android:overScrollMode="ifContentScrolls" + > + <com.android.systemui.statusbar.policy.NotificationRowLayout + android:id="@+id/latestItems" + android:layout_width="match_parent" + android:layout_height="wrap_content" + systemui:rowHeight="@dimen/notification_row_min_height" + /> + </ScrollView> + </FrameLayout> </LinearLayout> </com.android.systemui.statusbar.phone.NotificationPanelView><!-- end of sliding panel --> diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml index c921837..c13405a 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml @@ -70,21 +70,37 @@ android:textColor="#00A040" android:padding="2dp" /> - - <ImageView android:id="@+id/settings_button" - android:layout_width="50dp" - android:layout_height="50dp" - android:scaleType="center" - android:src="@drawable/ic_notify_settings" - android:contentDescription="@string/accessibility_settings_button" - /> <ImageView android:id="@+id/clear_all_button" android:layout_width="50dp" android:layout_height="50dp" - android:layout_marginLeft="12dp" + android:layout_marginRight="12dp" android:scaleType="center" android:src="@drawable/ic_notify_clear" + android:background="@drawable/ic_notify_button_bg" android:contentDescription="@string/accessibility_clear_all" /> + + <FrameLayout + android:layout_width="50dp" + android:layout_height="50dp" + > + <ImageView android:id="@+id/settings_button" + android:layout_width="50dp" + android:layout_height="50dp" + android:scaleType="center" + android:src="@drawable/ic_notify_settings" + android:background="@drawable/ic_notify_button_bg" + android:contentDescription="@string/accessibility_settings_button" + /> + <ImageView android:id="@+id/notification_button" + android:layout_width="50dp" + android:layout_height="50dp" + android:scaleType="center" + android:src="@drawable/ic_notifications" + android:background="@drawable/ic_notify_button_bg" + android:visibility="gone" + android:contentDescription="@string/accessibility_notifications_button" + /> + </FrameLayout> </LinearLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index d536793..69355d5 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Kennisgewing is toegemaak."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Kennisgewingskerm."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Vinnige instellings."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Onlangse programme."</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Gebruiker <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobiele <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index a588b42..735da78 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"ማሳወቂያ ተወግዷል።"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"የማሳወቂያ ጥላ።"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ፈጣን ቅንብሮች።"</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"የቅርብ ጊዜ መተግበሪያዎች።"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ተጠቃሚ <xliff:g id="USER">%s</xliff:g>።"</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>። <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ተንቀሳቃሽ ስልክ <xliff:g id="SIGNAL">%1$s</xliff:g>። <xliff:g id="TYPE">%2$s</xliff:g>። <xliff:g id="NETWORK">%3$s</xliff:g>።"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 13fb675..bf10ce2 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -149,8 +149,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificació omesa."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Capa de notificació."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuració ràpida."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Aplicacions recents."</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuari <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mòbil <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index a04673b..671f292 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Underretningen er annulleret."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Underretningspanel."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hurtige indstillinger."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Seneste apps"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Bruger <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobil <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index a73c113..0665020 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -149,8 +149,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Η ειδοποίηση έχει απορριφθεί."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Πλαίσιο σκίασης ειδοποιήσεων."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Γρήγορες ρυθμίσεις."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Πρόσφατες εφαρμογές"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Χρήστης <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Κινητό <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 1ad2c06..906b5c6 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Recent apps"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobile <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 9f0fbda..90f93b2 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificación ignorada"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Pantalla de notificaciones"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ajustes rápidos"</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Aplicaciones recientes"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Móvil <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 7b4c31a..d77b26a 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Märguandest on loobutud."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Märguande vari."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Kiirseaded."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Hiljutised rakendused"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kasutaja <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobiili <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 8ce9f64..b5be2ac 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -149,8 +149,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notifica eliminata."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Area notifiche."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Impostazioni rapide."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Applicazioni recenti."</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utente <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Cellulare: <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index c6ed8d2..76de197 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Pranešimo atsisakyta."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Pranešimų gaubtas."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Spartieji nustatymai."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Naujausios programos."</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Naudotojas <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobilusis ryšys <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 6d1b313..21299b2 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Paziņojums netiek rādīts."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Paziņojumu panelis"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ātrie iestatījumi"</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Pēdējās izmantotās lietotnes"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Lietotājs: <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobilo sakaru tīkls. <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 88096b3..ccba8e5 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Varselet ble skjult."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Varselskygge."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hurtiginnstillinger."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Nylige apper."</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Bruker: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobil – <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 24b6ff7..9978b76 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Melding verwijderd."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Meldingenpaneel."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Snelle instellingen."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Recente apps."</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Gebruiker: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Mobiel <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index c2ecb5a..639201c 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -147,8 +147,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificação ignorada."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Painel de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Definições rápidas."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Aplicações recentes"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilizador <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Dispositivo Móvel <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 905e1dd..3b29b39 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -145,8 +145,7 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Arifa imetupwa."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Kivuli cha arifa."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Mipangilio ya haraka."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Programu za hivi karibuni."</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Mtumiaji <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Simu <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml index 50575d0..48a02ab 100644 --- a/packages/SystemUI/res/values-sw600dp/config.xml +++ b/packages/SystemUI/res/values-sw600dp/config.xml @@ -31,4 +31,7 @@ <!-- Whether rotation lock shows up in quick settings or not --> <bool name="quick_settings_show_rotation_lock">true</bool> + + <!-- Enable the "flip settings" panel --> + <bool name="config_hasFlipSettingsPanel">false</bool> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 8cc8738..8ad1881 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -105,7 +105,7 @@ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Ibha elilodwa le-WiFi."</string> <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Amabha amabili we-WiFi."</string> <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Amabha amathathu we-WiFi."</string> - <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Isignali ye-WiFi igcwele."</string> + <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Isiginali ye-WiFi igcwele."</string> <string name="accessibility_no_wimax" msgid="4329180129727630368">"Ayikho i-WiMAX."</string> <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"Ibha eyodwa ye-WiMAX."</string> <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Amabha amabili we-WiMAX."</string> @@ -117,7 +117,7 @@ <string name="accessibility_one_bar" msgid="1685730113192081895">"Ibha elilodwa."</string> <string name="accessibility_two_bars" msgid="6437363648385206679">"Amabha amabili."</string> <string name="accessibility_three_bars" msgid="2648241415119396648">"Amabha amathathu."</string> - <string name="accessibility_signal_full" msgid="9122922886519676839">"Isignali egcwele."</string> + <string name="accessibility_signal_full" msgid="9122922886519676839">"Isiginali egcwele."</string> <string name="accessibility_desc_on" msgid="2385254693624345265">"Vula."</string> <string name="accessibility_desc_off" msgid="6475508157786853157">"Vala."</string> <string name="accessibility_desc_connected" msgid="8366256693719499665">"Ixhunyiwe."</string> @@ -147,13 +147,12 @@ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Isaziso sichithiwe."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Umthunzi wesaziso."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Izilingiselelo ezisheshayo."</string> - <!-- no translation found for accessibility_desc_recent_apps (9014032916410590027) --> - <skip /> + <string name="accessibility_desc_recent_apps" msgid="9014032916410590027">"Izinhlelo zokusebenza zakamuva"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Umsebenzisi <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="6099781031669728709">"<xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="NETWORK">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Iselula <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Ibhethri <xliff:g id="STATE">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"I-Airplane Mode <xliff:g id="STATE">%s</xliff:g>."</string> + <string name="accessibility_quick_settings_airplane" msgid="4196876722090224753">"Imodi yendiza <xliff:g id="STATE">%s</xliff:g>."</string> <string name="accessibility_quick_settings_bluetooth" msgid="5749054971341882340">"I-Bluetooth <xliff:g id="STATE">%s</xliff:g>."</string> <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"I-alamu isethiwe ngo-<xliff:g id="TIME">%s</xliff:g>."</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"idatha ye-2G-3G ivimbelwe"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index aec9555..a27630d 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -97,7 +97,10 @@ <integer name="blinds_pop_duration_ms">10</integer> - <!-- Disable quick settings by default --> - <bool name="config_hasSettingsPanel">false</bool> + <!-- Disable the separate quick settings panel --> + <bool name="config_hasSettingsPanel">true</bool> + + <!-- Enable the "flip settings" panel --> + <bool name="config_hasFlipSettingsPanel">true</bool> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 356689f..6877cba 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -665,6 +665,7 @@ public class ImageWallpaper extends WallpaperService { EGL_ALPHA_SIZE, 0, EGL_DEPTH_SIZE, 0, EGL_STENCIL_SIZE, 0, + EGL_CONFIG_CAVEAT, EGL_NONE, EGL_NONE }; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 75a2598..64bce22 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -20,6 +20,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.animation.TimeInterpolator; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.Notification; @@ -61,6 +62,7 @@ import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; +import android.view.ViewPropertyAnimator; import android.view.ViewStub; import android.view.WindowManager; import android.view.animation.AccelerateInterpolator; @@ -188,13 +190,16 @@ public class PhoneStatusBar extends BaseStatusBar { TextView mNotificationPanelDebugText; // settings - boolean mHasSettingsPanel; + QuickSettings mQS; + boolean mHasSettingsPanel, mHasFlipSettings; SettingsPanelView mSettingsPanel; + View mFlipSettingsView; + QuickSettingsContainerView mSettingsContainer; int mSettingsPanelGravity; // top bar View mClearButton; - ImageView mSettingsButton; + ImageView mSettingsButton, mNotificationButton; // carrier/wifi label private TextView mCarrierLabel; @@ -290,8 +295,12 @@ public class PhoneStatusBar extends BaseStatusBar { if (MULTIUSER_DEBUG) Slog.d(TAG, String.format("User setup changed: " + "selfChange=%s userSetup=%s mUserSetup=%s", selfChange, userSetup, mUserSetup)); - if (mSettingsPanel != null) + if (mSettingsButton != null) { + mSettingsButton.setVisibility(userSetup ? View.VISIBLE : View.INVISIBLE); + } + if (mSettingsPanel != null) { mSettingsPanel.setEnabled(userSetup); + } if (userSetup != mUserSetup) { mUserSetup = userSetup; if (!mUserSetup && mStatusBarView != null) @@ -355,10 +364,6 @@ public class PhoneStatusBar extends BaseStatusBar { mNotificationPanel = (PanelView) mStatusBarWindow.findViewById(R.id.notification_panel); mNotificationPanelIsFullScreenWidth = (mNotificationPanel.getLayoutParams().width == ViewGroup.LayoutParams.MATCH_PARENT); - mNotificationPanel.setSystemUiVisibility( - View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER | - View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS | - View.STATUS_BAR_DISABLE_CLOCK); // make the header non-responsive to clicks mNotificationPanel.findViewById(R.id.header).setOnTouchListener( @@ -423,6 +428,7 @@ public class PhoneStatusBar extends BaseStatusBar { mDateView = (DateView)mStatusBarWindow.findViewById(R.id.date); mHasSettingsPanel = res.getBoolean(R.bool.config_hasSettingsPanel); + mHasFlipSettings = res.getBoolean(R.bool.config_hasFlipSettingsPanel); mSettingsButton = (ImageView) mStatusBarWindow.findViewById(R.id.settings_button); if (mSettingsButton != null) { @@ -442,9 +448,19 @@ public class PhoneStatusBar extends BaseStatusBar { mSettingsButton.setImageResource(R.drawable.ic_notify_settings); } } - + if (mHasFlipSettings) { + mNotificationButton = (ImageView) mStatusBarWindow.findViewById(R.id.notification_button); + if (mNotificationButton != null) { + mNotificationButton.setOnClickListener(mNotificationButtonListener); + } + } + mScrollView = (ScrollView)mStatusBarWindow.findViewById(R.id.scroll); mScrollView.setVerticalScrollBarEnabled(false); // less drawing during pulldowns + mScrollView.setSystemUiVisibility( + View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER | + View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS | + View.STATUS_BAR_DISABLE_CLOCK); mTicker = new MyTicker(context, mStatusBarView); @@ -505,28 +521,52 @@ public class PhoneStatusBar extends BaseStatusBar { // Quick Settings (where available, some restrictions apply) if (mHasSettingsPanel) { - final View settings_stub - = mStatusBarWindow.findViewById(R.id.quick_settings_stub); - - if (settings_stub != null) { - mSettingsPanel = (SettingsPanelView) ((ViewStub)settings_stub).inflate(); + // first, figure out where quick settings should be inflated + final View settings_stub; + if (mHasFlipSettings) { + // a version of quick settings that flips around behind the notifications + settings_stub = mStatusBarWindow.findViewById(R.id.flip_settings_stub); + if (settings_stub != null) { + mFlipSettingsView = ((ViewStub)settings_stub).inflate(); + mFlipSettingsView.setVisibility(View.GONE); + mFlipSettingsView.setVerticalScrollBarEnabled(false); + } } else { - mSettingsPanel = (SettingsPanelView) mStatusBarWindow.findViewById(R.id.settings_panel); + // full quick settings panel + settings_stub = mStatusBarWindow.findViewById(R.id.quick_settings_stub); + if (settings_stub != null) { + mSettingsPanel = (SettingsPanelView) ((ViewStub)settings_stub).inflate(); + } else { + mSettingsPanel = (SettingsPanelView) mStatusBarWindow.findViewById(R.id.settings_panel); + } + + if (mSettingsPanel != null) { + mSettingsPanel.setBar(mStatusBarView); + + if (!ActivityManager.isHighEndGfx()) { + mSettingsPanel.setBackground(new FastColorDrawable(context.getResources().getColor( + R.color.notification_panel_solid_background))); + } + } } - if (mSettingsPanel != null) { - mSettingsPanel.setBar(mStatusBarView); - mSettingsPanel.setService(this); - mSettingsPanel.setup(mNetworkController, mBluetoothController, mBatteryController, - mLocationController); - mSettingsPanel.setSystemUiVisibility( - View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER + // wherever you find it, Quick Settings needs a container to survive + mSettingsContainer = (QuickSettingsContainerView) + mStatusBarWindow.findViewById(R.id.quick_settings_container); + if (mSettingsContainer != null) { + mQS = new QuickSettings(mContext, mSettingsContainer); + mSettingsContainer.setSystemUiVisibility( + View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER | View.STATUS_BAR_DISABLE_SYSTEM_INFO); - - if (!ActivityManager.isHighEndGfx()) { - mSettingsPanel.setBackground(new FastColorDrawable(context.getResources().getColor( - R.color.notification_panel_solid_background))); + + if (mSettingsPanel != null) { + mSettingsPanel.setQuickSettings(mQS); } + mQS.setService(this); + mQS.setup(mNetworkController, mBluetoothController, mBatteryController, + mLocationController); + } else { + mQS = null; // fly away, be free } } @@ -984,7 +1024,8 @@ public class PhoneStatusBar extends BaseStatusBar { final boolean emergencyCallsShownElsewhere = mEmergencyCallLabel != null; final boolean makeVisible = !(emergencyCallsShownElsewhere && mNetworkController.isEmergencyOnly()) - && mPile.getHeight() < (mNotificationPanel.getHeight() - mCarrierLabelHeight - mNotificationHeaderHeight); + && mPile.getHeight() < (mNotificationPanel.getHeight() - mCarrierLabelHeight - mNotificationHeaderHeight) + && mScrollView.getVisibility() == View.VISIBLE; if (force || mCarrierLabelVisible != makeVisible) { mCarrierLabelVisible = makeVisible; @@ -1239,6 +1280,17 @@ public class PhoneStatusBar extends BaseStatusBar { return; } + if (mHasFlipSettings && !mExpandedVisible) { + // reset things to their proper state + mScrollView.setScaleX(1f); + mScrollView.setVisibility(View.VISIBLE); + mSettingsButton.setAlpha(1f); + mSettingsButton.setVisibility(View.VISIBLE); + mNotificationPanel.setVisibility(View.GONE); + mFlipSettingsView.setVisibility(View.GONE); + mNotificationButton.setVisibility(View.GONE); + } + mExpandedVisible = true; mPile.setLayoutTransitionsEnabled(true); if (mNavigationBarView != null) @@ -1293,6 +1345,53 @@ public class PhoneStatusBar extends BaseStatusBar { mStatusBarView.collapseAllPanels(true); } + public ViewPropertyAnimator setVisibilityWhenDone( + final ViewPropertyAnimator a, final View v, final int vis) { + a.setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + v.setVisibility(vis); + a.setListener(null); // oneshot + } + }); + return a; + } + + public Animator setVisibilityWhenDone( + final Animator a, final View v, final int vis) { + a.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + v.setVisibility(vis); + } + }); + return a; + } + + public Animator interpolator(TimeInterpolator ti, Animator a) { + a.setInterpolator(ti); + return a; + } + + public Animator startDelay(int d, Animator a) { + a.setStartDelay(d); + return a; + } + + public Animator start(Animator a) { + a.start(); + return a; + } + + final TimeInterpolator mAccelerateInterpolator = new AccelerateInterpolator(); + final TimeInterpolator mDecelerateInterpolator = new DecelerateInterpolator(); + final int FLIP_DURATION_OUT = 125; + final int FLIP_DURATION_IN = 225; + final int FLIP_DURATION = (FLIP_DURATION_IN + FLIP_DURATION_OUT); + + Animator mScrollViewAnim, mFlipSettingsViewAnim, mNotificationButtonAnim, + mSettingsButtonAnim, mClearButtonAnim; + @Override public void animateExpandNotificationsPanel() { if (SPEW) Slog.d(TAG, "animateExpand: mExpandedVisible=" + mExpandedVisible); @@ -1301,6 +1400,47 @@ public class PhoneStatusBar extends BaseStatusBar { } mNotificationPanel.expand(); + if (mHasFlipSettings) { + if (mScrollView.getVisibility() != View.VISIBLE) { + if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel(); + if (mScrollViewAnim != null) mScrollViewAnim.cancel(); + if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel(); + if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel(); + if (mClearButtonAnim != null) mClearButtonAnim.cancel(); + + mScrollView.setVisibility(View.VISIBLE); + mScrollViewAnim = start( + startDelay(FLIP_DURATION_OUT, + interpolator(mDecelerateInterpolator, + ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 0f, 1f) + .setDuration(FLIP_DURATION_IN) + ))); + mFlipSettingsViewAnim = start( + setVisibilityWhenDone( + interpolator(mAccelerateInterpolator, + ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 1f, 0f) + ) + .setDuration(FLIP_DURATION_OUT), + mFlipSettingsView, View.INVISIBLE)); + mNotificationButtonAnim = start( + setVisibilityWhenDone( + ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 0f) + .setDuration(FLIP_DURATION), + mNotificationButton, View.INVISIBLE)); + mSettingsButton.setVisibility(View.VISIBLE); + mSettingsButtonAnim = start( + ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f) + .setDuration(FLIP_DURATION)); + mClearButton.setVisibility(View.VISIBLE); + mClearButton.setAlpha(0f); + setAreThereNotifications(); // this will show/hide the button as necessary + mNotificationPanel.postDelayed(new Runnable() { + public void run() { + updateCarrierLabelVisibility(false); + } + }, FLIP_DURATION - 150); + } + } if (false) postStartTracing(); } @@ -1312,7 +1452,53 @@ public class PhoneStatusBar extends BaseStatusBar { return; } - if (mSettingsPanel != null) mSettingsPanel.expand(); + if (mHasFlipSettings) { + mNotificationPanel.expand(); + if (mFlipSettingsView.getVisibility() != View.VISIBLE) { + if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel(); + if (mScrollViewAnim != null) mScrollViewAnim.cancel(); + if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel(); + if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel(); + if (mClearButtonAnim != null) mClearButtonAnim.cancel(); + + mFlipSettingsView.setVisibility(View.VISIBLE); + mFlipSettingsView.setScaleX(0f); + mFlipSettingsViewAnim = start( + startDelay(FLIP_DURATION_OUT, + interpolator(mDecelerateInterpolator, + ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 0f, 1f) + .setDuration(FLIP_DURATION_IN) + ))); + mScrollViewAnim = start( + setVisibilityWhenDone( + interpolator(mAccelerateInterpolator, + ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 1f, 0f) + ) + .setDuration(FLIP_DURATION_OUT), + mScrollView, View.INVISIBLE)); + mSettingsButtonAnim = start( + setVisibilityWhenDone( + ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 0f) + .setDuration(FLIP_DURATION), + mScrollView, View.INVISIBLE)); + mNotificationButton.setVisibility(View.VISIBLE); + mNotificationButtonAnim = start( + ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f) + .setDuration(FLIP_DURATION)); + mClearButtonAnim = start( + setVisibilityWhenDone( + ObjectAnimator.ofFloat(mClearButton, View.ALPHA, 0f) + .setDuration(FLIP_DURATION), + mClearButton, View.INVISIBLE)); + mNotificationPanel.postDelayed(new Runnable() { + public void run() { + updateCarrierLabelVisibility(false); + } + }, FLIP_DURATION - 150); + } + } else if (mSettingsPanel != null) { + mSettingsPanel.expand(); + } if (false) postStartTracing(); } @@ -1622,7 +1808,7 @@ public class PhoneStatusBar extends BaseStatusBar { mCommandQueue.setNavigationIconHints( altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT) : (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT)); - if (mSettingsPanel != null) mSettingsPanel.setImeWindowStatus(vis > 0); + if (mQS != null) mQS.setImeWindowStatus(vis > 0); } @Override @@ -1960,6 +2146,12 @@ public class PhoneStatusBar extends BaseStatusBar { } }; + private View.OnClickListener mNotificationButtonListener = new View.OnClickListener() { + public void onClick(View v) { + animateExpandNotificationsPanel(); + } + }; + private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { Slog.v(TAG, "onReceive: " + intent); @@ -2050,7 +2242,7 @@ public class PhoneStatusBar extends BaseStatusBar { } // Update the QuickSettings container - if (mSettingsPanel != null) mSettingsPanel.updateResources(); + if (mQS != null) mQS.updateResources(); loadDimens(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java index faf20e2..5b550c2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java @@ -88,7 +88,7 @@ class QuickSettings { private Context mContext; private PanelBar mBar; private QuickSettingsModel mModel; - private QuickSettingsContainerView mContainerView; + private ViewGroup mContainerView; private DisplayManager mDisplayManager; private WifiDisplayStatus mWifiDisplayStatus; @@ -717,6 +717,7 @@ class QuickSettings { for (QuickSettingsTileView v : mDynamicSpannedTiles) { v.setColumnSpan(span); } + ((QuickSettingsContainerView)mContainerView).updateResources(); mContainerView.requestLayout(); // Reset the dialog diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java index 4e10fa3..a58eb22 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java @@ -53,7 +53,6 @@ public class SettingsPanelView extends PanelView { super.onFinishInflate(); mQSContainer = (QuickSettingsContainerView) findViewById(R.id.quick_settings_container); - mQS = new QuickSettings(getContext(), mQSContainer); Resources resources = getContext().getResources(); mHandleBar = resources.getDrawable(R.drawable.status_bar_close); @@ -62,6 +61,10 @@ public class SettingsPanelView extends PanelView { setContentDescription(resources.getString(R.string.accessibility_desc_quick_settings)); } + + public void setQuickSettings(QuickSettings qs) { + mQS = qs; + } @Override public void setBar(PanelBar panelBar) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 0176f42..89c70e8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -42,6 +42,7 @@ public class StatusBarWindowView extends FrameLayout private ExpandHelper mExpandHelper; private NotificationRowLayout latestItems; private NotificationPanelView mNotificationPanel; + private ScrollView mScrollView; PhoneStatusBar mService; @@ -55,13 +56,13 @@ public class StatusBarWindowView extends FrameLayout protected void onAttachedToWindow () { super.onAttachedToWindow(); latestItems = (NotificationRowLayout) findViewById(R.id.latestItems); - ScrollView scroller = (ScrollView) findViewById(R.id.scroll); + mScrollView = (ScrollView) findViewById(R.id.scroll); mNotificationPanel = (NotificationPanelView) findViewById(R.id.notification_panel); int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height); int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height); mExpandHelper = new ExpandHelper(mContext, latestItems, minHeight, maxHeight); mExpandHelper.setEventSource(this); - mExpandHelper.setScrollView(scroller); + mExpandHelper.setScrollView(mScrollView); } @Override @@ -80,7 +81,7 @@ public class StatusBarWindowView extends FrameLayout @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean intercept = false; - if (mNotificationPanel.isFullyExpanded()) { + if (mNotificationPanel.isFullyExpanded() && mScrollView.getVisibility() == View.VISIBLE) { intercept = mExpandHelper.onInterceptTouchEvent(ev); } if (!intercept) { diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index e8af0a5..91d5eaa 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1473,16 +1473,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { return getNonDecorDisplayHeight(fullWidth, fullHeight, rotation); } + @Override public boolean doesForceHide(WindowState win, WindowManager.LayoutParams attrs) { return attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD; } + @Override public boolean canBeForceHidden(WindowState win, WindowManager.LayoutParams attrs) { - return attrs.type != WindowManager.LayoutParams.TYPE_STATUS_BAR - && attrs.type != WindowManager.LayoutParams.TYPE_NAVIGATION_BAR - && attrs.type != WindowManager.LayoutParams.TYPE_WALLPAPER - && attrs.type != WindowManager.LayoutParams.TYPE_DREAM - && attrs.type != WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND; + switch (attrs.type) { + case TYPE_STATUS_BAR: + case TYPE_NAVIGATION_BAR: + case TYPE_WALLPAPER: + case TYPE_DREAM: + case TYPE_UNIVERSE_BACKGROUND: + case TYPE_KEYGUARD: + return false; + default: + return true; + } } /** {@inheritDoc} */ diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java index eca8618..ebc54b3 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -79,7 +79,7 @@ public class KeyguardHostView extends KeyguardViewBase { private boolean mEnableMenuKey; private boolean mIsVerifyUnlockOnly; private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView - private SecurityMode mCurrentSecuritySelection = SecurityMode.None; + private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid; protected Runnable mLaunchRunnable; @@ -433,7 +433,8 @@ public class KeyguardHostView extends KeyguardViewBase { */ private void showBackupSecurityScreen() { if (DEBUG) Log.d(TAG, "showBackupSecurity()"); - showSecurityScreen(mSecurityModel.getBackupSecurityMode()); + SecurityMode backup = mSecurityModel.getBackupSecurityMode(mCurrentSecuritySelection); + showSecurityScreen(backup); } public boolean showNextSecurityScreenIfPresent() { @@ -543,6 +544,45 @@ public class KeyguardHostView extends KeyguardViewBase { private KeyguardStatusViewManager mKeyguardStatusViewManager; + // Used to ignore callbacks from methods that are no longer current (e.g. face unlock). + // This avoids unwanted asynchronous events from messing with the state. + private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { + + @Override + public void userActivity(long timeout) { + } + + @Override + public void showBackupSecurity() { + } + + @Override + public void setOnDismissRunnable(Runnable runnable) { + } + + @Override + public void reportSuccessfulUnlockAttempt() { + } + + @Override + public void reportFailedUnlockAttempt() { + } + + @Override + public boolean isVerifyUnlockOnly() { + return false; + } + + @Override + public int getFailedAttempts() { + return 0; + } + + @Override + public void dismiss(boolean securityVerified) { + } + }; + @Override public void reset() { mIsVerifyUnlockOnly = false; @@ -568,9 +608,10 @@ public class KeyguardHostView extends KeyguardViewBase { } } boolean simPukFullScreen = getResources().getBoolean(R.bool.kg_sim_puk_account_full_screen); - if (view == null) { + int layoutId = getLayoutIdFor(securityMode); + if (view == null && layoutId != 0) { final LayoutInflater inflater = LayoutInflater.from(mContext); - View v = inflater.inflate(getLayoutIdFor(securityMode), this, false); + View v = inflater.inflate(layoutId, this, false); mSecurityViewContainer.addView(v); updateSecurityView(v); @@ -617,8 +658,12 @@ public class KeyguardHostView extends KeyguardViewBase { KeyguardSecurityView newView = getSecurityView(securityMode); // Emulate Activity life cycle - oldView.onPause(); + if (oldView != null) { + oldView.onPause(); + oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view + } newView.onResume(); + newView.setKeyguardCallback(mCallback); final boolean needsInput = newView.needsInput(); if (mViewMediatorCallback != null) { @@ -749,7 +794,7 @@ public class KeyguardHostView extends KeyguardViewBase { case SimPin: return R.layout.keyguard_sim_pin_view; case SimPuk: return R.layout.keyguard_sim_puk_view; default: - throw new RuntimeException("No layout for securityMode " + securityMode); + return 0; } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java index 80282c1..59e2ca9 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java @@ -28,6 +28,7 @@ public class KeyguardSecurityModel { * @see com.android.internal.policy.impl.LockPatternKeyguardView#getUnlockMode() */ enum SecurityMode { + Invalid, // NULL state None, // No security enabled Pattern, // Unlock by drawing a pattern. Password, // Unlock by entering a password or PIN @@ -53,7 +54,7 @@ public class KeyguardSecurityModel { * Returns true if biometric unlock is installed and selected. If this returns false there is * no need to even construct the biometric unlock. */ - private boolean isBiometricUnlockEnabled() { + boolean isBiometricUnlockEnabled() { return mLockPatternUtils.usingBiometricWeak() && mLockPatternUtils.isBiometricWeakInstalled(); } @@ -128,15 +129,7 @@ public class KeyguardSecurityModel { * * @return backup method or current security mode */ - SecurityMode getBackupSecurityMode() { - SecurityMode mode = getSecurityMode(); - - // Note that getAlternateFor() cannot be called here because we want to get the backup for - // biometric unlock even if it's suppressed; it just has to be enabled. - if (isBiometricUnlockEnabled() - && (mode == SecurityMode.Password || mode == SecurityMode.Pattern)) { - mode = SecurityMode.Biometric; - } + SecurityMode getBackupSecurityMode(SecurityMode mode) { switch(mode) { case Biometric: return getSecurityMode(); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java index 9615e71..5b85064 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java @@ -221,6 +221,7 @@ class KeyguardStatusViewManager implements SecurityMessageDisplay { mHandler.removeCallbacks(mClearSecurityMessageRunnable); mHandler.postDelayed(mClearSecurityMessageRunnable, SECURITY_MESSAGE_DURATION); } + mSecurityMessage.announceForAccessibility(mSecurityMessage.getText()); } /** diff --git a/services/java/com/android/server/EventLogTags.logtags b/services/java/com/android/server/EventLogTags.logtags index 840e006..0fe66fc 100644 --- a/services/java/com/android/server/EventLogTags.logtags +++ b/services/java/com/android/server/EventLogTags.logtags @@ -52,12 +52,12 @@ option java_package com.android.server # NotificationManagerService.java # --------------------------- # when a NotificationManager.notify is called -2750 notification_enqueue (pkg|3),(id|1|5),(tag|3),(notification|3) +2750 notification_enqueue (pkg|3),(id|1|5),(tag|3),(userid|1|5),(notification|3) # when someone tries to cancel a notification, the notification manager sometimes # calls this with flags too -2751 notification_cancel (pkg|3),(id|1|5),(tag|3),(required_flags|1),(forbidden_flags|1) +2751 notification_cancel (pkg|3),(id|1|5),(tag|3),(userid|1|5),(required_flags|1),(forbidden_flags|1) # when someone tries to cancel all of the notifications for a particular package -2752 notification_cancel_all (pkg|3),(required_flags|1),(forbidden_flags|1) +2752 notification_cancel_all (pkg|3),(userid|1|5),(required_flags|1),(forbidden_flags|1) # --------------------------- diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index c5016e6..6948927 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -609,10 +609,9 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } /** - * Throw SecurityException if caller has neither COARSE or FINE. - * Otherwise, return the best permission. + * Returns the best permission available to the caller. */ - private String checkPermission() { + private String getBestCallingPermission() { if (mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { return ACCESS_FINE_LOCATION; @@ -620,9 +619,20 @@ public class LocationManagerService extends ILocationManager.Stub implements Run PackageManager.PERMISSION_GRANTED) { return ACCESS_COARSE_LOCATION; } + return null; + } - throw new SecurityException("Location requires either ACCESS_COARSE_LOCATION or" + - " ACCESS_FINE_LOCATION permission"); + /** + * Throw SecurityException if caller has neither COARSE or FINE. + * Otherwise, return the best permission. + */ + private String checkPermission() { + String perm = getBestCallingPermission(); + if (perm == null) { + throw new SecurityException("Location requires either ACCESS_COARSE_LOCATION or" + + " ACCESS_FINE_LOCATION permission"); + } + return perm; } /** @@ -635,19 +645,15 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } } - private boolean isAllowedProviderSafe(String provider) { + private String getMinimumPermissionForProvider(String provider) { if (LocationManager.GPS_PROVIDER.equals(provider) || LocationManager.PASSIVE_PROVIDER.equals(provider)) { // gps and passive providers require FINE permission - return mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) - == PackageManager.PERMISSION_GRANTED; + return ACCESS_FINE_LOCATION; } else if (LocationManager.NETWORK_PROVIDER.equals(provider) || LocationManager.FUSED_PROVIDER.equals(provider)) { // network and fused providers are ok with COARSE or FINE - return (mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) - == PackageManager.PERMISSION_GRANTED) || - (mContext.checkCallingOrSelfPermission(ACCESS_COARSE_LOCATION) - == PackageManager.PERMISSION_GRANTED); + return ACCESS_COARSE_LOCATION; } else { // mock providers LocationProviderInterface lp = mMockProviders.get(provider); @@ -656,20 +662,43 @@ public class LocationManagerService extends ILocationManager.Stub implements Run if (properties != null) { if (properties.mRequiresSatellite) { // provider requiring satellites require FINE permission - return mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) - == PackageManager.PERMISSION_GRANTED; + return ACCESS_FINE_LOCATION; } else if (properties.mRequiresNetwork || properties.mRequiresCell) { // provider requiring network and or cell require COARSE or FINE - return (mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) - == PackageManager.PERMISSION_GRANTED) || - (mContext.checkCallingOrSelfPermission(ACCESS_COARSE_LOCATION) - == PackageManager.PERMISSION_GRANTED); + return ACCESS_COARSE_LOCATION; } } } } - return false; + return null; + } + + private boolean isPermissionSufficient(String perm, String minPerm) { + if (ACCESS_FINE_LOCATION.equals(minPerm)) { + return ACCESS_FINE_LOCATION.equals(perm); + } else if (ACCESS_COARSE_LOCATION.equals(minPerm)) { + return ACCESS_FINE_LOCATION.equals(perm) || + ACCESS_COARSE_LOCATION.equals(perm); + } else { + return false; + } + } + + private void checkPermissionForProvider(String perm, String provider) { + String minPerm = getMinimumPermissionForProvider(provider); + if (!isPermissionSufficient(perm, minPerm)) { + if (ACCESS_FINE_LOCATION.equals(minPerm)) { + throw new SecurityException("Location provider \"" + provider + + "\" requires ACCESS_FINE_LOCATION permission."); + } else if (ACCESS_COARSE_LOCATION.equals(minPerm)) { + throw new SecurityException("Location provider \"" + provider + + "\" requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission."); + } else { + throw new SecurityException("Insufficient permission for location provider \"" + + provider + "\"."); + } + } } /** @@ -703,6 +732,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run @Override public List<String> getProviders(Criteria criteria, boolean enabledOnly) { ArrayList<String> out; + String perm = getBestCallingPermission(); int callingUserId = UserHandle.getCallingUserId(); long identity = Binder.clearCallingIdentity(); try { @@ -713,7 +743,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run if (LocationManager.FUSED_PROVIDER.equals(name)) { continue; } - if (isAllowedProviderSafe(name)) { + if (isPermissionSufficient(perm, getMinimumPermissionForProvider(name))) { if (enabledOnly && !isAllowedBySettingsLocked(name, callingUserId)) { continue; } @@ -980,26 +1010,12 @@ public class LocationManagerService extends ILocationManager.Stub implements Run return receiver; } - private boolean isProviderAllowedByCoarsePermission(String provider) { - if (LocationManager.FUSED_PROVIDER.equals(provider)) { - return true; - } - if (LocationManager.PASSIVE_PROVIDER.equals(provider)) { - return true; - } - if (LocationManager.NETWORK_PROVIDER.equals(provider)) { - return true; - } - return false; - } - private String checkPermissionAndRequest(LocationRequest request) { - String perm = checkPermission(); + String perm = getBestCallingPermission(); + String provider = request.getProvider(); + checkPermissionForProvider(perm, provider); if (ACCESS_COARSE_LOCATION.equals(perm)) { - if (!isProviderAllowedByCoarsePermission(request.getProvider())) { - throw new SecurityException("Requires ACCESS_FINE_LOCATION permission"); - } switch (request.getQuality()) { case LocationRequest.ACCURACY_FINE: request.setQuality(LocationRequest.ACCURACY_BLOCK); @@ -1324,7 +1340,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run */ @Override public ProviderProperties getProviderProperties(String provider) { - checkPermission(); + checkPermissionForProvider(getBestCallingPermission(), provider); LocationProviderInterface p; synchronized (mLock) { @@ -1337,13 +1353,8 @@ public class LocationManagerService extends ILocationManager.Stub implements Run @Override public boolean isProviderEnabled(String provider) { - String perms = checkPermission(); + checkPermissionForProvider(getBestCallingPermission(), provider); if (LocationManager.FUSED_PROVIDER.equals(provider)) return false; - if (ACCESS_COARSE_LOCATION.equals(perms) && - !isProviderAllowedByCoarsePermission(provider)) { - throw new SecurityException("The \"" + provider + - "\" provider requires ACCESS_FINE_LOCATION permission"); - } long identity = Binder.clearCallingIdentity(); try { diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 09a606e..4a54efe 100755 --- a/services/java/com/android/server/NotificationManagerService.java +++ b/services/java/com/android/server/NotificationManagerService.java @@ -916,7 +916,7 @@ public class NotificationManagerService extends INotificationManager.Stub // behalf of the download manager without affecting other apps. if (!pkg.equals("com.android.providers.downloads") || Log.isLoggable("DownloadManager", Log.VERBOSE)) { - EventLog.writeEvent(EventLogTags.NOTIFICATION_ENQUEUE, pkg, id, tag, + EventLog.writeEvent(EventLogTags.NOTIFICATION_ENQUEUE, pkg, id, tag, userId, notification.toString()); } @@ -1207,7 +1207,7 @@ public class NotificationManagerService extends INotificationManager.Stub */ private void cancelNotification(String pkg, String tag, int id, int mustHaveFlags, int mustNotHaveFlags, boolean sendDelete, int userId) { - EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL, pkg, id, tag, + EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL, pkg, id, tag, userId, mustHaveFlags, mustNotHaveFlags); synchronized (mNotificationList) { @@ -1231,20 +1231,34 @@ public class NotificationManagerService extends INotificationManager.Stub } /** + * Determine whether the userId applies to the notification in question, either because + * they match exactly, or one of them is USER_ALL (which is treated as a wildcard). + */ + private boolean notificationMatchesUserId(NotificationRecord r, int userId) { + return + // looking for USER_ALL notifications? match everything + userId == UserHandle.USER_ALL + // a notification sent to USER_ALL matches any query + || r.userId == UserHandle.USER_ALL + // an exact user match + || r.userId == userId; + } + + /** * Cancels all notifications from a given package that have all of the * {@code mustHaveFlags}. */ boolean cancelAllNotificationsInt(String pkg, int mustHaveFlags, int mustNotHaveFlags, boolean doit, int userId) { - EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL_ALL, pkg, mustHaveFlags, - mustNotHaveFlags); + EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL_ALL, pkg, userId, + mustHaveFlags, mustNotHaveFlags); synchronized (mNotificationList) { final int N = mNotificationList.size(); boolean canceledSomething = false; for (int i = N-1; i >= 0; --i) { NotificationRecord r = mNotificationList.get(i); - if (userId != UserHandle.USER_ALL && r.userId != userId) { + if (!notificationMatchesUserId(r, userId)) { continue; } if ((r.notification.flags & mustHaveFlags) != mustHaveFlags) { @@ -1322,7 +1336,7 @@ public class NotificationManagerService extends INotificationManager.Stub for (int i=N-1; i>=0; i--) { NotificationRecord r = mNotificationList.get(i); - if (r.userId != userId) { + if (!notificationMatchesUserId(r, userId)) { continue; } @@ -1376,7 +1390,7 @@ public class NotificationManagerService extends INotificationManager.Stub final int len = list.size(); for (int i=0; i<len; i++) { NotificationRecord r = list.get(i); - if (r.userId != userId || r.id != id) { + if (!notificationMatchesUserId(r, userId) || r.id != id) { continue; } if (tag == null) { diff --git a/services/java/com/android/server/display/WifiDisplayAdapter.java b/services/java/com/android/server/display/WifiDisplayAdapter.java index 3e541dd..c441b02 100644 --- a/services/java/com/android/server/display/WifiDisplayAdapter.java +++ b/services/java/com/android/server/display/WifiDisplayAdapter.java @@ -198,6 +198,12 @@ final class WifiDisplayAdapter extends DisplayAdapter { updateRememberedDisplaysLocked(); scheduleStatusChangedBroadcastLocked(); } + + if (mActiveDisplay != null && mActiveDisplay.getDeviceAddress().equals(address) + && mDisplayDevice != null) { + mDisplayDevice.setNameLocked(mActiveDisplay.getFriendlyDisplayName()); + sendDisplayDeviceEventLocked(mDisplayDevice, DISPLAY_DEVICE_EVENT_CHANGED); + } } public void requestForgetLocked(String address) { @@ -397,7 +403,7 @@ final class WifiDisplayAdapter extends DisplayAdapter { }; private final class WifiDisplayDevice extends DisplayDevice { - private final String mName; + private String mName; private final int mWidth; private final int mHeight; private final float mRefreshRate; @@ -423,6 +429,11 @@ final class WifiDisplayAdapter extends DisplayAdapter { sendTraversalRequestLocked(); } + public void setNameLocked(String name) { + mName = name; + mInfo = null; + } + @Override public void performTraversalInTransactionLocked() { setSurfaceInTransactionLocked(mSurface); diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java index b76ad45..4e692a2 100644 --- a/services/java/com/android/server/power/PowerManagerService.java +++ b/services/java/com/android/server/power/PowerManagerService.java @@ -162,6 +162,11 @@ public final class PowerManagerService extends IPowerManager.Stub // Poll interval in milliseconds for watching boot animation finished. private static final int BOOT_ANIMATION_POLL_INTERVAL = 200; + // If the battery level drops by this percentage and the user activity timeout + // has expired, then assume the device is receiving insufficient current to charge + // effectively and terminate the dream. + private static final int DREAM_BATTERY_LEVEL_DRAIN_CUTOFF = 5; + private Context mContext; private LightsService mLightsService; private BatteryService mBatteryService; @@ -256,6 +261,14 @@ public final class PowerManagerService extends IPowerManager.Stub // The current plug type, such as BatteryManager.BATTERY_PLUGGED_WIRELESS. private int mPlugType; + // The current battery level percentage. + private int mBatteryLevel; + + // The battery level percentage at the time the dream started. + // This is used to terminate a dream and go to sleep if the battery is + // draining faster than it is charging and the user activity timeout has expired. + private int mBatteryLevelWhenDreamStarted; + // True if the device should wake up when plugged or unplugged. private boolean mWakeUpWhenPluggedOrUnpluggedConfig; @@ -1067,12 +1080,14 @@ public final class PowerManagerService extends IPowerManager.Stub final int oldPlugType = mPlugType; mIsPowered = mBatteryService.isPowered(BatteryManager.BATTERY_PLUGGED_ANY); mPlugType = mBatteryService.getPlugType(); + mBatteryLevel = mBatteryService.getBatteryLevel(); if (DEBUG) { Slog.d(TAG, "updateIsPoweredLocked: wasPowered=" + wasPowered + ", mIsPowered=" + mIsPowered + ", oldPlugType=" + oldPlugType - + ", mPlugType=" + mPlugType); + + ", mPlugType=" + mPlugType + + ", mBatteryLevel=" + mBatteryLevel); } if (wasPowered != mIsPowered || oldPlugType != mPlugType) { @@ -1126,8 +1141,7 @@ public final class PowerManagerService extends IPowerManager.Stub } if (!wasPowered && mIsPowered && mPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS - && mBatteryService.getBatteryLevel() >= - WIRELESS_CHARGER_TURN_ON_BATTERY_LEVEL_LIMIT) { + && mBatteryLevel >= WIRELESS_CHARGER_TURN_ON_BATTERY_LEVEL_LIMIT) { return false; } @@ -1403,7 +1417,7 @@ public final class PowerManagerService extends IPowerManager.Stub mSandmanScheduled = false; boolean canDream = canDreamLocked(); if (DEBUG_SPEW) { - Log.d(TAG, "handleSandman: canDream=" + canDream + Slog.d(TAG, "handleSandman: canDream=" + canDream + ", mWakefulness=" + wakefulnessToString(mWakefulness)); } @@ -1431,10 +1445,24 @@ public final class PowerManagerService extends IPowerManager.Stub if (mWakefulness == WAKEFULNESS_NAPPING) { mWakefulness = WAKEFULNESS_DREAMING; mDirty |= DIRTY_WAKEFULNESS; + mBatteryLevelWhenDreamStarted = mBatteryLevel; updatePowerStateLocked(); continueDreaming = true; } else if (mWakefulness == WAKEFULNESS_DREAMING) { - continueDreaming = true; + if (!isBeingKeptAwakeLocked() + && mBatteryLevel < mBatteryLevelWhenDreamStarted + - DREAM_BATTERY_LEVEL_DRAIN_CUTOFF) { + // If the user activity timeout expired and the battery appears + // to be draining faster than it is charging then stop dreaming + // and go to sleep. + Slog.i(TAG, "Stopping dream because the battery appears to " + + "be draining faster than it is charging. " + + "Battery level when dream started: " + + mBatteryLevelWhenDreamStarted + "%. " + + "Battery level now: " + mBatteryLevel + "%."); + } else { + continueDreaming = true; + } } } if (!continueDreaming) { @@ -1704,8 +1732,11 @@ public final class PowerManagerService extends IPowerManager.Stub } /** - * Reboot the device, passing 'reason' (may be null) - * to the underlying __reboot system call. Should not return. + * Reboots the device. + * + * @param confirm If true, shows a reboot confirmation dialog. + * @param reason The reason for the reboot, or null if none. + * @param wait If true, this call waits for the reboot to complete and does not return. */ @Override // Binder call public void reboot(boolean confirm, String reason, boolean wait) { @@ -1713,15 +1744,17 @@ public final class PowerManagerService extends IPowerManager.Stub final long ident = Binder.clearCallingIdentity(); try { - rebootInternal(false, confirm, reason, wait); + shutdownOrRebootInternal(false, confirm, reason, wait); } finally { Binder.restoreCallingIdentity(ident); } } /** - * Shutdown the devic, passing 'reason' (may be null) - * to the underlying __reboot system call. Should not return. + * Shuts down the device. + * + * @param confirm If true, shows a shutdown confirmation dialog. + * @param wait If true, this call waits for the shutdown to complete and does not return. */ @Override // Binder call public void shutdown(boolean confirm, boolean wait) { @@ -1729,19 +1762,20 @@ public final class PowerManagerService extends IPowerManager.Stub final long ident = Binder.clearCallingIdentity(); try { - rebootInternal(true, confirm, null, wait); + shutdownOrRebootInternal(true, confirm, null, wait); } finally { Binder.restoreCallingIdentity(ident); } } - private void rebootInternal(final boolean shutdown, final boolean confirm, + private void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm, final String reason, boolean wait) { if (mHandler == null || !mSystemReady) { - throw new IllegalStateException("Too early to call reboot()"); + throw new IllegalStateException("Too early to call shutdown() or reboot()"); } Runnable runnable = new Runnable() { + @Override public void run() { synchronized (this) { if (shutdown) { @@ -1789,6 +1823,7 @@ public final class PowerManagerService extends IPowerManager.Stub private void crashInternal(final String message) { Thread t = new Thread("PowerManagerService.crash()") { + @Override public void run() { throw new RuntimeException(message); } @@ -2087,6 +2122,8 @@ public final class PowerManagerService extends IPowerManager.Stub pw.println(" mWakefulness=" + wakefulnessToString(mWakefulness)); pw.println(" mIsPowered=" + mIsPowered); pw.println(" mPlugType=" + mPlugType); + pw.println(" mBatteryLevel=" + mBatteryLevel); + pw.println(" mBatteryLevelWhenDreamStarted=" + mBatteryLevelWhenDreamStarted); pw.println(" mStayOn=" + mStayOn); pw.println(" mProximityPositive=" + mProximityPositive); pw.println(" mBootCompleted=" + mBootCompleted); diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index b67fb51..269eac0 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -618,6 +618,7 @@ public class WindowAnimator { if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( TAG, ">>> OPEN TRANSACTION animateLocked"); Surface.openTransaction(); + Surface.setAnimationTransaction(); try { updateAppWindowsLocked(); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 77d815b..c341872 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -2823,16 +2823,9 @@ public class WindowManagerService extends IWindowManager.Stub "Relayout window turning screen on: " + win); win.mTurnOnScreen = true; } - int diff = 0; - if (win.mConfiguration != mCurConfiguration - && (win.mConfiguration == null - || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) { - win.mConfiguration = mCurConfiguration; - if (DEBUG_CONFIGURATION) { - Slog.i(TAG, "Window " + win + " visible with new config: " - + win.mConfiguration + " / 0x" - + Integer.toHexString(diff)); - } + if (win.isConfigChanged()) { + if (DEBUG_CONFIGURATION) Slog.i(TAG, "Window " + win + + " visible with new config: " + win.mConfiguration); outConfig.setTo(mCurConfiguration); } } @@ -8260,7 +8253,7 @@ public class WindowManagerService extends IWindowManager.Stub Slog.v(TAG, "1ST PASS " + win + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame + " mLayoutAttached=" + win.mLayoutAttached - + " screen changed=" + win.isConfigDiff(ActivityInfo.CONFIG_SCREEN_SIZE)); + + " screen changed=" + win.isConfigChanged()); final AppWindowToken atoken = win.mAppToken; if (gone) Slog.v(TAG, " GONE: mViewVisibility=" + win.mViewVisibility + " mRelayoutCalled=" @@ -8282,7 +8275,7 @@ public class WindowManagerService extends IWindowManager.Stub // windows, since that means "perform layout as normal, // just don't display"). if (!gone || !win.mHaveFrame || win.mLayoutNeeded - || win.isConfigDiff(ActivityInfo.CONFIG_SCREEN_SIZE) + || win.isConfigChanged() || win.mAttrs.type == TYPE_UNIVERSE_BACKGROUND) { if (!win.mLayoutAttached) { if (initial) { diff --git a/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java b/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java index 26cb97b..fd594f7 100644 --- a/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java +++ b/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java @@ -66,7 +66,7 @@ public class SystemClock_Delegate { * @return elapsed nanoseconds since boot. */ @LayoutlibDelegate - /*package*/ static long elapsedRealtimeNano() { + /*package*/ static long elapsedRealtimeNanos() { return System.nanoTime() - sBootTimeNano; } diff --git a/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java b/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java new file mode 100644 index 0000000..f75ee50 --- /dev/null +++ b/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.view; + +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + +/** + * Delegate used to provide new implementation of a select few methods of {@link Choreographer} + * + * Through the layoutlib_create tool, the original methods of Choreographer have been + * replaced by calls to methods of the same name in this delegate class. + * + */ +public class Choreographer_Delegate { + + @LayoutlibDelegate + public static float getRefreshRate() { + return 60.f; + } +} diff --git a/tools/layoutlib/bridge/src/android/view/Display_Delegate.java b/tools/layoutlib/bridge/src/android/view/Display_Delegate.java index 6ccdcb6..53dc821 100644 --- a/tools/layoutlib/bridge/src/android/view/Display_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/Display_Delegate.java @@ -16,11 +16,8 @@ package android.view; -import com.android.layoutlib.bridge.android.BridgeWindowManager; -import com.android.layoutlib.bridge.impl.RenderAction; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; -import android.os.RemoteException; /** * Delegate used to provide new implementation of a select few methods of {@link Display} @@ -31,4 +28,9 @@ import android.os.RemoteException; */ public class Display_Delegate { + @LayoutlibDelegate + static void updateDisplayInfoLocked(Display theDisplay) { + // do nothing + } + } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index 3fcc8ef..da736b7 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.layoutlib.bridge.android; +package android.view; import com.android.internal.view.IInputContext; import com.android.internal.view.IInputMethodClient; @@ -28,7 +28,6 @@ import android.os.IRemoteCallback; import android.os.RemoteException; import android.util.DisplayMetrics; import android.view.Display; -import android.view.Display_Delegate; import android.view.Gravity; import android.view.IApplicationToken; import android.view.IDisplayContentChangeListener; @@ -45,16 +44,21 @@ import java.util.List; * Basic implementation of {@link IWindowManager} so that {@link Display} (and * {@link Display_Delegate}) can return a valid instance. */ -public class BridgeWindowManager implements IWindowManager { +public class IWindowManagerImpl implements IWindowManager { private final Configuration mConfig; private final DisplayMetrics mMetrics; private final int mRotation; + private final boolean mHasSystemNavBar; + private final boolean mHasNavigationBar; - public BridgeWindowManager(Configuration config, DisplayMetrics metrics, int rotation) { + public IWindowManagerImpl(Configuration config, DisplayMetrics metrics, int rotation, + boolean hasSystemNavBar, boolean hasNavigationBar) { mConfig = config; mMetrics = metrics; mRotation = rotation; + mHasSystemNavBar = hasSystemNavBar; + mHasNavigationBar = hasNavigationBar; } // custom API. @@ -70,14 +74,18 @@ public class BridgeWindowManager implements IWindowManager { return mRotation; } - // ---- unused implementation of IWindowManager ---- + @Override + public boolean hasNavigationBar() { + return mHasNavigationBar; + } @Override public boolean hasSystemNavBar() throws RemoteException { - // TODO Auto-generated method stub - return false; + return mHasSystemNavBar; } + // ---- unused implementation of IWindowManager ---- + @Override public void addAppToken(int arg0, IApplicationToken arg1, int arg2, int arg3, boolean arg4, boolean arg5) @@ -435,11 +443,6 @@ public class BridgeWindowManager implements IWindowManager { } @Override - public boolean hasNavigationBar() { - return false; // should this return something else? - } - - @Override public void lockNow(Bundle options) { // TODO Auto-generated method stub } diff --git a/tools/layoutlib/bridge/src/android/view/WindowManagerGlobal_Delegate.java b/tools/layoutlib/bridge/src/android/view/WindowManagerGlobal_Delegate.java new file mode 100644 index 0000000..2606e55 --- /dev/null +++ b/tools/layoutlib/bridge/src/android/view/WindowManagerGlobal_Delegate.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + +/** + * Delegate used to provide new implementation of a select few methods of + * {@link WindowManagerGlobal} + * + * Through the layoutlib_create tool, the original methods of WindowManagerGlobal have been + * replaced by calls to methods of the same name in this delegate class. + * + */ +public class WindowManagerGlobal_Delegate { + + private static IWindowManager sService; + + @LayoutlibDelegate + public static IWindowManager getWindowManagerService() { + return sService; + } + + // ---- internal implementation stuff ---- + + public static void setWindowManagerService(IWindowManager service) { + sService = service; + } +} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index 80478ba..e2fced6 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -25,6 +25,7 @@ import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.StyleResourceValue; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.BridgeConstants; +import com.android.layoutlib.bridge.android.view.WindowManagerImpl; import com.android.layoutlib.bridge.impl.ParserFactory; import com.android.layoutlib.bridge.impl.Stack; import com.android.resources.ResourceType; @@ -68,9 +69,9 @@ import android.util.TypedValue; import android.view.BridgeInflater; import android.view.CompatibilityInfoHolder; import android.view.Display; -import android.view.Surface; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.view.textservice.TextServicesManager; import java.io.File; @@ -98,7 +99,7 @@ public final class BridgeContext extends Context { private final Configuration mConfig; private final ApplicationInfo mApplicationInfo; private final IProjectCallback mProjectCallback; - private final BridgeWindowManager mIWindowManager; + private final WindowManager mWindowManager; private Resources.Theme mTheme; @@ -139,10 +140,10 @@ public final class BridgeContext extends Context { mRenderResources = renderResources; mConfig = config; - mIWindowManager = new BridgeWindowManager(mConfig, metrics, Surface.ROTATION_0); - mApplicationInfo = new ApplicationInfo(); mApplicationInfo.targetSdkVersion = targetSdkVersion; + + mWindowManager = new WindowManagerImpl(mMetrics); } /** @@ -198,14 +199,14 @@ public final class BridgeContext extends Context { return mRenderResources; } - public BridgeWindowManager getIWindowManager() { - return mIWindowManager; - } - public Map<String, String> getDefaultPropMap(Object key) { return mDefaultPropMaps.get(key); } + public Configuration getConfiguration() { + return mConfig; + } + /** * Adds a parser to the stack. * @param parser the parser to add. @@ -431,10 +432,8 @@ public final class BridgeContext extends Context { return TextServicesManager.getInstance(); } - // AutoCompleteTextView and MultiAutoCompleteTextView want a window - // service. We don't have any but it's not worth an exception. if (WINDOW_SERVICE.equals(service)) { - return null; + return mWindowManager; } // needed by SearchView diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java new file mode 100644 index 0000000..9a633bf --- /dev/null +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.layoutlib.bridge.android.view; + +import android.util.DisplayMetrics; +import android.view.Display; +import android.view.DisplayInfo; +import android.view.View; +import android.view.WindowManager; + +public class WindowManagerImpl implements WindowManager { + + private final DisplayMetrics mMetrics; + private final Display mDisplay; + + public WindowManagerImpl(DisplayMetrics metrics) { + mMetrics = metrics; + + DisplayInfo info = new DisplayInfo(); + info.logicalHeight = mMetrics.heightPixels; + info.logicalWidth = mMetrics.widthPixels; + mDisplay = new Display(null, Display.DEFAULT_DISPLAY, info, null); + } + + @Override + public Display getDefaultDisplay() { + return mDisplay; + } + + + @Override + public void addView(View arg0, android.view.ViewGroup.LayoutParams arg1) { + // pass + } + + @Override + public void removeView(View arg0) { + // pass + } + + @Override + public void updateViewLayout(View arg0, android.view.ViewGroup.LayoutParams arg1) { + // pass + } + + + @Override + public void removeViewImmediate(View arg0) { + // pass + } +} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index e93b41d..cc0f077 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -68,11 +68,15 @@ import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.AttachInfo_Accessor; import android.view.BridgeInflater; +import android.view.IWindowManagerImpl; +import android.view.IWindowManager; +import android.view.Surface; import android.view.View; import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.MarginLayoutParams; +import android.view.WindowManagerGlobal_Delegate; import android.widget.AbsListView; import android.widget.AbsSpinner; import android.widget.AdapterView; @@ -185,6 +189,14 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { findActionBar(resources, metrics); findSystemBar(resources, metrics); + // FIXME: find those out, and possibly add them to the render params + boolean hasSystemNavBar = true; + boolean hasNavigationBar = true; + IWindowManager iwm = new IWindowManagerImpl(getContext().getConfiguration(), + metrics, Surface.ROTATION_0, + hasSystemNavBar, hasNavigationBar); + WindowManagerGlobal_Delegate.setWindowManagerService(iwm); + // build the inflater and parser. mInflater = new BridgeInflater(context, params.getProjectCallback()); context.setBridgeInflater(mInflater); diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java index 5109810..80a1a60 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java @@ -110,11 +110,13 @@ public final class CreateInfo implements ICreateInfo { "android.os.Handler#sendMessageAtTime", "android.os.HandlerThread#run", "android.os.Build#getString", - "android.view.Display#getWindowManager", + "android.view.Choreographer#getRefreshRate", + "android.view.Display#updateDisplayInfoLocked", "android.view.LayoutInflater#rInflate", "android.view.LayoutInflater#parseInclude", "android.view.View#isInEditMode", "android.view.ViewRootImpl#isInTouchMode", + "android.view.WindowManagerGlobal#getWindowManagerService", "android.view.inputmethod.InputMethodManager#getInstance", "com.android.internal.util.XmlUtils#convertValueToInt", "com.android.internal.textservice.ITextServicesManager$Stub#asInterface", |