diff options
560 files changed, 6076 insertions, 4749 deletions
diff --git a/api/11.xml b/api/11.xml index d79baf0cc996..6a672d16611b 100644 --- a/api/11.xml +++ b/api/11.xml @@ -70101,7 +70101,7 @@ </parameter> </method> <method name="getAttachedDbs" - return="java.util.ArrayList<android.util.Pair<java.lang.String, java.lang.String>>" + return="java.util.List<android.util.Pair<java.lang.String, java.lang.String>>" abstract="false" native="false" synchronized="false" @@ -215665,17 +215665,6 @@ visibility="public" > </method> -<method name="getOnLayoutChangeListeners" - return="java.util.List<android.view.View.OnLayoutChangeListener>" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -</method> <method name="getOverScrollMode" return="int" abstract="false" @@ -238854,7 +238843,7 @@ > </method> <method name="onRemoteAdapterConnected" - return="void" + return="boolean" abstract="false" native="false" synchronized="false" @@ -240832,7 +240821,7 @@ > </method> <method name="onRemoteAdapterConnected" - return="void" + return="boolean" abstract="false" native="false" synchronized="false" diff --git a/api/current.xml b/api/current.xml index d79baf0cc996..bd5969414692 100644 --- a/api/current.xml +++ b/api/current.xml @@ -1885,6 +1885,28 @@ visibility="public" > </field> +<field name="actionMenuTextAppearance" + type="int" + transient="false" + volatile="false" + value="16843616" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="actionMenuTextColor" + type="int" + transient="false" + volatile="false" + value="16843617" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="actionModeBackground" type="int" transient="false" @@ -11809,6 +11831,28 @@ visibility="public" > </field> +<field name="dialog_holo_dark_frame" + type="int" + transient="false" + volatile="false" + value="17301682" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="dialog_holo_light_frame" + type="int" + transient="false" + volatile="false" + value="17301683" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="divider_horizontal_bright" type="int" transient="false" @@ -24777,6 +24821,28 @@ visibility="public" > </method> +<method name="getLauncherLargeIconDensity" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getLauncherLargeIconSize" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getMemoryClass" return="int" abstract="false" @@ -26563,6 +26629,39 @@ <parameter name="viewSpacingBottom" type="int"> </parameter> </method> +<field name="THEME_HOLO_DARK" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="THEME_HOLO_LIGHT" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="THEME_TRADITIONAL" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> </class> <class name="AlertDialog.Builder" extends="java.lang.Object" @@ -70101,7 +70200,7 @@ </parameter> </method> <method name="getAttachedDbs" - return="java.util.ArrayList<android.util.Pair<java.lang.String, java.lang.String>>" + return="java.util.List<android.util.Pair<java.lang.String, java.lang.String>>" abstract="false" native="false" synchronized="false" @@ -94202,6 +94301,17 @@ visibility="public" > </constructor> +<method name="getBackDisposition" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getCandidatesHiddenVisibility" return="int" abstract="false" @@ -94927,6 +95037,19 @@ <parameter name="charCode" type="char"> </parameter> </method> +<method name="setBackDisposition" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="disposition" type="int"> +</parameter> +</method> <method name="setCandidatesView" return="void" abstract="false" @@ -95053,6 +95176,39 @@ visibility="public" > </method> +<field name="BACK_DISPOSITION_DEFAULT" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="BACK_DISPOSITION_WILL_DISMISS" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="BACK_DISPOSITION_WILL_NOT_DISMISS" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> </class> <class name="InputMethodService.InputMethodImpl" extends="android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodImpl" @@ -215665,17 +215821,6 @@ visibility="public" > </method> -<method name="getOnLayoutChangeListeners" - return="java.util.List<android.view.View.OnLayoutChangeListener>" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -</method> <method name="getOverScrollMode" return="int" abstract="false" @@ -225876,6 +226021,16 @@ visibility="public" > </field> +<field name="systemUiVisibility" + type="int" + transient="false" + volatile="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="token" type="android.os.IBinder" transient="false" @@ -238854,7 +239009,7 @@ > </method> <method name="onRemoteAdapterConnected" - return="void" + return="boolean" abstract="false" native="false" synchronized="false" @@ -240832,7 +240987,7 @@ > </method> <method name="onRemoteAdapterConnected" - return="void" + return="boolean" abstract="false" native="false" synchronized="false" @@ -260450,7 +260605,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="t" type="T"> +<parameter name="arg0" type="T"> </parameter> </method> </interface> diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 055984f9fa32..3c45080531ea 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -4268,7 +4268,7 @@ public class Activity extends ContextThemeWrapper mWindow = PolicyManager.makeNewWindow(this); mWindow.setCallback(this); - mWindow.getLayoutInflater().setFactory2(this); + mWindow.getLayoutInflater().setPrivateFactory(this); if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) { mWindow.setSoftInputMode(info.softInputMode); } diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 133a7d04003f..d76b67d3ef2a 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -22,6 +22,8 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.ConfigurationInfo; import android.content.pm.IPackageDataObserver; +import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Bitmap; import android.os.Debug; import android.os.RemoteException; @@ -30,6 +32,8 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.SystemProperties; import android.text.TextUtils; +import android.util.DisplayMetrics; + import java.util.List; /** @@ -1145,7 +1149,67 @@ public class ActivityManager { } return null; } - + + /** + * Get the preferred density of icons for the launcher. This is used when + * custom drawables are created (e.g., for shortcuts). + * + * @return density in terms of DPI + */ + public int getLauncherLargeIconDensity() { + final Resources res = mContext.getResources(); + final int density = res.getDisplayMetrics().densityDpi; + + if ((res.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) + != Configuration.SCREENLAYOUT_SIZE_XLARGE) { + return density; + } + + switch (density) { + case DisplayMetrics.DENSITY_LOW: + return DisplayMetrics.DENSITY_MEDIUM; + case DisplayMetrics.DENSITY_MEDIUM: + return DisplayMetrics.DENSITY_HIGH; + case DisplayMetrics.DENSITY_HIGH: + return DisplayMetrics.DENSITY_XHIGH; + case DisplayMetrics.DENSITY_XHIGH: + return DisplayMetrics.DENSITY_MEDIUM * 2; + default: + return density; + } + } + + /** + * Get the preferred launcher icon size. This is used when custom drawables + * are created (e.g., for shortcuts). + * + * @return dimensions of square icons in terms of pixels + */ + public int getLauncherLargeIconSize() { + final Resources res = mContext.getResources(); + final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size); + + if ((res.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) + != Configuration.SCREENLAYOUT_SIZE_XLARGE) { + return size; + } + + final int density = res.getDisplayMetrics().densityDpi; + + switch (density) { + case DisplayMetrics.DENSITY_LOW: + return (size * DisplayMetrics.DENSITY_MEDIUM) / DisplayMetrics.DENSITY_LOW; + case DisplayMetrics.DENSITY_MEDIUM: + return (size * DisplayMetrics.DENSITY_HIGH) / DisplayMetrics.DENSITY_MEDIUM; + case DisplayMetrics.DENSITY_HIGH: + return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH; + case DisplayMetrics.DENSITY_XHIGH: + return (size * DisplayMetrics.DENSITY_MEDIUM * 2) / DisplayMetrics.DENSITY_XHIGH; + default: + return size; + } + } + /** * Returns "true" if the user interface is currently being messed with * by a monkey. diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java index 428f4e3d4b3f..e83d1047ee80 100644 --- a/core/java/android/app/AlertDialog.java +++ b/core/java/android/app/AlertDialog.java @@ -58,29 +58,69 @@ import android.widget.ListView; public class AlertDialog extends Dialog implements DialogInterface { private AlertController mAlert; + /** + * Special theme constant for {@link #AlertDialog(Context, int)}: use + * the traditional (pre-Holo) alert dialog theme. + */ + public static final int THEME_TRADITIONAL = 1; + + /** + * Special theme constant for {@link #AlertDialog(Context, int)}: use + * the holographic alert theme with a dark background. + */ + public static final int THEME_HOLO_DARK = 2; + + /** + * Special theme constant for {@link #AlertDialog(Context, int)}: use + * the holographic alert theme with a light background. + */ + public static final int THEME_HOLO_LIGHT = 3; + protected AlertDialog(Context context) { - this(context, getDefaultDialogTheme(context)); + this(context, resolveDialogTheme(context, 0), true); } + /** + * Construct an AlertDialog that uses an explicit theme. The actual style + * that an AlertDialog uses is a private implementation, however you can + * here supply either the name of an attribute in the theme from which + * to get the dialog's style (such as {@link android.R.attr#alertDialogTheme} + * or one of the constants {@link #THEME_TRADITIONAL}, + * {@link #THEME_HOLO_DARK}, or {@link #THEME_HOLO_LIGHT}. + */ protected AlertDialog(Context context, int theme) { - super(context, theme == 0 ? getDefaultDialogTheme(context) : theme); + this(context, theme, true); + } + + AlertDialog(Context context, int theme, boolean createContextWrapper) { + super(context, resolveDialogTheme(context, theme), createContextWrapper); mWindow.alwaysReadCloseOnTouchAttr(); - mAlert = new AlertController(context, this, getWindow()); + mAlert = new AlertController(getContext(), this, getWindow()); } protected AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { - super(context, getDefaultDialogTheme(context)); + super(context, resolveDialogTheme(context, 0)); mWindow.alwaysReadCloseOnTouchAttr(); setCancelable(cancelable); setOnCancelListener(cancelListener); mAlert = new AlertController(context, this, getWindow()); } - private static int getDefaultDialogTheme(Context context) { - TypedValue outValue = new TypedValue(); - context.getTheme().resolveAttribute(com.android.internal.R.attr.alertDialogTheme, - outValue, true); - return outValue.resourceId; + static int resolveDialogTheme(Context context, int resid) { + if (resid == THEME_TRADITIONAL) { + return com.android.internal.R.style.Theme_Dialog_Alert; + } else if (resid == THEME_HOLO_DARK) { + return com.android.internal.R.style.Theme_Holo_Dialog_Alert; + } else if (resid == THEME_HOLO_LIGHT) { + return com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert; + } else if (resid >= 0x01000000) { // start of real resource IDs. + return resid; + } else { + TypedValue outValue = new TypedValue(); + context.getTheme().resolveAttribute(com.android.internal.R.attr.alertDialogTheme, + outValue, true); + return outValue.resourceId; + } } /** @@ -294,15 +334,23 @@ public class AlertDialog extends Dialog implements DialogInterface { * Constructor using a context for this builder and the {@link AlertDialog} it creates. */ public Builder(Context context) { - this(context, getDefaultDialogTheme(context)); + this(context, resolveDialogTheme(context, 0)); } /** * Constructor using a context and theme for this builder and - * the {@link AlertDialog} it creates. + * the {@link AlertDialog} it creates. The actual theme + * that an AlertDialog uses is a private implementation, however you can + * here supply either the name of an attribute in the theme from which + * to get the dialog's style (such as {@link android.R.attr#alertDialogTheme} + * or one of the constants + * {@link AlertDialog#THEME_TRADITIONAL AlertDialog.THEME_TRADITIONAL}, + * {@link AlertDialog#THEME_HOLO_DARK AlertDialog.THEME_HOLO_DARK}, or + * {@link AlertDialog#THEME_HOLO_LIGHT AlertDialog.THEME_HOLO_LIGHT}. */ public Builder(Context context, int theme) { - P = new AlertController.AlertParams(new ContextThemeWrapper(context, theme)); + P = new AlertController.AlertParams(new ContextThemeWrapper( + context, resolveDialogTheme(context, theme))); mTheme = theme; } @@ -840,7 +888,7 @@ public class AlertDialog extends Dialog implements DialogInterface { * to do and want this to be created and displayed. */ public AlertDialog create() { - final AlertDialog dialog = new AlertDialog(P.mContext, mTheme); + final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false); P.apply(dialog.mAlert); dialog.setCancelable(P.mCancelable); dialog.setOnCancelListener(P.mOnCancelListener); diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index f4fa567e28fd..23d4065622ac 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -119,7 +119,7 @@ public class Dialog implements DialogInterface, Window.Callback, * present its UI. */ public Dialog(Context context) { - this(context, 0); + this(context, 0, true); } /** @@ -135,6 +135,10 @@ public class Dialog implements DialogInterface, Window.Callback, * <var>context</var>. If 0, the default dialog theme will be used. */ public Dialog(Context context, int theme) { + this(context, theme, true); + } + + Dialog(Context context, int theme, boolean createContextWrapper) { if (theme == 0) { TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme, @@ -142,7 +146,7 @@ public class Dialog implements DialogInterface, Window.Callback, theme = outValue.resourceId; } - mContext = new ContextThemeWrapper(context, theme); + mContext = createContextWrapper ? new ContextThemeWrapper(context, theme) : context; mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); Window w = PolicyManager.makeNewWindow(mContext); mWindow = w; @@ -152,7 +156,7 @@ public class Dialog implements DialogInterface, Window.Callback, mUiThread = Thread.currentThread(); mListenersHandler = new ListenersHandler(this); } - + /** * @deprecated * @hide diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 97e6931a46fb..1af09838c2f1 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -22,6 +22,7 @@ import android.os.Binder; import android.os.RemoteException; import android.os.IBinder; import android.os.ServiceManager; +import android.view.View; import com.android.internal.statusbar.IStatusBarService; @@ -31,52 +32,24 @@ import com.android.internal.statusbar.IStatusBarService; * @hide */ public class StatusBarManager { - /** - * Flag for {@link #disable} to make the status bar not expandable. Unless you also - * set {@link #DISABLE_NOTIFICATION_ICONS}, new notifications will continue to show. - */ - public static final int DISABLE_EXPAND = 0x00000001; - - /** - * Flag for {@link #disable} to hide notification icons and scrolling ticker text. - */ - public static final int DISABLE_NOTIFICATION_ICONS = 0x00000002; - - /** - * Flag for {@link #disable} to disable incoming notification alerts. This will not block - * icons, but it will block sound, vibrating and other visual or aural notifications. - */ - public static final int DISABLE_NOTIFICATION_ALERTS = 0x00000004; - /** - * Flag for {@link #disable} to hide only the scrolling ticker. Note that - * {@link #DISABLE_NOTIFICATION_ICONS} implies {@link #DISABLE_NOTIFICATION_TICKER}. - */ - public static final int DISABLE_NOTIFICATION_TICKER = 0x00000008; + public static final int DISABLE_EXPAND = View.STATUS_BAR_DISABLE_EXPAND; + public static final int DISABLE_NOTIFICATION_ICONS = View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS; + public static final int DISABLE_NOTIFICATION_ALERTS + = View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS; + public static final int DISABLE_NOTIFICATION_TICKER + = View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER; + public static final int DISABLE_SYSTEM_INFO = View.STATUS_BAR_DISABLE_SYSTEM_INFO; + public static final int DISABLE_NAVIGATION = View.STATUS_BAR_DISABLE_NAVIGATION; + public static final int DISABLE_BACK = View.STATUS_BAR_DISABLE_BACK; + public static final int DISABLE_CLOCK = View.STATUS_BAR_DISABLE_CLOCK; - /** - * Flag for {@link #disable} to hide the center system info area. - */ - public static final int DISABLE_SYSTEM_INFO = 0x00000010; - - /** - * Flag for {@link #disable} to hide only the navigation buttons. Don't use this - * unless you're a special part of the system UI (i.e., setup wizard, keyguard). - */ - public static final int DISABLE_NAVIGATION = 0x00000020; - - /** - * Flag for {@link #disable} to hide only the clock. You might use this if your activity has - * its own clock making the status bar's clock redundant. - */ - public static final int DISABLE_CLOCK = 0x00000040; - - - /** - * Re-enable all of the status bar features that you've disabled. - */ public static final int DISABLE_NONE = 0x00000000; + public static final int DISABLE_MASK = DISABLE_EXPAND | DISABLE_NOTIFICATION_ICONS + | DISABLE_NOTIFICATION_ALERTS | DISABLE_NOTIFICATION_TICKER + | DISABLE_SYSTEM_INFO| DISABLE_NAVIGATION | DISABLE_BACK | DISABLE_CLOCK; + private Context mContext; private IStatusBarService mService; private IBinder mToken = new Binder(); diff --git a/core/java/android/app/admin/package.html b/core/java/android/app/admin/package.html new file mode 100644 index 000000000000..1a81083919be --- /dev/null +++ b/core/java/android/app/admin/package.html @@ -0,0 +1,12 @@ +<HTML> +<BODY> +<p>Provides device administration features at the system level, allowing you to create +security-aware applications that are useful in enterprise settings, in which IT professionals +require rich control over employee devices.</p> + +<p>For more information, see the <a +href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a> developer guide.</p> +{@more} + +</BODY> +</HTML> diff --git a/core/java/android/app/backup/package.html b/core/java/android/app/backup/package.html index e14034973ddd..56658f521128 100644 --- a/core/java/android/app/backup/package.html +++ b/core/java/android/app/backup/package.html @@ -2,9 +2,10 @@ <BODY> <p>Contains the backup and restore functionality available to applications. If a user wipes the data on their device or upgrades to a new Android-powered -device, all applications that have enabled backup will restore the user's previous data.</p> +device, all applications that have enabled backup can restore the user's previous data when the +application is reinstalled.</p> -<p>For a detailed guide to using the backup APIs, see the <a +<p>For more information, see the <a href="{@docRoot}guide/topics/data/backup.html">Data Backup</a> developer guide.</p> {@more} diff --git a/core/java/android/app/package.html b/core/java/android/app/package.html index 048ee93749e0..5137600a5954 100644 --- a/core/java/android/app/package.html +++ b/core/java/android/app/package.html @@ -1,72 +1,43 @@ <html> -<head> -<script type="text/javascript" src="http://www.corp.google.com/style/prettify.js"></script> -<script src="http://www.corp.google.com/eng/techpubs/include/navbar.js" type="text/javascript"></script> -</head> <body> -<p>High-level classes encapsulating the overall Android application model. -The central class is {@link android.app.Activity}, with other top-level -application components being defined by {@link android.app.Service} and, -from the {@link android.content} package, {@link android.content.BroadcastReceiver} -and {@link android.content.ContentProvider}. It also includes application -tools, such as dialogs and notifications.</p> +<p>Contains high-level classes encapsulating the overall Android application model.</p> + +<p>An Android application is defined using one or more of Android's four core application +components. Two such application components are defined in this package: {@link +android.app.Activity} and {@link android.app.Service}. The other two components are from the {@link +android.content} package: {@link android.content.BroadcastReceiver} and {@link +android.content.ContentProvider}.</p> + +<p>An {@link android.app.Activity} is an application component that provides a screen with which +users can interact in order to do something, such as dial the phone, take a photo, send an email, or +view a map. An activity can start other activities, including activities that live in separate +applications.</p> + +<p>A {@link android.app.Service} is an application component that can perform +long-running operations in the background without a user interface. For example, a service +can handle network transactions, play music, or work with a content provider without the user being +aware of the work going on.</p> + +<p>The {@link android.app.Fragment} class is also an important part of an application's +design—especially when designing for large screen devices, such as tablets. A fragment defines +a distinct part of an activity's behavior, including the associated UI. It has its own lifecycle +that is similar to that of the activity and can exist alongside other fragments that are embedded in +the activity. While an activity is running, you can add and remove fragments and include each +fragment in a back stack that's managed by the activity—allowing the user to navigate +backwards through the fragment states, without leaving the activity.</p> + +<p>This package also defines application utilities, such as dialogs, notifications, and the +action bar.</p> + +<p>For information about using some the classes in this package, see the following +documents: <a href="{@docRoot}guide/topics/fundamentals/index.html">Application +Fundamentals</a> (for activities, services, and fragments), <a +href="{@docRoot}guide/topics/ui/actionbar.html">Using the Action Bar</a>, <a +href="{@docRoot}guide/topics/ui/dialogs.html">Creating Dialogs</a>, and <a +href="{@docRoot}guide/topics/ui/notifiers/index.html">Notifying the User</a>.</p> -<p>This package builds on top of the lower-level Android packages -{@link android.widget}, {@link android.view}, {@link android.content}, -{@link android.text}, {@link android.graphics}, {@link android.os}, and -{@link android.util}.</p> - -<p>An {@link android.app.Activity Activity} is a specific operation the -user can perform, generally corresponding -to one screen in the user interface. -It is the basic building block of an Android application. -Examples of activities are "view the -list of people," "view the details of a person," "edit information about -a person," "view an image," etc. Switching from one activity to another -generally implies adding a new entry on the navigation history; that is, -going "back" means moving to the previous activity you were doing.</p> - -<p>A set of related activities can be grouped together as a "task". Until -a new task is explicitly specified, all activites you start are considered -to be part of the current task. While the only way to navigate between -individual activities is by going "back" in the history stack, the group -of activities in a task can be moved in relation to other tasks: for example -to the front or the back of the history stack. This mechanism can be used -to present to the user a list of things they have been doing, moving -between them without disrupting previous work. -</p> - -<p>A complete "application" is a set of activities that allow the user to do a -cohesive group of operations -- such as working with contacts, working with a -calendar, messaging, etc. Though there can be a custom application object -associated with a set of activities, in many cases this is not needed -- -each activity provides a particular path into one of the various kinds of -functionality inside of the application, serving as its on self-contained -"mini application". -</p> - -<p>This approach allows an application to be broken into pieces, which -can be reused and replaced in a variety of ways. Consider, for example, -a "camera application." There are a number of things this application -must do, each of which is provided by a separate activity: take a picture -(creating a new image), browse through the existing images, display a -specific image, etc. If the "contacts application" then wants to let the -user associate an image with a person, it can simply launch the existing -"take a picture" or "select an image" activity that is part of the camera -application and attach the picture it gets back. -</p> - -<p>Note that there is no hard relationship between tasks the user sees and -applications the developer writes. A task can be composed of activities from -multiple applications (such as the contact application using an activity in -the camera application to get a picture for a person), and multiple active -tasks may be running for the same application (such as editing e-mail messages -to two different people). The way tasks are organized is purely a UI policy -decided by the system; for example, typically a new task is started when the -user goes to the application launcher and selects an application. -</p> </body> </html> diff --git a/core/java/android/appwidget/package.html b/core/java/android/appwidget/package.html index 2b85bd5a41a4..19fd2f75400d 100644 --- a/core/java/android/appwidget/package.html +++ b/core/java/android/appwidget/package.html @@ -1,32 +1,32 @@ <body> -<p>Android allows applications to publish views to be embedded in other applications. These -views are called widgets, and are published by "AppWidget providers." The component that can -contain widgets is called a "AppWidget host." -</p> -<p>For more information, see the -<a href="{@docRoot}guide/topics/appwidgets/index.html">AppWidgets</a> -documentation in the Dev Guide.</p> - +<p>Contains the components necessary to create "app widgets", which users can embed in other +applications (such as the home screen) to quickly access application data and services without +launching a new activity.</p> +<p>For more information, see the +<a href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a> +developer guide.</p> {@more} - - -<h2><a name="providers"></a>AppWidget Providers</h2> -<p>Any application can publish widgets. All an application needs to do to publish a widget is -to have a {@link android.content.BroadcastReceiver} that receives the {@link -android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE AppWidgetManager.ACTION_APPWIDGET_UPDATE} intent, -and provide some meta-data about the widget. Android provides the -{@link android.appwidget.AppWidgetProvider} class, which extends BroadcastReceiver, as a convenience -class to aid in handling the broadcasts. - - -<h2>AppWidget Hosts</h3> -<p>Widget hosts are the containers in which widgets can be placed. Most of the look and feel +<p>The behavior of an app widget is published by an "app widget provider." An "app widget host" is +a component that can contain app widgets (such as the Home screen).</p> + +<p>Any application can publish app widgets (as an app widget provider). All an application needs to +do to publish an app widget is +provide a {@link android.content.BroadcastReceiver} that receives the {@link +android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE} intent +and provide some metadata about the app widget. Android provides the +{@link android.appwidget.AppWidgetProvider} class, which extends {@link +android.content.BroadcastReceiver}, as a convenience class to define the app widget behavrio and aid +in handling the broadcasts.</p> + +<p>App widget hosts are the containers in which widgets can be placed. Most of the look and feel details are left up to the widget hosts. For example, the home screen has one way of viewing widgets, but the lock screen could also contain widgets, and it would have a different way of adding, removing and otherwise managing widgets.</p> -<p>For more information on implementing your own widget host, see the -{@link android.appwidget.AppWidgetHost AppWidgetHost} class.</p> + +<p>The <a href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a> +developer guide shows you how to create an app widget provider. For information about implementing +an app widget host, see the {@link android.appwidget.AppWidgetHost} class.</p> </body> diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java index 231f5920be56..9246a1035087 100644 --- a/core/java/android/bluetooth/BluetoothA2dp.java +++ b/core/java/android/bluetooth/BluetoothA2dp.java @@ -56,7 +56,7 @@ public final class BluetoothA2dp implements BluetoothProfile { * <li> {@link BluetoothDevice#EXTRA_DEVICE} - The remote device. </li> * </ul> * - * {@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of + * <p>{@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of * {@link #STATE_DISCONNECTED}, {@link #STATE_CONNECTING}, * {@link #STATE_CONNECTED}, {@link #STATE_DISCONNECTING}. * @@ -75,10 +75,10 @@ public final class BluetoothA2dp implements BluetoothProfile { * <ul> * <li> {@link #EXTRA_STATE} - The current state of the profile. </li> * <li> {@link #EXTRA_PREVIOUS_STATE}- The previous state of the profile. </li> - * <li> {@link BluetoothDevice#EXTRA_DEVICE} - The remote device. <li/> + * <li> {@link BluetoothDevice#EXTRA_DEVICE} - The remote device. </li> * </ul> * - * {@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of + * <p>{@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of * {@link #STATE_PLAYING}, {@link #STATE_NOT_PLAYING}, * * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission to diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java index 768a6ff17c94..fa5552096605 100644 --- a/core/java/android/bluetooth/BluetoothHeadset.java +++ b/core/java/android/bluetooth/BluetoothHeadset.java @@ -57,7 +57,7 @@ public final class BluetoothHeadset implements BluetoothProfile { * <li> {@link #EXTRA_PREVIOUS_STATE}- The previous state of the profile. </li> * <li> {@link BluetoothDevice#EXTRA_DEVICE} - The remote device. </li> * </ul> - * {@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of + * <p>{@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of * {@link #STATE_DISCONNECTED}, {@link #STATE_CONNECTING}, * {@link #STATE_CONNECTED}, {@link #STATE_DISCONNECTING}. * @@ -78,7 +78,7 @@ public final class BluetoothHeadset implements BluetoothProfile { * <li> {@link #EXTRA_PREVIOUS_STATE}- The previous state of the profile. </li> * <li> {@link BluetoothDevice#EXTRA_DEVICE} - The remote device. </li> * </ul> - * {@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of + * <p>{@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of * {@link #STATE_AUDIO_CONNECTED}, {@link #STATE_AUDIO_DISCONNECTED}, * * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission @@ -102,12 +102,12 @@ public final class BluetoothHeadset implements BluetoothProfile { * <li> {@link #EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE} - The AT * command type which can be one of {@link #AT_CMD_TYPE_READ}, * {@link #AT_CMD_TYPE_TEST}, or {@link #AT_CMD_TYPE_SET}, - * {@link #AT_CMD_TYPE_BASIC},{@link #AT_CMD_TYPE_ACTION}. <li/> + * {@link #AT_CMD_TYPE_BASIC},{@link #AT_CMD_TYPE_ACTION}. </li> * <li> {@link #EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS} - Command * arguments. </li> * </ul> * - * The category is the Company ID of the vendor defining the + *<p> The category is the Company ID of the vendor defining the * vendor-specific command. {@link BluetoothAssignedNumbers} * * For example, for Plantronics specific events @@ -117,7 +117,7 @@ public final class BluetoothHeadset implements BluetoothProfile { * <ul> * <li> EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD = +XEVENT </li> * <li> EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE = AT_CMD_TYPE_SET </li> - * <li> EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS = foo, 3 <li> + * <li> EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS = foo, 3 </li> * </ul> * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission * to receive. diff --git a/core/java/android/bluetooth/package.html b/core/java/android/bluetooth/package.html index 9ac42dc58352..37505fd40479 100644 --- a/core/java/android/bluetooth/package.html +++ b/core/java/android/bluetooth/package.html @@ -3,7 +3,7 @@ <p>Provides classes that manage Bluetooth functionality, such as scanning for devices, connecting with devices, and managing data transfer between devices.</p> -<p>For a complete guide to using the Bluetooth APIs, see the <a +<p>For more information, see the <a href="{@docRoot}guide/topics/wireless/bluetooth.html">Bluetooth</a> developer guide.</p> {@more} @@ -25,6 +25,6 @@ permission. </p> <p class="note"><strong>Note:</strong> -Not all Android devices are guaranteed to have Bluetooth functionality.</p> +Not all Android-powered devices provide Bluetooth functionality.</p> </BODY> </HTML> diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java index 2fa283493c67..68cb2bcca9ca 100644 --- a/core/java/android/content/SyncManager.java +++ b/core/java/android/content/SyncManager.java @@ -1128,12 +1128,45 @@ public class SyncManager implements OnAccountsUpdateListener { pw.print(formatTime(status.initialFailureTime)); pw.print(" lastTime="); pw.println(formatTime(status.lastFailureTime)); - pw.print(" message: "); pw.println(status.lastFailureMesg); + int errCode = status.getLastFailureMesgAsInt(0); + pw.print(" message: "); pw.println( + getLastFailureMessage(errCode) + " (" + errCode + ")"); } } } } + private String getLastFailureMessage(int code) { + switch (code) { + case ContentResolver.SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS: + return "sync already in progress"; + + case ContentResolver.SYNC_ERROR_AUTHENTICATION: + return "authentication error"; + + case ContentResolver.SYNC_ERROR_IO: + return "I/O error"; + + case ContentResolver.SYNC_ERROR_PARSE: + return "parse error"; + + case ContentResolver.SYNC_ERROR_CONFLICT: + return "conflict error"; + + case ContentResolver.SYNC_ERROR_TOO_MANY_DELETIONS: + return "too many deletions error"; + + case ContentResolver.SYNC_ERROR_TOO_MANY_RETRIES: + return "too many retries error"; + + case ContentResolver.SYNC_ERROR_INTERNAL: + return "internal error"; + + default: + return "unknown"; + } + } + private void dumpTimeSec(PrintWriter pw, long time) { pw.print(time/1000); pw.print('.'); pw.print((time/100)%10); pw.print('s'); diff --git a/core/java/android/content/package.html b/core/java/android/content/package.html index eac679dbfd58..54086fe155ab 100644 --- a/core/java/android/content/package.html +++ b/core/java/android/content/package.html @@ -1,649 +1,31 @@ <html> -<head> -<script type="text/javascript" src="http://www.corp.google.com/style/prettify.js"></script> -<script src="http://www.corp.google.com/eng/techpubs/include/navbar.js" type="text/javascript"></script> -</head> - <body> -<p>Contains classes for accessing and publishing data -on the device. It includes three main categories of APIs: -the {@link android.content.res.Resources Resources} for -retrieving resource data associated with an application; -{@link android.content.ContentProvider Content Providers} and -{@link android.content.ContentResolver ContentResolver} for managing and -publishing persistent data associated with an application; and -the {@link android.content.pm.PackageManager Package Manager} -for finding out information about the application packages installed -on the device.</p> - -<p>In addition, the {@link android.content.Context Context} abstract class -is a base API for pulling these pieces together, allowing you to access -an application's resources and transfer data between applications.</p> - -<p>This package builds on top of the lower-level Android packages -{@link android.database}, {@link android.text}, -{@link android.graphics.drawable}, {@link android.graphics}, -{@link android.os}, and {@link android.util}.</p> - -<ol> - <li> <a href="#Resources">Resources</a> - <ol> - <li> <a href="#ResourcesTerminology">Terminology</a> - <li> <a href="#ResourcesQuickStart">Examples</a> - <ol> - <li> <a href="#UsingSystemResources">Using System Resources</a> - <li> <a href="#StringResources">String Resources</a> - <li> <a href="#ColorResources">Color Resources</a> - <li> <a href="#DrawableResources">Drawable Resources</a> - <li> <a href="#LayoutResources">Layout Resources</a> - <li> <a href="#ReferencesToResources">References to Resources</a> - <li> <a href="#ReferencesToThemeAttributes">References to Theme Attributes</a> - <li> <a href="#StyleResources">Style Resources</a> - <li> <a href="#StylesInLayoutResources">Styles in Layout Resources</a> - </ol> - </ol> -</ol> - -<a name="Resources"></a> -<h2>Resources</h2> - -<p>This topic includes a terminology list associated with resources, and a series - of examples of using resources in code. For a complete guide on creating and - using resources, see the document on <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources - and Internationalization</a>. For a reference on the supported Android resource types, - see <a href="{@docRoot}guide/topics/resources/available-resources.html">Available Resource Types</a>.</p> -<p>The Android resource system keeps track of all non-code - assets associated with an application. You use the - {@link android.content.res.Resources Resources} class to access your - application's resources; the Resources instance associated with your - application can generally be found through - {@link android.content.Context#getResources Context.getResources()}.</p> -<p>An application's resources are compiled into the application -binary at build time for you by the build system. To use a resource, -you must install it correctly in the source tree and build your -application. As part of the build process, Java symbols for each -of the resources are generated that you can use in your source -code -- this allows the compiler to verify that your application code matches -up with the resources you defined.</p> - -<p>The rest of this section is organized as a tutorial on how to -use resources in an application.</p> - -<a name="ResourcesTerminology"></a> -<h3>Terminology</h3> - -<p>The resource system brings a number of different pieces together to -form the final complete resource functionality. To help understand the -overall system, here are some brief definitions of the core concepts and -components you will encounter in using it:</p> - -<p><b>Asset</b>: A single blob of data associated with an application. This -includes Java object files, graphics (such as PNG images), XML files, etc. -These files are organized in a directory hierarchy that, during final packaging -of the application, is bundled together into a single ZIP file.</p> - -<p><b>aapt</b>: The tool that generates the final ZIP file of application -assets. In addition to collecting raw assets together, it also parses -resource definitions into binary asset data.</p> - -<p><b>Resource Table</b>: A special asset that aapt generates for you, -describing all of the resources contained in an application/package. -This file is accessed for you by the Resources class; it is not touched -directly by applications.</p> - -<p><b>Resource</b>: An entry in the Resource Table describing a single -named value. Broadly, there are two types of resources: primitives and -bags.</p> - -<p><b>Resource Identifier</b>: In the Resource Table all resources are -identified by a unique integer number. In source code (resource descriptions, -XML files, Java code) you can use symbolic names that stand as constants for -the actual resource identifier integer.</p> - -<p><b>Primitive Resource</b>: All primitive resources can be written as a -simple string, using formatting to describe a variety of primitive types -included in the resource system: integers, colors, strings, references to -other resources, etc. Complex resources, such as bitmaps and XML -describes, are stored as a primitive string resource whose value is the path -of the underlying Asset holding its actual data.</p> - -<p><b>Bag Resource</b>: A special kind of resource entry that, instead of a -simple string, holds an arbitrary list of name/value pairs. Each name is -itself a resource identifier, and each value can hold -the same kinds of string formatted data as a normal resource. Bags also -support inheritance: a bag can inherit the values from another bag, selectively -replacing or extending them to generate its own contents.</p> - -<p><b>Kind</b>: The resource kind is a way to organize resource identifiers -for various purposes. For example, drawable resources are used to -instantiate Drawable objects, so their data is a primitive resource containing -either a color constant or string path to a bitmap or XML asset. Other -common resource kinds are string (localized string primitives), color -(color primitives), layout (a string path to an XML asset describing a view -layout), and style (a bag resource describing user interface attributes). -There is also a standard "attr" resource kind, which defines the resource -identifiers to be used for naming bag items and XML attributes</p> - -<p><b>Style</b>: The name of the resource kind containing bags that are used -to supply a set of user interface attributes. For example, a TextView class may -be given a style resource that defines its text size, color, and alignment. -In a layout XML file, you associate a style with a bag using the "style" -attribute, whose value is the name of the style resource.</p> - -<p><b>Style Class</b>: Specifies a related set of attribute resources. -This data is not placed in the resource table itself, but used to generate -Java constants that make it easier for you to retrieve values out of -a style resource and/or XML tag's attributes. For example, the -Android platform defines a "View" style class that -contains all of the standard view attributes: padding, visibility, -background, etc.; when View is inflated it uses this style class to -retrieve those values from the XML file (at which point style and theme -information is applied as approriate) and load them into its instance.</p> - -<p><b>Configuration</b>: For any particular resource identifier, there may be -multiple different available values depending on the current configuration. -The configuration includes the locale (language and country), screen -orientation, screen density, etc. The current configuration is used to -select which resource values are in effect when the resource table is -loaded.</p> - -<p><b>Theme</b>: A standard style resource that supplies global -attribute values for a particular context. For example, when writing a -Activity the application developer can select a standard theme to use, such -as the Theme.White or Theme.Black styles; this style supplies information -such as the screen background image/color, default text color, button style, -text editor style, text size, etc. When inflating a layout resource, most -values for widgets (the text color, selector, background) if not explicitly -set will come from the current theme; style and attribute -values supplied in the layout can also assign their value from explicitly -named values in the theme attributes if desired.</p> - -<p><b>Overlay</b>: A resource table that does not define a new set of resources, -but instead replaces the values of resources that are in another resource table. -Like a configuration, this is applied at load time -to the resource data; it can add new configuration values (for example -strings in a new locale), replace existing values (for example change -the standard white background image to a "Hello Kitty" background image), -and modify resource bags (for example change the font size of the Theme.White -style to have an 18 pt font size). This is the facility that allows the -user to select between different global appearances of their device, or -download files with new appearances.</p> - -<a name="ResourcesQuickStart"></a> -<h3>Examples</h3> - -<p>This section gives a few quick examples you can use to make your own resources. - For more details on how to define and use resources, see <a - href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources and - Internationalization</a>. </p> - -<a name="UsingSystemResources"></a> -<h4>Using System Resources</h4> - -<p>Many resources included with the system are available to applications. -All such resources are defined under the class "android.R". For example, -you can display the standard application icon in a screen with the following -code:</p> - -<pre class="prettyprint"> -public class MyActivity extends Activity -{ - public void onStart() - { - requestScreenFeatures(FEATURE_BADGE_IMAGE); - - super.onStart(); - - setBadgeResource(android.R.drawable.sym_def_app_icon); - } -} -</pre> - -<p>In a similar way, this code will apply to your screen the standard -"green background" visual treatment defined by the system:</p> - -<pre class="prettyprint"> -public class MyActivity extends Activity -{ - public void onStart() - { - super.onStart(); - - setTheme(android.R.style.Theme_Black); - } -} -</pre> - -<a name="StringResources"></a> -<h4>String Resources</h4> - -<p>String resources are defined using an XML resource description syntax. -The file or multiple files containing these resources can be given any name -(as long as it has a .xml suffix) and placed at an appropriate location in -the source tree for the desired configuration (locale/orientation/density). - -<p>Here is a simple resource file describing a few strings:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string id="mainLabel">Hello <u>th<ignore>e</ignore>re</u>, <i>you</i> <b>Activity</b>!</string> - <string id="back">Back</string> - <string id="clear">Clear</string> -</resources> -</pre> - -<p>Typically this file will be called "strings.xml", and must be placed -in the <code>values</code> directory:</p> - -<pre> -MyApp/res/values/strings.xml -</pre> - -<p>The strings can now be retrieved by your application through the -symbol specified in the "id" attribute:</p> - -<pre class="prettyprint"> -public class MyActivity extends Activity -{ - public void onStart() - { - super.onStart(); - - String back = getResources().getString(R.string.back).toString(); - back = getString(R.string.back).toString(); // synonym - } -} -</pre> - -<p>Unlike system resources, the resource symbol (the R class) we are using -here comes from our own application's package, not android.R.</p> - -<p>Note that the "mainLabel" string is complex, including style information. -To support this, the <code>getString()</code> method returns a -<code>CharSequence</code> object that you can pass to a -<code>TextView</code> to retain those style. This is why code -must call <code>toString()</code> on the returned resource if it wants -a raw string.</p> - -<a name="ColorResources"></a> -<h4>Color Resources</h4> - -<p>Color resources are created in a way very similar to string resources, -but with the <color> resource tag. The data for these resources -must be a hex color constant of the form "#rgb", "#argb", "#rrggbb", or -"#aarrggbb". The alpha channel is 0xff (or 0xf) for opaque and 0 -for transparent.</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <color id="opaque_red">#ffff0000</color> - <color id="transparent_red">#80ff0000</color> - <color id="opaque_blue">#0000ff</color> - <color id="opaque_green">#0f0</color> -</resources> -</pre> - -<p>While color definitions could be placed in the same resource file -as the previously shown string data, usually you will place the colors in -their own file:</p> - -<pre> -MyApp/res/values/colors.xml -</pre> - -<p>The colors can now be retrieved by your application through the -symbol specified in the "id" attribute:</p> - -<pre class="prettyprint"> -public class MyActivity extends Activity -{ - public void onStart() - { - super.onStart(); - - int red = getResources().getColor(R.color.opaque_red); - } -} -</pre> - -<a name="DrawableResources"></a> -<h4>Drawable Resources</h4> - -<p>For simple drawable resources, all you need to do is place your -image in a special resource sub-directory called "drawable". Files here -are things that can be handled by an implementation of the -{@link android.graphics.drawable.Drawable Drawable} class, often bitmaps -(such as PNG images) but also various kinds of XML descriptions -for selectors, gradients, etc.</p> - -<p>The drawable files will be scanned by the -resource tool, automatically generating a resource entry for each found. -For example the file <code>res/drawable/<myimage>.<ext></code> -will result in a resource symbol named "myimage" (without the extension). Note -that these file names <em>must</em> be valid Java identifiers, and should -have only lower-case letters.</p> - -<p>For example, to use your own custom image as a badge in a screen, -you can place the image here:</p> - -<pre> -MyApp/res/drawable/my_badge.png -</pre> - -<p>The image can then be used in your code like this:</p> - -<pre class="prettyprint"> -public class MyActivity extends Activity -{ - public void onStart() - { - requestScreenFeatures(FEATURE_BADGE_IMAGE); - - super.onStart(); - - setBadgeResource(R.drawable.my_badge); - } -} -</pre> - -<p>For drawables that are a single solid color, you can also define them -in a resource file very much like colors shown previously. The only -difference is that here we use the <drawable> tag to create a -drawable resource.</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <drawable id="opaque_red">#ffff0000</drawable> - <drawable id="transparent_red">#80ff0000</drawable> - <drawable id="opaque_blue">#0000ff</drawable> - <drawable id="opaque_green">#0f0</drawable> -</resources> -</pre> - -<p>These resource entries are often placed in the same resource file -as color definitions:</p> - -<pre> -MyApp/res/values/colors.xml -</pre> - -<a name="LayoutResources"></a> -<h4>Layout Resources</h4> - -<p>Layout resources describe a view hierarchy configuration that is -generated at runtime. These resources are XML files placed in the -resource directory "layout", and are how you should create the content -views inside of your screen (instead of creating them by hand) so that -they can be themed, styled, configured, and overlayed.</p> - -<p>Here is a simple layout resource consisting of a single view, a text -editor:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<root> - <EditText id="text" - android:layout_width="fill-parent" android:layout_height="fill-parent" - android:text="Hello, World!" /> -</root> -</pre> - -<p>To use this layout, it can be placed in a file like this:</p> - -<pre> -MyApp/res/layout/my_layout.xml -</pre> - -<p>The layout can then be instantiated in your screen like this:</p> - -<pre class="prettyprint"> -public class MyActivity extends Activity -{ - public void onStart() - { - super.onStart(); - setContentView(R.layout.my_layout); - } -} -</pre> - -<p>Note that there are a number of visual attributes that can be supplied -to TextView (including textSize, textColor, and textStyle) that we did -not define in the previous example; in such a sitation, the default values for -those attributes come from the theme. If we want to customize them, we -can supply them explicitly in the XML file:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<root> - <EditText id="text" - android:layout_width="match_parent" android:layout_height="match_parent" - <b>android:textSize="18" android:textColor="#008"</b> - android:text="Hello, World!" /> -</root> -</pre> - -<p>However, usually these kinds of attributes (those being attributes that -usually make sense to vary with theme or overlay) should be defined through -the theme or separate style resource. Later we will see how this is done.</p> - -<a name="ReferencesToResources"></a> -<h4>References to Resources</h4> - -<p>A value supplied in an attribute (or resource) can also be a reference to -a resource. This is often used in layout files to supply strings (so they -can be localized) and images (which exist in another file), though a reference -can be do any resource type including colors and integers.</p> - -<p>For example, if we have the previously defined color resources, we can -write a layout file that sets the text color size to be the value contained in -one of those resources:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<root> - <EditText id="text" - android:layout_width="match_parent" android:layout_height="match_parent" - <b>android:textColor="@color/opaque_red"</b> - android:text="Hello, World!" /> -</root> -</pre> - -<p>Note here the use of the '@' prefix to introduce a resource reference -- the -text following that is the name of a resource in the form -of <code>@[package:]type/name</code>. In this case we didn't need to specify -the package because we are referencing a resource in our own package. To -reference a system resource, you would need to write:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<root> - <EditText id="text" - android:layout_width="match_parent" android:layout_height="match_parent" - android:textColor="@<b>android:</b>color/opaque_red" - android:text="Hello, World!" /> -</root> -</pre> - -<p>As another example, you should always use resource references when supplying -strings in a layout file so that they can be localized:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<root> - <EditText id="text" - android:layout_width="match_parent" android:layout_height="match_parent" - android:textColor="@android:color/opaque_red" - android:text="@string/hello_world" /> -</root> -</pre> - -<p>This facility can also be used to create references between resources. -For example, we can create new drawable resources that are aliases for -existing images:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <drawable id="my_background">@android:drawable/theme2_background</drawable> -</resources> -</pre> - -<a name="ReferencesToThemeAttributes"></a> -<h4>References to Theme Attributes</h4> - -<p>Another kind of resource value allows you to reference the value of an -attribute in the current theme. This attribute reference can <em>only</em> -be used in style resources and XML attributes; it allows you to customize the -look of UI elements by changing them to standard variations supplied by the -current theme, instead of supplying more concrete values.</p> - -<p>As an example, we can use this in our layout to set the text color to -one of the standard colors defined in the base system theme:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<root> - <EditText id="text" - android:layout_width="match_parent" android:layout_height="match_parent" - <b>android:textColor="?android:textDisabledColor"</b> - android:text="@string/hello_world" /> -</root> -</pre> - -<p>Note that this is very similar to a resource reference, except we are using -an '?' prefix instead of '@'. When you use this markup, you are supplying -the name of an attribute resource that will be looked up in the theme -- -because the resource tool knows that an attribute resource is expected, -you do not need to explicitly state the type (which would be -<code>?android:attr/android:textDisabledColor</code>).</p> - -<p>Other than using this resource identifier to find the value in the -theme instead of raw resources, the name syntax is identical to the '@' format: -<code>?[package:]type/name</code> with the type here being optional.</p> - -<a name="StyleResources"></a> -<h4>Style Resources</h4> - -<p>A style resource is a set of name/value pairs describing a group -of related attributes. There are two main uses for these resources: -defining overall visual themes, and describing a set of visual attributes -to apply to a class in a layout resource. In this section we will look -at their use to describe themes; later we will look at using them in -conjunction with layouts.</p> - -<p>Like strings, styles are defined through a resource XML file. In the -situation where we want to define a new theme, we can create a custom theme -style that inherits from one of the standard system themes:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <style id="Theme" parent="android:Theme.White"> - <item id="android:foregroundColor">#FFF8D96F</item> - <item id="android:textColor">@color/opaque_blue</item> - <item id="android:textSelectedColor">?android:textColor</item> - </style> -</resources> -</pre> - -<p>Typically these resource definitions will be placed in a file -called "styles.xml" , and must be placed in the <code>values</code> -directory:</p> - -<pre> -MyApp/res/values/styles.xml -</pre> - -<p>Similar to how we previously used a system style for an Activity theme, -you can apply this style to your Activity:</p> - -<pre class="prettyprint"> -public class MyActivity extends Activity -{ - public void onStart() - { - super.onStart(); - - setTheme(R.style.Theme); - } -} -</pre> - -<p>In the style resource shown here, we used the <code>parent</code> -attribute to specify another style resource from which it inherits -its values -- in this case the <code>Theme.White</code> system resource:</p> - -<pre> - <style id="Home" parent="android:Theme.White"> - ... - </style> -</pre> - -<p>Note, when doing this, that you must use the "android" prefix in front -to tell the compiler the namespace to look in for the resource -- -the resources you are specifying here are in your application's namespace, -not the system. This explicit namespace specification ensures that names -the application uses will not accidentally conflict with those defined by -the system.</p> - -<p>If you don't specify an explicit parent style, it will be inferred -from the style name -- everything before the final '.' in the name of the -style being defined is taken as the parent style name. Thus, to make -another style in your application that inherits from this base Theme style, -you can write:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <style id="Theme.WhiteText"> - <item id="android:foregroundColor">#FFFFFFFF</item> - <item id="android:textColor">?android:foregroundColor</item> - </style> -</resources> -</pre> - -<p>This results in the symbol <code>R.style.Theme_WhiteText</code> that -can be used in Java just like we did with <code>R.style.Theme</code> -above.</p> - -<a name="StylesInLayoutResources"></a> -<h4>Styles in Layout Resources</h4> - -<p>Often you will have a number fo views in a layout that all use the same -set of attributes, or want to allow resource overlays to modify the values of -attributes. Style resources can be used for both of these purposes, to put -attribute definitions in a single place that can be references by multiple -XML tags and modified by overlays. To do this, you simply define a -new style resource with the desired values:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <style id="SpecialText"> - <item id="android:textSize">18</item> - <item id="android:textColor">#008</item> - </style> -</resources> -</pre> - -<p>You can now apply this style to your TextView in the XML file:</p> - -<pre> -<?xml version="1.0" encoding="utf-8"?> -<root> - <EditText id="text1" <b>style="@style/SpecialText"</b> - android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="Hello, World!" /> - <EditText id="text2" <b>style="@style/SpecialText"</b> - android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="I love you all." /> -</root></pre> -<h4> </h4> +<p>Contains classes for accessing and publishing data on a device. It includes three main +categories of APIs:</p> + +<ul> + <dt>Content sharing ({@link android.content})</dt> + <dd>For sharing content between application components. The most important classes are: + <ul> + <li>{@link android.content.ContentProvider} and {@link android.content.ContentResolver} + for managing and publishing persistent data associated with an application.</li> + <li>{@link android.content.Intent} and {@link android.content.IntentFilter}, for delivering + structured messages between different application components—allowing components to initiate + other components and return results.</li> + </ul> + </dd> + + <dt>Package management ({@link android.content.pm})</dt> + <dd>For accessing information about an Android package (an {@code .apk}), including information +about its activities, permissions, services, signatures, and providers. The most important class for +accessing this information is {@link android.content.pm.PackageManager}.</dd> + + <dt>Resource management ({@link android.content.res})</dt> + <dd>For retrieving resource data associated with an application, such as strings, drawables, +media, and device configuration details. The most important class for accessing this data is {@link +android.content.res.Resources}.</dd> +</ul> </body> </html> diff --git a/core/java/android/content/pm/package.html b/core/java/android/content/pm/package.html index 766b7dd9b296..b18adb2f7770 100644 --- a/core/java/android/content/pm/package.html +++ b/core/java/android/content/pm/package.html @@ -1,7 +1,11 @@ <HTML> <BODY> -Contains classes for accessing information about an -application package, including information about its activities, -permissions, services, signatures, and providers. +<p>Contains classes for accessing information about an +application package, including information about its activities, +permissions, services, signatures, and providers.</p> +<p>Most of the information about an application package is defined by its manifest file. For +more information, see the <a +href="{@docRoot}guide/topics/manifest/guide/topics/manifest/manifest-intro.html">AndroidManifest.xml +File</a> documentation.</p> </BODY> </HTML>
\ No newline at end of file diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 29bb004cf0ac..85f64d058bde 100755 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -45,8 +45,28 @@ import libcore.icu.NativePluralRules; /** * Class for accessing an application's resources. This sits on top of the - * asset manager of the application (accessible through getAssets()) and - * provides a higher-level API for getting typed data from the assets. + * asset manager of the application (accessible through {@link #getAssets}) and + * provides a high-level API for getting typed data from the assets. + * + * <p>The Android resource system keeps track of all non-code assets associated with an + * application. You can use this class to access your application's resources. You can generally + * acquire the {@link android.content.res.Resources} instance associated with your application + * with {@link android.content.Context#getResources getResources()}.</p> + * + * <p>The Android SDK tools compile your application's resources into the application binary + * at build time. To use a resource, you must install it correctly in the source tree (inside + * your project's {@code res/} directory) and build your application. As part of the build + * process, the SDK tools generate symbols for each resource, which you can use in your application + * code to access the resources.</p> + * + * <p>Using application resources makes it easy to update various characteristics of your + * application without modifying code, and—by providing sets of alternative + * resources—enables you to optimize your application for a variety of device configurations + * (such as for different languages and screen sizes). This is an important aspect of developing + * Android applications that are compatible on different types of devices.</p> + * + * <p>For more information about using resources, see the documentation about <a + * href="{@docRoot}guide/topics/resources/index.html">Application Resources</a>.</p> */ public class Resources { static final String TAG = "Resources"; diff --git a/core/java/android/content/res/package.html b/core/java/android/content/res/package.html index bb09dc7c12ee..0af94a42f0e9 100644 --- a/core/java/android/content/res/package.html +++ b/core/java/android/content/res/package.html @@ -1,8 +1,12 @@ <HTML> <BODY> -Contains classes for accessing application resources, -such as raw asset files, colors, drawables, media or other other files -in the package, plus important device configuration details -(orientation, input types, etc.) that affect how the application may behave. +<p>Contains classes for accessing application resources, +such as raw asset files, colors, drawables, media or other other files +in the package, plus important device configuration details +(orientation, input types, etc.) that affect how the application may behave.</p> + +<p>For more information, see the <a +href="{@docRoot}guide/topics/resources/index.html">Application Resources</a> developer guide.</p> +{@more} </BODY> </HTML>
\ No newline at end of file diff --git a/core/java/android/database/DefaultDatabaseErrorHandler.java b/core/java/android/database/DefaultDatabaseErrorHandler.java index 61337dde6c3a..a9e39c321ac2 100644 --- a/core/java/android/database/DefaultDatabaseErrorHandler.java +++ b/core/java/android/database/DefaultDatabaseErrorHandler.java @@ -16,7 +16,7 @@ package android.database; import java.io.File; -import java.util.ArrayList; +import java.util.List; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; @@ -65,7 +65,7 @@ public final class DefaultDatabaseErrorHandler implements DatabaseErrorHandler { return; } - ArrayList<Pair<String, String>> attachedDbs = null; + List<Pair<String, String>> attachedDbs = null; try { // Close the database, which will cause subsequent operations to fail. // before that, get the attached database list first. diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index b1c84a115944..b3fd9147f23c 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -40,6 +40,7 @@ import dalvik.system.BlockGuard; import java.io.File; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.List; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; @@ -416,8 +417,7 @@ public class SQLiteDatabase extends SQLiteClosable { private void lock(boolean forced) { // make sure this method is NOT being called from a 'synchronized' method if (Thread.holdsLock(this)) { - // STOPSHIP change the following line to Log.w() - throw new IllegalStateException("don't lock() while in a synchronized method"); + Log.w(TAG, "don't lock() while in a synchronized method"); } verifyDbIsOpen(); if (!forced && !mLockingEnabled) return; @@ -2505,7 +2505,7 @@ public class SQLiteDatabase extends SQLiteClosable { String lastnode = path.substring((indx != -1) ? ++indx : 0); // get list of attached dbs and for each db, get its size and pagesize - ArrayList<Pair<String, String>> attachedDbs = db.getAttachedDbs(); + List<Pair<String, String>> attachedDbs = db.getAttachedDbs(); if (attachedDbs == null) { continue; } @@ -2561,7 +2561,7 @@ public class SQLiteDatabase extends SQLiteClosable { * @return ArrayList of pairs of (database name, database file path) or null if the database * is not open. */ - public ArrayList<Pair<String, String>> getAttachedDbs() { + public List<Pair<String, String>> getAttachedDbs() { if (!isOpen()) { return null; } @@ -2614,7 +2614,7 @@ public class SQLiteDatabase extends SQLiteClosable { */ public boolean isDatabaseIntegrityOk() { verifyDbIsOpen(); - ArrayList<Pair<String, String>> attachedDbs = null; + List<Pair<String, String>> attachedDbs = null; try { attachedDbs = getAttachedDbs(); if (attachedDbs == null) { diff --git a/core/java/android/hardware/package.html b/core/java/android/hardware/package.html index 06788a6ceed9..5b04da11e4fe 100644 --- a/core/java/android/hardware/package.html +++ b/core/java/android/hardware/package.html @@ -1,5 +1,9 @@ <HTML> <BODY> -Provides support for hardware devices that may not be present on every Android device. +<p>Provides support for hardware features, such as the camera and other sensors. Be aware that +not all Android-powered devices support all hardware features, so you should declare hardware +that your application requires using the <a +href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code +<uses-feature>}</a> manifest element.</p> </BODY> </HTML> diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 255eb6c67db4..a99256f6ce80 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -219,7 +219,34 @@ import java.io.PrintWriter; public class InputMethodService extends AbstractInputMethodService { static final String TAG = "InputMethodService"; static final boolean DEBUG = false; - + + /** + * The back button will close the input window. + */ + public static final int BACK_DISPOSITION_DEFAULT = 0; // based on window + + /** + * This input method will not consume the back key. + */ + public static final int BACK_DISPOSITION_WILL_NOT_DISMISS = 1; // back + + /** + * This input method will consume the back key. + */ + public static final int BACK_DISPOSITION_WILL_DISMISS = 2; // down + + /** + * @hide + * The IME is active. It may or may not be visible. + */ + public static final int IME_ACTIVE = 0x1; + + /** + * @hide + * The IME is visible. + */ + public static final int IME_VISIBLE = 0x2; + InputMethodManager mImm; int mTheme = 0; @@ -271,6 +298,7 @@ public class InputMethodService extends AbstractInputMethodService { boolean mIsInputViewShown; int mStatusIcon; + int mBackDisposition; final Insets mTmpInsets = new Insets(); final int[] mTmpLocation = new int[2]; @@ -394,9 +422,9 @@ public class InputMethodService extends AbstractInputMethodService { showWindow(true); } // If user uses hard keyboard, IME button should always be shown. - if (!onEvaluateInputViewShown()) { - mImm.setIMEButtonVisible(mToken, true); - } + boolean showing = onEvaluateInputViewShown(); + mImm.setImeWindowStatus(mToken, IME_ACTIVE | (showing ? IME_VISIBLE : 0), + mBackDisposition); if (resultReceiver != null) { resultReceiver.send(wasVis != isInputViewShown() ? InputMethodManager.RESULT_SHOWN @@ -704,9 +732,9 @@ public class InputMethodService extends AbstractInputMethodService { hideWindow(); } // If user uses hard keyboard, IME button should always be shown. - if (!onEvaluateInputViewShown()) { - mImm.setIMEButtonVisible(mToken, true); - } + boolean showing = onEvaluateInputViewShown(); + mImm.setImeWindowStatus(mToken, IME_ACTIVE | (showing ? IME_VISIBLE : 0), + mBackDisposition); } } @@ -736,6 +764,14 @@ public class InputMethodService extends AbstractInputMethodService { return mWindow; } + public void setBackDisposition(int disposition) { + mBackDisposition = disposition; + } + + public int getBackDisposition() { + return mBackDisposition; + } + /** * Return the maximum width, in pixels, available the input method. * Input methods are positioned at the bottom of the screen and, unless @@ -1378,7 +1414,7 @@ public class InputMethodService extends AbstractInputMethodService { if (!wasVisible) { if (DEBUG) Log.v(TAG, "showWindow: showing!"); - mImm.setIMEButtonVisible(mToken, true); + mImm.setImeWindowStatus(mToken, IME_ACTIVE, mBackDisposition); onWindowShown(); mWindow.show(); } @@ -1394,7 +1430,7 @@ public class InputMethodService extends AbstractInputMethodService { } mInputViewStarted = false; mCandidatesViewStarted = false; - mImm.setIMEButtonVisible(mToken, false); + mImm.setImeWindowStatus(mToken, 0, mBackDisposition); if (mWindowVisible) { mWindow.hide(); mWindowVisible = false; diff --git a/core/java/android/inputmethodservice/package.html b/core/java/android/inputmethodservice/package.html index 164349ba9a3f..cf8e0d907e0f 100644 --- a/core/java/android/inputmethodservice/package.html +++ b/core/java/android/inputmethodservice/package.html @@ -1,6 +1,6 @@ <html> <body> -Base classes for writing input methods. These APIs are not for use by +Base classes for writing input methods (such as software keyboards). These APIs are not for use by normal applications, they are a framework specifically for writing input method components. Implementations will typically derive from {@link android.inputmethodservice.InputMethodService}. diff --git a/core/java/android/package.html b/core/java/android/package.html index 1f1be2d97e4d..a7287c51298c 100644 --- a/core/java/android/package.html +++ b/core/java/android/package.html @@ -1,10 +1,17 @@ <HTML> <BODY> -Contains the resource classes used by standard Android applications. -<p> -This package contains the resource classes that Android defines to be used in -Android applications. Third party developers can use many of them also for their applications. -To learn more about how to use these classes, and what a -resource is, see <a href="{@docRoot}guide/topics/resources/index.html">Resources and Assets</a>. +<p>Contains resource classes used by applications included in the platform and defines application +permissions for system features.</p> + +<p>You can use some resources directly from these {@link android.R} classes in your own +applications, but you should generally use only resources that you've provided directly in your +application, in order to provide a cohesive application package that has no external dependencies. +In particular, you should not use drawable resources from the {@code android} package, because they +may change between platform versions, causing unforeseen conflicts with your design. Typically, +{@link android.R.style styles} are the only resources you should use directly from these +resources.</p> + +<p>For information about using resources, see the <a +href="{@docRoot}guide/topics/resources/index.html">Application Resources</a> developer guide.</p> </BODY> -</HTML> +</HTML>
\ No newline at end of file diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 82fe7dede98d..4c1fb5b7cb2d 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -375,12 +375,29 @@ public final class MediaStore { public static final String MEDIA_TYPE = "media_type"; /** - * Constants for MEDIA_TYPE + * Constant for the {@link #MEDIA_TYPE} column indicating that file + * is not an audio, image, video or playlist file. */ public static final int MEDIA_TYPE_NONE = 0; + + /** + * Constant for the {@link #MEDIA_TYPE} column indicating that file is an image file. + */ public static final int MEDIA_TYPE_IMAGE = 1; + + /** + * Constant for the {@link #MEDIA_TYPE} column indicating that file is an audio file. + */ public static final int MEDIA_TYPE_AUDIO = 2; + + /** + * Constant for the {@link #MEDIA_TYPE} column indicating that file is an video file. + */ public static final int MEDIA_TYPE_VIDEO = 3; + + /** + * Constant for the {@link #MEDIA_TYPE} column indicating that file is an playlist file. + */ public static final int MEDIA_TYPE_PLAYLIST = 4; } } diff --git a/core/java/android/provider/package.html b/core/java/android/provider/package.html index 055b037b5d26..f34aa2b85858 100644 --- a/core/java/android/provider/package.html +++ b/core/java/android/provider/package.html @@ -1,11 +1,13 @@ <HTML> <BODY> -Provides convenience classes to access the content providers supplied by -Android. +<p>Provides convenience classes to access the content providers supplied by +Android.</p> <p>Android ships with a number of content providers that store common data such as contact informations, calendar information, and media files. These classes provide simplified methods of adding or retrieving data from these content -providers. For information about how to use a content provider, see <a -href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a>. +providers.</p> +<p>For information about how to use a content provider, see the <a +href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a> developer +guide.</p> </BODY> </HTML> diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java index 5608603daf90..115370b2f0cb 100644 --- a/core/java/android/server/BluetoothService.java +++ b/core/java/android/server/BluetoothService.java @@ -617,8 +617,6 @@ public class BluetoothService extends IBluetooth.Stub { BluetoothUuid.getServiceIdentifierFromParcelUuid( BluetoothUuid.HSP_AG), BluetoothUuid.getServiceIdentifierFromParcelUuid( - BluetoothUuid.PBAP_PSE), - BluetoothUuid.getServiceIdentifierFromParcelUuid( BluetoothUuid.ObexObjectPush), }; mAdapterSdpUuids = uuids; diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index dac3135dc322..9a6a274ade12 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -56,8 +56,6 @@ class GLES20Canvas extends HardwareCanvas { private DrawFilter mFilter; - private boolean mContextLocked; - /////////////////////////////////////////////////////////////////////////// // JNI /////////////////////////////////////////////////////////////////////////// @@ -224,33 +222,12 @@ class GLES20Canvas extends HardwareCanvas { private static native void nFinish(int renderer); @Override - public boolean acquireContext() { - if (!mContextLocked) { - nAcquireContext(mRenderer); - mContextLocked = true; - } - return mContextLocked; - } - - private static native void nAcquireContext(int renderer); - - @Override public boolean callDrawGLFunction(int drawGLFunction) { return nCallDrawGLFunction(mRenderer, drawGLFunction); } private static native boolean nCallDrawGLFunction(int renderer, int drawGLFunction); - @Override - public void releaseContext() { - if (mContextLocked) { - nReleaseContext(mRenderer); - mContextLocked = false; - } - } - - private static native void nReleaseContext(int renderer); - /////////////////////////////////////////////////////////////////////////// // Display list /////////////////////////////////////////////////////////////////////////// diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java index d24af52303d8..a17ed9d1ad0d 100644 --- a/core/java/android/view/LayoutInflater.java +++ b/core/java/android/view/LayoutInflater.java @@ -68,6 +68,7 @@ public abstract class LayoutInflater { private boolean mFactorySet; private Factory mFactory; private Factory2 mFactory2; + private Factory2 mPrivateFactory; private Filter mFilter; private final Object[] mConstructorArgs = new Object[2]; @@ -193,6 +194,7 @@ public abstract class LayoutInflater { mContext = newContext; mFactory = original.mFactory; mFactory2 = original.mFactory2; + mPrivateFactory = original.mPrivateFactory; mFilter = original.mFilter; } @@ -300,6 +302,13 @@ public abstract class LayoutInflater { } /** + * @hide for use by framework + */ + public void setPrivateFactory(Factory2 factory) { + mPrivateFactory = factory; + } + + /** * @return The {@link Filter} currently used by this LayoutInflater to restrict the set of Views * that are allowed to be inflated. */ @@ -651,6 +660,10 @@ public abstract class LayoutInflater { else if (mFactory != null) view = mFactory.onCreateView(name, mContext, attrs); else view = null; + if (view == null && mPrivateFactory != null) { + view = mPrivateFactory.onCreateView(parent, name, mContext, attrs); + } + if (view == null) { if (-1 == name.indexOf('.')) { view = onCreateView(parent, name, attrs); diff --git a/core/java/android/view/MenuInflater.java b/core/java/android/view/MenuInflater.java index ab515c9f6bbf..372ac15a45a8 100644 --- a/core/java/android/view/MenuInflater.java +++ b/core/java/android/view/MenuInflater.java @@ -228,8 +228,8 @@ public class MenuInflater { private boolean itemAdded; private int itemId; private int itemCategoryOrder; - private String itemTitle; - private String itemTitleCondensed; + private CharSequence itemTitle; + private CharSequence itemTitleCondensed; private int itemIconResId; private char itemAlphabeticShortcut; private char itemNumericShortcut; @@ -311,8 +311,8 @@ public class MenuInflater { final int category = a.getInt(com.android.internal.R.styleable.MenuItem_menuCategory, groupCategory); final int order = a.getInt(com.android.internal.R.styleable.MenuItem_orderInCategory, groupOrder); itemCategoryOrder = (category & Menu.CATEGORY_MASK) | (order & Menu.USER_MASK); - itemTitle = a.getString(com.android.internal.R.styleable.MenuItem_title); - itemTitleCondensed = a.getString(com.android.internal.R.styleable.MenuItem_titleCondensed); + itemTitle = a.getText(com.android.internal.R.styleable.MenuItem_title); + itemTitleCondensed = a.getText(com.android.internal.R.styleable.MenuItem_titleCondensed); itemIconResId = a.getResourceId(com.android.internal.R.styleable.MenuItem_icon, 0); itemAlphabeticShortcut = getShortcut(a.getString(com.android.internal.R.styleable.MenuItem_alphabeticShortcut)); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 8a95664adb38..966bd8d47789 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -163,7 +163,18 @@ public class SurfaceView extends View { boolean mUpdateWindowNeeded; boolean mReportDrawNeeded; private Translator mTranslator; - + + private final ViewTreeObserver.OnPreDrawListener mDrawListener = + new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + // reposition ourselves where the surface is + mHaveFrame = getWidth() > 0 && getHeight() > 0; + updateWindow(false, false); + return true; + } + }; + public SurfaceView(Context context) { super(context); init(); @@ -201,7 +212,9 @@ public class SurfaceView extends View { mLayout.token = getWindowToken(); mLayout.setTitle("SurfaceView"); mViewVisibility = getVisibility() == VISIBLE; - getViewTreeObserver().addOnScrollChangedListener(mScrollChangedListener); + ViewTreeObserver observer = getViewTreeObserver(); + observer.addOnScrollChangedListener(mScrollChangedListener); + observer.addOnPreDrawListener(mDrawListener); } @Override @@ -262,7 +275,9 @@ public class SurfaceView extends View { @Override protected void onDetachedFromWindow() { - getViewTreeObserver().removeOnScrollChangedListener(mScrollChangedListener); + ViewTreeObserver observer = getViewTreeObserver(); + observer.removeOnScrollChangedListener(mScrollChangedListener); + observer.removeOnPreDrawListener(mDrawListener); mRequestedVisible = false; updateWindow(false, false); mHaveFrame = false; @@ -346,9 +361,6 @@ public class SurfaceView extends View { canvas.drawColor(0, PorterDuff.Mode.CLEAR); } } - // reposition ourselves where the surface is - mHaveFrame = true; - updateWindow(false, false); super.dispatchDraw(canvas); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index aa911205877c..fc0039ea731a 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -48,7 +48,6 @@ import android.os.Message; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; import android.util.AttributeSet; @@ -1721,18 +1720,114 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility /** * View has requested the status bar to be visible (the default). * - * @see setSystemUiVisibility + * @see #setSystemUiVisibility(int) */ public static final int STATUS_BAR_VISIBLE = 0; /** * View has requested the status bar to be visible (the default). * - * @see setSystemUiVisibility + * @see #setSystemUiVisibility(int) */ public static final int STATUS_BAR_HIDDEN = 0x00000001; /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to make the status bar not expandable. Unless you also + * set {@link #STATUS_BAR_DISABLE_NOTIFICATION_ICONS}, new notifications will continue to show. + */ + public static final int STATUS_BAR_DISABLE_EXPAND = 0x00010000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to hide notification icons and scrolling ticker text. + */ + public static final int STATUS_BAR_DISABLE_NOTIFICATION_ICONS = 0x00020000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to disable incoming notification alerts. This will not block + * icons, but it will block sound, vibrating and other visual or aural notifications. + */ + public static final int STATUS_BAR_DISABLE_NOTIFICATION_ALERTS = 0x00040000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to hide only the scrolling ticker. Note that + * {@link #STATUS_BAR_DISABLE_NOTIFICATION_ICONS} implies + * {@link #STATUS_BAR_DISABLE_NOTIFICATION_TICKER}. + */ + public static final int STATUS_BAR_DISABLE_NOTIFICATION_TICKER = 0x00080000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to hide the center system info area. + */ + public static final int STATUS_BAR_DISABLE_SYSTEM_INFO = 0x00100000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to hide only the navigation buttons. Don't use this + * unless you're a special part of the system UI (i.e., setup wizard, keyguard). + * + * THIS DOES NOT DISABLE THE BACK BUTTON + */ + public static final int STATUS_BAR_DISABLE_NAVIGATION = 0x00200000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to hide only the back button. Don't use this + * unless you're a special part of the system UI (i.e., setup wizard, keyguard). + */ + public static final int STATUS_BAR_DISABLE_BACK = 0x00400000; + + /** + * @hide + * + * NOTE: This flag may only be used in subtreeSystemUiVisibility. It is masked + * out of the public fields to keep the undefined bits out of the developer's way. + * + * Flag to hide only the clock. You might use this if your activity has + * its own clock making the status bar's clock redundant. + */ + public static final int STATUS_BAR_DISABLE_CLOCK = 0x00800000; + + + /** + * @hide + */ + public static final int PUBLIC_STATUS_BAR_VISIBILITY_MASK = STATUS_BAR_HIDDEN; + + + /** * Controls the over-scroll mode for this view. * See {@link #overScrollBy(int, int, int, int, int, int, int, int, boolean)}, * {@link #OVER_SCROLL_ALWAYS}, {@link #OVER_SCROLL_IF_CONTENT_SCROLLS}, @@ -2938,13 +3033,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** - * Gets the current list of listeners for layout changes. - */ - public List<OnLayoutChangeListener> getOnLayoutChangeListeners() { - return mOnLayoutChangeListeners; - } - - /** * Returns the focus-change callback registered for this view. * * @return The callback, or null if one is not registered. @@ -3283,7 +3371,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility imm.focusIn(this); } - invalidate(); + invalidate(true); if (mOnFocusChangeListener != null) { mOnFocusChangeListener.onFocusChange(this, gainFocus); } @@ -3722,7 +3810,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility // Invalidate too, since the default behavior for views is to be // be drawn at 50% alpha rather than to change the drawable. - invalidate(); + invalidate(true); } /** @@ -5286,7 +5374,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if ((changed & GONE) != 0) { needGlobalAttributesUpdate(false); requestLayout(); - invalidate(); + invalidate(true); if (((mViewFlags & VISIBILITY_MASK) == GONE)) { if (hasFocus()) clearFocus(); @@ -5300,7 +5388,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility /* Check if the VISIBLE bit has changed */ if ((changed & INVISIBLE) != 0) { needGlobalAttributesUpdate(false); - invalidate(); + invalidate(true); if (((mViewFlags & VISIBILITY_MASK) == INVISIBLE) && hasFocus()) { // root view becoming invisible shouldn't clear focus @@ -5315,8 +5403,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if ((changed & VISIBILITY_MASK) != 0) { if (mParent instanceof ViewGroup) { - ((ViewGroup)mParent).onChildVisibilityChanged(this, (flags & VISIBILITY_MASK)); - ((View) mParent).invalidate(); + ((ViewGroup) mParent).onChildVisibilityChanged(this, (flags & VISIBILITY_MASK)); + ((View) mParent).invalidate(true); } dispatchVisibilityChanged(this, (flags & VISIBILITY_MASK)); } @@ -5328,7 +5416,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if ((changed & DRAWING_CACHE_ENABLED) != 0) { destroyDrawingCache(); mPrivateFlags &= ~DRAWING_CACHE_VALID; - invalidateParentIfAccelerated(); + invalidateParentCaches(); } if ((changed & DRAWING_CACHE_QUALITY_MASK) != 0) { @@ -5348,7 +5436,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mPrivateFlags &= ~SKIP_DRAW; } requestLayout(); - invalidate(); + invalidate(true); } if ((changed & KEEP_SCREEN_ON) != 0) { @@ -5683,13 +5771,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void setRotation(float rotation) { if (mRotation != rotation) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mRotation = rotation; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -5717,13 +5805,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void setRotationY(float rotationY) { if (mRotationY != rotationY) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mRotationY = rotationY; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -5751,13 +5839,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void setRotationX(float rotationX) { if (mRotationX != rotationX) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mRotationX = rotationX; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -5787,13 +5875,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void setScaleX(float scaleX) { if (mScaleX != scaleX) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mScaleX = scaleX; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -5823,13 +5911,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void setScaleY(float scaleY) { if (mScaleY != scaleY) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mScaleY = scaleY; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -5865,13 +5953,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public void setPivotX(float pivotX) { mPrivateFlags |= PIVOT_EXPLICITLY_SET; if (mPivotX != pivotX) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mPivotX = pivotX; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -5906,13 +5994,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public void setPivotY(float pivotY) { mPrivateFlags |= PIVOT_EXPLICITLY_SET; if (mPivotY != pivotY) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mPivotY = pivotY; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -5944,15 +6032,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void setAlpha(float alpha) { mAlpha = alpha; + invalidateParentCaches(); if (onSetAlpha((int) (alpha * 255))) { mPrivateFlags |= ALPHA_SET; // subclass is handling alpha - don't optimize rendering cache invalidation - invalidate(); + invalidate(true); } else { mPrivateFlags &= ~ALPHA_SET; invalidate(false); } - invalidateParentIfAccelerated(); } /** @@ -5993,7 +6081,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } } else { // Double-invalidation is necessary to capture view's old and new areas - invalidate(); + invalidate(true); } int width = mRight - mLeft; @@ -6009,9 +6097,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; } mPrivateFlags |= DRAWN; // force another invalidation with the new orientation - invalidate(); + invalidate(true); } mBackgroundSizeChanged = true; + invalidateParentIfNeeded(); } } @@ -6059,7 +6148,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } } else { // Double-invalidation is necessary to capture view's old and new areas - invalidate(); + invalidate(true); } int width = mRight - mLeft; @@ -6075,9 +6164,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; } mPrivateFlags |= DRAWN; // force another invalidation with the new orientation - invalidate(); + invalidate(true); } mBackgroundSizeChanged = true; + invalidateParentIfNeeded(); } } @@ -6119,7 +6209,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } } else { // Double-invalidation is necessary to capture view's old and new areas - invalidate(); + invalidate(true); } int oldWidth = mRight - mLeft; @@ -6135,9 +6225,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; } mPrivateFlags |= DRAWN; // force another invalidation with the new orientation - invalidate(); + invalidate(true); } mBackgroundSizeChanged = true; + invalidateParentIfNeeded(); } } @@ -6176,7 +6267,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } } else { // Double-invalidation is necessary to capture view's old and new areas - invalidate(); + invalidate(true); } int oldWidth = mRight - mLeft; @@ -6192,9 +6283,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mMatrixDirty = true; } mPrivateFlags |= DRAWN; // force another invalidation with the new orientation - invalidate(); + invalidate(true); } mBackgroundSizeChanged = true; + invalidateParentIfNeeded(); } } @@ -6266,13 +6358,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void setTranslationX(float translationX) { if (mTranslationX != translationX) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mTranslationX = translationX; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -6300,13 +6392,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ public void setTranslationY(float translationY) { if (mTranslationY != translationY) { + invalidateParentCaches(); // Double-invalidation is necessary to capture view's old and new areas invalidate(false); mTranslationY = translationY; mMatrixDirty = true; mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); - invalidateParentIfAccelerated(); } } @@ -6439,6 +6531,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); } + invalidateParentIfNeeded(); } } @@ -6477,6 +6570,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); } + invalidateParentIfNeeded(); } } @@ -6523,10 +6617,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility int oldY = mScrollY; mScrollX = x; mScrollY = y; - invalidateParentIfAccelerated(); + invalidateParentCaches(); onScrollChanged(mScrollX, mScrollY, oldX, oldY); if (!awakenScrollBars()) { - invalidate(); + invalidate(true); } } } @@ -6680,7 +6774,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if (invalidate) { // Invalidate to show the scrollbars - invalidate(); + invalidate(true); } if (scrollCache.state == ScrollabilityCache.OFF) { @@ -6817,11 +6911,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE); } - boolean opaque = isOpaque(); if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) || (invalidateCache && (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID) || - opaque != mLastIsOpaque || (mPrivateFlags & INVALIDATED) != INVALIDATED) { - mLastIsOpaque = opaque; + (mPrivateFlags & INVALIDATED) != INVALIDATED || isOpaque() != mLastIsOpaque) { + mLastIsOpaque = isOpaque(); mPrivateFlags &= ~DRAWN; if (invalidateCache) { mPrivateFlags |= INVALIDATED; @@ -6850,16 +6943,32 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** + * Used to indicate that the parent of this view should clear its caches. This functionality + * is used to force the parent to rebuild its display list (when hardware-accelerated), + * which is necessary when various parent-managed properties of the view change, such as + * alpha, translationX/Y, scrollX/Y, scaleX/Y, and rotation/X/Y. This method only + * clears the parent caches and does not causes an invalidate event. + * + * @hide + */ + protected void invalidateParentCaches() { + if (mParent instanceof View) { + ((View) mParent).mPrivateFlags |= INVALIDATED; + } + } + + /** * Used to indicate that the parent of this view should be invalidated. This functionality * is used to force the parent to rebuild its display list (when hardware-accelerated), * which is necessary when various parent-managed properties of the view change, such as - * alpha, translationX/Y, scrollX/Y, scaleX/Y, and rotation/X/Y. + * alpha, translationX/Y, scrollX/Y, scaleX/Y, and rotation/X/Y. This method will propagate + * an invalidation event to the parent. * * @hide */ - protected void invalidateParentIfAccelerated() { + protected void invalidateParentIfNeeded() { if (isHardwareAccelerated() && mParent instanceof View) { - ((View) mParent).invalidate(); + ((View) mParent).invalidate(true); } } @@ -7526,10 +7635,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility final int height = mBottom - mTop; final ScrollBarDrawable scrollBar = cache.scrollBar; - int size = scrollBar.getSize(false); - if (size <= 0) { - size = cache.scrollBarSize; - } final int scrollX = mScrollX; final int scrollY = mScrollY; @@ -7538,6 +7643,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility int left, top, right, bottom; if (drawHorizontalScrollBar) { + int size = scrollBar.getSize(false); + if (size <= 0) { + size = cache.scrollBarSize; + } + scrollBar.setParameters(computeHorizontalScrollRange(), computeHorizontalScrollOffset(), computeHorizontalScrollExtent(), false); @@ -7554,6 +7664,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } if (drawVerticalScrollBar) { + int size = scrollBar.getSize(true); + if (size <= 0) { + size = cache.scrollBarSize; + } + scrollBar.setParameters(computeVerticalScrollRange(), computeVerticalScrollOffset(), computeVerticalScrollExtent(), true); @@ -8023,10 +8138,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if (layerType == mLayerType) { if (layerType != LAYER_TYPE_NONE && paint != mLayerPaint) { mLayerPaint = paint == null ? new Paint() : paint; - if (mParent instanceof ViewGroup) { - ((ViewGroup) mParent).invalidate(); - } - invalidate(); + invalidateParentCaches(); + invalidate(true); } return; } @@ -8057,10 +8170,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mLayerType = layerType; mLayerPaint = mLayerType == LAYER_TYPE_NONE ? null : (paint == null ? new Paint() : paint); - if (mParent instanceof ViewGroup) { - ((ViewGroup) mParent).invalidate(); - } - invalidate(); + invalidateParentCaches(); + invalidate(true); } /** @@ -8115,11 +8226,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility // TODO: We should pass the dirty rect canvas.onPreDraw(null); + final int restoreCount = canvas.save(); + computeScroll(); canvas.translate(-mScrollX, -mScrollY); - final int restoreCount = canvas.save(); - mPrivateFlags |= DRAWN | DRAWING_CACHE_VALID; // Fast path for layouts with no backgrounds @@ -8218,6 +8329,21 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @hide */ protected void dispatchGetDisplayList() {} + + /** + * A view that is not attached or hardware accelerated cannot create a display list. + * This method checks these conditions and returns the appropriate result. + * + * @return true if view has the ability to create a display list, false otherwise. + * + * @hide + */ + public boolean canHaveDisplayList() { + if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { + return false; + } + return true; + } /** * <p>Returns a display list that can be used to draw this view again @@ -8228,7 +8354,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @hide */ public DisplayList getDisplayList() { - if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { + if (!canHaveDisplayList()) { return null; } @@ -8254,7 +8380,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility // If we're creating a new display list, make sure our parent gets invalidated // since they will need to recreate their display list to account for this // new child display list. - invalidateParentIfAccelerated(); + invalidateParentCaches(); } final HardwareCanvas canvas = mDisplayList.start(); @@ -9169,7 +9295,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility int drawn = mPrivateFlags & DRAWN; // Invalidate our old position - invalidate(); + invalidate(true); int oldWidth = mRight - mLeft; @@ -9200,7 +9326,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility // before this call to setFrame came in, thereby clearing // the DRAWN bit. mPrivateFlags |= DRAWN; - invalidate(); + invalidate(true); } // Reset drawn bit to original value (invalidate turns it off) @@ -9589,7 +9715,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } mBackgroundSizeChanged = true; - invalidate(); + invalidate(true); } /** @@ -9724,7 +9850,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if (((mPrivateFlags & SELECTED) != 0) != selected) { mPrivateFlags = (mPrivateFlags & ~SELECTED) | (selected ? SELECTED : 0); if (!selected) resetPressedState(); - invalidate(); + invalidate(true); refreshDrawableState(); dispatchSetSelected(selected); } @@ -9766,7 +9892,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public void setActivated(boolean activated) { if (((mPrivateFlags & ACTIVATED) != 0) != activated) { mPrivateFlags = (mPrivateFlags & ~ACTIVATED) | (activated ? ACTIVATED : 0); - invalidate(); + invalidate(true); refreshDrawableState(); dispatchSetActivated(activated); } @@ -10610,8 +10736,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public void startAnimation(Animation animation) { animation.setStartTime(Animation.START_ON_FIRST_FRAME); setAnimation(animation); - invalidate(); - invalidateParentIfAccelerated(); + invalidateParentCaches(); + invalidate(true); } /** @@ -10622,7 +10748,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mCurrentAnimation.detach(); } mCurrentAnimation = null; - invalidateParentIfAccelerated(); + invalidateParentIfNeeded(); } /** @@ -10807,8 +10933,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility /** */ public void dispatchSystemUiVisibilityChanged(int visibility) { + mSystemUiVisibility = visibility; if (mOnSystemUiVisibilityChangeListener != null) { - mOnSystemUiVisibilityChangeListener.onSystemUiVisibilityChange(visibility); + mOnSystemUiVisibilityChangeListener.onSystemUiVisibilityChange( + visibility & ~PUBLIC_STATUS_BAR_VISIBILITY_MASK); } } @@ -11387,6 +11515,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } } + /** @hide */ + public void hackTurnOffWindowResizeAnim(boolean off) { + mAttachInfo.mTurnOffWindowResizeAnim = off; + } + /** * Interface definition for a callback to be invoked when a key event is * dispatched to this view. The callback will be invoked before the key @@ -11653,6 +11786,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility boolean mScalingRequired; /** + * If set, ViewRoot doesn't use its lame animation for when the window resizes. + */ + boolean mTurnOffWindowResizeAnim; + + /** * Left position of this view's window */ int mWindowLeft; @@ -11947,7 +12085,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility state = FADING; // Kick off the fade animation - host.invalidate(); + host.invalidate(true); } } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 9e5b23ccca09..d0509b20134a 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -17,6 +17,7 @@ package android.view; import android.animation.LayoutTransition; +import android.view.animation.AlphaAnimation; import com.android.internal.R; import com.android.internal.util.Predicate; @@ -2262,13 +2263,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager boolean scalingRequired = false; boolean caching; int layerType = child.getLayerType(); - + + final boolean hardwareAccelerated = canvas.isHardwareAccelerated(); if ((flags & FLAG_CHILDREN_DRAWN_WITH_CACHE) == FLAG_CHILDREN_DRAWN_WITH_CACHE || (flags & FLAG_ALWAYS_DRAWN_WITH_CACHE) == FLAG_ALWAYS_DRAWN_WITH_CACHE) { caching = true; if (mAttachInfo != null) scalingRequired = mAttachInfo.mScalingRequired; } else { - caching = (layerType != LAYER_TYPE_NONE) || canvas.isHardwareAccelerated(); + caching = (layerType != LAYER_TYPE_NONE) || hardwareAccelerated; } if (a != null) { @@ -2350,7 +2352,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return more; } - if (canvas.isHardwareAccelerated()) { + if (hardwareAccelerated) { // Clear INVALIDATED flag to allow invalidation to occur during rendering, but // retain the flag's value temporarily in the mRecreateDisplayList flag child.mRecreateDisplayList = (child.mPrivateFlags & INVALIDATED) == INVALIDATED; @@ -2364,8 +2366,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager DisplayList displayList = null; Bitmap cache = null; + boolean hasDisplayList = false; if (caching) { - if (!canvas.isHardwareAccelerated()) { + if (!hardwareAccelerated) { if (layerType != LAYER_TYPE_NONE) { layerType = LAYER_TYPE_SOFTWARE; child.buildDrawingCache(true); @@ -2376,12 +2379,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager child.buildDrawingCache(true); cache = child.getDrawingCache(true); } else if (layerType == LAYER_TYPE_NONE) { - displayList = child.getDisplayList(); + // Delay getting the display list until animation-driven alpha values are + // set up and possibly passed on to the view + hasDisplayList = child.canHaveDisplayList(); } } } - final boolean hasDisplayList = displayList != null && displayList.isReady(); final boolean hasNoCache = cache == null || hasDisplayList; final int restoreTo = canvas.save(); @@ -2472,6 +2476,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } + if (hasDisplayList) { + displayList = child.getDisplayList(); + } + if (hasNoCache) { boolean layerRendered = false; if (layerType == LAYER_TYPE_HARDWARE) { @@ -2499,11 +2507,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } else { child.mPrivateFlags &= ~DIRTY_MASK; - // Skip drawing the display list into ours if we were just refreshing - // it's content; we already have a reference to it in our display list - if (mRecreateDisplayList || mLayerType != LAYER_TYPE_NONE) { - ((HardwareCanvas) canvas).drawDisplayList(displayList); - } + ((HardwareCanvas) canvas).drawDisplayList(displayList); } } } else if (cache != null) { @@ -2529,15 +2533,21 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager canvas.restoreToCount(restoreTo); if (a != null && !more) { - child.onSetAlpha(255); + if (!hardwareAccelerated && !a.getFillAfter()) { + child.onSetAlpha(255); + } finishAnimatingView(child, a); } - if (more && canvas.isHardwareAccelerated()) { + if (more && hardwareAccelerated) { // invalidation is the trigger to recreate display lists, so if we're using // display lists to render, force an invalidate to allow the animation to // continue drawing another frame invalidate(); + if (a instanceof AlphaAnimation) { + // alpha animations should cause the child to recreate its display list + child.invalidate(); + } } child.mRecreateDisplayList = false; diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index b0553c60c701..b1d509acfe79 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -772,6 +772,7 @@ public final class ViewRoot extends Handler implements ViewParent, if (!mAttachInfo.mContentInsets.equals(mPendingContentInsets)) { if (mWidth > 0 && mHeight > 0 && mSurface != null && mSurface.isValid() && + !mAttachInfo.mTurnOffWindowResizeAnim && mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled() && lp != null && !PixelFormat.formatHasAlpha(lp.format)) { @@ -903,8 +904,9 @@ public final class ViewRoot extends Handler implements ViewParent, attachInfo.mSystemUiVisibility = 0; attachInfo.mHasSystemUiListeners = false; host.dispatchCollectViewAttributes(0); - if (attachInfo.mKeepScreenOn != oldScreenOn || - attachInfo.mSystemUiVisibility != oldVis) { + if (attachInfo.mKeepScreenOn != oldScreenOn + || attachInfo.mSystemUiVisibility != oldVis + || attachInfo.mHasSystemUiListeners) { params = lp; } } @@ -987,8 +989,10 @@ public final class ViewRoot extends Handler implements ViewParent, if (attachInfo.mKeepScreenOn) { params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; } - params.systemUiVisibility = attachInfo.mSystemUiVisibility; - params.hasSystemUiListeners = attachInfo.mHasSystemUiListeners; + params.subtreeSystemUiVisibility = attachInfo.mSystemUiVisibility; + params.hasSystemUiListeners = attachInfo.mHasSystemUiListeners + || params.subtreeSystemUiVisibility != 0 + || params.systemUiVisibility != 0; } if (DEBUG_LAYOUT) { Log.i(TAG, "host=w:" + host.getMeasuredWidth() + ", h:" + @@ -1533,6 +1537,7 @@ public final class ViewRoot extends Handler implements ViewParent, int top = dirty.top; int right = dirty.right; int bottom = dirty.bottom; + canvas = surface.lockCanvas(dirty); if (left != dirty.left || top != dirty.top || right != dirty.right || @@ -1546,11 +1551,13 @@ public final class ViewRoot extends Handler implements ViewParent, Log.e(TAG, "OutOfResourcesException locking surface", e); // TODO: we should ask the window manager to do something! // for now we just do nothing + mLayoutRequested = true; // ask wm for a new surface next time. return; } catch (IllegalArgumentException e) { Log.e(TAG, "IllegalArgumentException locking surface", e); // TODO: we should ask the window manager to do something! // for now we just do nothing + mLayoutRequested = true; // ask wm for a new surface next time. return; } @@ -2854,6 +2861,9 @@ public final class ViewRoot extends Handler implements ViewParent, public void handleDispatchSystemUiVisibilityChanged(int visibility) { if (mView == null) return; + if (mAttachInfo != null) { + mAttachInfo.mSystemUiVisibility = visibility; + } mView.dispatchSystemUiVisibilityChanged(visibility); } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 491a79f1557d..c26fa933cecd 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -953,11 +953,20 @@ public interface WindowManager extends ViewManager { /** * Control the visibility of the status bar. - * @hide + * + * @see View#STATUS_BAR_VISIBLE + * @see View#STATUS_BAR_HIDDEN */ public int systemUiVisibility; /** + * @hide + * The ui visibility as requested by the views in this hierarchy. + * the combined value should be systemUiVisibility | subtreeSystemUiVisibility. + */ + public int subtreeSystemUiVisibility; + + /** * Get callbacks about the system ui visibility changing. * * TODO: Maybe there should be a bitfield of optional callbacks that we need. @@ -1046,6 +1055,7 @@ public interface WindowManager extends ViewManager { TextUtils.writeToParcel(mTitle, out, parcelableFlags); out.writeInt(screenOrientation); out.writeInt(systemUiVisibility); + out.writeInt(subtreeSystemUiVisibility); out.writeInt(hasSystemUiListeners ? 1 : 0); } @@ -1083,6 +1093,7 @@ public interface WindowManager extends ViewManager { mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); screenOrientation = in.readInt(); systemUiVisibility = in.readInt(); + subtreeSystemUiVisibility = in.readInt(); hasSystemUiListeners = in.readInt() != 0; } @@ -1212,8 +1223,10 @@ public interface WindowManager extends ViewManager { changes |= SCREEN_ORIENTATION_CHANGED; } - if (systemUiVisibility != o.systemUiVisibility) { + if (systemUiVisibility != o.systemUiVisibility + || subtreeSystemUiVisibility != o.subtreeSystemUiVisibility) { systemUiVisibility = o.systemUiVisibility; + subtreeSystemUiVisibility = o.subtreeSystemUiVisibility; changes |= SYSTEM_UI_VISIBILITY_CHANGED; } @@ -1298,6 +1311,10 @@ public interface WindowManager extends ViewManager { sb.append(" sysui=0x"); sb.append(Integer.toHexString(systemUiVisibility)); } + if (subtreeSystemUiVisibility != 0) { + sb.append(" vsysui=0x"); + sb.append(Integer.toHexString(subtreeSystemUiVisibility)); + } if (hasSystemUiListeners) { sb.append(" sysuil="); sb.append(hasSystemUiListeners); diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 7edfd7b095e7..cb67b78b8e98 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -531,9 +531,9 @@ public final class InputMethodManager { } /** @hide */ - public void setIMEButtonVisible(IBinder imeToken, boolean visible) { + public void setImeWindowStatus(IBinder imeToken, int vis, int backDisposition) { try { - mService.setIMEButtonVisible(imeToken, visible); + mService.setImeWindowStatus(imeToken, vis, backDisposition); } catch (RemoteException e) { throw new RuntimeException(e); } diff --git a/core/java/android/webkit/AccessibilityInjector.java b/core/java/android/webkit/AccessibilityInjector.java index 6bb432089c9e..db6630531d01 100644 --- a/core/java/android/webkit/AccessibilityInjector.java +++ b/core/java/android/webkit/AccessibilityInjector.java @@ -113,6 +113,11 @@ class AccessibilityInjector { * @return True if the event was processed. */ public boolean onKeyEvent(KeyEvent event) { + // We do not handle ENTER in any circumstances. + if (isEnterActionKey(event.getKeyCode())) { + return false; + } + if (event.getAction() == KeyEvent.ACTION_UP) { return mLastDownEventHandled; } @@ -367,6 +372,12 @@ class AccessibilityInjector { } } + private boolean isEnterActionKey(int keyCode) { + return keyCode == KeyEvent.KEYCODE_DPAD_CENTER + || keyCode == KeyEvent.KEYCODE_ENTER + || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER; + } + /** * Represents a web content key-binding. */ diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java index ec3c32971c26..b7ffd14cf72a 100644 --- a/core/java/android/webkit/BrowserFrame.java +++ b/core/java/android/webkit/BrowserFrame.java @@ -88,6 +88,9 @@ class BrowserFrame extends Handler { // Attached Javascript interfaces private Map<String, Object> mJSInterfaceMap; + // Key store handler when Chromium HTTP stack is used. + private KeyStoreHandler mKeyStoreHandler = null; + // message ids // a message posted when a frame loading is completed static final int FRAME_COMPLETED = 1001; @@ -1173,8 +1176,27 @@ class BrowserFrame extends Handler { } mimeType = MimeTypeMap.getSingleton().remapGenericMimeType( mimeType, url, contentDisposition); - mCallbackProxy.onDownloadStart(url, userAgent, + + if (CertTool.getCertType(mimeType) != null) { + mKeyStoreHandler = new KeyStoreHandler(mimeType); + } else { + mCallbackProxy.onDownloadStart(url, userAgent, contentDisposition, mimeType, contentLength); + } + } + + /** + * Called by JNI for Chrome HTTP stack when the Java side needs to access the data. + */ + private void didReceiveData(byte data[], int size) { + if (mKeyStoreHandler != null) mKeyStoreHandler.didReceiveData(data, size); + } + + private void didFinishLoading() { + if (mKeyStoreHandler != null) { + mKeyStoreHandler.installCert(mContext); + mKeyStoreHandler = null; + } } /** diff --git a/core/java/android/webkit/CertTool.java b/core/java/android/webkit/CertTool.java index d25d970eea88..4c534f93cd26 100644 --- a/core/java/android/webkit/CertTool.java +++ b/core/java/android/webkit/CertTool.java @@ -29,6 +29,7 @@ import android.util.Log; import java.security.KeyPair; import java.security.KeyPairGenerator; +import java.util.HashMap; class CertTool { private static final String LOGTAG = "CertTool"; @@ -39,6 +40,14 @@ class CertTool { static final String CERT = Credentials.CERTIFICATE; static final String PKCS12 = Credentials.PKCS12; + private static HashMap<String, String> sCertificateTypeMap; + static { + sCertificateTypeMap = new HashMap<String, String>(); + sCertificateTypeMap.put("application/x-x509-ca-cert", CertTool.CERT); + sCertificateTypeMap.put("application/x-x509-user-cert", CertTool.CERT); + sCertificateTypeMap.put("application/x-pkcs12", CertTool.PKCS12); + } + static String[] getKeyStrengthList() { return new String[] {"High Grade", "Medium Grade"}; } @@ -66,5 +75,9 @@ class CertTool { Credentials.getInstance().install(context, type, value); } + static String getCertType(String mimeType) { + return sCertificateTypeMap.get(mimeType); + } + private CertTool() {} } diff --git a/core/java/android/webkit/KeyStoreHandler.java b/core/java/android/webkit/KeyStoreHandler.java new file mode 100644 index 000000000000..849007e9d547 --- /dev/null +++ b/core/java/android/webkit/KeyStoreHandler.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.webkit; + +import android.content.Context; +import android.os.Handler; +import android.util.Log; + +/** + * KeyStoreHandler: class responsible for certificate installation to + * the system key store. It reads the certificates file from network + * then pass the bytes to class CertTool. + * This class is only needed if the Chromium HTTP stack is used. + */ +class KeyStoreHandler extends Handler { + private static final String LOGTAG = "KeyStoreHandler"; + + private final ByteArrayBuilder mDataBuilder = new ByteArrayBuilder(); + + private String mMimeType; + + public KeyStoreHandler(String mimeType) { + mMimeType = mimeType; + } + + /** + * Add data to the internal collection of data. + * @param data A byte array containing the content. + * @param length The length of data. + */ + public void didReceiveData(byte[] data, int length) { + synchronized (mDataBuilder) { + mDataBuilder.append(data, 0, length); + } + } + + public void installCert(Context context) { + String type = CertTool.getCertType(mMimeType); + if (type == null) return; + + // This must be synchronized so that no more data can be added + // after getByteSize returns. + synchronized (mDataBuilder) { + // In the case of downloading certificate, we will save it + // to the KeyStore and stop the current loading so that it + // will not generate a new history page + byte[] cert = new byte[mDataBuilder.getByteSize()]; + int offset = 0; + while (true) { + ByteArrayBuilder.Chunk c = mDataBuilder.getFirstChunk(); + if (c == null) break; + + if (c.mLength != 0) { + System.arraycopy(c.mArray, 0, cert, offset, c.mLength); + offset += c.mLength; + } + c.release(); + } + CertTool.addCertificate(context, type, cert); + return; + } + } +} diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java index 6d1d39ac034f..04af73877cce 100644 --- a/core/java/android/webkit/LoadListener.java +++ b/core/java/android/webkit/LoadListener.java @@ -75,14 +75,6 @@ class LoadListener extends Handler implements EventHandler { private static final int HTTP_NOT_FOUND = 404; private static final int HTTP_PROXY_AUTH = 407; - private static HashMap<String, String> sCertificateTypeMap; - static { - sCertificateTypeMap = new HashMap<String, String>(); - sCertificateTypeMap.put("application/x-x509-ca-cert", CertTool.CERT); - sCertificateTypeMap.put("application/x-x509-user-cert", CertTool.CERT); - sCertificateTypeMap.put("application/x-pkcs12", CertTool.PKCS12); - } - private static int sNativeLoaderCount; private final ByteArrayBuilder mDataBuilder = new ByteArrayBuilder(); @@ -1053,7 +1045,7 @@ class LoadListener extends Handler implements EventHandler { // This commits the headers without checking the response status code. private void commitHeaders() { - if (mIsMainPageLoader && sCertificateTypeMap.containsKey(mMimeType)) { + if (mIsMainPageLoader && CertTool.getCertType(mMimeType) != null) { // In the case of downloading certificate, we will save it to the // KeyStore in commitLoad. Do not call webcore. return; @@ -1114,7 +1106,7 @@ class LoadListener extends Handler implements EventHandler { } if (mIsMainPageLoader) { - String type = sCertificateTypeMap.get(mMimeType); + String type = CertTool.getCertType(mMimeType); if (type != null) { // This must be synchronized so that no more data can be added // after getByteSize returns. diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 1d5d08f91708..790a04023330 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -16,9 +16,6 @@ package android.webkit; -import android.view.HardwareCanvas; -import com.android.internal.R; - import android.annotation.Widget; import android.app.AlertDialog; import android.content.BroadcastReceiver; @@ -31,7 +28,6 @@ import android.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.content.res.Resources; import android.database.DataSetObserver; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -57,7 +53,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; -import android.os.SystemClock; import android.provider.Settings; import android.speech.tts.TextToSpeech; import android.text.Selection; @@ -66,6 +61,7 @@ import android.util.AttributeSet; import android.util.EventLog; import android.util.Log; import android.view.Gravity; +import android.view.HardwareCanvas; import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -92,7 +88,6 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.CheckedTextView; -import android.widget.EdgeGlow; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.OverScroller; @@ -355,6 +350,7 @@ public class WebView extends AbsoluteLayout private ZoomManager mZoomManager; private Rect mGLRectViewport = new Rect(); + private boolean mGLViewportEmpty = false; /** * Transportation object for returning WebView across thread boundaries. @@ -677,6 +673,9 @@ public class WebView extends AbsoluteLayout static final int SET_AUTOFILLABLE = 133; static final int AUTOFILL_COMPLETE = 134; + static final int SELECT_AT = 135; + static final int SCREEN_ON = 136; + private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID; private static final int LAST_PACKAGE_MSG_ID = SET_TOUCH_HIGHLIGHT_RECTS; @@ -728,7 +727,9 @@ public class WebView extends AbsoluteLayout "SET_TOUCH_HIGHLIGHT_RECTS", // = 131; "SAVE_WEBARCHIVE_FINISHED", // = 132; "SET_AUTOFILLABLE", // = 133; - "AUTOFILL_COMPLETE" // = 134; + "AUTOFILL_COMPLETE", // = 134; + "SELECT_AT", // = 135; + "SCREEN_ON" // = 136; }; // If the site doesn't use the viewport meta tag to specify the viewport, @@ -2013,13 +2014,7 @@ public class WebView extends AbsoluteLayout } private void startPrivateBrowsing() { - boolean wasPrivateBrowsingEnabled = isPrivateBrowsingEnabled(); - getSettings().setPrivateBrowsingEnabled(true); - - if (!wasPrivateBrowsingEnabled) { - loadUrl("browser:incognito"); - } } private boolean extendScroll(int y) { @@ -3740,6 +3735,10 @@ public class WebView extends AbsoluteLayout return; } + if (canvas.isHardwareAccelerated()) { + mZoomManager.setHardwareAccelerated(); + } + int saveCount = canvas.save(); if (mInOverScrollMode && !getSettings() .getUseWebViewBackgroundForOverscrollBackground()) { @@ -4077,7 +4076,8 @@ public class WebView extends AbsoluteLayout } if (canvas.isHardwareAccelerated()) { - int functor = nativeGetDrawGLFunction(mGLRectViewport, getScale(), extras); + int functor = nativeGetDrawGLFunction(mGLViewportEmpty ? null : mGLRectViewport, + getScale(), extras); ((HardwareCanvas) canvas).callDrawGLFunction(functor); } else { DrawFilter df = null; @@ -5161,16 +5161,21 @@ public class WebView extends AbsoluteLayout void setGLRectViewport() { // Use the getGlobalVisibleRect() to get the intersection among the parents - getGlobalVisibleRect(mGLRectViewport); - - // Then need to invert the Y axis, just for GL - View rootView = getRootView(); - int rootViewHeight = rootView.getHeight(); - int savedWebViewBottom = mGLRectViewport.bottom; - mGLRectViewport.bottom = rootViewHeight - mGLRectViewport.top - getVisibleTitleHeight(); - mGLRectViewport.top = rootViewHeight - savedWebViewBottom; - - nativeUpdateDrawGLFunction(mGLRectViewport); + // visible == false means we're clipped - send a null rect down to indicate that + // we should not draw + boolean visible = getGlobalVisibleRect(mGLRectViewport); + if (visible) { + // Then need to invert the Y axis, just for GL + View rootView = getRootView(); + int rootViewHeight = rootView.getHeight(); + int savedWebViewBottom = mGLRectViewport.bottom; + mGLRectViewport.bottom = rootViewHeight - mGLRectViewport.top - getVisibleTitleHeight(); + mGLRectViewport.top = rootViewHeight - savedWebViewBottom; + mGLViewportEmpty = false; + } else { + mGLViewportEmpty = true; + } + nativeUpdateDrawGLFunction(mGLViewportEmpty ? null : mGLRectViewport); } /** @@ -6830,7 +6835,7 @@ public class WebView extends AbsoluteLayout previouslyFocusedRect); } else { result = super.requestFocus(direction, previouslyFocusedRect); - if (mWebViewCore.getSettings().getNeedInitialFocus()) { + if (mWebViewCore.getSettings().getNeedInitialFocus() && !isInTouchMode()) { // For cases such as GMail, where we gain focus from a direction, // we want to move to the first available link. // FIXME: If there are no visible links, we may not want to @@ -7462,6 +7467,10 @@ public class WebView extends AbsoluteLayout doMotionUp(msg.arg1, msg.arg2); break; + case SCREEN_ON: + setKeepScreenOn(msg.arg1 == 1); + break; + case SHOW_FULLSCREEN: { View view = (View) msg.obj; int npp = msg.arg1; @@ -7600,6 +7609,10 @@ public class WebView extends AbsoluteLayout } break; + case SELECT_AT: + nativeSelectAt(msg.arg1, msg.arg2); + break; + default: super.handleMessage(msg); break; @@ -7957,24 +7970,6 @@ public class WebView extends AbsoluteLayout cursorData()); } - /* - * Called from JNI when the cursor has moved. This method - * sends a message to the WebCore requesting the given - * nodePtr in the given framePrt to be selected which will - * result in firing an accessibility event announing its - * content. - * - * Note: Accessibility support. - */ - @SuppressWarnings("unused") - // called from JNI - private void sendMoveSelection(int framePtr, int nodePtr) { - if (AccessibilityManager.getInstance(mContext).isEnabled() - && mAccessibilityInjector != null) { - mWebViewCore.sendMessage(EventHub.MOVE_SELECTION, framePtr, nodePtr); - } - } - /** * Called by JNI to send a message to the webcore thread that the user * touched the webpage. @@ -8286,6 +8281,7 @@ public class WebView extends AbsoluteLayout private native Point nativeSelectableText(); private native void nativeSelectAll(); private native void nativeSelectBestAt(Rect rect); + private native void nativeSelectAt(int x, int y); private native int nativeSelectionX(); private native int nativeSelectionY(); private native int nativeFindIndex(); diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 0992079b464e..3bde0002e3aa 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -188,14 +188,9 @@ final class WebViewCore { // Allow us to use up to our memory class value before V8's GC kicks in. // These values have been determined by experimentation. mLowMemoryUsageThresholdMb = manager.getLargeMemoryClass(); - // If things get crazy, allow V8 to use up to 3 times our memory class, or a third of the - // device's total available memory, whichever is smaller. This value must be no less - // than the low memory threshold. - // At that point V8 will start attempting more aggressive garbage collection. - mHighMemoryUsageThresholdMb = Math.max(Math.min(mLowMemoryUsageThresholdMb * 3, - (int) (memInfo.availMem / 3) >> 20), mLowMemoryUsageThresholdMb); + mHighMemoryUsageThresholdMb = (int) (mLowMemoryUsageThresholdMb * 1.5); // Avoid constant V8 GC when memory usage equals to working set estimate. - mHighUsageDeltaMb = 1; + mHighUsageDeltaMb = mLowMemoryUsageThresholdMb / 32; // Send a message to initialize the WebViewCore. Message init = sWebCoreHandler.obtainMessage( @@ -641,18 +636,6 @@ final class WebViewCore { */ private native String nativeModifySelection(int direction, int granularity); - /** - * Moves the selection to given node i.e. selects that node. - * - * Note: Accessibility support. - * - * @param framePtr Pointer to the frame containing the node to be selected. - * @param nodePtr Pointer to the node to be selected. - * - * @return The selection string. - */ - private native String nativeMoveSelection(int framePtr, int nodePtr); - // EventHub for processing messages private final EventHub mEventHub; // WebCore thread handler @@ -1018,9 +1001,6 @@ final class WebViewCore { static final int PROXY_CHANGED = 193; - // accessibility support - static final int MOVE_SELECTION = 194; - // private message ids private static final int DESTROY = 200; @@ -1439,12 +1419,6 @@ final class WebViewCore { modifiedSelectionString).sendToTarget(); break; - case MOVE_SELECTION: - String movedSelectionString = nativeMoveSelection(msg.arg1, msg.arg2); - mWebView.mPrivateHandler.obtainMessage(WebView.SELECTION_STRING_CHANGED, - movedSelectionString).sendToTarget(); - break; - case LISTBOX_CHOICES: SparseBooleanArray choices = (SparseBooleanArray) msg.obj; @@ -2575,6 +2549,15 @@ final class WebViewCore { } // called by JNI + private void keepScreenOn(boolean screenOn) { + if (mWebView != null) { + Message message = mWebView.mPrivateHandler.obtainMessage(WebView.SCREEN_ON); + message.arg1 = screenOn ? 1 : 0; + message.sendToTarget(); + } + } + + // called by JNI private Class<?> getPluginClass(String libName, String clsName) { if (mWebView == null) { @@ -2714,6 +2697,14 @@ final class WebViewCore { hMode, vMode).sendToTarget(); } + // called by JNI + @SuppressWarnings("unused") + private void selectAt(int x, int y) { + if (mWebView != null) { + mWebView.mPrivateHandler.obtainMessage(WebView.SELECT_AT, x, y).sendToTarget(); + } + } + private void useMockDeviceOrientation() { mDeviceMotionAndOrientationManager.useMock(); } diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java index b47fe86ec6ce..efbcd5811db8 100644 --- a/core/java/android/webkit/ZoomManager.java +++ b/core/java/android/webkit/ZoomManager.java @@ -183,6 +183,9 @@ class ZoomManager { private ScaleGestureDetector mScaleDetector; private boolean mPinchToZoomAnimating = false; + private boolean mHardwareAccelerated = false; + private boolean mInHWAcceleratedZoom = false; + public ZoomManager(WebView webView, CallbackProxy callbackProxy) { mWebView = webView; mCallbackProxy = callbackProxy; @@ -384,6 +387,10 @@ class ZoomManager { scale = getReadingLevelScale(); } + if (mHardwareAccelerated) { + mInHWAcceleratedZoom = true; + } + setZoomScale(scale, reflowText); if (oldScale != mActualScale) { @@ -447,8 +454,18 @@ class ZoomManager { - titleHeight, mWebView.getViewHeight(), Math.round(mWebView.getContentHeight() * zoomScale)) + titleHeight) + mWebView.getScrollY(); - canvas.translate(tx, ty); - canvas.scale(zoomScale, zoomScale); + if (mHardwareAccelerated) { + mWebView.updateScrollCoordinates(mWebView.getScrollX() - tx, mWebView.getScrollY() - ty); + setZoomScale(zoomScale, false); + + if (mZoomScale == 0) { + // We've reached the end of the zoom animation. + mInHWAcceleratedZoom = false; + } + } else { + canvas.translate(tx, ty); + canvas.scale(zoomScale, zoomScale); + } } public boolean isZoomAnimating() { @@ -493,12 +510,14 @@ class ZoomManager { mActualScale = scale; mInvActualScale = 1 / scale; - if (!mWebView.drawHistory()) { + if (!mWebView.drawHistory() && !mInHWAcceleratedZoom) { // If history Picture is drawn, don't update scroll. They will // be updated when we get out of that mode. // update our scroll so we don't appear to jump // i.e. keep the center of the doc in the center of the view + // If this is part of a zoom on a HW accelerated canvas, we + // have already updated the scroll so don't do it again. int oldX = mWebView.getScrollX(); int oldY = mWebView.getScrollY(); float ratio = scale * oldInvScale; @@ -1020,4 +1039,8 @@ class ZoomManager { return null; } } + + public void setHardwareAccelerated() { + mHardwareAccelerated = true; + } } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 6d66bbc96c7b..3f38f2eec581 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -2358,7 +2358,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } if (mScrollY != 0) { mScrollY = 0; - invalidateParentIfAccelerated(); + invalidateParentCaches(); finishGlows(); invalidate(); } @@ -2735,7 +2735,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te if (mScrollY != 0) { mScrollY = 0; - invalidateParentIfAccelerated(); + invalidateParentCaches(); finishGlows(); invalidate(); } @@ -2954,7 +2954,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te // Coming back to 'real' list scrolling incrementalDeltaY = -newScroll; mScrollY = 0; - invalidateParentIfAccelerated(); + invalidateParentIfNeeded(); // No need to do all this work if we're not going to move anyway if (incrementalDeltaY != 0) { @@ -3248,7 +3248,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { mScrollY = scrollY; - invalidateParentIfAccelerated(); + invalidateParentIfNeeded(); if (clampedY) { // Velocity is broken by hitting the limit; don't start a fling off of this. @@ -4467,15 +4467,14 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } /** - * If there is a selection returns true. - * Otherwise resurrects the selection and returns false. + * If there is a selection returns false. + * Otherwise resurrects the selection and returns true if resurrected. */ - boolean ensureSelectionOnMovementKey() { + boolean resurrectSelectionIfNeeded() { if (mSelectedPosition < 0) { - resurrectSelection(); - return false; + return resurrectSelection(); } - return true; + return false; } /** @@ -5289,12 +5288,15 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te /** * Called back when the adapter connects to the RemoteViewsService. */ - public void onRemoteAdapterConnected() { + public boolean onRemoteAdapterConnected() { if (mRemoteAdapter != mAdapter) { setAdapter(mRemoteAdapter); + return false; } else if (mRemoteAdapter != null) { mRemoteAdapter.superNotifyDataSetChanged(); + return true; } + return false; } /** diff --git a/core/java/android/widget/AdapterViewAnimator.java b/core/java/android/widget/AdapterViewAnimator.java index b505c850f8ad..190c0fc40907 100644 --- a/core/java/android/widget/AdapterViewAnimator.java +++ b/core/java/android/widget/AdapterViewAnimator.java @@ -54,6 +54,12 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> int mWhichChild = 0; /** + * The index of the child to restore after the asynchronous connection from the + * RemoteViewsAdapter has been. + */ + private int mRestoreWhichChild = -1; + + /** * Whether or not the first view(s) should be animated in */ boolean mAnimateFirstTime = true; @@ -274,6 +280,10 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> * @param whichChild the index of the child view to display */ public void setDisplayedChild(int whichChild) { + setDisplayedChild(whichChild, true); + } + + private void setDisplayedChild(int whichChild, boolean animate) { if (mAdapter != null) { mWhichChild = whichChild; if (whichChild >= getWindowSize()) { @@ -284,7 +294,7 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> boolean hasFocus = getFocusedChild() != null; // This will clear old focus if we had it - showOnly(mWhichChild); + showOnly(mWhichChild, animate); if (hasFocus) { // Try to retake focus if we had it requestFocus(FOCUS_FORWARD); @@ -780,19 +790,15 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> // set mWhichChild mWhichChild = ss.whichChild; - setDisplayedChild(mWhichChild); - } - - /** - * Shows only the specified child. The other displays Views exit the screen - * with the {@link #getOutAnimation() out animation} and the specified child - * enters the screen with the {@link #getInAnimation() in animation}. - * - * @param childIndex The index of the child to be shown. - */ - void showOnly(int childIndex) { - final boolean animate = (!mFirstTime || mAnimateFirstTime); - showOnly(childIndex, animate); + // When using RemoteAdapters, the async connection process can lead to + // onRestoreInstanceState to be called before setAdapter(), so we need to save the previous + // values to restore the list position after we connect, and can skip setting the displayed + // child until then. + if (mRemoteViewsAdapter != null && mAdapter == null) { + mRestoreWhichChild = mWhichChild; + } else { + setDisplayedChild(mWhichChild, false); + } } /** @@ -957,12 +963,21 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> /** * Called back when the adapter connects to the RemoteViewsService. */ - public void onRemoteAdapterConnected() { + public boolean onRemoteAdapterConnected() { if (mRemoteViewsAdapter != mAdapter) { setAdapter(mRemoteViewsAdapter); + + // Restore the previous position (see onRestoreInstanceState) + if (mRestoreWhichChild > -1) { + setDisplayedChild(mRestoreWhichChild, false); + mRestoreWhichChild = -1; + } + return false; } else if (mRemoteViewsAdapter != null) { mRemoteViewsAdapter.superNotifyDataSetChanged(); + return true; } + return false; } /** @@ -992,10 +1007,4 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> */ public void fyiWillBeAdvancedByHostKThx() { } - - @Override - protected void onDetachedFromWindow() { - mAdapter = null; - super.onDetachedFromWindow(); - } } diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java index 899e8726ca3e..13a407f4e9b1 100644 --- a/core/java/android/widget/CalendarView.java +++ b/core/java/android/widget/CalendarView.java @@ -897,10 +897,13 @@ public class CalendarView extends FrameLayout { throw new IllegalArgumentException("fromDate: " + mMinDate.getTime() + " does not precede toDate: " + date.getTime()); } - int fromDateDayOfWeek = mMinDate.get(Calendar.DAY_OF_WEEK); - long diff = (fromDateDayOfWeek - mFirstDayOfWeek) * MILLIS_IN_DAY; - long refDay = mMinDate.getTimeInMillis() - diff; - return (int) ((date.getTimeInMillis() - refDay) / MILLIS_IN_WEEK); + long endTimeMillis = date.getTimeInMillis() + + date.getTimeZone().getOffset(date.getTimeInMillis()); + long startTimeMillis = mMinDate.getTimeInMillis() + + mMinDate.getTimeZone().getOffset(mMinDate.getTimeInMillis()); + long dayOffsetMillis = (mMinDate.get(Calendar.DAY_OF_WEEK) - mFirstDayOfWeek) + * MILLIS_IN_DAY; + return (int) ((endTimeMillis - startTimeMillis + dayOffsetMillis) / MILLIS_IN_WEEK); } /** @@ -1180,6 +1183,7 @@ public class CalendarView extends FrameLayout { mNumCells = mShowWeekNumber ? mDaysPerWeek + 1 : mDaysPerWeek; mWeek = weekNumber; mTempDate.setTimeInMillis(mMinDate.getTimeInMillis()); + mTempDate.add(Calendar.WEEK_OF_YEAR, mWeek); mTempDate.setFirstDayOfWeek(mFirstDayOfWeek); diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index ea868a634c0f..4a34b45e57d3 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -30,6 +30,7 @@ import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; import android.view.LayoutInflater; +import android.view.accessibility.AccessibilityEvent; import android.widget.NumberPicker.OnValueChangeListener; import java.text.ParseException; @@ -184,6 +185,8 @@ public class DatePicker extends FrameLayout { // now set the date to the adjusted one setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH), mTempDate.get(Calendar.DAY_OF_MONTH)); + updateSpinners(); + updateCalendarView(); notifyDateChanged(); } }; @@ -195,6 +198,7 @@ public class DatePicker extends FrameLayout { mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) { setDate(year, month, monthDay); + updateSpinners(); notifyDateChanged(); } }); @@ -350,6 +354,16 @@ public class DatePicker extends FrameLayout { return mIsEnabled; } + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY + | DateUtils.FORMAT_SHOW_YEAR; + String selectedDateUtterance = DateUtils.formatDateTime(mContext, + mCurrentDate.getTimeInMillis(), flags); + event.getText().add(selectedDateUtterance); + return true; + } + /** * Gets whether the {@link CalendarView} is shown. * @@ -469,6 +483,8 @@ public class DatePicker extends FrameLayout { return; } setDate(year, month, dayOfMonth); + updateSpinners(); + updateCalendarView(); notifyDateChanged(); } @@ -489,6 +505,8 @@ public class DatePicker extends FrameLayout { SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); setDate(ss.mYear, ss.mMonth, ss.mDay); + updateSpinners(); + updateCalendarView(); } /** @@ -504,6 +522,8 @@ public class DatePicker extends FrameLayout { public void init(int year, int monthOfYear, int dayOfMonth, OnDateChangedListener onDateChangedListener) { setDate(year, monthOfYear, dayOfMonth); + updateSpinners(); + updateCalendarView(); mOnDateChangedListener = onDateChangedListener; } @@ -553,8 +573,6 @@ public class DatePicker extends FrameLayout { } else if (mCurrentDate.after(mMaxDate)) { mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); } - updateSpinners(); - updateCalendarView(); } private void updateSpinners() { @@ -634,6 +652,7 @@ public class DatePicker extends FrameLayout { * Notifies the listener, if such, for a change in the selected date. */ private void notifyDateChanged() { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); if (mOnDateChangedListener != null) { mOnDateChangedListener.onDateChanged(this, getYear(), getMonth(), getDayOfMonth()); } diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index c7addcc4cb33..a84df16d2d59 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -1486,77 +1486,79 @@ public class GridView extends AbsListView { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_LEFT); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_LEFT); } break; case KeyEvent.KEYCODE_DPAD_RIGHT: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_RIGHT); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_RIGHT); } break; case KeyEvent.KEYCODE_DPAD_UP: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_UP); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_DPAD_DOWN: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; case KeyEvent.KEYCODE_DPAD_CENTER: - case KeyEvent.KEYCODE_ENTER: { - if (event.hasNoModifiers() - && event.getRepeatCount() == 0 && getChildCount() > 0) { - ensureSelectionOnMovementKey(); - keyPressed(); + case KeyEvent.KEYCODE_ENTER: + if (event.hasNoModifiers()) { + handled = resurrectSelectionIfNeeded(); + if (!handled + && event.getRepeatCount() == 0 && getChildCount() > 0) { + keyPressed(); + handled = true; + } } - return true; - } + break; case KeyEvent.KEYCODE_SPACE: if (mPopup == null || !mPopup.isShowing()) { if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP); } } break; case KeyEvent.KEYCODE_PAGE_UP: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_PAGE_DOWN: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; case KeyEvent.KEYCODE_MOVE_HOME: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_MOVE_END: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; @@ -1569,32 +1571,34 @@ public class GridView extends AbsListView { // perhaps it should be configurable (and more comprehensive). if (false) { if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && sequenceScroll(FOCUS_FORWARD); + handled = resurrectSelectionIfNeeded() + || sequenceScroll(FOCUS_FORWARD); } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = ensureSelectionOnMovementKey() && sequenceScroll(FOCUS_BACKWARD); + handled = resurrectSelectionIfNeeded() + || sequenceScroll(FOCUS_BACKWARD); } } break; } } - if (!handled) { - handled = sendToTextFilter(keyCode, count, event); + if (handled) { + return true; } - if (handled) { + if (sendToTextFilter(keyCode, count, event)) { return true; - } else { - switch (action) { - case KeyEvent.ACTION_DOWN: - return super.onKeyDown(keyCode, event); - case KeyEvent.ACTION_UP: - return super.onKeyUp(keyCode, event); - case KeyEvent.ACTION_MULTIPLE: - return super.onKeyMultiple(keyCode, count, event); - default: - return false; - } + } + + switch (action) { + case KeyEvent.ACTION_DOWN: + return super.onKeyDown(keyCode, event); + case KeyEvent.ACTION_UP: + return super.onKeyUp(keyCode, event); + case KeyEvent.ACTION_MULTIPLE: + return super.onKeyMultiple(keyCode, count, event); + default: + return false; } } diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index ff6677f5bcb5..13f0890c9d92 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -647,7 +647,7 @@ public class HorizontalScrollView extends FrameLayout { if (!mScroller.isFinished()) { mScrollX = scrollX; mScrollY = scrollY; - invalidateParentIfAccelerated(); + invalidateParentIfNeeded(); if (clampedX) { mScroller.springBack(mScrollX, mScrollY, 0, getScrollRange(), 0, 0); } diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index 444a163d385d..8116a1237112 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -190,6 +190,7 @@ public class ListPopupWindow { public ListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { mContext = context; mPopup = new PopupWindow(context, attrs, defStyleAttr, defStyleRes); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); } /** @@ -576,7 +577,6 @@ public class ListPopupWindow { } mPopup.setWindowLayoutMode(widthSpec, heightSpec); - mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); mPopup.setClipToScreenEnabled(true); // use outside touchable to dismiss drop down when touching outside of it, so @@ -774,7 +774,7 @@ public class ListPopupWindow { } /** - * Filter key down events. By forwarding key up events to this function, + * Filter key down events. By forwarding key down events to this function, * views using non-modal ListPopupWindow can have it handle key selection of items. * * @param keyCode keyCode param passed to the host view's onKeyDown diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index a107c600b62f..12a0ebf254e0 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -2081,25 +2081,35 @@ public class ListView extends AbsListView { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: if (event.hasNoModifiers()) { - if (ensureSelectionOnMovementKey()) { + handled = resurrectSelectionIfNeeded(); + if (!handled) { while (count-- > 0) { - handled |= arrowScroll(FOCUS_UP); + if (arrowScroll(FOCUS_UP)) { + handled = true; + } else { + break; + } } } } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_DPAD_DOWN: if (event.hasNoModifiers()) { - if (ensureSelectionOnMovementKey()) { + handled = resurrectSelectionIfNeeded(); + if (!handled) { while (count-- > 0) { - handled |= arrowScroll(FOCUS_DOWN); + if (arrowScroll(FOCUS_DOWN)) { + handled = true; + } else { + break; + } } } } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; @@ -2117,19 +2127,22 @@ public class ListView extends AbsListView { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_ENTER: - if (mItemCount > 0 && event.getRepeatCount() == 0) { - ensureSelectionOnMovementKey(); - keyPressed(); + if (event.hasNoModifiers()) { + handled = resurrectSelectionIfNeeded(); + if (!handled + && event.getRepeatCount() == 0 && getChildCount() > 0) { + keyPressed(); + handled = true; + } } - handled = true; break; case KeyEvent.KEYCODE_SPACE: if (mPopup == null || !mPopup.isShowing()) { if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP); } handled = true; } @@ -2137,29 +2150,29 @@ public class ListView extends AbsListView { case KeyEvent.KEYCODE_PAGE_UP: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_PAGE_DOWN: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; case KeyEvent.KEYCODE_MOVE_HOME: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_MOVE_END: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; @@ -2172,35 +2185,35 @@ public class ListView extends AbsListView { // perhaps it should be configurable (and more comprehensive). if (false) { if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_UP); } } break; } } - if (!handled) { - handled = sendToTextFilter(keyCode, count, event); + if (handled) { + return true; } - if (handled) { + if (sendToTextFilter(keyCode, count, event)) { return true; - } else { - switch (action) { - case KeyEvent.ACTION_DOWN: - return super.onKeyDown(keyCode, event); + } - case KeyEvent.ACTION_UP: - return super.onKeyUp(keyCode, event); + switch (action) { + case KeyEvent.ACTION_DOWN: + return super.onKeyDown(keyCode, event); - case KeyEvent.ACTION_MULTIPLE: - return super.onKeyMultiple(keyCode, count, event); + case KeyEvent.ACTION_UP: + return super.onKeyUp(keyCode, event); - default: // shouldn't happen - return false; - } + case KeyEvent.ACTION_MULTIPLE: + return super.onKeyMultiple(keyCode, count, event); + + default: // shouldn't happen + return false; } } diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index c5161bcb6c1f..c5b1caae79d4 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -623,7 +623,11 @@ public class NumberPicker extends LinearLayout { hideInputControls(); return true; } - if (isEventInInputText(event)) { + if (isEventInViewHitRect(event, mInputText) + || (!mIncrementButton.isShown() + && isEventInViewHitRect(event, mIncrementButton)) + || (!mDecrementButton.isShown() + && isEventInViewHitRect(event, mDecrementButton))) { mAdjustScrollerOnUpEvent = false; setDrawSelectorWheel(true); hideInputControls(); @@ -708,7 +712,7 @@ public class NumberPicker extends LinearLayout { public boolean dispatchTouchEvent(MotionEvent event) { int action = event.getActionMasked(); if ((action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) - && !isEventInInputText(event)) { + && !isEventInViewHitRect(event, mInputText)) { removeAllCallbacks(); } return super.dispatchTouchEvent(event); @@ -1177,10 +1181,10 @@ public class NumberPicker extends LinearLayout { } /** - * @return If the <code>event</code> is in the input text. + * @return If the <code>event</code> is in the <code>view</code>. */ - private boolean isEventInInputText(MotionEvent event) { - mInputText.getHitRect(mTempRect); + private boolean isEventInViewHitRect(MotionEvent event, View view) { + view.getHitRect(mTempRect); return mTempRect.contains((int) event.getX(), (int) event.getY()); } diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java index f329a3e9eb30..0a48febaed82 100644 --- a/core/java/android/widget/RemoteViewsAdapter.java +++ b/core/java/android/widget/RemoteViewsAdapter.java @@ -48,7 +48,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback private static final String TAG = "RemoteViewsAdapter"; // The max number of items in the cache - private static final int sDefaultCacheSize = 36; + private static final int sDefaultCacheSize = 40; // The delay (in millis) to wait until attempting to unbind from a service after a request. // This ensures that we don't stay continually bound to the service and that it can be destroyed // if we need the memory elsewhere in the system. @@ -65,6 +65,9 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback private WeakReference<RemoteAdapterConnectionCallback> mCallback; private FixedSizeRemoteViewsCache mCache; + // A flag to determine whether we should notify data set changed after we connect + private boolean mNotifyDataSetChangedAfterOnServiceConnected = false; + // The set of requested views that are to be notified when the associated RemoteViews are // loaded. private RemoteViewsFrameLayoutRefSet mRequestedViews; @@ -79,7 +82,10 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback * are actually connected to/disconnected from their actual services. */ public interface RemoteAdapterConnectionCallback { - public void onRemoteAdapterConnected(); + /** + * @return whether the adapter was set or not. + */ + public boolean onRemoteAdapterConnected(); public void onRemoteAdapterDisconnected(); } @@ -93,7 +99,8 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback */ private static class RemoteViewsAdapterServiceConnection extends IRemoteViewsAdapterConnection.Stub { - private boolean mConnected; + private boolean mIsConnected; + private boolean mIsConnecting; private WeakReference<RemoteViewsAdapter> mAdapter; private IRemoteViewsFactory mRemoteViewsFactory; @@ -101,27 +108,58 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback mAdapter = new WeakReference<RemoteViewsAdapter>(adapter); } - public void onServiceConnected(IBinder service) { + public synchronized void bind(Context context, int appWidgetId, Intent intent) { + if (!mIsConnecting) { + try { + final AppWidgetManager mgr = AppWidgetManager.getInstance(context); + mgr.bindRemoteViewsService(appWidgetId, intent, asBinder()); + mIsConnecting = true; + } catch (Exception e) { + Log.e("RemoteViewsAdapterServiceConnection", "bind(): " + e.getMessage()); + mIsConnecting = false; + mIsConnected = false; + } + } + } + + public synchronized void unbind(Context context, int appWidgetId, Intent intent) { + try { + final AppWidgetManager mgr = AppWidgetManager.getInstance(context); + mgr.unbindRemoteViewsService(appWidgetId, intent); + mIsConnecting = false; + } catch (Exception e) { + Log.e("RemoteViewsAdapterServiceConnection", "unbind(): " + e.getMessage()); + mIsConnecting = false; + mIsConnected = false; + } + } + + public synchronized void onServiceConnected(IBinder service) { mRemoteViewsFactory = IRemoteViewsFactory.Stub.asInterface(service); - mConnected = true; - // Queue up work that we need to do for the callback to run + // Remove any deferred unbind messages final RemoteViewsAdapter adapter = mAdapter.get(); if (adapter == null) return; + + // Queue up work that we need to do for the callback to run adapter.mWorkerQueue.post(new Runnable() { @Override public void run() { - // Call back to the service to notify that the data set changed - if (adapter.mServiceConnection.isConnected()) { + if (adapter.mNotifyDataSetChangedAfterOnServiceConnected) { + // Handle queued notifyDataSetChanged() if necessary + adapter.onNotifyDataSetChanged(); + } else { IRemoteViewsFactory factory = adapter.mServiceConnection.getRemoteViewsFactory(); try { - // call back to the factory - factory.onDataSetChanged(); + if (!factory.isCreated()) { + // We only call onDataSetChanged() if this is the factory was just + // create in response to this bind + factory.onDataSetChanged(); + } } catch (Exception e) { Log.e(TAG, "Error notifying factory of data set changed in " + "onServiceConnected(): " + e.getMessage()); - e.printStackTrace(); // Return early to prevent anything further from being notified // (effectively nothing has changed) @@ -130,13 +168,16 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback // Request meta data so that we have up to date data when calling back to // the remote adapter callback - adapter.updateMetaData(); + adapter.updateTemporaryMetaData(); - // Post a runnable to call back to the view to notify it that we have - // connected + // Notify the host that we've connected adapter.mMainQueue.post(new Runnable() { @Override public void run() { + synchronized (adapter.mCache) { + adapter.mCache.commitTemporaryMetaData(); + } + final RemoteAdapterConnectionCallback callback = adapter.mCallback.get(); if (callback != null) { @@ -145,35 +186,44 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } }); } + + // Enqueue unbind message + adapter.enqueueDeferredUnbindServiceMessage(); + mIsConnected = true; + mIsConnecting = false; } }); } - public void onServiceDisconnected() { - mConnected = false; + public synchronized void onServiceDisconnected() { + mIsConnected = false; + mIsConnecting = false; mRemoteViewsFactory = null; + // Clear the main/worker queues final RemoteViewsAdapter adapter = mAdapter.get(); if (adapter == null) return; - // Clear the main/worker queues - adapter.mMainQueue.removeMessages(sUnbindServiceMessageType); - adapter.mMainQueue.removeMessages(sDefaultMessageType); - adapter.mWorkerQueue.removeMessages(sDefaultMessageType); + adapter.mMainQueue.post(new Runnable() { + @Override + public void run() { + // Dequeue any unbind messages + adapter.mMainQueue.removeMessages(sUnbindServiceMessageType); - final RemoteAdapterConnectionCallback callback = adapter.mCallback.get(); - if (callback != null) { - callback.onRemoteAdapterDisconnected(); - } - adapter.mCache.reset(); + final RemoteAdapterConnectionCallback callback = adapter.mCallback.get(); + if (callback != null) { + callback.onRemoteAdapterDisconnected(); + } + } + }); } - public IRemoteViewsFactory getRemoteViewsFactory() { + public synchronized IRemoteViewsFactory getRemoteViewsFactory() { return mRemoteViewsFactory; } - public boolean isConnected() { - return mConnected; + public synchronized boolean isConnected() { + return mIsConnected; } } @@ -270,7 +320,6 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback int count; int viewTypeCount; boolean hasStableIds; - boolean isDataDirty; // Used to determine how to construct loading views. If a loading view is not specified // by the user, then we try and load the first view, and use its height as the height for @@ -280,22 +329,31 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback int mFirstViewHeight; // A mapping from type id to a set of unique type ids - private Map<Integer, Integer> mTypeIdIndexMap; + private final HashMap<Integer, Integer> mTypeIdIndexMap = new HashMap<Integer, Integer>(); public RemoteViewsMetaData() { reset(); } + public void set(RemoteViewsMetaData d) { + synchronized (d) { + count = d.count; + viewTypeCount = d.viewTypeCount; + hasStableIds = d.hasStableIds; + setLoadingViewTemplates(d.mUserLoadingView, d.mFirstView); + } + } + public void reset() { count = 0; + // by default there is at least one dummy view type viewTypeCount = 1; hasStableIds = true; - isDataDirty = false; mUserLoadingView = null; mFirstView = null; mFirstViewHeight = 0; - mTypeIdIndexMap = new HashMap<Integer, Integer>(); + mTypeIdIndexMap.clear(); } public void setLoadingViewTemplates(RemoteViews loadingView, RemoteViews firstView) { @@ -363,17 +421,19 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback private class RemoteViewsIndexMetaData { int typeId; long itemId; + boolean isRequested; - public RemoteViewsIndexMetaData(RemoteViews v, long itemId) { - set(v, itemId); + public RemoteViewsIndexMetaData(RemoteViews v, long itemId, boolean requested) { + set(v, itemId, requested); } - public void set(RemoteViews v, long id) { + public void set(RemoteViews v, long id, boolean requested) { itemId = id; if (v != null) typeId = v.getLayoutId(); else typeId = 0; + isRequested = requested; } } @@ -385,6 +445,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback // The meta data related to all the RemoteViews, ie. count, is stable, etc. private RemoteViewsMetaData mMetaData; + private RemoteViewsMetaData mTemporaryMetaData; // The cache/mapping of position to RemoteViewsMetaData. This set is guaranteed to be // greater than or equal to the set of RemoteViews. @@ -402,6 +463,10 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback // The set of indices that have been explicitly requested by the collection view private HashSet<Integer> mRequestedIndices; + // We keep a reference of the last requested index to determine which item to prune the + // farthest items from when we hit the memory limit + private int mLastRequestedIndex; + // The set of indices to load, including those explicitly requested, as well as those // determined by the preloading algorithm to be prefetched private HashSet<Integer> mLoadIndices; @@ -418,7 +483,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback private int mMaxCount; private int mMaxCountSlack; private static final float sMaxCountSlackPercent = 0.75f; - private static final int sMaxMemoryUsage = 1024 * 1024; + private static final int sMaxMemoryLimitInBytes = 2 * 1024 * 1024; public FixedSizeRemoteViewsCache(int maxCacheSize) { mMaxCount = maxCacheSize; @@ -426,34 +491,37 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback mPreloadLowerBound = 0; mPreloadUpperBound = -1; mMetaData = new RemoteViewsMetaData(); + mTemporaryMetaData = new RemoteViewsMetaData(); mIndexMetaData = new HashMap<Integer, RemoteViewsIndexMetaData>(); mIndexRemoteViews = new HashMap<Integer, RemoteViews>(); mRequestedIndices = new HashSet<Integer>(); + mLastRequestedIndex = -1; mLoadIndices = new HashSet<Integer>(); } - public void insert(int position, RemoteViews v, long itemId) { + public void insert(int position, RemoteViews v, long itemId, boolean isRequested) { // Trim the cache if we go beyond the count if (mIndexRemoteViews.size() >= mMaxCount) { mIndexRemoteViews.remove(getFarthestPositionFrom(position)); } // Trim the cache if we go beyond the available memory size constraints - while (getRemoteViewsBitmapMemoryUsage() >= sMaxMemoryUsage) { + int pruneFromPosition = (mLastRequestedIndex > -1) ? mLastRequestedIndex : position; + while (getRemoteViewsBitmapMemoryUsage() >= sMaxMemoryLimitInBytes) { // Note: This is currently the most naive mechanism for deciding what to prune when // we hit the memory limit. In the future, we may want to calculate which index to // remove based on both its position as well as it's current memory usage, as well // as whether it was directly requested vs. whether it was preloaded by our caching // mechanism. - mIndexRemoteViews.remove(getFarthestPositionFrom(position)); + mIndexRemoteViews.remove(getFarthestPositionFrom(pruneFromPosition)); } // Update the metadata cache if (mIndexMetaData.containsKey(position)) { final RemoteViewsIndexMetaData metaData = mIndexMetaData.get(position); - metaData.set(v, itemId); + metaData.set(v, itemId, isRequested); } else { - mIndexMetaData.put(position, new RemoteViewsIndexMetaData(v, itemId)); + mIndexMetaData.put(position, new RemoteViewsIndexMetaData(v, itemId, isRequested)); } mIndexRemoteViews.put(position, v); } @@ -461,6 +529,9 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback public RemoteViewsMetaData getMetaData() { return mMetaData; } + public RemoteViewsMetaData getTemporaryMetaData() { + return mTemporaryMetaData; + } public RemoteViews getRemoteViewsAt(int position) { if (mIndexRemoteViews.containsKey(position)) { return mIndexRemoteViews.get(position); @@ -474,6 +545,14 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback return null; } + public void commitTemporaryMetaData() { + synchronized (mTemporaryMetaData) { + synchronized (mMetaData) { + mMetaData.set(mTemporaryMetaData); + } + } + } + private int getRemoteViewsBitmapMemoryUsage() { // Calculate the memory usage of all the RemoteViews bitmaps being cached int mem = 0; @@ -489,28 +568,42 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback // Find the index farthest away and remove that int maxDist = 0; int maxDistIndex = -1; + int maxDistNonRequested = 0; + int maxDistIndexNonRequested = -1; for (int i : mIndexRemoteViews.keySet()) { int dist = Math.abs(i-pos); + if (dist > maxDistNonRequested && !mIndexMetaData.get(i).isRequested) { + // maxDistNonRequested/maxDistIndexNonRequested will store the index of the + // farthest non-requested position + maxDistIndexNonRequested = i; + maxDistNonRequested = dist; + } if (dist > maxDist) { + // maxDist/maxDistIndex will store the index of the farthest position + // regardless of whether it was directly requested or not maxDistIndex = i; maxDist = dist; } } + if (maxDistIndexNonRequested > -1) { + return maxDistIndexNonRequested; + } return maxDistIndex; } public void queueRequestedPositionToLoad(int position) { + mLastRequestedIndex = position; synchronized (mLoadIndices) { mRequestedIndices.add(position); mLoadIndices.add(position); } } - public void queuePositionsToBePreloadedFromRequestedPosition(int position) { + public boolean queuePositionsToBePreloadedFromRequestedPosition(int position) { // Check if we need to preload any items if (mPreloadLowerBound <= position && position <= mPreloadUpperBound) { int center = (mPreloadUpperBound + mPreloadLowerBound) / 2; if (Math.abs(position - center) < mMaxCountSlack) { - return; + return false; } } @@ -537,8 +630,10 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback // But remove all the indices that have already been loaded and are cached mLoadIndices.removeAll(mIndexRemoteViews.keySet()); } + return true; } - public int getNextIndexToLoad() { + /** Returns the next index to load, and whether that index was directly requested or not */ + public int[] getNextIndexToLoad() { // We try and prioritize items that have been requested directly, instead // of items that are loaded as a result of the caching mechanism synchronized (mLoadIndices) { @@ -547,17 +642,17 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback Integer i = mRequestedIndices.iterator().next(); mRequestedIndices.remove(i); mLoadIndices.remove(i); - return i.intValue(); + return new int[]{i.intValue(), 1}; } // Otherwise, preload other indices as necessary if (!mLoadIndices.isEmpty()) { Integer i = mLoadIndices.iterator().next(); mLoadIndices.remove(i); - return i.intValue(); + return new int[]{i.intValue(), 0}; } - return -1; + return new int[]{-1, 0}; } } @@ -575,6 +670,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback mPreloadLowerBound = 0; mPreloadUpperBound = -1; + mLastRequestedIndex = -1; mIndexRemoteViews.clear(); mIndexMetaData.clear(); synchronized (mLoadIndices) { @@ -616,100 +712,117 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback mWorkerQueue.post(new Runnable() { @Override public void run() { - // Get the next index to load - int position = -1; - synchronized (mCache) { - position = mCache.getNextIndexToLoad(); - } - if (position > -1) { - // Load the item, and notify any existing RemoteViewsFrameLayouts - updateRemoteViews(position); + if (mServiceConnection.isConnected()) { + // Get the next index to load + int position = -1; + boolean isRequested = false; + synchronized (mCache) { + int[] res = mCache.getNextIndexToLoad(); + position = res[0]; + isRequested = res[1] > 0; + } + if (position > -1) { + // Load the item, and notify any existing RemoteViewsFrameLayouts + updateRemoteViews(position, isRequested); - // Queue up for the next one to load - loadNextIndexInBackground(); + // Queue up for the next one to load + loadNextIndexInBackground(); + } else { + // No more items to load, so queue unbind + enqueueDeferredUnbindServiceMessage(); + } } } }); } - private void updateMetaData() { - if (mServiceConnection.isConnected()) { - try { - IRemoteViewsFactory factory = mServiceConnection.getRemoteViewsFactory(); - - // get the properties/first view (so that we can use it to - // measure our dummy views) - boolean hasStableIds = factory.hasStableIds(); - int viewTypeCount = factory.getViewTypeCount(); - int count = factory.getCount(); - RemoteViews loadingView = factory.getLoadingView(); - RemoteViews firstView = null; - if ((count > 0) && (loadingView == null)) { - firstView = factory.getViewAt(0); - } - final RemoteViewsMetaData metaData = mCache.getMetaData(); - synchronized (metaData) { - metaData.hasStableIds = hasStableIds; - metaData.viewTypeCount = viewTypeCount + 1; - metaData.count = count; - metaData.setLoadingViewTemplates(loadingView, firstView); - } - } catch (Exception e) { - // print the error - Log.e(TAG, "Error in requestMetaData(): " + e.getMessage()); + private void processException(String method, Exception e) { + Log.e("RemoteViewsAdapter", "Error in " + method + ": " + e.getMessage()); - // reset any members after the failed call - final RemoteViewsMetaData metaData = mCache.getMetaData(); - synchronized (metaData) { - metaData.reset(); - } - } + // If we encounter a crash when updating, we should reset the metadata & cache and trigger + // a notifyDataSetChanged to update the widget accordingly + final RemoteViewsMetaData metaData = mCache.getMetaData(); + synchronized (metaData) { + metaData.reset(); } - } - - private void updateRemoteViews(final int position) { - if (mServiceConnection.isConnected()) { - IRemoteViewsFactory factory = mServiceConnection.getRemoteViewsFactory(); - - // Load the item information from the remote service - RemoteViews remoteViews = null; - long itemId = 0; - try { - remoteViews = factory.getViewAt(position); - itemId = factory.getItemId(position); - } catch (Throwable t) { - Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + t.getMessage()); - t.printStackTrace(); - - // Return early to prevent additional work in re-centering the view cache, and - // swapping from the loading view - return; + synchronized (mCache) { + mCache.reset(); + } + mMainQueue.post(new Runnable() { + @Override + public void run() { + superNotifyDataSetChanged(); } + }); + } - if (remoteViews == null) { - // If a null view was returned, we break early to prevent it from getting - // into our cache and causing problems later. The effect is that the child at this - // position will remain as a loading view until it is updated. - Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + " null RemoteViews " + - "returned from RemoteViewsFactory."); - return; + private void updateTemporaryMetaData() { + IRemoteViewsFactory factory = mServiceConnection.getRemoteViewsFactory(); + + try { + // get the properties/first view (so that we can use it to + // measure our dummy views) + boolean hasStableIds = factory.hasStableIds(); + int viewTypeCount = factory.getViewTypeCount(); + int count = factory.getCount(); + RemoteViews loadingView = factory.getLoadingView(); + RemoteViews firstView = null; + if ((count > 0) && (loadingView == null)) { + firstView = factory.getViewAt(0); } - synchronized (mCache) { - // Cache the RemoteViews we loaded - mCache.insert(position, remoteViews, itemId); - - // Notify all the views that we have previously returned for this index that - // there is new data for it. - final RemoteViews rv = remoteViews; - final int typeId = mCache.getMetaDataAt(position).typeId; - mMainQueue.post(new Runnable() { - @Override - public void run() { - mRequestedViews.notifyOnRemoteViewsLoaded(position, rv, typeId); - enqueueDeferredUnbindServiceMessage(); - } - }); + final RemoteViewsMetaData tmpMetaData = mCache.getTemporaryMetaData(); + synchronized (tmpMetaData) { + tmpMetaData.hasStableIds = hasStableIds; + // We +1 because the base view type is the loading view + tmpMetaData.viewTypeCount = viewTypeCount + 1; + tmpMetaData.count = count; + tmpMetaData.setLoadingViewTemplates(loadingView, firstView); } + } catch (Exception e) { + processException("updateMetaData", e); + } + } + + private void updateRemoteViews(final int position, boolean isRequested) { + if (!mServiceConnection.isConnected()) return; + IRemoteViewsFactory factory = mServiceConnection.getRemoteViewsFactory(); + + // Load the item information from the remote service + RemoteViews remoteViews = null; + long itemId = 0; + try { + remoteViews = factory.getViewAt(position); + itemId = factory.getItemId(position); + } catch (Exception e) { + Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + e.getMessage()); + + // Return early to prevent additional work in re-centering the view cache, and + // swapping from the loading view + return; + } + + if (remoteViews == null) { + // If a null view was returned, we break early to prevent it from getting + // into our cache and causing problems later. The effect is that the child at this + // position will remain as a loading view until it is updated. + Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + " null RemoteViews " + + "returned from RemoteViewsFactory."); + return; + } + synchronized (mCache) { + // Cache the RemoteViews we loaded + mCache.insert(position, remoteViews, itemId, isRequested); + + // Notify all the views that we have previously returned for this index that + // there is new data for it. + final RemoteViews rv = remoteViews; + final int typeId = mCache.getMetaDataAt(position).typeId; + mMainQueue.post(new Runnable() { + @Override + public void run() { + mRequestedViews.notifyOnRemoteViewsLoaded(position, rv, typeId); + } + }); } } @@ -718,7 +831,6 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } public int getCount() { - requestBindService(); final RemoteViewsMetaData metaData = mCache.getMetaData(); synchronized (metaData) { return metaData.count; @@ -731,7 +843,6 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } public long getItemId(int position) { - requestBindService(); synchronized (mCache) { if (mCache.containsMetaDataAt(position)) { return mCache.getMetaDataAt(position).itemId; @@ -741,7 +852,6 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } public int getItemViewType(int position) { - requestBindService(); int typeId = 0; synchronized (mCache) { if (mCache.containsMetaDataAt(position)) { @@ -773,13 +883,23 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } public View getView(int position, View convertView, ViewGroup parent) { - requestBindService(); - if (mServiceConnection.isConnected()) { - // "Request" an index so that we can queue it for loading, initiate subsequent - // preloading, etc. - synchronized (mCache) { + // "Request" an index so that we can queue it for loading, initiate subsequent + // preloading, etc. + synchronized (mCache) { + boolean isInCache = mCache.containsRemoteViewAt(position); + boolean isConnected = mServiceConnection.isConnected(); + boolean hasNewItems = false; + + if (!isConnected) { + // Requesting bind service will trigger a super.notifyDataSetChanged(), which will + // in turn trigger another request to getView() + requestBindService(); + } else { // Queue up other indices to be preloaded based on this position - mCache.queuePositionsToBePreloadedFromRequestedPosition(position); + hasNewItems = mCache.queuePositionsToBePreloadedFromRequestedPosition(position); + } + + if (isInCache) { View convertViewChild = null; int convertViewTypeId = 0; RemoteViewsFrameLayout layout = null; @@ -792,51 +912,47 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback // Second, we try and retrieve the RemoteViews from the cache, returning a loading // view and queueing it to be loaded if it has not already been loaded. - if (mCache.containsRemoteViewAt(position)) { - Context context = parent.getContext(); - RemoteViews rv = mCache.getRemoteViewsAt(position); - int typeId = mCache.getMetaDataAt(position).typeId; - - // Reuse the convert view where possible - if (layout != null) { - if (convertViewTypeId == typeId) { - rv.reapply(context, convertViewChild); - return layout; - } - } - - // Otherwise, create a new view to be returned - View newView = rv.apply(context, parent); - newView.setTagInternal(com.android.internal.R.id.rowTypeId, new Integer(typeId)); - if (layout != null) { - layout.removeAllViews(); - } else { - layout = new RemoteViewsFrameLayout(context); + Context context = parent.getContext(); + RemoteViews rv = mCache.getRemoteViewsAt(position); + int typeId = mCache.getMetaDataAt(position).typeId; + + // Reuse the convert view where possible + if (layout != null) { + if (convertViewTypeId == typeId) { + rv.reapply(context, convertViewChild); + return layout; } - layout.addView(newView); - return layout; + layout.removeAllViews(); } else { - // If the cache does not have the RemoteViews at this position, then create a - // loading view and queue the actual position to be loaded in the background - RemoteViewsFrameLayout loadingView = null; - final RemoteViewsMetaData metaData = mCache.getMetaData(); - synchronized (metaData) { - loadingView = metaData.createLoadingView(position, convertView, parent); - } + layout = new RemoteViewsFrameLayout(context); + } - mRequestedViews.add(position, loadingView); - mCache.queueRequestedPositionToLoad(position); - loadNextIndexInBackground(); + // Otherwise, create a new view to be returned + View newView = rv.apply(context, parent); + newView.setTagInternal(com.android.internal.R.id.rowTypeId, new Integer(typeId)); + layout.addView(newView); + if (hasNewItems) loadNextIndexInBackground(); - return loadingView; + return layout; + } else { + // If the cache does not have the RemoteViews at this position, then create a + // loading view and queue the actual position to be loaded in the background + RemoteViewsFrameLayout loadingView = null; + final RemoteViewsMetaData metaData = mCache.getMetaData(); + synchronized (metaData) { + loadingView = metaData.createLoadingView(position, convertView, parent); } + + mRequestedViews.add(position, loadingView); + mCache.queueRequestedPositionToLoad(position); + loadNextIndexInBackground(); + + return loadingView; } } - return new View(parent.getContext()); } public int getViewTypeCount() { - requestBindService(); final RemoteViewsMetaData metaData = mCache.getMetaData(); synchronized (metaData) { return metaData.viewTypeCount; @@ -844,7 +960,6 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } public boolean hasStableIds() { - requestBindService(); final RemoteViewsMetaData metaData = mCache.getMetaData(); synchronized (metaData) { return metaData.hasStableIds; @@ -855,44 +970,67 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback return getCount() <= 0; } - public void notifyDataSetChanged() { - mWorkerQueue.post(new Runnable() { + + private void onNotifyDataSetChanged() { + // Complete the actual notifyDataSetChanged() call initiated earlier + IRemoteViewsFactory factory = mServiceConnection.getRemoteViewsFactory(); + try { + factory.onDataSetChanged(); + } catch (Exception e) { + Log.e(TAG, "Error in updateNotifyDataSetChanged(): " + e.getMessage()); + + // Return early to prevent from further being notified (since nothing has + // changed) + return; + } + + // Flush the cache so that we can reload new items from the service + synchronized (mCache) { + mCache.reset(); + } + + // Re-request the new metadata (only after the notification to the factory) + updateTemporaryMetaData(); + + // Propagate the notification back to the base adapter + mMainQueue.post(new Runnable() { @Override public void run() { - // Complete the actual notifyDataSetChanged() call initiated earlier - if (mServiceConnection.isConnected()) { - IRemoteViewsFactory factory = mServiceConnection.getRemoteViewsFactory(); - try { - factory.onDataSetChanged(); - } catch (Exception e) { - Log.e(TAG, "Error in updateNotifyDataSetChanged(): " + e.getMessage()); - - // Return early to prevent from further being notified (since nothing has - // changed) - return; - } - } - - // Flush the cache so that we can reload new items from the service synchronized (mCache) { - mCache.reset(); + mCache.commitTemporaryMetaData(); } - // Re-request the new metadata (only after the notification to the factory) - updateMetaData(); - - // Propagate the notification back to the base adapter - mMainQueue.post(new Runnable() { - @Override - public void run() { - superNotifyDataSetChanged(); - } - }); + superNotifyDataSetChanged(); + enqueueDeferredUnbindServiceMessage(); } }); - // Note: we do not call super.notifyDataSetChanged() until the RemoteViewsFactory has had - // a chance to update itself and return new meta data associated with the new data. + // Reset the notify flagflag + mNotifyDataSetChangedAfterOnServiceConnected = false; + } + + public void notifyDataSetChanged() { + // Dequeue any unbind messages + mMainQueue.removeMessages(sUnbindServiceMessageType); + + // If we are not connected, queue up the notifyDataSetChanged to be handled when we do + // connect + if (!mServiceConnection.isConnected()) { + if (mNotifyDataSetChangedAfterOnServiceConnected) { + return; + } + + mNotifyDataSetChangedAfterOnServiceConnected = true; + requestBindService(); + return; + } + + mWorkerQueue.post(new Runnable() { + @Override + public void run() { + onNotifyDataSetChanged(); + } + }); } void superNotifyDataSetChanged() { @@ -904,9 +1042,8 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback boolean result = false; switch (msg.what) { case sUnbindServiceMessageType: - final AppWidgetManager mgr = AppWidgetManager.getInstance(mContext); if (mServiceConnection.isConnected()) { - mgr.unbindRemoteViewsService(mAppWidgetId, mIntent); + mServiceConnection.unbind(mContext, mAppWidgetId, mIntent); } result = true; break; @@ -917,20 +1054,19 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } private void enqueueDeferredUnbindServiceMessage() { - /* Temporarily disable delayed service unbinding // Remove any existing deferred-unbind messages mMainQueue.removeMessages(sUnbindServiceMessageType); mMainQueue.sendEmptyMessageDelayed(sUnbindServiceMessageType, sUnbindServiceDelay); - */ } private boolean requestBindService() { // Try binding the service (which will start it if it's not already running) if (!mServiceConnection.isConnected()) { - final AppWidgetManager mgr = AppWidgetManager.getInstance(mContext); - mgr.bindRemoteViewsService(mAppWidgetId, mIntent, mServiceConnection.asBinder()); + mServiceConnection.bind(mContext, mAppWidgetId, mIntent); } + // Remove any existing deferred-unbind messages + mMainQueue.removeMessages(sUnbindServiceMessageType); return mServiceConnection.isConnected(); } } diff --git a/core/java/android/widget/RemoteViewsService.java b/core/java/android/widget/RemoteViewsService.java index e5a3de28ca62..fb2c4160ecbf 100644 --- a/core/java/android/widget/RemoteViewsService.java +++ b/core/java/android/widget/RemoteViewsService.java @@ -17,11 +17,11 @@ package android.widget; import java.util.HashMap; -import java.util.Map; import android.app.Service; import android.content.Intent; import android.os.IBinder; +import android.util.Log; import android.util.Pair; import com.android.internal.widget.IRemoteViewsFactory; @@ -35,8 +35,13 @@ public abstract class RemoteViewsService extends Service { private static final String LOG_TAG = "RemoteViewsService"; - // multimap implementation for reference counting - private HashMap<Intent.FilterComparison, Pair<RemoteViewsFactory, Integer>> mRemoteViewFactories; + // Used for reference counting of RemoteViewsFactories + // Because we are now unbinding when we are not using the Service (to allow them to be + // reclaimed), the references to the factories that are created need to be stored and used when + // the service is restarted (in response to user input for example). When the process is + // destroyed, so is this static cache of RemoteViewsFactories. + private static final HashMap<Intent.FilterComparison, RemoteViewsFactory> mRemoteViewFactories = + new HashMap<Intent.FilterComparison, RemoteViewsFactory>(); private final Object mLock = new Object(); /** @@ -126,9 +131,13 @@ public abstract class RemoteViewsService extends Service { * A private proxy class for the private IRemoteViewsFactory interface through the * public RemoteViewsFactory interface. */ - private class RemoteViewsFactoryAdapter extends IRemoteViewsFactory.Stub { - public RemoteViewsFactoryAdapter(RemoteViewsFactory factory) { + private static class RemoteViewsFactoryAdapter extends IRemoteViewsFactory.Stub { + public RemoteViewsFactoryAdapter(RemoteViewsFactory factory, boolean isCreated) { mFactory = factory; + mIsCreated = isCreated; + } + public synchronized boolean isCreated() { + return mIsCreated; } public synchronized void onDataSetChanged() { mFactory.onDataSetChanged(); @@ -155,56 +164,26 @@ public abstract class RemoteViewsService extends Service { } private RemoteViewsFactory mFactory; - } - - public RemoteViewsService() { - mRemoteViewFactories = - new HashMap<Intent.FilterComparison, Pair<RemoteViewsFactory, Integer>>(); + private boolean mIsCreated; } @Override public IBinder onBind(Intent intent) { synchronized (mLock) { - // increment the reference count to the particular factory associated with this intent Intent.FilterComparison fc = new Intent.FilterComparison(intent); - Pair<RemoteViewsFactory, Integer> factoryRef = null; RemoteViewsFactory factory = null; + boolean isCreated = false; if (!mRemoteViewFactories.containsKey(fc)) { factory = onGetViewFactory(intent); - factoryRef = new Pair<RemoteViewsFactory, Integer>(factory, 1); - mRemoteViewFactories.put(fc, factoryRef); + mRemoteViewFactories.put(fc, factory); factory.onCreate(); + isCreated = false; } else { - Pair<RemoteViewsFactory, Integer> oldFactoryRef = mRemoteViewFactories.get(fc); - factory = oldFactoryRef.first; - int newRefCount = oldFactoryRef.second.intValue() + 1; - factoryRef = new Pair<RemoteViewsFactory, Integer>(oldFactoryRef.first, newRefCount); - mRemoteViewFactories.put(fc, factoryRef); - } - return new RemoteViewsFactoryAdapter(factory); - } - } - - @Override - public boolean onUnbind(Intent intent) { - synchronized (mLock) { - Intent.FilterComparison fc = new Intent.FilterComparison(intent); - if (mRemoteViewFactories.containsKey(fc)) { - // this alleviates the user's responsibility of having to clear all factories - Pair<RemoteViewsFactory, Integer> oldFactoryRef = - mRemoteViewFactories.get(fc); - int newRefCount = oldFactoryRef.second.intValue() - 1; - if (newRefCount <= 0) { - oldFactoryRef.first.onDestroy(); - mRemoteViewFactories.remove(fc); - } else { - Pair<RemoteViewsFactory, Integer> factoryRef = - new Pair<RemoteViewsFactory, Integer>(oldFactoryRef.first, newRefCount); - mRemoteViewFactories.put(fc, factoryRef); - } + factory = mRemoteViewFactories.get(fc); + isCreated = true; } + return new RemoteViewsFactoryAdapter(factory, isCreated); } - return super.onUnbind(intent); } /** diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index fc049cc14d29..d1cfcec6c1c9 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -644,7 +644,7 @@ public class ScrollView extends FrameLayout { if (!mScroller.isFinished()) { mScrollX = scrollX; mScrollY = scrollY; - invalidateParentIfAccelerated(); + invalidateParentIfNeeded(); if (clampedY) { mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, getScrollRange()); } diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java index 0baddcb97501..a92272ce1ce4 100644 --- a/core/java/android/widget/Spinner.java +++ b/core/java/android/widget/Spinner.java @@ -665,6 +665,7 @@ public class Spinner extends AbsSpinner implements OnClickListener { @Override public void show() { setWidth(Spinner.this.getWidth()); + setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED); super.show(); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); setSelection(Spinner.this.getSelectedItemPosition()); diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java index d57d5c682883..6a09d3548e79 100644 --- a/core/java/android/widget/StackView.java +++ b/core/java/android/widget/StackView.java @@ -546,14 +546,14 @@ public class StackView extends AdapterViewAnimator { private void onLayout() { if (!mFirstLayoutHappened) { - mSlideAmount = Math.round(SLIDE_UP_RATIO * getMeasuredHeight()); - mSwipeThreshold = Math.round(SWIPE_THRESHOLD_RATIO * mSlideAmount); mFirstLayoutHappened = true; - post(new Runnable() { - public void run() { - updateChildTransforms(); - } - }); + updateChildTransforms(); + } + + final int newSlideAmount = Math.round(SLIDE_UP_RATIO * getMeasuredHeight()); + if (mSlideAmount != newSlideAmount) { + mSlideAmount = newSlideAmount; + mSwipeThreshold = Math.round(SWIPE_THRESHOLD_RATIO * newSlideAmount); } if (Float.compare(mPerspectiveShiftY, mNewPerspectiveShiftY) != 0 || @@ -561,12 +561,7 @@ public class StackView extends AdapterViewAnimator { mPerspectiveShiftY = mNewPerspectiveShiftY; mPerspectiveShiftX = mNewPerspectiveShiftX; - - post(new Runnable() { - public void run() { - updateChildTransforms(); - } - }); + updateChildTransforms(); } } @@ -1120,6 +1115,8 @@ public class StackView extends AdapterViewAnimator { mNewPerspectiveShiftX = PERSPECTIVE_SHIFT_FACTOR_X * measuredWidth; mNewPerspectiveShiftY = PERSPECTIVE_SHIFT_FACTOR_Y * measuredHeight; + + // If we have extra space, we try and spread the items out if (maxWidth > 0 && count > 0 && maxWidth < childWidth) { mNewPerspectiveShiftX = measuredWidth - maxWidth; } diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java index ce4e8e5230d0..51ece3318616 100644 --- a/core/java/android/widget/TabWidget.java +++ b/core/java/android/widget/TabWidget.java @@ -141,6 +141,55 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { } /** + * {@inheritDoc} + */ + @Override + void measureHorizontal(int widthMeasureSpec, int heightMeasureSpec) { + // First measure with no constraint + final int unspecifiedWidth = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + super.measureHorizontal(unspecifiedWidth, heightMeasureSpec); + + final int count = getChildCount(); + int totalWidth = 0; + int totalCount = 0; + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + if (child.getVisibility() == GONE) { + continue; + } + final int childWidth = child.getMeasuredWidth(); + totalWidth += childWidth; + totalCount++; + } + + final int width = MeasureSpec.getSize(widthMeasureSpec); + if (totalWidth > width && totalCount > 0) { + int extraWidth = totalWidth - width; + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + if (child.getVisibility() == GONE) { + continue; + } + final int childWidth = child.getMeasuredWidth(); + final int delta = extraWidth / totalCount; + final int tabWidth = Math.max(0, childWidth - delta); + + final int tabWidthMeasureSpec = MeasureSpec.makeMeasureSpec( + tabWidth, MeasureSpec.EXACTLY); + final int tabHeightMeasureSpec = MeasureSpec.makeMeasureSpec( + child.getMeasuredHeight(), MeasureSpec.EXACTLY); + + child.measure(tabWidthMeasureSpec, tabHeightMeasureSpec); + + // Make sure the extra width is evenly distributed, avoiding int division remainder + extraWidth -= delta; + totalCount--; + } + setMeasuredDimension(width, getMeasuredHeight()); + } + } + + /** * Returns the tab indicator view at the given index. * * @param index the zero-based index of the tab indicator view to return @@ -175,6 +224,7 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { * Sets the drawable to use as a divider between the tab indicators. * @param drawable the divider drawable */ + @Override public void setDividerDrawable(Drawable drawable) { mDividerDrawable = drawable; requestLayout(); diff --git a/core/java/android/widget/TableLayout.java b/core/java/android/widget/TableLayout.java index 7f26e28b0770..842b0870eeb2 100644 --- a/core/java/android/widget/TableLayout.java +++ b/core/java/android/widget/TableLayout.java @@ -560,7 +560,7 @@ public class TableLayout extends LinearLayout { if ((totalWidth > size) && (mShrinkAllColumns || mShrinkableColumns.size() > 0)) { // oops, the largest columns are wider than the row itself - // fairly redistribute the row's widh among the columns + // fairly redistribute the row's width among the columns mutateColumnsWidth(mShrinkableColumns, mShrinkAllColumns, size, totalWidth); } else if ((totalWidth < size) && (mStretchAllColumns || mStretchableColumns.size() > 0)) { // if we have some space left, we distribute it among the diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index fedda686b712..10ec6ca5899e 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -3320,7 +3320,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } else if (actionCode == EditorInfo.IME_ACTION_DONE) { InputMethodManager imm = InputMethodManager.peekInstance(); - if (imm != null) { + if (imm != null && imm.isActive(this)) { imm.hideSoftInputFromWindow(getWindowToken(), 0); } return; @@ -3508,6 +3508,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private static class ErrorPopup extends PopupWindow { private boolean mAbove = false; private final TextView mView; + private int mPopupInlineErrorBackgroundId = 0; + private int mPopupInlineErrorAboveBackgroundId = 0; ErrorPopup(TextView v, int width, int height) { super(v, width, height); @@ -3518,10 +3520,23 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mAbove = above; if (above) { - mView.setBackgroundResource(com.android.internal.R.drawable.popup_inline_error_above); + mPopupInlineErrorAboveBackgroundId = + getResourceId(mPopupInlineErrorAboveBackgroundId, com.android.internal.R.styleable.Theme_errorMessageAboveBackground); } else { - mView.setBackgroundResource(com.android.internal.R.drawable.popup_inline_error); + mPopupInlineErrorBackgroundId = + getResourceId(mPopupInlineErrorBackgroundId, com.android.internal.R.styleable.Theme_errorMessageBackground); } + + mView.setBackgroundResource(above ? mPopupInlineErrorAboveBackgroundId : mPopupInlineErrorBackgroundId); + } + + private int getResourceId(int currentId, int index) { + if (currentId == 0) { + TypedArray styledAttributes = mView.getContext().obtainStyledAttributes(R.styleable.Theme); + currentId = styledAttributes.getResourceId(index, 0); + styledAttributes.recycle(); + } + return currentId; } @Override @@ -4593,9 +4608,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mInput.onKeyDown(this, (Editable)mText, keyCode, down); mInput.onKeyUp(this, (Editable)mText, keyCode, up); } - if (mError != null && !mErrorWasChanged) { - setError(null, null); - } + hideErrorIfUnchanged(); } else if (which == 2) { mMovement.onKeyUp(this, (Spannable)mText, keyCode, up); @@ -4716,13 +4729,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if (mInput != null) { - /* - * Keep track of what the error was before doing the input - * so that if an input filter changed the error, we leave - * that error showing. Otherwise, we take down whatever - * error was showing when the user types something. - */ - mErrorWasChanged = false; + resetErrorChangedFlag(); boolean doDown = true; if (otherEvent != null) { @@ -4730,9 +4737,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener beginBatchEdit(); boolean handled = mInput.onKeyOther(this, (Editable) mText, otherEvent); - if (mError != null && !mErrorWasChanged) { - setError(null, null); - } + hideErrorIfUnchanged(); doDown = false; if (handled) { return -1; @@ -4749,9 +4754,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener beginBatchEdit(); if (mInput.onKeyDown(this, (Editable) mText, keyCode, event)) { endBatchEdit(); - if (mError != null && !mErrorWasChanged) { - setError(null, null); - } + hideErrorIfUnchanged(); return 1; } endBatchEdit(); @@ -4785,6 +4788,30 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return 0; } + /** + * Resets the mErrorWasChanged flag, so that future calls to {@link #setError(CharSequence)} + * can be recorded. + * @hide + */ + public void resetErrorChangedFlag() { + /* + * Keep track of what the error was before doing the input + * so that if an input filter changed the error, we leave + * that error showing. Otherwise, we take down whatever + * error was showing when the user types something. + */ + mErrorWasChanged = false; + } + + /** + * @hide + */ + public void hideErrorIfUnchanged() { + if (mError != null && !mErrorWasChanged) { + setError(null, null); + } + } + @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (!isEnabled()) { @@ -4807,9 +4834,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mOnClickListener == null) { if (mMovement != null && mText instanceof Editable && mLayout != null && onCheckIsTextEditor()) { - InputMethodManager imm = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(this, 0); + InputMethodManager imm = InputMethodManager.peekInstance(); + if (imm != null) imm.showSoftInput(this, 0); } } } @@ -4862,7 +4888,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // No target for next focus, but make sure the IME // if this came from it. InputMethodManager imm = InputMethodManager.peekInstance(); - if (imm != null) { + if (imm != null && imm.isActive(this)) { imm.hideSoftInputFromWindow(getWindowToken(), 0); } } @@ -6272,7 +6298,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mScroller.computeScrollOffset()) { mScrollX = mScroller.getCurrX(); mScrollY = mScroller.getCurrY(); - invalidateParentIfAccelerated(); + invalidateParentCaches(); postInvalidate(); // So we draw again } } @@ -7134,10 +7160,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // the IME. Showing the IME while focus is moved using the D-Pad is a bad idea, however this // does not happen in that case (using the arrows on a bluetooth keyboard). if (focused && isTextEditable()) { - final InputMethodManager imm = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - - imm.showSoftInput(this, 0, null); + final InputMethodManager imm = InputMethodManager.peekInstance(); + if (imm != null) imm.showSoftInput(this, 0, null); } } @@ -7331,10 +7355,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Show the IME, except when selecting in read-only text. if (!mTextIsSelectable) { - final InputMethodManager imm = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - - handled |= imm.showSoftInput(this, 0, csr) && (csr != null); + final InputMethodManager imm = InputMethodManager.peekInstance(); + handled |= imm != null && imm.showSoftInput(this, 0, csr) && (csr != null); } stopSelectionActionMode(); @@ -8189,6 +8211,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * {@link android.R.id#selectAll}, {@link android.R.id#cut}, {@link android.R.id#copy} or * {@link android.R.id#paste} ids as parameters. * + * Returning false from {@link ActionMode.Callback#onCreateActionMode(ActionMode, Menu)} will + * prevent the action mode from being started. + * * Action click events should be handled by the custom implementation of * {@link ActionMode.Callback#onActionItemClicked(ActionMode, MenuItem)}. * @@ -8229,16 +8254,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener selectCurrentWord(); } - if (!mTextIsSelectable) { - // Show the IME, except when selection non editable text. - final InputMethodManager imm = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(this, 0, null); - } - ActionMode.Callback actionModeCallback = new SelectionActionModeCallback(); mSelectionActionMode = startActionMode(actionModeCallback); - return mSelectionActionMode != null; + final boolean selectionStarted = mSelectionActionMode != null; + + if (selectionStarted && !mTextIsSelectable) { + // Show the IME to be able to replace text, except when selecting non editable text. + final InputMethodManager imm = InputMethodManager.peekInstance(); + if (imm != null) imm.showSoftInput(this, 0, null); + } + + return selectionStarted; } /** @@ -8349,7 +8375,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener styledAttributes.recycle(); if (mCustomSelectionActionModeCallback != null) { - mCustomSelectionActionModeCallback.onCreateActionMode(mode, menu); + if (!mCustomSelectionActionModeCallback.onCreateActionMode(mode, menu)) { + // The custom mode can choose to cancel the action mode + return false; + } } if (menu.hasVisibleItems() || mode.getCustomView() != null) { diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index 2688b952a72a..4b37beb3bbae 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -23,9 +23,11 @@ import android.content.Context; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; +import android.text.format.DateUtils; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; +import android.view.accessibility.AccessibilityEvent; import android.widget.NumberPicker.OnValueChangeListener; import java.text.DateFormatSymbols; @@ -88,6 +90,8 @@ public class TimePicker extends FrameLayout { // callbacks private OnTimeChangedListener mOnTimeChangedListener; + private Calendar mTempCalendar; + /** * The callback interface used to indicate the time has been adjusted. */ @@ -214,12 +218,12 @@ public class TimePicker extends FrameLayout { updateAmPmControl(); // initialize to current time - Calendar calendar = Calendar.getInstance(); + mTempCalendar = Calendar.getInstance(); setOnTimeChangedListener(NO_OP_CHANGE_LISTENER); // set to current time - setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY)); - setCurrentMinute(calendar.get(Calendar.MINUTE)); + setCurrentHour(mTempCalendar.get(Calendar.HOUR_OF_DAY)); + setCurrentMinute(mTempCalendar.get(Calendar.MINUTE)); if (!isEnabled()) { setEnabled(false); @@ -406,6 +410,22 @@ public class TimePicker extends FrameLayout { return mHourSpinner.getBaseline(); } + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + int flags = DateUtils.FORMAT_SHOW_TIME; + if (mIs24HourView) { + flags |= DateUtils.FORMAT_24HOUR; + } else { + flags |= DateUtils.FORMAT_12HOUR; + } + mTempCalendar.set(Calendar.HOUR_OF_DAY, getCurrentHour()); + mTempCalendar.set(Calendar.MINUTE, getCurrentMinute()); + String selectedDateUtterance = DateUtils.formatDateTime(mContext, + mTempCalendar.getTimeInMillis(), flags); + event.getText().add(selectedDateUtterance); + return true; + } + private void updateHourControl() { if (is24HourView()) { mHourSpinner.setMinValue(0); @@ -435,9 +455,11 @@ public class TimePicker extends FrameLayout { mAmPmButton.setVisibility(View.VISIBLE); } } + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); } private void onTimeChanged() { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); if (mOnTimeChangedListener != null) { mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute()); } diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 1cc068f249ea..5fcd0c2ec7db 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -32,6 +32,6 @@ oneway interface IStatusBar void animateCollapse(); void setLightsOn(boolean on); void setMenuKeyVisible(boolean visible); - void setIMEButtonVisible(in IBinder token, boolean visible); + void setImeWindowStatus(in IBinder token, int vis, int backDisposition); } diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index d83a53497141..c62aeb04168d 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -30,9 +30,8 @@ interface IStatusBarService void setIcon(String slot, String iconPackage, int iconId, int iconLevel); void setIconVisibility(String slot, boolean visible); void removeIcon(String slot); - void setActiveWindowIsFullscreen(boolean fullscreen); void setMenuKeyVisible(boolean visible); - void setIMEButtonVisible(in IBinder token, boolean visible); + void setImeWindowStatus(in IBinder token, int vis, int backDisposition); // ---- Methods below are for use by the status bar policy services ---- // You need the STATUS_BAR_SERVICE permission diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index b2fbd3a7c1e5..611d9875d2cf 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -59,7 +59,7 @@ interface IInputMethodManager { void hideMySoftInput(in IBinder token, int flags); void showMySoftInput(in IBinder token, int flags); void updateStatusIcon(in IBinder token, String packageName, int iconId); - void setIMEButtonVisible(in IBinder token, boolean visible); + void setImeWindowStatus(in IBinder token, int vis, int backDisposition); InputMethodSubtype getCurrentInputMethodSubtype(); boolean setCurrentInputMethodSubtype(in InputMethodSubtype subtype); boolean switchToLastInputMethod(in IBinder token); diff --git a/core/java/com/android/internal/widget/EditableInputConnection.java b/core/java/com/android/internal/widget/EditableInputConnection.java index e992e7c40ab1..9f9f020b70d4 100644 --- a/core/java/com/android/internal/widget/EditableInputConnection.java +++ b/core/java/com/android/internal/widget/EditableInputConnection.java @@ -138,9 +138,9 @@ public class EditableInputConnection extends BaseInputConnection { return super.commitText(text, newCursorPosition); } - CharSequence errorBefore = mTextView.getError(); + mTextView.resetErrorChangedFlag(); boolean success = super.commitText(text, newCursorPosition); - CharSequence errorAfter = mTextView.getError(); + mTextView.hideErrorIfUnchanged(); return success; } diff --git a/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl b/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl index ae9900cc4b7c..60eca006f686 100644 --- a/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl +++ b/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl @@ -27,5 +27,6 @@ interface IRemoteViewsFactory { int getViewTypeCount(); long getItemId(int position); boolean hasStableIds(); + boolean isCreated(); } diff --git a/core/java/com/android/internal/widget/WaveView.java b/core/java/com/android/internal/widget/WaveView.java index c7a90c40bd63..d6f2e1aefdd1 100644 --- a/core/java/com/android/internal/widget/WaveView.java +++ b/core/java/com/android/internal/widget/WaveView.java @@ -83,6 +83,8 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen private DrawableHolder mUnlockHalo; private int mLockState = STATE_RESET_LOCK; private int mGrabbedState = OnTriggerListener.NO_HANDLE; + private boolean mWavesRunning; + private boolean mFinishWaves; public WaveView(Context context) { this(context, null); @@ -241,6 +243,7 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen case STATE_READY: if (DBG) Log.v(TAG, "State READY"); + mWaveTimerDelay = WAVE_DELAY; break; case STATE_START_ATTEMPT: @@ -264,14 +267,13 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen mUnlockRing.addAnimTo(DURATION, 0, "scaleY", 1.0f, true); mUnlockRing.addAnimTo(DURATION, 0, "alpha", 1.0f, true); - postDelayed(mAddWaveAction, mWaveTimerDelay); - mLockState = STATE_ATTEMPTING; break; case STATE_ATTEMPTING: if (DBG) Log.v(TAG, "State ATTEMPTING (fingerDown = " + fingerDown + ")"); if (dragDistance > mSnapRadius) { + mFinishWaves = true; // don't start any more waves. if (fingerDown) { mUnlockHalo.addAnimTo(0, 0, "x", ringX, true); mUnlockHalo.addAnimTo(0, 0, "y", ringY, true); @@ -283,6 +285,13 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen mLockState = STATE_UNLOCK_ATTEMPT; } } else { + // If waves have stopped, we need to kick them off again... + if (!mWavesRunning) { + mWavesRunning = true; + mFinishWaves = false; + // mWaveTimerDelay = WAVE_DELAY; + postDelayed(mAddWaveAction, mWaveTimerDelay); + } mUnlockHalo.addAnimTo(0, 0, "x", mouseX, true); mUnlockHalo.addAnimTo(0, 0, "y", mouseY, true); mUnlockHalo.addAnimTo(0, 0, "scaleX", 1.0f, true); @@ -429,10 +438,15 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen mCurrentWave = (mCurrentWave+1) % mWaveCount; if (DBG) Log.v(TAG, "WaveTimerDelay: start new wave in " + mWaveTimerDelay); - postDelayed(mAddWaveAction, mWaveTimerDelay); } else { mWaveTimerDelay += DELAY_INCREMENT2; } + if (mFinishWaves) { + // sentinel used to restart the waves after they've stopped + mWavesRunning = false; + } else { + postDelayed(mAddWaveAction, mWaveTimerDelay); + } } }; diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index 9de270dc4611..7a609a54d6c5 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -137,21 +137,11 @@ static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz, renderer->finish(); } -static void android_view_GLES20Canvas_acquireContext(JNIEnv* env, jobject clazz, - OpenGLRenderer* renderer) { - renderer->acquireContext(); -} - static bool android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, Functor *functor) { return renderer->callDrawGLFunction(functor); } -static void android_view_GLES20Canvas_releaseContext(JNIEnv* env, jobject clazz, - OpenGLRenderer* renderer) { - renderer->releaseContext(); -} - // ---------------------------------------------------------------------------- // State // ---------------------------------------------------------------------------- @@ -609,8 +599,6 @@ static JNINativeMethod gMethods[] = { { "nPrepare", "(IZ)V", (void*) android_view_GLES20Canvas_prepare }, { "nPrepareDirty", "(IIIIIZ)V", (void*) android_view_GLES20Canvas_prepareDirty }, { "nFinish", "(I)V", (void*) android_view_GLES20Canvas_finish }, - { "nAcquireContext", "(I)V", (void*) android_view_GLES20Canvas_acquireContext }, - { "nReleaseContext", "(I)V", (void*) android_view_GLES20Canvas_releaseContext }, { "nCallDrawGLFunction", "(II)Z", (void*) android_view_GLES20Canvas_callDrawGLFunction }, diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index e4af33f1e885..aa9c1078363b 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -296,8 +296,10 @@ static inline SkBitmap::Config convertPixelFormat(PixelFormat format) static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect) { const sp<Surface>& surface(getSurface(env, clazz)); - if (!Surface::isValid(surface)) + if (!Surface::isValid(surface)) { + doThrow(env, "java/lang/IllegalArgumentException", NULL); return 0; + } // get dirty region Region dirtyRegion; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index bd0cd3500429..a91829caeb59 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1095,7 +1095,7 @@ <permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" android:label="@string/permlab_changeComponentState" android:description="@string/permdesc_changeComponentState" - android:protectionLevel="signature" /> + android:protectionLevel="signatureOrSystem" /> <!-- Allows an application to use SurfaceFlinger's low level features --> <permission android:name="android.permission.ACCESS_SURFACE_FLINGER" diff --git a/core/res/res/anim/lock_screen_behind_enter.xml b/core/res/res/anim/lock_screen_behind_enter.xml index c01e26500e19..6c7782e74d24 100644 --- a/core/res/res/anim/lock_screen_behind_enter.xml +++ b/core/res/res/anim/lock_screen_behind_enter.xml @@ -3,21 +3,34 @@ /* ** Copyright 2007, 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 +** 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 +** 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 +** 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. */ --> -<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@interpolator/accelerate_cubic"> - <alpha android:fromAlpha="0.0" android:toAlpha="1.0" - android:duration="@android:integer/config_activityDefaultDur" /> -</set> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:detachWallpaper="true" android:shareInterpolator="false"> + <scale + android:fromXScale="0.9" android:toXScale="1.0" + android:fromYScale="0.9" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="50%p" + android:fillEnabled="true" android:fillBefore="true" + android:interpolator="@interpolator/decelerate_cubic" + android:startOffset="@android:integer/config_mediumAnimTime" + android:duration="@android:integer/config_mediumAnimTime" /> + <alpha + android:fromAlpha="0" android:toAlpha="1.0" + android:fillEnabled="true" android:fillBefore="true" + android:interpolator="@interpolator/decelerate_quad" + android:startOffset="@android:integer/config_mediumAnimTime" + android:duration="@android:integer/config_mediumAnimTime"/> +</set>
\ No newline at end of file diff --git a/core/res/res/anim/lock_screen_exit.xml b/core/res/res/anim/lock_screen_exit.xml index 44ca7363808c..d9c3a3379f67 100644 --- a/core/res/res/anim/lock_screen_exit.xml +++ b/core/res/res/anim/lock_screen_exit.xml @@ -3,22 +3,33 @@ /* ** Copyright 2007, 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 +** 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 +** 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 +** 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. */ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:interpolator="@interpolator/decelerate_cubic"> - <alpha android:fromAlpha="1.0" android:toAlpha="0.0" - android:duration="@android:integer/config_activityDefaultDur" /> -</set> + android:zAdjustment="top" + android:shareInterpolator="false"> + <scale + android:fromXScale="1.0" android:toXScale="1.2" + android:fromYScale="1.0" android:toYScale="1.2" + android:pivotX="50%p" android:pivotY="50%p" + android:fillEnabled="true" android:fillAfter="true" + android:interpolator="@interpolator/accelerate_quint" + android:duration="@android:integer/config_mediumAnimTime" /> + <alpha + android:fromAlpha="1.0" android:toAlpha="0" + android:fillEnabled="true" android:fillAfter="true" + android:interpolator="@interpolator/accelerate_quad" + android:duration="@android:integer/config_mediumAnimTime"/> +</set>
\ No newline at end of file diff --git a/core/res/res/anim/wallpaper_open_exit.xml b/core/res/res/anim/wallpaper_open_exit.xml index 47ea0b462a03..0aeb55062cc3 100644 --- a/core/res/res/anim/wallpaper_open_exit.xml +++ b/core/res/res/anim/wallpaper_open_exit.xml @@ -18,7 +18,8 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:detachWallpaper="true" android:shareInterpolator="false"> + android:detachWallpaper="true" android:shareInterpolator="false" + android:zAdjustment="top"> <scale android:fromXScale="1.0" android:toXScale="1.0" android:fromYScale="1.0" android:toYScale="0.0" android:pivotX="50%p" android:pivotY="50%p" diff --git a/core/res/res/color/widget_edittext_holo_dark.xml b/core/res/res/color/widget_edittext_holo_dark.xml deleted file mode 100644 index 4f3eb62dfd32..000000000000 --- a/core/res/res/color/widget_edittext_holo_dark.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_focused="false" android:color="@android:color/bright_foreground_light"/> <!-- unfocused --> - <item android:color="@android:color/bright_foreground_light"/> -</selector> diff --git a/core/res/res/color/widget_edittext_holo_light.xml b/core/res/res/color/widget_edittext_holo_light.xml deleted file mode 100644 index 7b950d467102..000000000000 --- a/core/res/res/color/widget_edittext_holo_light.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_focused="false" android:color="@android:color/bright_foreground_dark"/> <!-- unfocused --> - <item android:color="@android:color/bright_foreground_dark"/> -</selector> diff --git a/core/res/res/drawable-hdpi/btn_check_on_normal_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_normal_holo_dark.png Binary files differdeleted file mode 100644 index bf4f3bb6b030..000000000000 --- a/core/res/res/drawable-hdpi/btn_check_on_normal_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/btn_check_on_normal_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_normal_holo_light.png Binary files differdeleted file mode 100644 index 5a2a3c16b5e9..000000000000 --- a/core/res/res/drawable-hdpi/btn_check_on_normal_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/stat_notify_chat.png b/core/res/res/drawable-hdpi/stat_notify_chat.png Binary files differindex b2e65c627380..9c713c8f2738 100644 --- a/core/res/res/drawable-hdpi/stat_notify_chat.png +++ b/core/res/res/drawable-hdpi/stat_notify_chat.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_15.png b/core/res/res/drawable-hdpi/stat_sys_battery_15.png Binary files differnew file mode 100644 index 000000000000..5d5ac67ac960 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_15.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_28.png b/core/res/res/drawable-hdpi/stat_sys_battery_28.png Binary files differnew file mode 100644 index 000000000000..a35ded9e3bda --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_28.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_43.png b/core/res/res/drawable-hdpi/stat_sys_battery_43.png Binary files differnew file mode 100644 index 000000000000..b0ea53a97fc5 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_43.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_57.png b/core/res/res/drawable-hdpi/stat_sys_battery_57.png Binary files differnew file mode 100644 index 000000000000..f3c1bd40d608 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_57.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_71.png b/core/res/res/drawable-hdpi/stat_sys_battery_71.png Binary files differnew file mode 100644 index 000000000000..6b3cb327deb7 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_71.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_85.png b/core/res/res/drawable-hdpi/stat_sys_battery_85.png Binary files differnew file mode 100644 index 000000000000..da3ea72f46a3 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_85.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim100.png b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim100.png Binary files differnew file mode 100644 index 000000000000..2bdd813d8a27 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim100.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim15.png b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim15.png Binary files differnew file mode 100644 index 000000000000..52b8470ef72d --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim15.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim28.png b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim28.png Binary files differnew file mode 100644 index 000000000000..620db0529e25 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim28.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim43.png b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim43.png Binary files differnew file mode 100644 index 000000000000..bb29a6a786b8 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim43.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim57.png b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim57.png Binary files differnew file mode 100644 index 000000000000..a417aa377a92 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim57.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim71.png b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim71.png Binary files differnew file mode 100644 index 000000000000..ab6ed3fd153f --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim71.png diff --git a/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim85.png b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim85.png Binary files differnew file mode 100644 index 000000000000..c9961f114985 --- /dev/null +++ b/core/res/res/drawable-hdpi/stat_sys_battery_charge_anim85.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png b/core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png Binary files differindex e8fbc9ee91cb..42a774efc7a0 100644 --- a/core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png +++ b/core/res/res/drawable-hdpi/stat_sys_data_bluetooth.png diff --git a/core/res/res/drawable-hdpi/stat_sys_data_usb.png b/core/res/res/drawable-hdpi/stat_sys_data_usb.png Binary files differindex bdec07205034..6987b094f4ea 100755 --- a/core/res/res/drawable-hdpi/stat_sys_data_usb.png +++ b/core/res/res/drawable-hdpi/stat_sys_data_usb.png diff --git a/core/res/res/drawable-hdpi/stat_sys_download_anim0.png b/core/res/res/drawable-hdpi/stat_sys_download_anim0.png Binary files differindex c127e6e57441..943e62020335 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_download_anim0.png +++ b/core/res/res/drawable-hdpi/stat_sys_download_anim0.png diff --git a/core/res/res/drawable-hdpi/stat_sys_download_anim1.png b/core/res/res/drawable-hdpi/stat_sys_download_anim1.png Binary files differindex 851eff9f1bc0..28edae120cca 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_download_anim1.png +++ b/core/res/res/drawable-hdpi/stat_sys_download_anim1.png diff --git a/core/res/res/drawable-hdpi/stat_sys_download_anim2.png b/core/res/res/drawable-hdpi/stat_sys_download_anim2.png Binary files differindex 2d06bb1d74e9..556a46f228cb 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_download_anim2.png +++ b/core/res/res/drawable-hdpi/stat_sys_download_anim2.png diff --git a/core/res/res/drawable-hdpi/stat_sys_download_anim3.png b/core/res/res/drawable-hdpi/stat_sys_download_anim3.png Binary files differindex 5c0ae7a34b6f..422d72b0b4cb 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_download_anim3.png +++ b/core/res/res/drawable-hdpi/stat_sys_download_anim3.png diff --git a/core/res/res/drawable-hdpi/stat_sys_download_anim4.png b/core/res/res/drawable-hdpi/stat_sys_download_anim4.png Binary files differindex f8d5c8a6b441..24a0db5582d6 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_download_anim4.png +++ b/core/res/res/drawable-hdpi/stat_sys_download_anim4.png diff --git a/core/res/res/drawable-hdpi/stat_sys_download_anim5.png b/core/res/res/drawable-hdpi/stat_sys_download_anim5.png Binary files differindex 32b142547868..97e5a6b37673 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_download_anim5.png +++ b/core/res/res/drawable-hdpi/stat_sys_download_anim5.png diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_bluetooth.png b/core/res/res/drawable-hdpi/stat_sys_tether_bluetooth.png Binary files differindex e43fbaee4caf..11869af2a4a9 100644 --- a/core/res/res/drawable-hdpi/stat_sys_tether_bluetooth.png +++ b/core/res/res/drawable-hdpi/stat_sys_tether_bluetooth.png diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_general.png b/core/res/res/drawable-hdpi/stat_sys_tether_general.png Binary files differindex c42b00c495f6..f1606baa176a 100644 --- a/core/res/res/drawable-hdpi/stat_sys_tether_general.png +++ b/core/res/res/drawable-hdpi/stat_sys_tether_general.png diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_usb.png b/core/res/res/drawable-hdpi/stat_sys_tether_usb.png Binary files differindex c6c533d8a2e5..a05ab3ec7bf1 100644 --- a/core/res/res/drawable-hdpi/stat_sys_tether_usb.png +++ b/core/res/res/drawable-hdpi/stat_sys_tether_usb.png diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png Binary files differindex 9fcadef2900b..6218c3f321f8 100644 --- a/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png +++ b/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png diff --git a/core/res/res/drawable-hdpi/stat_sys_upload_anim0.png b/core/res/res/drawable-hdpi/stat_sys_upload_anim0.png Binary files differindex 32b50775fc03..45f3c7bb4d8d 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_upload_anim0.png +++ b/core/res/res/drawable-hdpi/stat_sys_upload_anim0.png diff --git a/core/res/res/drawable-hdpi/stat_sys_upload_anim1.png b/core/res/res/drawable-hdpi/stat_sys_upload_anim1.png Binary files differindex 8387b45212a1..f4d5a72281d2 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_upload_anim1.png +++ b/core/res/res/drawable-hdpi/stat_sys_upload_anim1.png diff --git a/core/res/res/drawable-hdpi/stat_sys_upload_anim2.png b/core/res/res/drawable-hdpi/stat_sys_upload_anim2.png Binary files differindex c9a56a0ea763..b7448c835594 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_upload_anim2.png +++ b/core/res/res/drawable-hdpi/stat_sys_upload_anim2.png diff --git a/core/res/res/drawable-hdpi/stat_sys_upload_anim3.png b/core/res/res/drawable-hdpi/stat_sys_upload_anim3.png Binary files differindex 972808afad29..dfbd72654026 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_upload_anim3.png +++ b/core/res/res/drawable-hdpi/stat_sys_upload_anim3.png diff --git a/core/res/res/drawable-hdpi/stat_sys_upload_anim4.png b/core/res/res/drawable-hdpi/stat_sys_upload_anim4.png Binary files differindex d47c76191e77..c4513bfdac3b 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_upload_anim4.png +++ b/core/res/res/drawable-hdpi/stat_sys_upload_anim4.png diff --git a/core/res/res/drawable-hdpi/stat_sys_upload_anim5.png b/core/res/res/drawable-hdpi/stat_sys_upload_anim5.png Binary files differindex 7aeafbe10086..cc21de23fd52 100755..100644 --- a/core/res/res/drawable-hdpi/stat_sys_upload_anim5.png +++ b/core/res/res/drawable-hdpi/stat_sys_upload_anim5.png diff --git a/core/res/res/drawable-mdpi/btn_check_on_normal_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_normal_holo_dark.png Binary files differdeleted file mode 100644 index e65c0b4b5b13..000000000000 --- a/core/res/res/drawable-mdpi/btn_check_on_normal_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/btn_check_on_normal_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_normal_holo_light.png Binary files differdeleted file mode 100644 index 9576bea6401e..000000000000 --- a/core/res/res/drawable-mdpi/btn_check_on_normal_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/popup_inline_error_above_holo_dark.9.png b/core/res/res/drawable-mdpi/popup_inline_error_above_holo_dark.9.png Binary files differnew file mode 100644 index 000000000000..dd4af6d04d67 --- /dev/null +++ b/core/res/res/drawable-mdpi/popup_inline_error_above_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/popup_inline_error_above_holo_light.9.png b/core/res/res/drawable-mdpi/popup_inline_error_above_holo_light.9.png Binary files differnew file mode 100644 index 000000000000..892511270d3a --- /dev/null +++ b/core/res/res/drawable-mdpi/popup_inline_error_above_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/popup_inline_error_holo_dark.9.png b/core/res/res/drawable-mdpi/popup_inline_error_holo_dark.9.png Binary files differnew file mode 100755 index 000000000000..66c2c09b52a4 --- /dev/null +++ b/core/res/res/drawable-mdpi/popup_inline_error_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/popup_inline_error_holo_light.9.png b/core/res/res/drawable-mdpi/popup_inline_error_holo_light.9.png Binary files differnew file mode 100755 index 000000000000..c5113f2919e3 --- /dev/null +++ b/core/res/res/drawable-mdpi/popup_inline_error_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/stat_notify_chat.png b/core/res/res/drawable-mdpi/stat_notify_chat.png Binary files differindex f98b032bcc4b..91b429008ef6 100644 --- a/core/res/res/drawable-mdpi/stat_notify_chat.png +++ b/core/res/res/drawable-mdpi/stat_notify_chat.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_bluetooth.png b/core/res/res/drawable-mdpi/stat_sys_data_bluetooth.png Binary files differindex 7a8b78f6e8db..f7f554ecf3f8 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_bluetooth.png +++ b/core/res/res/drawable-mdpi/stat_sys_data_bluetooth.png diff --git a/core/res/res/drawable-mdpi/stat_sys_data_usb.png b/core/res/res/drawable-mdpi/stat_sys_data_usb.png Binary files differindex 4175b2917a16..6cdfab7f9335 100644 --- a/core/res/res/drawable-mdpi/stat_sys_data_usb.png +++ b/core/res/res/drawable-mdpi/stat_sys_data_usb.png diff --git a/core/res/res/drawable-mdpi/stat_sys_download_anim0.png b/core/res/res/drawable-mdpi/stat_sys_download_anim0.png Binary files differindex 01b65e01ea63..39e4ccb8d207 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_download_anim0.png +++ b/core/res/res/drawable-mdpi/stat_sys_download_anim0.png diff --git a/core/res/res/drawable-mdpi/stat_sys_download_anim1.png b/core/res/res/drawable-mdpi/stat_sys_download_anim1.png Binary files differindex 2b0633f29e2f..429ebd7c9c1f 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_download_anim1.png +++ b/core/res/res/drawable-mdpi/stat_sys_download_anim1.png diff --git a/core/res/res/drawable-mdpi/stat_sys_download_anim2.png b/core/res/res/drawable-mdpi/stat_sys_download_anim2.png Binary files differindex 2295a6d7b310..b3de461f4a90 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_download_anim2.png +++ b/core/res/res/drawable-mdpi/stat_sys_download_anim2.png diff --git a/core/res/res/drawable-mdpi/stat_sys_download_anim3.png b/core/res/res/drawable-mdpi/stat_sys_download_anim3.png Binary files differindex 99db712bfcb4..195498e19b5e 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_download_anim3.png +++ b/core/res/res/drawable-mdpi/stat_sys_download_anim3.png diff --git a/core/res/res/drawable-mdpi/stat_sys_download_anim4.png b/core/res/res/drawable-mdpi/stat_sys_download_anim4.png Binary files differindex 738dc87f7419..8fc3e8669138 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_download_anim4.png +++ b/core/res/res/drawable-mdpi/stat_sys_download_anim4.png diff --git a/core/res/res/drawable-mdpi/stat_sys_download_anim5.png b/core/res/res/drawable-mdpi/stat_sys_download_anim5.png Binary files differindex 00ff542ad8bd..c6f2f4e06f34 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_download_anim5.png +++ b/core/res/res/drawable-mdpi/stat_sys_download_anim5.png diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_bluetooth.png b/core/res/res/drawable-mdpi/stat_sys_tether_bluetooth.png Binary files differindex efb64ad7b849..b318b9c317ed 100644 --- a/core/res/res/drawable-mdpi/stat_sys_tether_bluetooth.png +++ b/core/res/res/drawable-mdpi/stat_sys_tether_bluetooth.png diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_general.png b/core/res/res/drawable-mdpi/stat_sys_tether_general.png Binary files differindex 368880328e2c..952ff6bfc1ad 100644 --- a/core/res/res/drawable-mdpi/stat_sys_tether_general.png +++ b/core/res/res/drawable-mdpi/stat_sys_tether_general.png diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_usb.png b/core/res/res/drawable-mdpi/stat_sys_tether_usb.png Binary files differindex 73f1a81ef926..3206557519d0 100644 --- a/core/res/res/drawable-mdpi/stat_sys_tether_usb.png +++ b/core/res/res/drawable-mdpi/stat_sys_tether_usb.png diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png Binary files differindex d448491df1d0..45a95f8bca42 100644 --- a/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png +++ b/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png diff --git a/core/res/res/drawable-mdpi/stat_sys_upload_anim0.png b/core/res/res/drawable-mdpi/stat_sys_upload_anim0.png Binary files differindex f6fcc7ac9021..5620cc859fb2 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_upload_anim0.png +++ b/core/res/res/drawable-mdpi/stat_sys_upload_anim0.png diff --git a/core/res/res/drawable-mdpi/stat_sys_upload_anim1.png b/core/res/res/drawable-mdpi/stat_sys_upload_anim1.png Binary files differindex 5d0538114ebc..0cbb85c24021 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_upload_anim1.png +++ b/core/res/res/drawable-mdpi/stat_sys_upload_anim1.png diff --git a/core/res/res/drawable-mdpi/stat_sys_upload_anim2.png b/core/res/res/drawable-mdpi/stat_sys_upload_anim2.png Binary files differindex a8699bcdc7bf..cfa74f39f670 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_upload_anim2.png +++ b/core/res/res/drawable-mdpi/stat_sys_upload_anim2.png diff --git a/core/res/res/drawable-mdpi/stat_sys_upload_anim3.png b/core/res/res/drawable-mdpi/stat_sys_upload_anim3.png Binary files differindex f5ad44ae3a3a..de5c31469826 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_upload_anim3.png +++ b/core/res/res/drawable-mdpi/stat_sys_upload_anim3.png diff --git a/core/res/res/drawable-mdpi/stat_sys_upload_anim4.png b/core/res/res/drawable-mdpi/stat_sys_upload_anim4.png Binary files differindex b5884f6a7bb8..8847949a1f43 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_upload_anim4.png +++ b/core/res/res/drawable-mdpi/stat_sys_upload_anim4.png diff --git a/core/res/res/drawable-mdpi/stat_sys_upload_anim5.png b/core/res/res/drawable-mdpi/stat_sys_upload_anim5.png Binary files differindex ae6b8a974c18..f804e5e37d8e 100755..100644 --- a/core/res/res/drawable-mdpi/stat_sys_upload_anim5.png +++ b/core/res/res/drawable-mdpi/stat_sys_upload_anim5.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_notify_chat.png b/core/res/res/drawable-xlarge-hdpi/stat_notify_chat.png Binary files differindex e936faceda63..8cc5535c21e1 100644 --- a/core/res/res/drawable-xlarge-hdpi/stat_notify_chat.png +++ b/core/res/res/drawable-xlarge-hdpi/stat_notify_chat.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_notify_disk_full.png b/core/res/res/drawable-xlarge-hdpi/stat_notify_disk_full.png Binary files differindex eb626df39878..4441ba20b86a 100644 --- a/core/res/res/drawable-xlarge-hdpi/stat_notify_disk_full.png +++ b/core/res/res/drawable-xlarge-hdpi/stat_notify_disk_full.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_notify_email_generic.png b/core/res/res/drawable-xlarge-hdpi/stat_notify_email_generic.png Binary files differindex d6bc7d30cddb..73891a387641 100644 --- a/core/res/res/drawable-xlarge-hdpi/stat_notify_email_generic.png +++ b/core/res/res/drawable-xlarge-hdpi/stat_notify_email_generic.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_notify_error.png b/core/res/res/drawable-xlarge-hdpi/stat_notify_error.png Binary files differindex 8c8f25dbc171..db68eeae3357 100644 --- a/core/res/res/drawable-xlarge-hdpi/stat_notify_error.png +++ b/core/res/res/drawable-xlarge-hdpi/stat_notify_error.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_notify_gmail.png b/core/res/res/drawable-xlarge-hdpi/stat_notify_gmail.png Binary files differindex 661cc2ff47b8..7af6921a84f1 100644 --- a/core/res/res/drawable-xlarge-hdpi/stat_notify_gmail.png +++ b/core/res/res/drawable-xlarge-hdpi/stat_notify_gmail.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_0.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_0.png Binary files differnew file mode 100644 index 000000000000..16424b98ae85 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_0.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_100.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_100.png Binary files differnew file mode 100644 index 000000000000..95cdc4516a8a --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_100.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_15.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_15.png Binary files differnew file mode 100644 index 000000000000..f61ccfae1dc9 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_15.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_28.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_28.png Binary files differnew file mode 100644 index 000000000000..5666654c707c --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_28.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_43.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_43.png Binary files differnew file mode 100644 index 000000000000..f9f4d81daed8 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_43.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_57.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_57.png Binary files differnew file mode 100644 index 000000000000..973ccc23e727 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_57.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_71.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_71.png Binary files differnew file mode 100644 index 000000000000..1c7d446303ef --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_71.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_85.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_85.png Binary files differnew file mode 100644 index 000000000000..2120bdcb26a8 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_85.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim0.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim0.png Binary files differnew file mode 100644 index 000000000000..f8063d15042d --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim0.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim100.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim100.png Binary files differnew file mode 100644 index 000000000000..85be2e3e14e8 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim100.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim15.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim15.png Binary files differnew file mode 100644 index 000000000000..589b30b51df8 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim15.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim28.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim28.png Binary files differnew file mode 100644 index 000000000000..4debfc0a5218 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim28.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim43.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim43.png Binary files differnew file mode 100644 index 000000000000..3920ab1500ea --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim43.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim57.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim57.png Binary files differnew file mode 100644 index 000000000000..a15716fa45ea --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim57.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim71.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim71.png Binary files differnew file mode 100644 index 000000000000..8d7352fcf4e4 --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim71.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim85.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim85.png Binary files differnew file mode 100644 index 000000000000..45f8e81247bf --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_charge_anim85.png diff --git a/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_unknown.png b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_unknown.png Binary files differnew file mode 100644 index 000000000000..696d9fb1982d --- /dev/null +++ b/core/res/res/drawable-xlarge-hdpi/stat_sys_battery_unknown.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_notify_chat.png b/core/res/res/drawable-xlarge-mdpi/stat_notify_chat.png Binary files differindex b2d71862c8cc..22adc672d9d2 100644 --- a/core/res/res/drawable-xlarge-mdpi/stat_notify_chat.png +++ b/core/res/res/drawable-xlarge-mdpi/stat_notify_chat.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_notify_disk_full.png b/core/res/res/drawable-xlarge-mdpi/stat_notify_disk_full.png Binary files differindex 36ab1ff76f47..c434d12449bf 100644 --- a/core/res/res/drawable-xlarge-mdpi/stat_notify_disk_full.png +++ b/core/res/res/drawable-xlarge-mdpi/stat_notify_disk_full.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_notify_email_generic.png b/core/res/res/drawable-xlarge-mdpi/stat_notify_email_generic.png Binary files differindex a14b3c7d0e7c..daf3b84fb413 100644 --- a/core/res/res/drawable-xlarge-mdpi/stat_notify_email_generic.png +++ b/core/res/res/drawable-xlarge-mdpi/stat_notify_email_generic.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_notify_error.png b/core/res/res/drawable-xlarge-mdpi/stat_notify_error.png Binary files differindex 81a66c112876..7b097b157d10 100644 --- a/core/res/res/drawable-xlarge-mdpi/stat_notify_error.png +++ b/core/res/res/drawable-xlarge-mdpi/stat_notify_error.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_notify_gmail.png b/core/res/res/drawable-xlarge-mdpi/stat_notify_gmail.png Binary files differindex a286ac611169..8daef7cbbe08 100644 --- a/core/res/res/drawable-xlarge-mdpi/stat_notify_gmail.png +++ b/core/res/res/drawable-xlarge-mdpi/stat_notify_gmail.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_0.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_0.png Binary files differnew file mode 100644 index 000000000000..ad483214bbae --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_0.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_100.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_100.png Binary files differnew file mode 100644 index 000000000000..16481d6f511e --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_100.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_15.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_15.png Binary files differnew file mode 100644 index 000000000000..c3cdcc8b33e0 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_15.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_28.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_28.png Binary files differnew file mode 100644 index 000000000000..ec58d318eed7 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_28.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_43.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_43.png Binary files differnew file mode 100644 index 000000000000..1fb3696a6029 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_43.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_57.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_57.png Binary files differnew file mode 100644 index 000000000000..d6d143a168e5 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_57.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_71.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_71.png Binary files differnew file mode 100644 index 000000000000..8de99fa914db --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_71.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_85.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_85.png Binary files differnew file mode 100644 index 000000000000..4600b253d438 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_85.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim0.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim0.png Binary files differnew file mode 100644 index 000000000000..577f7cc4adc0 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim0.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim100.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim100.png Binary files differnew file mode 100644 index 000000000000..53af703d6385 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim100.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim15.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim15.png Binary files differnew file mode 100644 index 000000000000..c2282e60ea32 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim15.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim28.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim28.png Binary files differnew file mode 100644 index 000000000000..704f96253a8f --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim28.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim43.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim43.png Binary files differnew file mode 100644 index 000000000000..b275dbba677f --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim43.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim57.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim57.png Binary files differnew file mode 100644 index 000000000000..5b0649f89c47 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim57.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim71.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim71.png Binary files differnew file mode 100644 index 000000000000..8bc888ede18b --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim71.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim85.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim85.png Binary files differnew file mode 100644 index 000000000000..ede370db0d49 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_charge_anim85.png diff --git a/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_unknown.png b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_unknown.png Binary files differnew file mode 100644 index 000000000000..5f39f622f760 --- /dev/null +++ b/core/res/res/drawable-xlarge-mdpi/stat_sys_battery_unknown.png diff --git a/core/res/res/layout-xlarge/status_bar_latest_event_content_large_icon.xml b/core/res/res/layout-xlarge/status_bar_latest_event_content_large_icon.xml index e9b106d8654b..fcbdf6d16a48 100644 --- a/core/res/res/layout-xlarge/status_bar_latest_event_content_large_icon.xml +++ b/core/res/res/layout-xlarge/status_bar_latest_event_content_large_icon.xml @@ -30,27 +30,21 @@ android:fadingEdge="horizontal" /> </LinearLayout> - <RelativeLayout + <TextView android:id="@+id/info" + android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Info" android:layout_width="wrap_content" android:layout_height="match_parent" - > - <TextView android:id="@+id/info" - android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Info" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:singleLine="true" - android:gravity="center_vertical" - android:layout_alignParentLeft="true" - android:paddingLeft="8dp" - /> - <ImageView android:id="@+id/icon" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:layout_alignRight="@id/info" - android:layout_marginBottom="8dip" - android:scaleType="center" - /> - </RelativeLayout> + android:singleLine="true" + android:gravity="center_vertical" + android:paddingLeft="4dp" + android:paddingRight="4dp" + /> + <ImageView android:id="@+id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom" + android:layout_marginBottom="13dip" + android:scaleType="center" + /> </LinearLayout> diff --git a/core/res/res/layout-xlarge/status_bar_latest_event_ticker_large_icon.xml b/core/res/res/layout-xlarge/status_bar_latest_event_ticker_large_icon.xml index b382c554d2d9..ff0f7d44e637 100644 --- a/core/res/res/layout-xlarge/status_bar_latest_event_ticker_large_icon.xml +++ b/core/res/res/layout-xlarge/status_bar_latest_event_ticker_large_icon.xml @@ -37,11 +37,13 @@ android:layout_marginTop="-10dp" /> <ImageView android:id="@+id/icon" - android:layout_width="48dp" - android:layout_height="32dp" - android:layout_gravity="top" - android:layout_marginTop="6dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom" + android:layout_marginBottom="13dip" android:scaleType="center" + android:layout_marginRight="4dip" + android:layout_marginLeft="16dip" /> </LinearLayout> diff --git a/core/res/res/layout/action_menu_item_layout.xml b/core/res/res/layout/action_menu_item_layout.xml index 4477df7aaf3e..15dfea36ca6d 100644 --- a/core/res/res/layout/action_menu_item_layout.xml +++ b/core/res/res/layout/action_menu_item_layout.xml @@ -40,9 +40,9 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:visibility="gone" - android:textAppearance="?attr/textAppearanceMedium" + android:textAppearance="?attr/actionMenuTextAppearance" style="?attr/buttonStyleSmall" - android:textColor="?attr/textColorPrimary" + android:textColor="?attr/actionMenuTextColor" android:background="@null" android:paddingLeft="4dip" android:paddingRight="4dip" /> diff --git a/core/res/res/layout/number_picker.xml b/core/res/res/layout/number_picker.xml index f92c1bcba659..807daf2b2dae 100644 --- a/core/res/res/layout/number_picker.xml +++ b/core/res/res/layout/number_picker.xml @@ -22,7 +22,8 @@ <ImageButton android:id="@+id/increment" android:layout_width="fill_parent" android:layout_height="wrap_content" - style="?android:attr/numberPickerUpButtonStyle" /> + style="?android:attr/numberPickerUpButtonStyle" + android:contentDescription="@string/number_picker_increment_button" /> <EditText android:id="@+id/numberpicker_input" android:layout_width="fill_parent" @@ -32,6 +33,7 @@ <ImageButton android:id="@+id/decrement" android:layout_width="fill_parent" android:layout_height="wrap_content" - style="?android:attr/numberPickerDownButtonStyle" /> + style="?android:attr/numberPickerDownButtonStyle" + android:contentDescription="@string/number_picker_decrement_button" /> </merge> diff --git a/core/res/res/layout/tab_content.xml b/core/res/res/layout/tab_content.xml index 79147fbe3845..3fa4494a837a 100644 --- a/core/res/res/layout/tab_content.xml +++ b/core/res/res/layout/tab_content.xml @@ -18,16 +18,30 @@ */ --> -<TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" - android:layout_width="match_parent" android:layout_height="match_parent"> - <LinearLayout android:orientation="vertical" - android:layout_width="match_parent" android:layout_height="match_parent"> - <TabWidget android:id="@android:id/tabs" - android:orientation="horizontal" android:layout_width="match_parent" - android:layout_height="wrap_content" android:layout_weight="0" /> - <FrameLayout android:id="@android:id/tabcontent" - android:layout_width="match_parent" android:layout_height="0dip" +<TabHost + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@android:id/tabhost" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <TabWidget + android:id="@android:id/tabs" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="0"/> + + <FrameLayout + android:id="@android:id/tabcontent" + android:layout_width="match_parent" + android:layout_height="0dip" android:layout_weight="1"/> - </LinearLayout> + + </LinearLayout> </TabHost> diff --git a/core/res/res/layout/textview_hint.xml b/core/res/res/layout/textview_hint.xml index 20b08bf9b7b6..f9c4406a0925 100644 --- a/core/res/res/layout/textview_hint.xml +++ b/core/res/res/layout/textview_hint.xml @@ -17,7 +17,6 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/popup_inline_error" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="@color/primary_text_light" /> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 7b13a7517331..0dea8f480069 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"بحث الويب"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"طلب تحديد الموقع"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"نعم"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"لا"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"تم تجاوز حد الحذف"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"حذف هذه العناصر."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"التراجع عن عمليات الحذف."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"عدم القيام بأي شيء الآن."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 7c8a7f578c1c..7c88a05d3c16 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Уеб търсене"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Заявка за споделяне на местоположението"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Да"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Не"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Лимитът за изтриване бе надхвърлен"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Изтриване на елементите."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Отмяна на изтриванията."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Да не се прави нищо засега."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 1f2cde040216..fe1692aa68ff 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Cerca al web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Sol·licitud d\'ubicació"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Sí"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"No"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"S\'ha superat el límit de supressions"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Suprimeix els elements."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Desfés les supressions."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"No facis res de moment."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 22d335791094..a6cc5cd4b04c 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Vypínání..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet se vypne."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Váš telefon bude vypnut."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Chcete telefon vypnout?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Nejnovější"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Žádné nedávno použité aplikace."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Možnosti tabletu"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Umožňuje aplikaci číst libovolné prostředky ve skupině diag, např. soubory ve složce /dev, a zapisovat do nich. Může dojít k ovlivnění stability a bezpečnosti systému. Toto nastavení by měl používat pouze výrobce či operátor pro diagnostiku hardwaru."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"povolení či zakázání komponent aplikací"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Umožňuje aplikaci změnit, zda je komponenta jiné aplikace povolena nebo ne. Škodlivé aplikace mohou pomocí tohoto nastavení vypnout důležité funkce tabletu. Je třeba postupovat opatrně, protože je možné způsobit nepoužitelnost, nekonzistenci či nestabilitu komponent aplikací."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Umožňuje aplikaci změnit, zda je komponenta jiné aplikace povolena nebo ne. Škodlivé aplikace mohou pomocí tohoto nastavení vypnout důležité funkce tabletu. Je třeba postupovat opatrně, protože je možné způsobit nepoužitelnost, nekonzistenci či nestabilitu komponent aplikací."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Umožňuje aplikaci změnit, zda je komponenta jiné aplikace povolena nebo ne. Škodlivé aplikace mohou pomocí tohoto vypnout důležité funkce tabletu. Je třeba postupovat opatrně, protože je možné způsobit nepoužitelnost, nekonzistenci či nestabilitu komponent aplikací."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"nastavení upřednostňovaných aplikací"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Umožňuje aplikaci změnit vaše upřednostňované aplikace. Toto nastavení může škodlivým aplikacím umožnit nepozorovaně změnit spouštěné aplikace a oklamat vaše existující aplikace tak, aby shromažďovaly vaše soukromá data."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"změna globálních nastavení systému"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Aut.vyp."</string> <string name="setup_autofill" msgid="8154593408885654044">"Nast. aut. vypl."</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"čtení historie a záložek Prohlížeče"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umožňuje aplikaci číst všechny navštívené adresy URL a záložky Prohlížeče."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"zápis do historie a záložek Prohlížeče"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 shoda"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Hotovo"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Odpojování úložiště USB..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Odpojování karty SD..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Mazání úložiště USB..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Vyhledat na webu"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Požadavek informací o poloze"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Ano"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Ne"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Byl překročen limit mazání."</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Smazat položky."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Vrátit mazání zpět."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Neprovádět akci."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index a9a26142978a..62ff4346d99a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Lukker ned ..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Din tabletcomputer slukkes nu."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Din telefon slukkes nu."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Vil du slukke?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Seneste"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Der er ingen nye programmer."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Valgmuligheder for tabletcomputeren"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Tillader, at et program læser og skriver til alle ressourcer, der ejes af diag-gruppen, som f.eks. flier i /dev. Dette kan muligvis påvirke systemets stabilitet og sikkerhed. Dette bør KUN bruges til hardwarespecifikke diagnosticeringer foretaget af producent eller udbyder."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"aktiver eller deaktiver programkomponenter"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Tillader, at et program ændrer, om en komponent fra et andet program er aktiveret eller ej. Ondsindede programmer kan bruge dette til at deaktivere vigtige funktioner på tabletcomputeren. Denne tilladelse skal anvendes med forsigtighed, da det kan forårsage ubrugelige, inkonsekvente eller ustabile programkomponenter."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Tillader, at et program ændrer, om en komponent fra et andet program er aktiveret eller ej. Ondsindede programmer kan bruge dette til at deaktivere vigtige funktioner på tabletcomputeren. Denne tilladelse skal anvendes med forsigtighed, da det kan forårsage ubrugelige, inkonsekvente eller ustabile programkomponenter."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Tillader, at et program ændrer, om en komponent fra et andet program er aktiveret eller ej. Ondsindede programmer kan bruge dette til at deaktivere vigtige funktioner på tabletcomputeren. Denne tilladelse skal anvendes med forsigtighed, da det kan forårsage ubrugelige, inkonsekvente eller ustabile programkomponenter."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"angiv foretrukne programmer"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Tillader, at et program ændrer dine foretrukne programmer. Dette kan medføre, at ondsindede programmer ændrer kørende programmer i det skjulte og narrer dine eksisterende programmer til at indsamle personlige oplysninger fra dig."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"rediger globale systemindstillinger"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"AutoFyld"</string> <string name="setup_autofill" msgid="8154593408885654044">"Opsætning af AutoFyld"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"læs browserens oversigt og bogmærker"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Tillader, at programmet læser alle de webadresser, browseren har besøgt, og alle browserens bogmærker."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skriv browserens oversigt og bogmærker"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 match"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> af <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Udført"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Demonterer USB-lager..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Demonterer SD-kort..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Sletter USB-lager..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Websøgning"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Placeringsanmodning"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Ja"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nej"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Grænsen for sletning er overskredet"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Slet elementerne."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Fortryd sletningerne."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Gør ikke noget lige nu."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 596affd8dab7..5b294082eee5 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Wird heruntergefahren..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Ihr Tablet wird heruntergefahren."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Ihr Telefon wird heruntergefahren."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Soll das Gerät abgeschaltet werden?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Zuletzt verwendet"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Keine zuletzt verwendeten Anwendungen"</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet-Optionen"</string> @@ -291,7 +290,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Ermöglicht einer Anwendung, alle Elemente in der Diagnosegruppe zu lesen und zu bearbeiten, etwa Dateien in \"/dev\". Dies könnte eine potenzielle Gefährdung für die Stabilität und Sicherheit des Systems darstellen und sollte NUR für Hardware-spezifische Diagnosen des Herstellers oder Netzbetreibers verwendet werden."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"Anwendungskomponenten aktivieren oder deaktivieren"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Ermöglicht einer Anwendung, die Komponente einer anderen Anwendung nach Belieben zu aktivieren oder zu deaktivieren. Schädliche Anwendungen können so wichtige Funktionen des Tablets deaktivieren. Bei der Erteilung dieser Berechtigung ist Vorsicht geboten, da die Anwendungskomponenten unbrauchbar, inkonsistent und instabil werden können."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Ermöglicht einer Anwendung, die Komponente einer anderen Anwendung nach Belieben zu aktivieren oder zu deaktivieren. Schädliche Anwendungen können so wichtige Funktionen des Tablets deaktivieren. Bei der Erteilung dieser Berechtigung ist Vorsicht geboten, da die Anwendungskomponenten unbrauchbar, inkonsistent und instabil werden können."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Ermöglicht einer Anwendung, die Komponente einer anderen Anwendung nach Belieben zu aktivieren oder zu deaktivieren. Schädliche Anwendungen können so wichtige Funktionen des Tablets deaktivieren. Bei der Erteilung dieser Berechtigung ist Vorsicht geboten, da die Anwendungskomponenten unbrauchbar, inkonsistent und instabil werden können."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"bevorzugte Einstellungen festlegen"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Ermöglicht einer Anwendung, Ihre bevorzugten Einstellungen zu ändern. Schädliche Anwendungen können so laufende Anwendungen ohne Ihr Wissen ändern, damit die vorhandenen Anwendungen private Daten von Ihnen sammeln."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"allgemeine Systemeinstellungen ändern"</string> @@ -470,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"SD-Karten-Inhalt ändern/löschen"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Ermöglicht der Anwendung Schreiben in USB-Speicher"</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Ermöglicht einer Anwendung, auf die SD-Karte zu schreiben"</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <!-- outdated translation 5585262071354704256 --> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Inhalt des internen Medienspeichers ändern/löschen"</string> + <!-- outdated translation 2372999661142345443 --> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Ermöglicht einer Anwendung, den Inhalt des internen Medienspeichers zu verändern"</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"Zugriff auf das Cache-Dateisystem"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Gewährt einer Anwendung Lese- und Schreibzugriff auf das Cache-Dateisystem."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"Internetanrufe tätigen/annehmen"</string> @@ -680,11 +677,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"AutoFill"</string> <string name="setup_autofill" msgid="8154593408885654044">"AutoFill-Setup"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"Browserverlauf und Lesezeichen lesen"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Ermöglicht der Anwendung, alle URLs, die mit dem Browser besucht wurden, sowie alle Lesezeichen des Browsers zu lesen."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"Browserverlauf und Lesezeichen schreiben"</string> @@ -1000,8 +995,7 @@ <item quantity="one" msgid="8167147081136579439">"1 Treffer"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> von <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Fertig"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"USB-Speicher wird getrennt..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"SD-Karte wird getrennt..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"USB-Speicher wird gelöscht..."</string> @@ -1020,24 +1014,17 @@ <string name="websearch" msgid="4337157977400211589">"Websuche"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Standortanfrage"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Ja"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nein"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Löschbegrenzung überschritten"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Elemente löschen"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Löschen rückgängig machen"</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Im Moment nichts unternehmen"</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 146e81f61b84..8aa892df77e9 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Απενεργοποίηση..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Το tablet σας θα απενεργοποιηθεί."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Το τηλέφωνό σας θα απενεργοποιηθεί."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Θα θέλατε να τερματίσετε τη λειτουργία;"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Πρόσφατα"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Δεν υπάρχουν πρόσφατες εφαρμογές."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Επιλογές tablet"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Επιτρέπει σε μια εφαρμογή την ανάγνωση και την εγγραφή σε πόρο που ανήκει στην ομάδα διαγνωστικού (π.χ. αρχεία στον κατάλογο /dev). Αυτό ενδέχεται να επηρεάσει την σταθερότητα και την ασφάλεια του συστήματος. Θα πρέπει να χρησιμοποιείται ΜΟΝΟ για διαγνωστικά υλικού του κατασκευαστή ή του χειριστή."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"ενεργοποίηση ή απενεργοποίηση στοιχείων εφαρμογής"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Επιτρέπει σε μια εφαρμογή την επιλογή ενεργοποίησης ή μη ενός στοιχείου μιας άλλης εφαρμογής. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να απενεργοποιήσουν σημαντικές δυνατότητες του tablet. Η χορήγηση άδειας πρέπει να γίνεται με προσοχή, καθώς είναι πιθανό τα στοιχεία μιας εφαρμογής να καταστούν ασυνεχή, ασταθή ή να είναι αδύνατον να χρησιμοποιηθούν."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Επιτρέπει σε μια εφαρμογή την επιλογή ενεργοποίησης ή μη ενός στοιχείου μιας άλλης εφαρμογής. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να απενεργοποιήσουν σημαντικές δυνατότητες του tablet. Η χορήγηση άδειας πρέπει να γίνεται με προσοχή, καθώς είναι πιθανό τα στοιχεία μιας εφαρμογής να καταστούν ασυνεχή, ασταθή ή να είναι αδύνατον να χρησιμοποιηθούν."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Επιτρέπει σε μια εφαρμογή την επιλογή ενεργοποίησης ή μη ενός στοιχείου μιας άλλης εφαρμογής. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να απενεργοποιήσουν σημαντικές δυνατότητες του tablet. Η χορήγηση άδειας πρέπει να γίνεται με προσοχή, καθώς είναι πιθανό τα στοιχεία μιας εφαρμογής να καταστούν ασυνεχή, ασταθή ή να είναι αδύνατον να χρησιμοποιηθούν."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"ορισμός προτιμώμενων εφαρμογών"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Επιτρέπει σε μια εφαρμογή να τροποποιεί τις εφαρμογές που προτιμάτε. Αυτό ενδέχεται να δώσει τη δυνατότητα σε κακόβουλες εφαρμογές να αλλάξουν χωρίς ειδοποίηση τις εφαρμογές που εκτελούνται, \"ξεγελώντας\" τις υπάρχουσες εφαρμογές ώστε να συλλέξουν ιδιωτικά δεδομένα."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"τροποποίηση καθολικών ρυθμίσεων συστήματος"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Αυτ.συμπ"</string> <string name="setup_autofill" msgid="8154593408885654044">"Ρύθμ. Αυτ. συμπ."</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"ανάγνωση ιστορικού και σελιδοδεικτών προγράμματος περιήγησης"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Επιτρέπει στην εφαρμογή την ανάγνωση όλων των διευθύνσεων URL που το πρόγραμμα περιήγησης έχει επισκεφθεί και όλων των σελιδοδεικτών του προγράμματος περιήγησης."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"εγγραφή ιστορικού και σελιδοδεικτών προγράμματος περιήγησης"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 αποτέλεσμα"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> από <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Ολοκληρώθηκε"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Αποπροσάρτηση αποθηκευτικού χώρου USB..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Αποπροσάρτηση κάρτας SD..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Διαγραφή αποθηκευτικού χώρου USB..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Αναζήτηση ιστού"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Αίτημα τοποθεσίας"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Ναι"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">" Όχι"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Έγινε υπέρβαση του ορίου διαγραφής."</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Διαγραφή αντικειμένων."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Αναίρεση των διαγραφών."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Να μην γίνει καμία ενέργεια τώρα."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index e7ed95f5dec9..571c25aa2b19 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Web Search"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Location request"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Yes"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"No"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Deletion limit exceeded"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Delete the items."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Undo the deletions."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Do nothing for now."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-es-rUS-xlarge/strings.xml b/core/res/res/values-es-rUS-xlarge/strings.xml deleted file mode 100644 index dc184b31a455..000000000000 --- a/core/res/res/values-es-rUS-xlarge/strings.xml +++ /dev/null @@ -1,341 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- XL --> - <string name="fileSizeSuffix" msgid="3468563433835560758">"Segmento <xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <!-- XL --> - <string name="unknownName" msgid="3202822008051920747">"(Desconocido)"</string> - <!-- XL --> - <string name="defaultVoiceMailAlphaTag" msgid="3668436100965334106">"Buzón de voz"</string> - <!-- XL --> - <string name="serviceClassVoice" msgid="7086876533404179039">"Google Voice"</string> - <!-- XL --> - <string name="cfTemplateNotForwarded" msgid="8534356655497306518">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no se ha reenviado"</string> - <!-- XL --> - <string name="cfTemplateRegistered" msgid="1255841210142514510">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no se ha reenviado"</string> - <!-- XL --> - <string name="cfTemplateRegisteredTime" msgid="7798907169190952367">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no se ha reenviado"</string> - <!-- XL --> - <string name="notification_title" msgid="5210128823045542445">"Error al acceder a <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> - <!-- XL --> - <string name="low_memory" product="tablet" msgid="4855646606241379548">"¡El espacio de almacenamiento de la tableta está completo! Elimina algunos archivos para liberar espacio."</string> - <string name="low_memory" product="default" msgid="9195238880281578473">"¡El espacio de almacenamiento está completo! Elimina algunos archivos para liberar espacio."</string> - <!-- XL --> - <string name="power_dialog" product="tablet" msgid="6884163545695410971">"Opciones de tableta"</string> - <string name="power_dialog" product="default" msgid="8882103237148972564">"Opciones de teléfono"</string> - <!-- XL --> - <string name="silent_mode" msgid="5687977677409351252">"Modo silencio"</string> - <!-- XL --> - <string name="shutdown_confirm" product="tablet" msgid="5776903973889956395">"Tu tableta se apagará."</string> - <string name="shutdown_confirm" product="default" msgid="3040950969577046278">"Tu teléfono se apagará."</string> - <!-- XL --> - <string name="global_actions" product="tablet" msgid="110297659383505180">"Opciones de tableta"</string> - <string name="global_actions" product="default" msgid="2108237350837066773">"Opciones de teléfono"</string> - <!-- XL --> - <string name="global_action_toggle_silent_mode" msgid="4538951049191334644">"Modo silencio"</string> - <!-- XL --> - <string name="global_action_silent_mode_off_status" msgid="9045822172493147761">"El sonido está ENCENDIDO"</string> - <!-- XL --> - <string name="global_actions_airplane_mode_on_status" msgid="7272433204482202219">"El modo avión está ENCENDIDO"</string> - <!-- XL --> - <string name="status_bar_notification_info_overflow" msgid="1081154808901480710">"100+"</string> - <!-- XL --> - <string name="android_system_label" msgid="844561213652704593">"Sistema Androide"</string> - <!-- XL --> - <string name="permgroupdesc_costMoney" msgid="4836624191696189469">"Admitir que las aplicaciones realicen actividades que se cobran."</string> - <!-- XL --> - <string name="permgroupdesc_developmentTools" msgid="5514251182135739578">"Las funciones sólo son necesarias para los programadores de aplicaciones."</string> - <!-- XL --> - <string name="permgrouplab_storage" msgid="746210798053836644">"Almacenamiento"</string> - <!-- XL --> - <string name="permdesc_readSms" product="tablet" msgid="3026416194429353337">"Permite que la aplicación lea los mensajes SMS almacenados en tu tableta o tarjeta SIM. Las aplicaciones maliciosas pueden leer tus mensajes confidenciales."</string> - <string name="permdesc_readSms" product="default" msgid="191875931331016383">"Admite que la aplicación lea los mensajes SMS almacenados en tu teléfono o tarjeta SIM. Las aplicaciones maliciosas pueden leer tus mensajes confidenciales."</string> - <!-- XL --> - <string name="permdesc_writeSms" product="tablet" msgid="692041754996169941">"Permite que la aplicación escriba a los mensajes SMS almacenados en tu tableta o tarjeta SIM. Las aplicaciones maliciosas pueden borrar tus mensajes."</string> - <string name="permdesc_writeSms" product="default" msgid="1659315878254882599">"Admite que la aplicación escriba a los mensajes SMS almacenados en tu teléfono o tarjeta SIM. Las aplicaciones maliciosas pueden borrar tus mensajes."</string> - <!-- XL --> - <string name="permlab_forceStopPackages" msgid="1277034765943155677">"provocar la detención de otras aplicaciones"</string> - <!-- XL --> - <string name="permlab_forceBack" msgid="4272218642115232597">"cerrar la aplicación a la fuerza"</string> - <!-- XL --> - <string name="permdesc_injectEvents" product="tablet" msgid="6096352450860864899">"Permite que una aplicación ofrezca sus propios eventos de entrada (presionar teclas, etc.) a otras aplicaciones. Las aplicaciones maliciosas pueden utilizarlo para tomar el control de la tableta."</string> - <string name="permdesc_injectEvents" product="default" msgid="2842435693076075109">"Admite una aplicación que ofrece sus propios eventos de entrada (presionar teclas, etc.) a otras aplicaciones. Las aplicaciones maliciosas pueden utilizarlo para tomar el control del teléfono."</string> - <!-- XL --> - <string name="permdesc_clearAppCache" product="tablet" msgid="1147333973960547529">"Permite que una aplicación libere espacio de almacenamiento en la tableta eliminando archivos del directorio de memoria caché de la aplicación. En general, el acceso es muy restringido para el proceso del sistema."</string> - <string name="permdesc_clearAppCache" product="default" msgid="5790679870501740958">"Admite una aplicación que libera espacio de almacenamiento en el teléfono al eliminar archivos del directorio de memoria caché de la aplicación. En general, el acceso es muy restringido para el proceso del sistema."</string> - <!-- XL --> - <string name="permdesc_readLogs" product="tablet" msgid="3701009088710926065">"Permite que una aplicación lea diversos archivos de registro del sistema. Esto le permite descubrir información general acerca de lo que haces con la tableta, y puede potencialmente incluir información personal o privada."</string> - <string name="permdesc_readLogs" product="default" msgid="8520101632251038537">"Admite una aplicación que lee diversos archivos de registro del sistema. Esto te permite descubrir información general acerca de lo que haces con el teléfono, y puede potencialmente incluir información personal o privada."</string> - <!-- XL --> - <string name="permdesc_changeComponentState" product="tablet" msgid="1791075936446230356">"Permite que una aplicación cambie si se debe activar o no un componente de otra aplicación. Las aplicaciones maliciosas pueden utilizarlo para desactivar funciones importantes de la tableta. Se debe tener cuidado con el permiso, ya que es posible que los componentes de la aplicación alcancen un estado inservible, imperfecto e inestable."</string> - <string name="permdesc_changeComponentState" product="default" msgid="587130297076242796">"Permite que una aplicación cambie si se debe activar o no un componente de otra aplicación. Las aplicaciones maliciosas pueden utilizarlo para desactivar funciones importantes del teléfono. Se debe tener cuidado con el permiso, ya que es posible que los componentes de la aplicación alcancen un estado inservible, imperfecto e inestable."</string> - <!-- XL --> - <string name="permdesc_receiveBootCompleted" product="tablet" msgid="8660405432665162821">"Permite que una aplicación se inicie en cuanto el sistema haya finalizado la inicialización. Esto puede ocasionar que la tableta demore más en inicializar y que la aplicación retarde el funcionamiento total de la tableta al estar en ejecución constante."</string> - <string name="permdesc_receiveBootCompleted" product="default" msgid="1827765096700833418">"Admite una aplicación que se inicia cuando el sistema haya finalizado la inicialización. Esto puede ocasionar que se demore más tiempo en inicializar el teléfono y que la aplicación retarde el funcionamiento total del teléfono al estar en ejecución constante."</string> - <!-- XL --> - <string name="permdesc_readContacts" product="tablet" msgid="1611730857475623952">"Permite que una aplicación lea todos los datos de de contacto (direcciones) almacenados en tu tableta. Las aplicaciones maliciosas pueden utilizarlo para enviar tus datos a otras personas."</string> - <string name="permdesc_readContacts" product="default" msgid="6610535719925788049">"Admite una aplicación que lee todos los datos de (direcciones) de contactos almacenados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para enviar tus eventos de calendario a otras personas."</string> - <!-- XL --> - <string name="permdesc_writeContacts" product="tablet" msgid="4572703488642353934">"Permite que una aplicación modifique los datos de (dirección) guardados en tu tableta. Las aplicaciones maliciosas pueden utilizarlo para borrar o modificar los datos de contacto."</string> - <string name="permdesc_writeContacts" product="default" msgid="714397557711969040">"Admite una aplicación que modifica los datos de (dirección de) contacto guardados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para borrar o modificar los datos de contacto."</string> - <!-- XL --> - <string name="permdesc_readCalendar" product="tablet" msgid="2991522150157238929">"Permite que una aplicación lea todos los eventos de calendario almacenados en tu tableta. Las aplicaciones maliciosas pueden utilizarlo para enviar tus eventos de calendario a otras personas."</string> - <string name="permdesc_readCalendar" product="default" msgid="2618681024074734985">"Admite que una aplicación lea todos los eventos de calendario almacenados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para enviar tus eventos de calendario a otras personas."</string> - <!-- XL --> - <string name="permdesc_accessFineLocation" product="tablet" msgid="9186984659787705379">"Accede a las fuentes de ubicación precisa, como el Sistema de posicionamiento global en la tableta, si está disponible. Las aplicaciones maliciosas pueden utilizarlo para determinar donde te encuentras y puede consumir energía adicional de la batería."</string> - <string name="permdesc_accessFineLocation" product="default" msgid="7130852247133907221">"Accede a las fuentes de ubicación precisa, como el Sistema de posicionamiento global en el teléfono, si está disponible. Las aplicaciones maliciosas pueden utilizarlo para determinar donde te encuentras y puede consumir energía adicional de la batería."</string> - <!-- XL --> - <string name="permdesc_accessCoarseLocation" product="tablet" msgid="2943949975553225591">"Accede a las fuentes de ubicación aproximada, como la base de datos de la red de celulares, para determinar la ubicación aproximada de un tableta, si está disponible. Las aplicaciones maliciosas pueden utilizarlo para determinar aproximadamente dónde te encuentras."</string> - <string name="permdesc_accessCoarseLocation" product="default" msgid="7474972764638621839">"Accede a las fuentes de ubicación aproximada, como la base de datos de la red de celulares, para determinar una ubicación telefónica aproximada, si está disponible. Las aplicaciones maliciosas pueden utilizarlo para determinar aproximadamente donde te encuentras."</string> - <!-- XL --> - <string name="permlab_brick" product="tablet" msgid="6967130388106614085">"inhabilitar tableta de forma permanente"</string> - <string name="permlab_brick" product="default" msgid="3120283238813720510">"desactivar teléfono de manera permanente"</string> - <!-- XL --> - <string name="permdesc_brick" product="tablet" msgid="8506097851567246888">"Permite que la aplicación desactive todo la tableta de manera permanente. Esto es muy peligroso."</string> - <string name="permdesc_brick" product="default" msgid="6696459767254028146">"Admite que la aplicación desactive todo el teléfono de manera permanente. Esto es muy peligroso."</string> - <!-- XL --> - <string name="permlab_reboot" product="tablet" msgid="8299304590708874992">"forzar reinicio de la tableta"</string> - <string name="permlab_reboot" product="default" msgid="7761230490609718232">"provocar el reinicio del teléfono"</string> - <!-- XL --> - <string name="permdesc_reboot" product="tablet" msgid="8289402537687518137">"Permite que la aplicación provoque el reinicio de la tableta."</string> - <string name="permdesc_reboot" product="default" msgid="2425170170087532554">"Admite que la aplicación provoque que el teléfono se reinicie."</string> - <!-- XL --> - <string name="permlab_performCdmaProvisioning" product="tablet" msgid="1602175938040327630">"iniciar directamente la configuración CDMA de la tableta"</string> - <string name="permlab_performCdmaProvisioning" product="default" msgid="2364447039211144234">"comienza directamente la configuración CDMA del teléfono"</string> - <!-- XL --> - <string name="permlab_checkinProperties" msgid="8770356116386811264">"acceder a las propiedades de registro"</string> - <!-- XL --> - <string name="permlab_bindGadget" msgid="2772444448613501375">"elegir controles"</string> - <!-- XL --> - <string name="permdesc_bindGadget" msgid="5172327215211875807">"Admite que la aplicación indique al sistema cuáles controles puede utilizar cada aplicación. Con este permiso, las aplicaciones pueden brindar acceso a los datos personales a otras aplicaciones. Las aplicaciones normales no deben utilizarlo."</string> - <!-- XL --> - <string name="permlab_wakeLock" product="tablet" msgid="8548785337425173690">"evitar que la tableta entre en estado de inactividad"</string> - <string name="permlab_wakeLock" product="default" msgid="7590534090355174805">"evitar que el teléfono entre en estado de inactividad"</string> - <!-- XL --> - <string name="permdesc_wakeLock" product="tablet" msgid="6871828582124115814">"Permite que una aplicación evite que la tableta entre en estado de inactividad."</string> - <string name="permdesc_wakeLock" product="default" msgid="1200311528451468554">"Admite una aplicación que evita que el teléfono entre en estado de inactividad."</string> - <!-- XL --> - <string name="permlab_devicePower" product="tablet" msgid="4737873025369971061">"apagar o encender la tableta"</string> - <string name="permlab_devicePower" product="default" msgid="6879460773734563850">"apagar o encender el teléfono"</string> - <!-- XL --> - <string name="permdesc_devicePower" product="tablet" msgid="5930342678996327905">"Permite que una aplicación encienda o apague la tableta."</string> - <string name="permdesc_devicePower" product="default" msgid="6653901512148320818">"Admite que la aplicación encienda o apague el teléfono."</string> - <!-- XL --> - <string name="permdesc_factoryTest" product="tablet" msgid="396653994609190055">"Se ejecuta como una prueba de fábrica de bajo nivel que permite un acceso completo al hardware de la tableta. Sólo disponible cuando la tableta se ejecuta en el modo de prueba de fábrica."</string> - <string name="permdesc_factoryTest" product="default" msgid="4581239666568781766">"Se ejecuta como una prueba de fábrica de bajo nivel que permite un acceso completo al hardware del teléfono. Sólo disponible cuando un teléfono se ejecuta en el modo de prueba de fábrica."</string> - <!-- XL --> - <string name="permlab_setWallpaper" msgid="845032615203772571">"establecer fondo de pantalla"</string> - <!-- XL --> - <string name="permdesc_setWallpaper" msgid="3378501759667797259">"Admite que la aplicación establezca el fondo de pantalla del sistema."</string> - <!-- XL --> - <string name="permlab_setWallpaperHints" msgid="4995885499848128983">"establecer sugerencias de tamaño del fondo de pantalla"</string> - <!-- XL --> - <string name="permdesc_setWallpaperHints" msgid="8857901708691279048">"Admite que la aplicación establezca las sugerencias de tamaño del fondo de pantalla del sistema."</string> - <!-- XL --> - <string name="permdesc_setTime" product="tablet" msgid="7329574196603775554">"Permite que una aplicación cambie la hora de la tableta."</string> - <string name="permdesc_setTime" product="default" msgid="7787175369529849526">"Permite a una aplicación cambiar la hora del teléfono."</string> - <!-- XL --> - <string name="permdesc_setTimeZone" product="tablet" msgid="3851480395450283316">"Permite que una aplicación cambie la zona horaria de la tableta."</string> - <string name="permdesc_setTimeZone" product="default" msgid="3231143515254577541">"Admite una aplicación que cambia la zona horaria del teléfono."</string> - <!-- XL --> - <string name="permdesc_getAccounts" product="tablet" msgid="374861616407073729">"Permite que una aplicación obtenga una la lista de cuentas conocidas por la tableta."</string> - <string name="permdesc_getAccounts" product="default" msgid="6356501268884684429">"Admite una aplicación que obtiene la lista de cuentas conocidas del teléfono."</string> - <!-- XL --> - <string name="permdesc_bluetoothAdmin" product="tablet" msgid="8034248164659819866">"Permite que una aplicación configure el Bluetooth local de la tableta, y descubra y se vincule con dispositivos remotos."</string> - <string name="permdesc_bluetoothAdmin" product="default" msgid="2555370145147752776">"Admite una aplicación que configura el teléfono Bluetooth local y descubre y se vincula con dispositivos remotos."</string> - <!-- XL --> - <string name="permdesc_bluetooth" product="tablet" msgid="4631562404621086816">"Permite que una aplicación vea la configuración de la tableta Bluetooth local, y que realice y acepte conexiones con dispositivos vinculados."</string> - <string name="permdesc_bluetooth" product="default" msgid="1202135959389935958">"Admite una aplicación que ve la configuración del teléfono Bluetooth local, y realiza y acepta conexiones con dispositivos vinculados."</string> - <!-- XL --> - <string name="policydesc_watchLogin" product="tablet" msgid="7927990389488709968">"Supervisar el número de contraseñas incorrectas ingresadas al desbloquear la pantalla, y bloquear la tableta o eliminar todos los datos del teléfono si se ingresan demasiadas contraseñas incorrectas."</string> - <string name="policydesc_watchLogin" product="default" msgid="4998594853332798741">"Supervisa el número de contraseñas incorrectas ingresadas al desbloquear la pantalla, y bloquee el teléfono o elimine todos los datos del teléfono si se ingresan demasiadas contraseñas incorrectas."</string> - <!-- XL --> - <string name="policydesc_wipeData" product="tablet" msgid="7871059407132175855">"Borrar los datos de la tableta sin advertencias, restableciendo la configuración de fábrica"</string> - <string name="policydesc_wipeData" product="default" msgid="6003127471292136411">"Borrar los datos del teléfono sin advertencias al restablecer la configuración original"</string> - <!-- XL --> - <string-array name="phoneTypes"> - <item msgid="7066790683658405096">"Pantalla principal"</item> - <item msgid="5813675571320075289">"Teléfono móvil"</item> - <item msgid="1236863745322977021">"Trabajo"</item> - <item msgid="7018038125868933566">"Fax laboral"</item> - <item msgid="4280105707643078852">"Fax personal"</item> - <item msgid="6527083287534782580">"Localizador"</item> - <item msgid="706618935041239888">"Otro"</item> - <item msgid="8099625332540070724">"Personalizado"</item> - </string-array> - <!-- XL --> - <string-array name="emailAddressTypes"> - <item msgid="8080673853442355385">"Pantalla principal"</item> - <item msgid="924798042157989715">"Trabajo"</item> - <item msgid="1959796935508361158">"Otro"</item> - <item msgid="756534161520555926">"Personalizado"</item> - </string-array> - <!-- XL --> - <string-array name="postalAddressTypes"> - <item msgid="1166454994471190496">"Pantalla principal"</item> - <item msgid="3602955376664951787">"Trabajo"</item> - <item msgid="4646105398231575508">"Otro"</item> - <item msgid="8191179302220976184">"Personalizado"</item> - </string-array> - <!-- XL --> - <string-array name="imAddressTypes"> - <item msgid="2528436635522549040">"Pantalla principal"</item> - <item msgid="5834207144511084508">"Trabajo"</item> - <item msgid="3796683891024584813">"Otro"</item> - <item msgid="6644316676098098833">"Personalizado"</item> - </string-array> - <!-- XL --> - <string-array name="organizationTypes"> - <item msgid="6571823895277482483">"Trabajo"</item> - <item msgid="4013674940836786104">"Otro"</item> - <item msgid="8549998141814637453">"Personalizado"</item> - </string-array> - <!-- XL --> - <string name="phoneTypeHome" msgid="2087652870939635038">"Pantalla principal"</string> - <!-- XL --> - <string name="phoneTypeMobile" msgid="7084573626440935140">"Teléfono móvil"</string> - <!-- XL --> - <string name="emailTypeHome" msgid="1298773522695936612">"Pantalla principal"</string> - <!-- XL --> - <string name="emailTypeMobile" msgid="5515624509217674980">"Teléfono móvil"</string> - <!-- XL --> - <string name="postalTypeHome" msgid="7553888805834710738">"Pantalla principal"</string> - <!-- XL --> - <string name="imTypeHome" msgid="3732426015472142690">"Pantalla principal"</string> - <!-- XL --> - <string name="sipAddressTypeHome" msgid="8212230577724692911">"Pantalla principal"</string> - <!-- XL --> - <string name="lockscreen_pattern_instructions" msgid="9171665895877154059">"Extraer el patrón para desbloquear"</string> - <!-- XL --> - <string name="lockscreen_battery_short" msgid="891372653127247039">"Segmento <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> - <!-- XL --> - <string name="lockscreen_missing_sim_message" product="tablet" msgid="3961770350078423154">"No hay tarjeta SIM en la tableta."</string> - <string name="lockscreen_missing_sim_message" product="default" msgid="5997031739677800758">"No hay tarjeta SIM en el teléfono."</string> - <!-- XL --> - <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="2429599468920598896">"Has establecido incorrectamente tu gráfico de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. "\n\n"Vuelve a intentarlo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string> - <!-- XL --> - <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3211267232692817092">"Has establecido incorrectamente tu gráfico de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees tu tableta al acceder a Google."\n\n" Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="7097890594752816076">"Has establecido incorrectamente tu gráfico de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos, se te solicitará que desbloquees tu teléfono al acceder a Google. "\n\n" Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string> - <!-- XL --> - <string name="lockscreen_glogin_submit_button" msgid="4760302858316749698">"Acceder"</string> - <!-- XL --> - <string name="lockscreen_glogin_invalid_input" msgid="7265806099449246244">"Nombre de usuario o contraseña no válidos."</string> - <!-- XL --> - <string name="hour_ampm" msgid="6161399724998500216">"Segmento <xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <!-- XL --> - <string name="hour_cap_ampm" msgid="724197720606114012">"Segmento <xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> - <!-- XL --> - <string name="double_tap_toast" msgid="2893001600485832537">"Sugerencia: presiona dos veces para acercar y alejar"</string> - <!-- XL --> - <string name="autofill_address_name_separator" msgid="5171727678145785075">" Segmento "</string> - <!-- XL --> - <string name="permlab_readHistoryBookmarks" msgid="6148149152792104516">"leer historial y favoritos del navegador"</string> - <!-- XL --> - <string name="permdesc_readHistoryBookmarks" msgid="7371336472744100059">"Permite a la aplicación leer todas las URL que ha visitado el navegador y todos los favoritos del navegador."</string> - <!-- XL --> - <string name="permlab_writeHistoryBookmarks" msgid="1369319390968848231">"escribir historial y favoritos del navegador"</string> - <!-- XL --> - <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="3870229397949634482">"Permite que una aplicación modifique el historial de navegación y los favoritos del navegador almacenados en tu tableta. Las aplicaciones maliciosas pueden utilizarlo para borrar o modificar los datos en tu navegador."</string> - <string name="permdesc_writeHistoryBookmarks" product="default" msgid="6845659334691579933">"Permite a una aplicación modificar el historial y los favoritos del navegador almacenados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para borrar o modificar tus datos."</string> - <!-- XL --> - <string name="permlab_setAlarm" msgid="8112208516527103653">"fija la alarma en el reloj de alarma"</string> - <!-- XL --> - <string name="permdesc_setAlarm" msgid="5454386032150297784">"Permite a la aplicación fijar una alarma en una aplicación de alarma. Es posible que algunas aplicaciones de alarma no implementen esta función."</string> - <!-- XL --> - <string name="menu_delete_shortcut_label" msgid="8482704027019632634">"eliminar"</string> - <!-- XL --> - <plurals name="num_minutes_ago"> - <item quantity="one" msgid="468685153446407901">"hace 1 minuto"</item> - <item quantity="other" msgid="211907662145171054">"Hace <xliff:g id="COUNT">%d</xliff:g> minutos"</item> - </plurals> - <!-- XL --> - <plurals name="num_hours_ago"> - <item quantity="one" msgid="2172827344495633666">"hace 1 hora"</item> - <item quantity="other" msgid="6094391999921908511">"Hace <xliff:g id="COUNT">%d</xliff:g> horas"</item> - </plurals> - <!-- XL --> - <plurals name="num_days_ago"> - <item quantity="one" msgid="3766494702684657165">"ayer"</item> - <item quantity="other" msgid="5030316952487658828">"Hace <xliff:g id="COUNT">%d</xliff:g> días"</item> - </plurals> - <!-- XL --> - <plurals name="abbrev_num_seconds_ago"> - <item quantity="one" msgid="1441918190525197797">"hace 1 s"</item> - <item quantity="other" msgid="3958332340802316933">"hace <xliff:g id="COUNT">%d</xliff:g> segundos"</item> - </plurals> - <!-- XL --> - <plurals name="abbrev_num_minutes_ago"> - <item quantity="one" msgid="3404245071272952255">"hace 1 min"</item> - <item quantity="other" msgid="6004808520903389765">"hace <xliff:g id="COUNT">%d</xliff:g> min"</item> - </plurals> - <!-- XL --> - <plurals name="abbrev_num_hours_ago"> - <item quantity="one" msgid="806010152744475654">"hace 1 hora"</item> - <item quantity="other" msgid="7553525762196895290">"Hace <xliff:g id="COUNT">%d</xliff:g> horas"</item> - </plurals> - <!-- XL --> - <plurals name="abbrev_num_days_ago"> - <item quantity="one" msgid="5819444260187611238">"ayer"</item> - <item quantity="other" msgid="1069986768190052012">"Hace <xliff:g id="COUNT">%d</xliff:g> días"</item> - </plurals> - <!-- XL --> - <string name="preposition_for_time" msgid="3606608741888559522">"a la/s <xliff:g id="TIME">%s</xliff:g>"</string> - <!-- XL --> - <string name="minutes" msgid="1486240209627391507">"min"</string> - <!-- XL --> - <string name="selectAll" msgid="847570914566450966">"Seleccionar todos"</string> - <!-- XL --> - <string name="low_internal_storage_view_text" product="tablet" msgid="6497548813789342134">"Está quedando poco espacio de almacenamiento en la tableta."</string> - <string name="low_internal_storage_view_text" product="default" msgid="2901569701336868928">"Hay poco espacio de almacenamiento en el teléfono."</string> - <!-- XL --> - <string name="capital_on" msgid="5705918046896729554">"ENCENDIDO"</string> - <!-- XL --> - <string name="capital_off" msgid="6734525950925281617">"APAGADO"</string> - <!-- XL --> - <string name="wait" msgid="8036803866051401072">"Espera"</string> - <!-- XL --> - <string name="heavy_weight_notification" msgid="5762367358298413602">"<xliff:g id="APP">%1$s</xliff:g> se está ejecutando"</string> - <!-- XL --> - <string name="ext_media_checking_notification_title" product="nosdcard" msgid="103298639852047758">"Preparando almacenamiento USB"</string> - <string name="ext_media_checking_notification_title" product="default" msgid="2111086053471573248">"Preparando la tarjeta SD"</string> - <!-- XL --> - <string name="ime_action_done" msgid="7200237418945571897">"Listo"</string> - <!-- XL --> - <string name="wallpaper_binding_label" msgid="6966627494441714436">"Fondo de pantalla"</string> - <!-- XL --> - <string name="websearch" msgid="904596193450917688">"Búsqueda web"</string> - <!-- XL --> - <string name="permlab_accessMtp" msgid="2385215229145694622">"implementar protocolo MTP"</string> - <!-- XL --> - <string name="permdesc_accessMtp" msgid="4707854877711083465">"Permite acceso al driver kernel MTP para implementar el protocolo MTP USB."</string> - <!-- XL --> - <string name="policylab_encryptedStorage" msgid="488196329176602372">"Establecer la encriptación del almacenamiento"</string> - <!-- XL --> - <string name="policydesc_encryptedStorage" msgid="6111889605506443825">"Requiere que los datos almacenados de la aplicación estén encriptados"</string> - <!-- XL --> - <string name="autofill_address_summary_name_format" msgid="7531610259426153850">"$1$2$3"</string> - <!-- XL --> - <string name="autofill_address_summary_format" msgid="8398158823767723887">"$1$2$3"</string> - <!-- XL --> - <string name="configure_input_methods" msgid="8093308517599282222">"Configurar métodos de entrada"</string> - <!-- XL --> - <string name="gpsNotifTicker" msgid="6612390321359669319">"Solicitud de ubicación de <xliff:g id="NAME">%s</xliff:g>"</string> - <!-- XL --> - <string name="gpsNotifTitle" msgid="7533028619350196545">"Solicitud de ubicación"</string> - <!-- XL --> - <string name="gpsNotifMessage" msgid="5592972401593755530">"Solicitado por <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> - <!-- XL --> - <string name="gpsVerifYes" msgid="1511016393202739483">"Sí"</string> - <!-- XL --> - <string name="gpsVerifNo" msgid="661731239940896232">"No"</string> - <!-- XL --> - <string name="sync_too_many_deletes" msgid="6088394702274114202">"Eliminar el límite excedido"</string> - <!-- XL --> - <string name="sync_too_many_deletes_desc" msgid="4794082462774743277">"Existen <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> artículos eliminados para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, cuenta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. ¿Qué te gustaría hacer?"</string> - <!-- XL --> - <string name="sync_really_delete" msgid="7782215155483034729">"Eliminar artículos."</string> - <!-- XL --> - <string name="sync_undo_deletes" msgid="6501390120900825477">"Deshacer eliminaciones."</string> - <!-- XL --> - <string name="sync_do_nothing" msgid="612038572646360281">"No hagas nada por el momento."</string> -</resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index de964c1d3852..23cf74ea7405 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -289,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Admite una aplicación que lee y escribe a cualquier recurso dentro del grupo de diagnóstico; por ejemplo, archivos con /dev. Esto puede afectar potencialmente la estabilidad y la seguridad del sistema. Debe utilizarlo SÓLO el fabricante o el operador en los diagnósticos específicos del hardware."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"activar o desactivar componentes de la aplicación"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permite que una aplicación cambie si se debe activar o no un componente de otra aplicación. Las aplicaciones maliciosas pueden utilizarlo para desactivar funciones importantes del tablet. Se debe tener cuidado con el permiso, ya que es posible que los componentes de la aplicación alcancen un estado inservible, imperfecto e inestable."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite que una aplicación cambie si se debe activar o no un componente de otra aplicación. Las aplicaciones maliciosas pueden utilizarlo para desactivar funciones importantes del tablet. Se debe tener cuidado con el permiso, ya que es posible que los componentes de la aplicación alcancen un estado inservible, imperfecto e inestable."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite que una aplicación cambie si se debe activar o no un componente de otra aplicación. Las aplicaciones maliciosas pueden utilizarlo para desactivar funciones importantes de la tableta. Se debe tener cuidado con el permiso, ya que es posible que los componentes de la aplicación alcancen un estado inservible, imperfecto e inestable."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"establecer aplicaciones preferidas"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Admite una aplicación que modifica tus aplicaciones preferidas. Puede admitir aplicaciones maliciosas que cambien silenciosamente las aplicaciones que se ejecutan e imiten tus aplicaciones existentes para recopilar tus datos privados."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"modificar la configuración global del sistema"</string> @@ -365,10 +365,8 @@ <string name="permdesc_flashlight" msgid="6433045942283802309">"Admite que la aplicación controle la linterna."</string> <string name="permlab_accessUsb" msgid="7362327818655760496">"acceder a dispositivos USB"</string> <string name="permdesc_accessUsb" msgid="2414271762914049292">"Permite que la aplicación acceda a dispositivos USB."</string> - <!-- no translation found for permlab_accessMtp (4953468676795917042) --> - <skip /> - <!-- no translation found for permdesc_accessMtp (6532961200486791570) --> - <skip /> + <!-- outdated translation 2385215229145694622 --> <string name="permlab_accessMtp" msgid="4953468676795917042">"implementar protocolo MTP"</string> + <!-- outdated translation 4707854877711083465 --> <string name="permdesc_accessMtp" msgid="6532961200486791570">"Permite acceso al driver kernel MTP para implementar el protocolo MTP USB."</string> <string name="permlab_hardware_test" msgid="4148290860400659146">"probar el hardware"</string> <string name="permdesc_hardware_test" msgid="3668894686500081699">"Admite que la aplicación controle diversos periféricos con el fin de probar el hardware."</string> <string name="permlab_callPhone" msgid="3925836347681847954">"llamar directamente a números de teléfono"</string> @@ -490,10 +488,8 @@ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Configuración del proxy global de dispositivo que se utilizará mientras se habilita la política. Sólo la primera administración de dispositivo configura el proxy global efectivo."</string> <string name="policylab_expirePassword" msgid="2314569545488269564">"Establecer la caducidad de la contraseña"</string> <string name="policydesc_expirePassword" msgid="7276906351852798814">"Verifica cuánto tiempo antes debes cambiar la contraseña de la pantalla de bloqueo"</string> - <!-- no translation found for policylab_encryptedStorage (8901326199909132915) --> - <skip /> - <!-- no translation found for policydesc_encryptedStorage (2504984732631479399) --> - <skip /> + <!-- outdated translation 488196329176602372 --> <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Establecer la encriptación del almacenamiento"</string> + <!-- outdated translation 6111889605506443825 --> <string name="policydesc_encryptedStorage" msgid="2504984732631479399">"Requiere que los datos almacenados de la aplicación estén encriptados"</string> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Casa"</item> <item msgid="869923650527136615">"Celular"</item> @@ -676,11 +672,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Autocompl."</string> <string name="setup_autofill" msgid="8154593408885654044">"Conf func Autocompl"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"leer historial y marcadores del navegador"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite a la aplicación leer todas las URL que ha visitado el navegador y todos los marcadores del navegador."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"escribir historial y marcadores del navegador"</string> @@ -913,8 +907,7 @@ <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración de USB conectada"</string> <string name="adb_active_notification_message" msgid="8470296818270110396">"Seleccionar para desactivar la depuración de USB."</string> <string name="select_input_method" msgid="6865512749462072765">"Seleccionar método de entrada"</string> - <!-- no translation found for configure_input_methods (6324843080254191535) --> - <skip /> + <!-- outdated translation 8093308517599282222 --> <string name="configure_input_methods" msgid="6324843080254191535">"Configurar métodos de entrada"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string> @@ -1015,24 +1008,17 @@ <string name="websearch" msgid="4337157977400211589">"Buscar en la Web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Solicitud de ubicación"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Sí"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"No"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Eliminar el límite excedido"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Eliminar artículos."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Deshacer eliminaciones."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"No hagas nada por el momento."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index ccc7dabf3b51..a60e4da3651f 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Apagando..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"La tableta se apagará."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"El teléfono se apagará."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"¿Deseas apagar el teléfono?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string> <string name="no_recent_tasks" msgid="279702952298056674">"No hay aplicaciones recientes"</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Opciones de tableta"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Permite que una aplicación lea y escriba en cualquier recurso propiedad del grupo de diagnóstico como, por ejemplo, archivos in/dev. Este permiso podría afectar a la seguridad y estabilidad del sistema. SÓLO se debe utilizar para diagnósticos específicos de hardware realizados por el fabricante o el operador."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"habilitar o inhabilitar componentes de la aplicación"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permite que una aplicación cambie si un componente de otra aplicación está habilitado o inhabilitado. Las aplicaciones malintencionadas pueden utilizar este permiso para inhabilitar funciones importantes de la tableta. Este permiso se debe utilizar con precaución, ya que es posible que los componentes se vuelvan inservibles, inconsistentes o inestables."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite que una aplicación cambie si un componente de otra aplicación está habilitado o inhabilitado. Las aplicaciones malintencionadas pueden utilizar este permiso para inhabilitar funciones importantes de la tableta. Este permiso se debe utilizar con precaución, ya que es posible que los componentes se vuelvan inservibles, inconsistentes o inestables."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite que una aplicación cambie si un componente de otra aplicación está habilitado o inhabilitado. Las aplicaciones malintencionadas pueden utilizar este permiso para inhabilitar funciones importantes de la tableta. Este permiso se debe utilizar con precaución, ya que es posible que los componentes se vuelvan inservibles, inconsistentes o inestables."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"establecer aplicaciones preferidas"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Permite que una aplicación modifique las aplicaciones preferidas del usuario. De esta forma, las aplicaciones malintencionadas pueden cambiar de forma silenciosa las aplicaciones que se están ejecutando, falsificando las aplicaciones existentes para recopilar datos privados del usuario."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"modificar la configuración global del sistema"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Autocompletar"</string> <string name="setup_autofill" msgid="8154593408885654044">"Config autocomp"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"leer información de marcadores y del historial del navegador"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite que la aplicación lea todas las URL que ha visitado el navegador y todos sus marcadores."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"escribir en marcadores y en el historial del navegador"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"Una coincidencia"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Listo"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Desactivando almacenamiento USB..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Desactivando tarjeta SD..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Borrando almacenamiento USB..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Búsqueda web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Solicitud de ubicación"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Sí"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"No"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Límite de eliminaciones superado"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Eliminar los elementos"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Deshacer las eliminaciones"</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"No hacer nada por ahora"</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index d3eac2d13eb1..033287f2762e 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"جستجوی وب"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"درخواست مکان"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"بله"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"خیر"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"از محدودیت حذف فراتر رفت"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"موارد را حذف کنید."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"واگرد موارد حذف شده."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"اکنون هیچ کاری انجام نشود."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 0e12063eef16..899bf4255700 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Verkkohaku"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Sijaintipyyntö"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Kyllä"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Ei"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Poistoraja ylittynyt"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Poista kohteet."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Kumoa poistot."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Älä tee mitään."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 194f23f794d4..976834b58a1e 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Arrêt en cours..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Votre tablette va s\'éteindre."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Votre téléphone va s\'éteindre."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Souhaitez-vous éteindre votre téléphone ?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Récentes"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Aucune application récente"</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Options de la tablette"</string> @@ -291,7 +290,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Permet à une application de lire et d\'éditer toute ressource appartenant au groupe de diagnostics (par exemple, les fichiers in/dev). Ceci peut affecter la stabilité et la sécurité du système. Cette fonctionnalité est UNIQUEMENT réservée aux diagnostics matériels effectués par le fabricant ou l\'opérateur."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"Activer ou désactiver des éléments de l\'application"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permet à une application d\'activer ou de désactiver un composant dépendant d\'une autre application. Des applications malveillantes peuvent exploiter cette fonctionnalité pour désactiver des options importantes de votre tablette. Cette autorisation doit être utilisée avec prudence : elle est susceptible de rendre les composants d\'une application inutilisables, incohérents ou instables."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permet à une application d\'activer ou de désactiver un composant dépendant d\'une autre application. Des applications malveillantes peuvent exploiter cette fonctionnalité pour désactiver des options importantes de votre tablette. Cette autorisation doit être utilisée avec prudence : elle est susceptible de rendre les composants d\'une application inutilisables, incohérents ou instables."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permet à une application d\'activer ou de désactiver un composant dépendant d\'une autre application. Des applications malveillantes peuvent exploiter cette fonctionnalité pour désactiver des options importantes de votre tablette. Cette autorisation doit être utilisée avec prudence : elle est susceptible de rendre les composants d\'une application inutilisables, incohérents ou instables."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"Définition des applications préférées"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Permet à une application de modifier vos applications préférées. Des applications malveillantes peuvent utiliser cette fonctionnalité pour modifier discrètement les applications en cours d\'exécution, en imitant vos applications existantes afin de récupérer des données personnelles vous concernant."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"Modification des paramètres généraux du système"</string> @@ -470,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"Modifier/supprimer le contenu de la carte SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Autorise une application à écrire sur la mémoire USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Autorise une application à écrire sur la carte SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <!-- outdated translation 5585262071354704256 --> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modifier/supprimer le contenu des mémoires de stockage internes"</string> + <!-- outdated translation 2372999661142345443 --> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permet à une application de modifier le contenu de la mémoire de stockage interne."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accéder au système de fichiers en cache"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permet à une application de lire et d\'écrire dans le système de fichiers en cache."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"effectuer/recevoir des appels Internet"</string> @@ -680,11 +677,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Saisie auto"</string> <string name="setup_autofill" msgid="8154593408885654044">"Config. saisie auto"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"lire l\'historique et les favoris du navigateur"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Autorise l\'application à lire toutes les URL auxquelles le navigateur a accédé et tous ses favoris."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"écrire dans l\'historique et les favoris du navigateur"</string> @@ -1000,8 +995,7 @@ <item quantity="one" msgid="8167147081136579439">"1 correspondance"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"OK"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Désinstallation de la mémoire de stockage USB..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Désinstallation de la carte SD..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Effacement de la mémoire de stockage USB..."</string> @@ -1020,24 +1014,17 @@ <string name="websearch" msgid="4337157977400211589">"Recherche Web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Demande de position"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Oui"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Non"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Le nombre maximal de suppressions a été atteint."</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Supprimer les éléments"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Annuler les suppressions"</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Ne rien faire pour l\'instant"</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 43a1c28ec7fd..edf7bf7cf434 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1014,24 +1014,17 @@ <string name="websearch" msgid="4337157977400211589">"Pretraž. weba"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Zahtjev za lokaciju"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Da"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Ne"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Prekoračeno je ograničenje za brisanje"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Izbriši ove stavke"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Poništi brisanja."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Za sad nemoj ništa učiniti."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index c4ee0ffa1312..7502e0a80a49 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Webes keresés"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Hely lekérése"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Igen"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nem"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"A szinkronizálás elérte a törlésre vonatkozó korlátot"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Az elemek törlése."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Törlés visszavonása."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Most nem."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 537ae5fc8e70..d80a2a45f95d 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Penelusuran Web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Permintaan lokasi"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Ya"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Tidak"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Penghapusan melebihi batas"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Hapus item tersebut."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Urung penghapusan."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Jangan lakukan apa pun untuk saat ini."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 0d24924fec7d..cf577f9d11fd 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Spegnimento..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Il tablet verrà spento."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Il telefono verrà spento."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Spegnere?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recenti"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Nessuna applicazione recente."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Opzioni tablet"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Consente a un\'applicazione di leggere le risorse del gruppo diag e scrivere a esse, per esempio i file in /dev. Questa capacità potrebbe influire sulla stabilità e sicurezza del sistema. Dovrebbe essere utilizzata SOLTANTO per diagnostiche specifiche dell\'hardware effettuate dal produttore o dall\'operatore."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"attivazione/disattivazione componenti applicazioni"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Consente a un\'applicazione di attivare o disattivare un componente di un\'altra applicazione. Le applicazioni dannose possono sfruttare questa possibilità per disattivare importanti funzionalità del tablet. Prestare attenzione con questa autorizzazione perché è possibile rendere inutilizzabili, incoerenti o instabili i componenti delle applicazioni."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Consente a un\'applicazione di attivare o disattivare un componente di un\'altra applicazione. Le applicazioni dannose possono sfruttare questa possibilità per disattivare importanti funzionalità del tablet. Prestare attenzione con questa autorizzazione perché è possibile rendere inutilizzabili, incoerenti o instabili i componenti delle applicazioni."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Consente a un\'applicazione di attivare o disattivare un componente di un\'altra applicazione. Le applicazioni dannose possono sfruttare questa possibilità per disattivare importanti funzionalità del tablet. Prestare attenzione con questa autorizzazione perché è possibile rendere inutilizzabili, incoerenti o instabili i componenti delle applicazioni."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"impostazione applicazioni preferite"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Consente la modifica da parte di un\'applicazione delle applicazioni preferite. Le applicazioni dannose potrebbero essere in grado di modificare automaticamente le applicazioni in esecuzione, effettuando lo spoofing delle applicazioni esistenti per raccogliere dati riservati."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"modifica impostazioni di sistema globali"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Compl. auto"</string> <string name="setup_autofill" msgid="8154593408885654044">"Compil. automatica"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"lettura cronologia e segnalibri del browser"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Consente all\'applicazione di leggere tutti gli URL visitati e tutti i segnalibri del browser."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"creazione cronologia e segnalibri del browser"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 corrispondenza"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> di <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Fine"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Smontaggio dell\'archivio USB in corso..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Smontaggio scheda SD in corso..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Cancellazione dell\'archivio USB in corso..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Ricerca Web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Richiesta di posizione"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Sì"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"No"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Limite di eliminazioni superato"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Elimina gli elementi."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Annulla le eliminazioni."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Non fare nulla per ora."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 387073c1660b..9ba56ba2a811 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"חיפוש Google"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"בקשת מיקום"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"כן"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"לא"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"חרגת ממגבלת המחיקה"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"מחק את הפריטים."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"בטל את המחיקות."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"אל תעשה דבר בינתיים."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index f9b5c7d46fde..d4daf909e340 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"シャットダウン中..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"タブレットの電源をOFFにします。"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"携帯電話の電源を切ります。"</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"シャットダウンしてもよろしいですか?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"新着"</string> <string name="no_recent_tasks" msgid="279702952298056674">"最近使ったアプリケーションはありません。"</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"タブレットオプション"</string> @@ -291,7 +290,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"diagグループが所有するリソース(例:/dev内のファイル)への読み書きをアプリケーションに許可します。システムの安定性とセキュリティに影響する恐れがあります。メーカー/オペレーターによるハードウェア固有の診断以外には使用しないでください。"</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"アプリケーションのコンポーネントを有効/無効にする"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"別アプリケーションのコンポーネントの有効/無効を変更することをアプリケーションに許可します。この許可を悪意のあるアプリケーションに利用されると、タブレットの重要な機能が無効にされる恐れがあります。アプリケーションコンポーネントが利用できなくなる、整合性が取れなくなる、または不安定な状態になる恐れがあるので許可には注意が必要です。"</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"別アプリケーションのコンポーネントの有効/無効を変更することをアプリケーションに許可します。この許可を悪意のあるアプリケーションに利用されると、タブレットの重要な機能が無効にされる恐れがあります。アプリケーションコンポーネントが利用できなくなる、整合性が取れなくなる、または不安定な状態になる恐れがあるので許可には注意が必要です。"</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"別アプリケーションのコンポーネントの有効/無効を変更することをアプリケーションに許可します。悪意のあるアプリケーションがタブレットの重要な機能を無効にする恐れがあります。アプリケーションコンポーネントが利用できなくなる、整合性が取れなくなる、または不安定な状態になる恐れがあるので許可には注意が必要です。"</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"優先アプリケーションの設定"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"優先アプリケーションを変更することをアプリケーションに許可します。悪意のあるアプリケーションが実行中のアプリケーションを密かに変更し、既存のアプリケーションになりすまして非公開データを収集する恐れがあります。"</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"システムの全般設定の変更"</string> @@ -470,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"SDカードのコンテンツを修正/削除する"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"USBストレージへの書き込みをアプリケーションに許可します。"</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"SDカードへの書き込みをアプリケーションに許可します。"</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <!-- outdated translation 5585262071354704256 --> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"内部メディアストレージのコンテンツの変更/削除"</string> + <!-- outdated translation 2372999661142345443 --> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"内部メディアストレージのコンテンツの変更をアプリケーションに許可します。"</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"キャッシュファイルシステムにアクセス"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"キャッシュファイルシステムへの読み書きをアプリケーションに許可します。"</string> <string name="permlab_use_sip" msgid="5986952362795870502">"インターネット通話の発着信"</string> @@ -680,11 +677,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"自動入力"</string> <string name="setup_autofill" msgid="8154593408885654044">"自動入力設定"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$3$2$1"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">"、 "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"ブラウザの履歴とブックマークを読み取る"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"ブラウザでアクセスしたすべてのURLおよびブラウザのすべてのブックマークの読み取りをアプリケーションに許可します。"</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"ブラウザの履歴とブックマークを書き込む"</string> @@ -1000,8 +995,7 @@ <item quantity="one" msgid="8167147081136579439">"1件一致"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g>件"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"完了"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"USBストレージのマウント解除中..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"SDカードのマウント解除中..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"USBストレージ内のデータを消去中..."</string> @@ -1020,24 +1014,17 @@ <string name="websearch" msgid="4337157977400211589">"ウェブ検索"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"現在地情報へのアクセス許可"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"はい"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"いいえ"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"削除の制限を超えました"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"項目を削除します。"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"削除を元に戻します。"</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"今は何もしません。"</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 5ab96843dbe4..f0d0418d2f19 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"종료 중..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"태블릿이 종료됩니다."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"휴대전화가 종료됩니다."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"종료하시겠습니까?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"최근 사용한 앱"</string> <string name="no_recent_tasks" msgid="279702952298056674">"최근에 사용한 앱이 없습니다."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"태블릿 옵션"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"애플리케이션이 진단 그룹 소유의 리소스(예: /dev에 있는 파일)를 읽고 쓸 수 있도록 합니다. 이 기능은 시스템 안정성 및 보안에 영향을 미칠 수 있으므로 제조업체 또는 사업자가 하드웨어 관련 진단을 수행하는 경우에만 사용해야 합니다."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"애플리케이션 구성 요소 사용 또는 사용 안함"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"애플리케이션이 다른 애플리케이션 구성 요소 사용 여부를 변경할 수 있도록 합니다. 악성 애플리케이션이 이를 악용하여 중요한 태블릿 기능을 중지시킬 수 있습니다. 이 권한을 허용할 경우 애플리케이션 구성 요소가 사용 불가능하게 되거나 일관성이 맞지 않거나 불안정해질 수 있으므로 주의해야 합니다."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"애플리케이션이 다른 애플리케이션 구성 요소 사용 여부를 변경할 수 있도록 합니다. 악성 애플리케이션이 이를 악용하여 중요한 태블릿 기능을 중지시킬 수 있습니다. 이 권한을 허용할 경우 애플리케이션 구성 요소가 사용 불가능하게 되거나 일관성이 맞지 않거나 불안정해질 수 있으므로 주의해야 합니다."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"애플리케이션이 다른 애플리케이션 구성 요소 사용 여부를 변경할 수 있도록 합니다. 악성 애플리케이션이 이를 악용하여 중요한 태블릿 기능을 중지시킬 수 있습니다. 이 권한을 허용할 경우 애플리케이션 구성 요소가 사용 불가능하게 되거나 일관성이 맞지 않거나 불안정해질 수 있으므로 주의해야 합니다."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"기본 애플리케이션 설정"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"애플리케이션이 기본 애플리케이션을 수정할 수 있도록 합니다. 이 경우 악성 애플리케이션이 사용자의 개인 정보를 수집하기 위해 기존 애플리케이션으로 위장하도록 실행되는 애플리케이션을 몰래 변경할 수 있습니다."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"전체 시스템 설정 수정"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"자동완성"</string> <string name="setup_autofill" msgid="8154593408885654044">"자동완성 설정"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"브라우저의 기록 및 북마크 읽기"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"애플리케이션이 브라우저로 방문한 모든 URL과 브라우저의 모든 북마크를 읽도록 허용합니다."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"브라우저의 기록 및 북마크 쓰기"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"검색결과 1개"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"완료"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"USB 저장소 마운트 해제 중..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"SD 카드 마운트 해제 중..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"USB 저장소 지우는 중..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"웹 검색"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"위치 요청"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"예"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"아니요"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"삭제 한도를 초과했습니다."</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"항목 삭제"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"삭제 실행취소"</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"지금은 아무 작업도 안함"</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index d979c4c0c1bd..4fbe3e5dbd54 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Žiniat. paieška"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Vietovės užklausa"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Taip"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Ne"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Viršyta ištrynimo riba"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Ištrinti elementus."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Anuliuoti ištrynimus."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Kol kas nieko nedaryti."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index ad108ff734da..c587a64276d3 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Meklēt tīmeklī"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Atrašanās vietas pieprasījums"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Jā"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nē"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Pārsniegts dzēšanas ierobežojums"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Dzēsiet šos vienumus."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Atsauciet dzēšanu."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Pagaidām neveiciet nekādas darbības."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 5a67d6fbd6fc..e965688793e9 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Avslutter…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Nettbrettet slås av."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonen vil bli slått av."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Vil du slå av?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Nylig"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Ingen nylig brukte applikasjoner."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Innstillinger for nettbrett"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Lar applikasjonen lese og skrive enhver ressurs eid av gruppen diag; for eksempel, filer i /dev. Dette kan potensielt påvirke systemets sikkerhet og stabilitet. Dette bør KUN brukes for maskinvarespesifikke diagnoseverktøy laget av operatøren eller produsenten."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"aktivere eller deaktigere applikasjonskomponenter"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Lar programmet endre på hvorvidt en komponent i et annet program er aktivert eller ikke. Skadelige programmer kan bruke dette til å deaktivere viktige nettbrettfunksjoner. Denne rettigheten må brukes med forsiktighet, ettersom det er mulig å få programkomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Lar programmet endre på hvorvidt en komponent i et annet program er aktivert eller ikke. Skadelige programmer kan bruke dette til å deaktivere viktige nettbrettfunksjoner. Denne rettigheten må brukes med forsiktighet, ettersom det er mulig å få programkomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Lar programmet endre på hvorvidt en komponent i et annet program er aktivert eller ikke. Skadelige programmer kan bruke dette til å deaktivere viktige nettbrettfunksjoner. Denne rettigheten må brukes med forsiktighet, ettersom det er mulig å få programkomponenter inn i en ubrukelig, inkonsistent eller ustabil tilstand."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"velge foretrukne applikasjoner"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Lar applikasjonen endre valgene for foretrukne applikasjoner. Dette kan gi ondsinnede applikasjoner tilgang til i det stille å endre hvilke applikasjoner som kjøres, og slik gi seg ut til å være en eksisterende applikasjon og samle private data."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"endre globale systeminnstillinger"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Autofyll"</string> <string name="setup_autofill" msgid="8154593408885654044">"Konfig. autofyll"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"lese nettleserens logg og bokmerker"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Lar applikasjonen lese alle adresser nettleseren har besøkt, og alle nettleserens bokmerker."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skrive til nettleserens logg og bokmerker"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 treff"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> av <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Ferdig"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Kobler fra USB-lagring ..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Kobler fra SD-kort ..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Sletter USB-lagring ..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Nettsøk"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Posisjonsforespørsel"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Ja"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nei"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Grense for sletting overskredet"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Slett elementene."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Angre slettinger."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Ikke gjør noe akkurat nå."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 979b9a38cf9a..48f5bb4bf0a1 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Uitschakelen..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Uw tablet wordt uitgeschakeld."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Uw telefoon wordt uitgeschakeld."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Wilt u afsluiten?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Geen recente toepassingen."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Tabletopties"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Hiermee kan een toepassing lezen en schrijven naar elke bron die hoort bij de diagnostische groep, zoals bestanden in /dev. Hierdoor kan de systeemstabiliteit en -veiligheid worden beïnvloed. Dit mag ALLEEN worden gebruikt voor hardwarespecifieke diagnostiek door de fabrikant of operator."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"toepassingscomponenten in- of uitschakelen"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Hiermee kan een toepassing bepalen of een component van een andere toepassing is ingeschakeld. Schadelijke toepassingen kunnen hiervan gebruik maken om belangrijke tabletfuncties uit te schakelen. Een machtiging moet zorgvuldig worden overwogen, aangezien toepassingscomponenten onbruikbaar, inconsistent of instabiel kunnen worden."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Hiermee kan een toepassing bepalen of een component van een andere toepassing is ingeschakeld. Schadelijke toepassingen kunnen hiervan gebruik maken om belangrijke tabletfuncties uit te schakelen. Een machtiging moet zorgvuldig worden overwogen, aangezien toepassingscomponenten onbruikbaar, inconsistent of instabiel kunnen worden."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Hiermee kan een toepassing bepalen of een component van een andere toepassing is ingeschakeld. Schadelijke toepassingen kunnen dit gebruiken om belangrijke tabletfuncties uit te schakelen. Een machtiging moet zorgvuldig worden overwogen, aangezien toepassingscomponenten onbruikbaar, inconsistent of instabiel kunnen worden."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"voorkeurstoepassingen instellen"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Hiermee kan een toepassing uw voorkeurstoepassingen wijzigen. Schadelijke toepassingen kunnen op deze manier de actieve toepassingen zonder uw medeweten wijzigen en uw bestaande toepassingen doorzoeken om privégegevens van u te verzamelen."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"algemene systeeminstellingen wijzigen"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"AutoFill"</string> <string name="setup_autofill" msgid="8154593408885654044">"Aut. aanv. inst."</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"browsergeschiedenis en bladwijzers lezen"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Hiermee kan een toepassing de URL\'s lezen die u via de browser heeft bezocht, evenals alle bladwijzers van de browser."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"browsergeschiedenis en bladwijzers schrijven"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 overeenkomst"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> van <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Gereed"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"USB-opslag ontkoppelen..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"SD-kaart ontkoppelen..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"USB-opslag wissen..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Online zoeken"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Locatieverzoek"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Ja"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nee"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Verwijderingslimiet overschreden"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"De items verwijderen."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Verwijderingen ongedaan maken."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Nu niets doen."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 85aeaf453ef3..91b02ace0f96 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Wyłączanie..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet zostanie wyłączony."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon zostanie wyłączony"</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Czy chcesz wyłączyć?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Najnowsze"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Brak ostatnio używanych aplikacji."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Opcje tabletu"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Pozwala aplikacji na czytanie i zapisywanie we wszystkich zasobach posiadanych przez diagnozowaną grupę, jak na przykład pliki w katalogu /dev. Może to potencjalnie wpłynąć na stabilność i bezpieczeństwo systemu. Powinno być wykorzystywane TYLKO w celach diagnozowania sprzętu przez producenta lub operatora."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"włączanie lub wyłączanie składników aplikacji"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Zezwala aplikacji na zmianę ustawienia określającego, czy składnik innej aplikacji ma być włączony. Złośliwe aplikacje mogą wykorzystać tę możliwość w celu wyłączenia ważnych funkcji tabletu. W przypadku tego uprawnienia należy zachować ostrożność, ponieważ składniki aplikacji mogą znaleźć się w stanie, w którym będą one bezużyteczne, niezgodne lub niestabilne."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Zezwala aplikacji na zmianę ustawienia określającego, czy składnik innej aplikacji ma być włączony. Złośliwe aplikacje mogą wykorzystać tę możliwość w celu wyłączenia ważnych funkcji tabletu. W przypadku tego uprawnienia należy zachować ostrożność, ponieważ składniki aplikacji mogą znaleźć się w stanie, w którym będą one bezużyteczne, niezgodne lub niestabilne."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Zezwala aplikacji na zmianę ustawienia określającego, czy składnik innej aplikacji ma być włączony. Złośliwe aplikacje mogą wykorzystać tę możliwość w celu wyłączenia ważnych funkcji tabletu. W przypadku tego uprawnienia należy zachować ostrożność, ponieważ składniki aplikacji mogą znaleźć się w stanie, w którym będą one bezużyteczne, niezgodne lub niestabilne."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"ustawianie preferowanych aplikacji"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Umożliwia aplikacji zmianę preferowanych programów użytkownika. Może to pozwolić szkodliwym aplikacjom na niezauważalną podmianę uruchamianych programów, aby zbierać prywatne dane użytkownika."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"modyfikowanie ogólnych ustawień systemu"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Autouzupełnianie"</string> <string name="setup_autofill" msgid="8154593408885654044">"Konfiguruj autouzupełnianie"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"odczyt historii i zakładek przeglądarki"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umożliwia aplikacji odczyt wszystkich adresów URL odwiedzonych przez przeglądarkę, a także wszystkich zakładek przeglądarki."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"zapis historii i zakładek przeglądarki"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 wynik"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Gotowe"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Odłączanie nośnika USB..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Odłączanie karty SD..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Czyszczenie nośnika USB..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Wyszukiwarka"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Prośba o lokalizację"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Tak"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nie"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Przekroczono limit usuwania"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Usuń elementy."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Cofnij usunięcie."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Nie wykonuj teraz żadnych czynności."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index bd1cb561b780..d555fb4a9aaf 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"A encerrar..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"O seu tablet irá encerrar."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"O seu telefone irá encerrar."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Pretende encerrar?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Nenhuma aplicação recente."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Opções do tablet"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Permite a uma aplicação ler e escrever em qualquer recurso que seja propriedade do grupo diag. Por exemplo, ficheiros em /dev. Isto pode afectar potencialmente a estabilidade e a segurança do sistema e deve ser utilizado APENAS para diagnósticos específicos do hardware pelo fabricante ou pelo operador."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"activar ou desactivar componentes da aplicação"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permite a uma aplicação mudar a opção de activar ou não um componente de outra aplicação. Algumas aplicações maliciosas podem utilizar este item para desactivar funcionalidades importantes do tablet. É necessário ter cuidado com a autorização, uma vez que é possível tornar alguns componentes de aplicações num estado inutilizável, inconsistente ou instável."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite a uma aplicação mudar a opção de activar ou não um componente de outra aplicação. Algumas aplicações maliciosas podem utilizar este item para desactivar funcionalidades importantes do tablet. É necessário ter cuidado com a autorização, uma vez que é possível tornar alguns componentes de aplicações num estado inutilizável, inconsistente ou instável."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite que uma aplicação mude opção de activar ou não um componente de outra aplicação. As aplicações maliciosas podem utilizar este item para desactivar funcionalidades importantes do tablet. É necessário ter cuidado com a autorização, uma vez que é possível tornar alguns componentes de aplicações num estado inutilizável, inconsistente ou instável."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"definir aplicações preferidas"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Permite a uma aplicação modificar as suas aplicações preferidas. Isto pode permitir que algumas aplicações maliciosas mudem, de forma silenciosa, as aplicações executadas, falsificando as aplicações existentes para recolher os seus dados privados."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"modificar definições globais do sistema"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Pr. aut."</string> <string name="setup_autofill" msgid="8154593408885654044">"Conf preench aut"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"ler histórico e marcadores do browser"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite que a aplicação leia todos os URLs visitados pelo browser e todos os marcadores do browser."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"gravar histórico e marcadores do browser"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 correspondência"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Concluído"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"A desmontar armazenamento USB..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"A desmontar cartão SD..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"A apagar armazenamento USB..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Pesquisar na Web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Pedido de localização"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Sim"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Não"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Limite de eliminações excedido"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Eliminar os itens."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Anular as eliminações."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Não fazer nada por agora."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 6cf440418fec..9f44c7870022 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Encerrando…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Seu tablet será desligado."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"O seu telefone será desligado."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"O que você deseja encerrar?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Nenhum aplicativo recente."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Opções do tablet"</string> @@ -291,7 +290,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Permite que um aplicativo leia e grave em qualquer recurso que pertença ao grupo de diagnósticos; por exemplo, arquivos em /dev. Isso possivelmente pode afetar a estabilidade e a segurança do sistema. Isso deve ser usado APENAS para diagnósticos específicos do hardware realizados pelo fabricante ou pelo operador."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"ativar ou desativar os componentes do aplicativo"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permite que um aplicativo altere se um componente de outro aplicativo está ativado ou não. Aplicativos maliciosos podem usar isso para desativar recursos importantes do tablet. É preciso ter cuidado com essa permissão, pois é possível deixar os componentes do aplicativo em um estado inutilizável, inconsistente ou instável."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite que um aplicativo altere se um componente de outro aplicativo está ativado ou não. Aplicativos maliciosos podem usar isso para desativar recursos importantes do tablet. É preciso ter cuidado com essa permissão, pois é possível deixar os componentes do aplicativo em um estado inutilizável, inconsistente ou instável."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite que um aplicativo altere se um componente de outro aplicativo está ativado ou não. Aplicativos maliciosos podem usar isso para desativar recursos importantes do tablet. É preciso ter cuidado com essa permissão, pois é possível deixar os componentes do aplicativo em um estado inutilizável, inconsistente ou instável."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"definir os aplicativos preferidos"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Permite que um aplicativo modifique os seus aplicativos preferidos. Isso pode permitir que aplicativos maliciosos alterem silenciosamente os aplicativos em execução, falsificando os seus aplicativos existentes para coletar os seus dados particulares."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"modificar configurações globais do sistema"</string> @@ -470,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modificar/excluir conteúdo do cartão SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Perm. aplic. grave arm. USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Permite que um aplicativo grave no cartão SD."</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <!-- outdated translation 5585262071354704256 --> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modificar/excluir o conteúdo de armazenamento de mídia interno"</string> + <!-- outdated translation 2372999661142345443 --> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permite que um aplicativo modifique o conteúdo do armazenamento de mídia interno."</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"acessar o sistema de arquivos de cache"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite que um aplicativo leia e grave no sistema de arquivos de cache."</string> <string name="permlab_use_sip" msgid="5986952362795870502">"fazer/receber chamadas pela internet"</string> @@ -680,11 +677,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Preenchimento automático"</string> <string name="setup_autofill" msgid="8154593408885654044">"Conf preen autom"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"ler histórico e favoritos do Navegador"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite que o aplicativo leia todos os URLs visitados pelo Navegador e todos os favoritos do Navegador."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"gravar histórico e favoritos do Navegador"</string> @@ -1000,8 +995,7 @@ <item quantity="one" msgid="8167147081136579439">"Uma correspondência"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Concluído"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Desconectando armazenamento USB..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Desconectando cartão SD..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Apagando o armazenamento USB..."</string> @@ -1020,24 +1014,17 @@ <string name="websearch" msgid="4337157977400211589">"Pesquisa na web do Google"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Solicitação de localização"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Sim"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Não"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Limite de exclusão excedido"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Excluir os itens."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Desfazer as exclusões."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Não fazer nada por enquanto."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 52f30c2f2eb7..a06b86d769dc 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Căutare pe web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Solicitare de locaţie"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Da"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nu"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Limita pentru ştergere a fost depăşită"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Ştergeţi elementele."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Anulaţi aceste ştergeri."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Pentru moment, nu efectuaţi nicio acţiune."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 46261d18889e..bfe9c8f9ae46 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Выключение..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Планшетный ПК будет отключен."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Телефон будет выключен."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Выключить?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Недавние"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Нет последних приложений."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Настройки планшетного ПК"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Позволяет приложению считывать и записывать данные в любые ресурсы, принадлежащие группе диагностики (например, файлы в каталоге /dev). Это может повлиять на стабильность и безопасность системы. Эта возможность может быть использована ТОЛЬКО производителем или оператором для диагностики аппаратного обеспечения."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"включать или отключать компоненты приложения"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Позволяет приложению отключать или включать компоненты другого приложения. Вредоносные приложения могут использовать это разрешение для отключения важных возможностей планшетного ПК. Это разрешение следует использовать с осторожностью, так как оно может привести к несовместимости, нестабильности и неработоспособности компонентов приложения."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Позволяет приложению отключать или включать компоненты другого приложения. Вредоносные приложения могут использовать это разрешение для отключения важных возможностей планшетного ПК. Это разрешение следует использовать с осторожностью, так как оно может привести к несовместимости, нестабильности и неработоспособности компонентов приложения."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Позволяет приложению отключать или включать компоненты другого приложения. Вредоносные приложения могут использовать это разрешение для отключения важных возможностей планшетного ПК. Это разрешение следует использовать с осторожностью, так как оно может привести к несовместимости, нестабильности и неработоспособности компонентов приложения."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"выбирать предпочтительные приложения"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Позволяет приложению изменять предпочтительные приложения. Вредоносные приложения могут использовать эту возможность для незаметного изменения запущенных приложений и для сбора конфиденциальной информации с помощью имитации подключения существующих приложений."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"изменять общие настройки системы"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Автозаполнение"</string> <string name="setup_autofill" msgid="8154593408885654044">"Нужна настройка"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"считывать историю и закладки браузера"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Разрешает приложению считывать все URL, посещенные браузером, и все его закладки."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"записывать историю и закладки браузера"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 совпадение"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> из <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Готово"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Отключение USB-накопителя..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Отключение SD-карты..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Очистка USB-накопителя..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Веб-поиск"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Запрос местоположения"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Да"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Нет"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Превышен предел удаления"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Удалить элементы."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Отменить удаления."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Ничего не делать сейчас."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 0722bc941045..04567d04c1af 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Hľadať na webe"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Žiadosť o informácie o polohe"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Áno"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nie"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Bol prekročený limit odstraňovania."</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Odstrániť položky."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Vrátiť odstránenia späť."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Nevykonávať akciu."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 1587d2eb5d09..f53adc82deaa 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Spletno iskanje"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Zahteva za lokacijo"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Da"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Ne"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Omejitev brisanja je presežena"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Izbriši elemente."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Razveljavi brisanje."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Zaenkrat ne stori ničesar."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index dcf9f1a8297b..5da258ce591a 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Веб претрага"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Захтев за локацију"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Да"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Не"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Премашено је ограничење за брисање"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Избриши ставке."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Опозови брисања."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Не ради ништа за сада."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 13cd84cca135..51311a961ee1 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Avslutar…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Din pekdator stängs av."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Din telefon stängs av."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Vill du stänga av?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Senaste"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Inga nya program."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Alternativ för pekdatorn"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Tillåter att ett program läser och skriver till en resurs som ägs av diag-gruppen; till exempel filer i /dev. Detta kan eventuellt påverka systemets stabilitet och säkerhet. Detta bör ENDAST används av tillverkaren eller operatören för maskinvaruspecifik diagnostik."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"aktivera eller inaktivera programkomponenter"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Tillåter att ett program ändrar inställningen för om en komponent i ett annat program har aktiverats eller inte. Skadliga program kan använda detta för att inaktivera viktiga funktioner i pekdatorn. Var försiktig med behörigheten, eftersom programkomponenter kan bli oanvändbara, inkonsekventa eller instabila."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Tillåter att ett program ändrar inställningen för om en komponent i ett annat program har aktiverats eller inte. Skadliga program kan använda detta för att inaktivera viktiga funktioner i pekdatorn. Var försiktig med behörigheten, eftersom programkomponenter kan bli oanvändbara, inkonsekventa eller instabila."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Tillåter att en app ändrar inställningen för om en komponent i en annan app ska aktiveras eller inte. Skadliga appar kan använda detta för att inaktivera viktiga funktioner i pekdatorn. Var försiktig med behörigheten, eftersom programkomponenter kan bli oanvändbara, inkonsekventa eller instabila."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"ange önskade program"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Tillåter att ett program ändrar dina önskade program. Skadliga program kan utan varning ändra de program som körs och förfalska dina befintliga program så att de samlar privata data från dig."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"ändra globala systeminställningar"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"Autofyll"</string> <string name="setup_autofill" msgid="8154593408885654044">"Konfig. Autofyll"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"läsa webbläsarhistorik och bokmärken"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Tillåter att program läser alla webbadresser som webbläsaren har öppnat och alla webbläsarens bokmärken."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skriva webbläsarhistorik och bokmärken"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 träff"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> av <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Klar"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Demontera USB-lagringsenhet..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Demonterar SD-kort..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Raderar USB-lagring..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Webbsökning"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Positionsförfrågan"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Ja"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Nej"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Gränsen för borttagning har överskridits"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Ta bort objekten."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Ångra borttagningarna."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Gör ingenting just nu."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 30a5ee7563cd..27e699e833fd 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"ค้นเว็บ"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"คำขอตำแหน่ง"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"ใช่"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"ไม่"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"เกินจำนวนการลบสูงสุด"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"ลบรายการ"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"เลิกทำการลบ"</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"ไม่ทำอะไรในขณะนี้"</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 577accb4f7d7..1a8e2c11022b 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Paghahanap sa Web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Hiling ng lokasyon"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Oo"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Hindi"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Nalagpasan na ang limitasyon sa pagtanggal"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Tanggalin ang mga item."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"I-undo ang mga pagtanggal."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Walang gawin sa ngayon."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 45bc2b26e7f9..a1aef7c969d6 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"Kapanıyor…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tabletiniz kapanacak."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonunuz kapanacak."</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"Kapatmak istiyor musunuz?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"En Son Görevler"</string> <string name="no_recent_tasks" msgid="279702952298056674">"Hiçbir yeni uygulama yok."</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet seçenekleri"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Uygulamanın tanılama grubundaki bir kaynağa ait herhangi bir kaynağı; örneğin /dev içindeki dosyaları okumasına ve bunlara yazmasına izin verir. Bu işlevin sistem kararlılığını ve güvenliğini olumsuz etkileme olasılığı vardır. Üretici veya operatör tarafından YALNIZCA donanıma özgü tanılama için kullanılmalıdır."</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"uygulama bileşenlerini etkinleştir veya devre dışı bırak"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Uygulamaya başka bir uygulamanın bir bileşenini etkinleştirme ayarını değiştirme izni verir. Kötü amaçlı uygulamalar bu ayarı tabletin önemli yeteneklerini devre dışı bırakmak için kullanabilir. Bu iznin verilmesi uygulama bileşenlerini kullanılamaz, tutarsız veya kararsız bir duruma sokabileceği için izin verilirken dikkatli olunmalıdır."</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Uygulamaya başka bir uygulamanın bir bileşenini etkinleştirme ayarını değiştirme izni verir. Kötü amaçlı uygulamalar bu ayarı tabletin önemli yeteneklerini devre dışı bırakmak için kullanabilir. Bu iznin verilmesi uygulama bileşenlerini kullanılamaz, tutarsız veya kararsız bir duruma sokabileceği için izin verilirken dikkatli olunmalıdır."</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Uygulamaya, başka bir uygulamanın bir bileşenini etkinleştirme ayarını değiştirme izni verir. Kötü amaçlı uygulamalar bu ayarı tabletin önemli yeteneklerini devre dışı bırakmak için kullanabilir. Bu iznin verilmesi uygulama bileşenlerini kullanılamaz, tutarsız veya kararsız bir duruma sokabileceği için izin verilirken dikkatli olunmalıdır."</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"tercih edilen uygulamaları ayarla"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"Uygulamanın tercih ettiğiniz uygulamaları değiştirmesine izin verir. Bu işlem, kötü amaçlı uygulamaların, çalışmakta olan uygulamaları sessizce değiştirerek mevcut uygulamalarınızı aldatıp kişisel bilgilerinizi almasına izin verebilir."</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"genel sistem ayarlarını değiştir"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"OtoDoldr"</string> <string name="setup_autofill" msgid="8154593408885654044">"Oto Doldr Ayarla"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"Tarayıcı geçmişini ve favorileri oku"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Uygulamaya Tarayıcının ziyaret etmiş olduğu tüm URL\'leri ve Tarayıcının tüm favorilerini okuma izni verir."</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"Tarayıcı geçmişini ve favorileri yaz"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 eşleşme"</item> <item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> / <xliff:g id="TOTAL">%d</xliff:g>"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"Bitti"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"USB depolama biriminin bağlantısı kesiliyor..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"SD kartın bağlantısı kesiliyor..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"USB dep brm silinyr..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Google Web Arama"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Konumlama isteği"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Evet"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Hayır"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Silme sınırı aşıldı"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Öğeleri silin."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Silme işlemlerini geri alın."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Şimdilik bir şey yapma."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 7d5a8f542274..7203298a2082 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Веб-пошук"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Запит про місцезнаходження"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Так"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Ні"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Перевищено ліміт видалень"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Видалити елементи."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Скасувати видалення."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Наразі нічого не робити."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 9f0a4f547b46..6dd250687640 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1013,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"Tìm kiếm trên web"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"Yêu cầu vị trí"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"Có"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"Không"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"Đã vượt quá giới hạn xóa"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"Xóa mục."</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"Hoàn tác việc xóa."</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"Ngay bây giờ bạn không cần làm gì cả."</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-xlarge/dimens.xml b/core/res/res/values-xlarge/dimens.xml index 63d3619a0284..e05844216441 100644 --- a/core/res/res/values-xlarge/dimens.xml +++ b/core/res/res/values-xlarge/dimens.xml @@ -40,9 +40,6 @@ <dimen name="thumbnail_width">230dp</dimen> <!-- The height that is used when creating thumbnails of applications. --> <dimen name="thumbnail_height">135dp</dimen> - <!-- The standard size (both width and height) of an application icon that - will be displayed in the app launcher and elsewhere. --> - <dimen name="app_icon_size">64dip</dimen> <!-- Minimum width of the search view text entry area. --> <dimen name="search_view_text_min_width">192dip</dimen> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index f69f965cd13e..c57ca62496f1 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"正在关机..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板电脑会关闭。"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"您的手机会关机。"</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"要关闭手机吗?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"近期任务"</string> <string name="no_recent_tasks" msgid="279702952298056674">"没有最近的应用程序。"</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"平板电脑选项"</string> @@ -291,7 +290,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"允许应用程序读取/写入诊断组所拥有的任何资源(例如,/dev 中的文件)。这可能会影响系统稳定性和安全性。此权限仅供制造商或运营商诊断硬件问题。"</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"启用或停用应用程序组件"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"允许应用程序更改是否启用其他应用程序的组件。恶意应用程序可借此停用重要的平板电脑功能。使用此权限时请务必谨慎,因为这可能导致应用程序组件陷入不可用、不一致或不稳定的状态。"</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"允许应用程序更改是否启用其他应用程序的组件。恶意应用程序可借此停用重要的平板电脑功能。使用此权限时请务必谨慎,因为这可能导致应用程序组件陷入不可用、不一致或不稳定的状态。"</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"允许应用程序更改是否启用其他应用程序的组件。恶意应用程序可借此停用重要的平板电脑功能。使用此权限时请务必谨慎,因为这可能导致应用程序组件陷入不可用、不一致或不稳定的状态。"</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"设置首选应用程序"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"允许应用程序修改首选的应用程序。这样恶意应用程序可能会暗中更改运行的应用程序,从而骗过您的现有应用程序来收集您的保密数据。"</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"修改全局系统设置"</string> @@ -470,10 +469,8 @@ <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"修改/删除 SD 卡中的内容"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"允许应用程序写入 USB 存储设备。"</string> <string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"允许应用程序写入 SD 卡。"</string> - <!-- no translation found for permlab_mediaStorageWrite (6859839199706879015) --> - <skip /> - <!-- no translation found for permdesc_mediaStorageWrite (8232008512478316233) --> - <skip /> + <!-- outdated translation 5585262071354704256 --> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"修改/删除内部媒体存储设备内容"</string> + <!-- outdated translation 2372999661142345443 --> <string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"允许应用程序修改内部媒体存储设备中的内容。"</string> <string name="permlab_cache_filesystem" msgid="5656487264819669824">"访问缓存文件系统"</string> <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"允许应用程序读取和写入缓存文件系统。"</string> <string name="permlab_use_sip" msgid="5986952362795870502">"拨打/接听互联网通话"</string> @@ -680,11 +677,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"自动填充"</string> <string name="setup_autofill" msgid="8154593408885654044">"设置自动填充"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$3$2$1"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$3$2$1"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"读取浏览器的历史记录和书签"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"允许应用程序读取用浏览器访问过的所有网址,以及浏览器的所有书签。"</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"写入浏览器的历史记录和书签"</string> @@ -1000,8 +995,7 @@ <item quantity="one" msgid="8167147081136579439">"1 个匹配项"</item> <item quantity="other" msgid="4641872797067609177">"第 <xliff:g id="INDEX">%d</xliff:g> 项,共 <xliff:g id="TOTAL">%d</xliff:g> 项"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"完成"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"正在卸载 USB 存储设备..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"正在卸载 SD 卡..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"正在格式化 USB 存储设备"</string> @@ -1020,24 +1014,17 @@ <string name="websearch" msgid="4337157977400211589">"网页搜索"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"定位请求"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"是"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"否"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"超出删除限制"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"删除这些项。"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"撤消删除。"</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"目前不进行任何操作。"</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index a584cd3bd221..37afec816e79 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -138,8 +138,7 @@ <string name="shutdown_progress" msgid="2281079257329981203">"關機中..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板電腦將會關機。"</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"手機即將關機。"</string> - <!-- no translation found for shutdown_confirm_question (6656441286856415014) --> - <skip /> + <!-- outdated translation 4249474800794963142 --> <string name="shutdown_confirm_question" msgid="6656441286856415014">"您要關機嗎?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"最新的"</string> <string name="no_recent_tasks" msgid="279702952298056674">"最近沒有存取應用程式。"</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"平板電腦選項"</string> @@ -290,7 +289,7 @@ <string name="permdesc_diagnostic" msgid="3121238373951637049">"允許應用程式讀寫 diag 群組的資源;例如:/dev 裡的檔案。這可能會影響系統穩定性與安全性。此功能僅供製造商或技術人員用於硬體規格偵測。"</string> <string name="permlab_changeComponentState" msgid="79425198834329406">"啟用或停用應用程式元件"</string> <string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"允許應用程式啟用或停用其他應用程式的元件。惡意應用程式可藉此停用重要的平板電腦功能。由於這個權限可能會導致應用程式元件無法使用、造成不一致或不穩定的問題,因此請謹慎斟酌授權。"</string> - <!-- outdated translation 4647419365510068321 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"允許應用程式啟用或停用其他應用程式的元件。惡意應用程式可藉此停用重要的平板電腦功能。由於這個權限可能會導致應用程式元件無法使用、造成不一致或不穩定的問題,因此請謹慎斟酌授權。"</string> + <!-- outdated translation 1791075936446230356 --> <string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"允許應用程式啟用或停用其他應用程式的元件。惡意應用程式可藉此停用重要的平板電腦功能。由於這個權限可能會導致應用程式元件無法使用、造成不一致或不穩定的問題,因此請謹慎斟酌授權。"</string> <string name="permlab_setPreferredApplications" msgid="3393305202145172005">"設定喜好的應用程式"</string> <string name="permdesc_setPreferredApplications" msgid="760008293501937546">"允許應用程式修改您偏好的應用程式。請注意:惡意程式可能藉以秘密竄改執行的程式,或偽造已存在的程式以收集私人資料。"</string> <string name="permlab_writeSettings" msgid="1365523497395143704">"編輯全域系統設定"</string> @@ -677,11 +676,9 @@ <string name="autofill_this_form" msgid="1272247532604569872">"自動填入功能"</string> <string name="setup_autofill" msgid="8154593408885654044">"設定自動填入功能"</string> <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> - <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> - <skip /> + <!-- outdated translation 7531610259426153850 --> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> - <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> - <skip /> + <!-- outdated translation 8398158823767723887 --> <string name="autofill_address_summary_format" msgid="4874459455786827344">"$1$2$3"</string> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"讀取瀏覽器的記錄與書籤"</string> <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"允許應用程式讀取瀏覽器曾經造訪過的所有網址,以及瀏覽器的所有書籤。"</string> <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"寫入瀏覽器的記錄與書籤"</string> @@ -997,8 +994,7 @@ <item quantity="one" msgid="8167147081136579439">"1 個相符項目"</item> <item quantity="other" msgid="4641872797067609177">"第 <xliff:g id="INDEX">%d</xliff:g> 個相符項目 (共 <xliff:g id="TOTAL">%d</xliff:g> 個相符項目)"</item> </plurals> - <!-- no translation found for action_mode_done (7217581640461922289) --> - <skip /> + <!-- outdated translation 9218298627167585235 --> <string name="action_mode_done" msgid="7217581640461922289">"完成"</string> <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"正在卸載 USB 儲存裝置..."</string> <string name="progress_unmounting" product="default" msgid="5556813978958789471">"正在卸載 SD 卡..."</string> <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"正在清除 USB 儲存裝置..."</string> @@ -1017,24 +1013,17 @@ <string name="websearch" msgid="4337157977400211589">"網頁搜尋"</string> <!-- no translation found for gpsNotifTicker (5622683912616496172) --> <skip /> - <!-- no translation found for gpsNotifTitle (5446858717157416839) --> - <skip /> + <!-- outdated translation 7533028619350196545 --> <string name="gpsNotifTitle" msgid="5446858717157416839">"位置資訊要求"</string> <!-- no translation found for gpsNotifMessage (1374718023224000702) --> <skip /> - <!-- no translation found for gpsVerifYes (2346566072867213563) --> - <skip /> - <!-- no translation found for gpsVerifNo (1146564937346454865) --> - <skip /> - <!-- no translation found for sync_too_many_deletes (5296321850662746890) --> - <skip /> + <!-- outdated translation 1511016393202739483 --> <string name="gpsVerifYes" msgid="2346566072867213563">"是"</string> + <!-- outdated translation 661731239940896232 --> <string name="gpsVerifNo" msgid="1146564937346454865">"否"</string> + <!-- outdated translation 6088394702274114202 --> <string name="sync_too_many_deletes" msgid="5296321850662746890">"超過刪除上限"</string> <!-- no translation found for sync_too_many_deletes_desc (7030265992955132593) --> <skip /> - <!-- no translation found for sync_really_delete (8933566316059338692) --> - <skip /> - <!-- no translation found for sync_undo_deletes (8610996708225006328) --> - <skip /> - <!-- no translation found for sync_do_nothing (8717589462945226869) --> - <skip /> + <!-- outdated translation 7782215155483034729 --> <string name="sync_really_delete" msgid="8933566316059338692">"刪除這些項目。"</string> + <!-- outdated translation 6501390120900825477 --> <string name="sync_undo_deletes" msgid="8610996708225006328">"復原刪除。"</string> + <!-- outdated translation 612038572646360281 --> <string name="sync_do_nothing" msgid="8717589462945226869">"暫停執行 。"</string> <!-- no translation found for vpn_notification_title_connected (3197819122581348515) --> <skip /> <!-- no translation found for vpn_notification_title_disconnected (4614192702448522822) --> diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index 04c6538a79c8..fa33b0a41db9 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -22,51 +22,248 @@ <!-- Do not translate. These are all of the drawable resources that should be preloaded by the zygote process before it starts forking application processes. --> <array name="preloaded_drawables"> - <item>@drawable/sym_def_app_icon</item> - <item>@drawable/arrow_down_float</item> - <item>@drawable/btn_check</item> - <item>@drawable/btn_check_label_background</item> - <item>@drawable/btn_check_off</item> - <item>@drawable/btn_check_on</item> - <item>@drawable/btn_default</item> - <item>@drawable/btn_default_small</item> - <item>@drawable/btn_dropdown</item> - <item>@drawable/btn_plus</item> - <item>@drawable/btn_minus</item> - <item>@drawable/btn_radio</item> - <item>@drawable/btn_star</item> - <item>@drawable/btn_toggle</item> - <item>@drawable/ic_emergency</item> - <item>@drawable/divider_horizontal_bright</item> - <item>@drawable/divider_horizontal_dark</item> - <item>@drawable/edit_text</item> - <item>@drawable/expander_group</item> - <item>@drawable/list_selector_background</item> - <item>@drawable/menu_background</item> - <item>@drawable/menu_background_fill_parent_width</item> - <item>@drawable/menu_selector</item> - <item>@drawable/panel_background</item> - <item>@drawable/popup_bottom_bright</item> - <item>@drawable/popup_bottom_dark</item> - <item>@drawable/popup_bottom_medium</item> - <item>@drawable/popup_center_bright</item> - <item>@drawable/popup_center_dark</item> - <item>@drawable/popup_full_dark</item> - <item>@drawable/popup_top_bright</item> - <item>@drawable/popup_top_dark</item> - <item>@drawable/progress_horizontal</item> - <item>@drawable/progress_indeterminate_horizontal</item> - <item>@drawable/progress_small</item> - <item>@drawable/progress_small_titlebar</item> - <item>@drawable/screen_background_dark</item> - <item>@drawable/screen_background_light</item> - <item>@drawable/scrollbar_handle_horizontal</item> - <item>@drawable/scrollbar_handle_vertical</item> - <item>@drawable/spinner_dropdown_background</item> - <item>@drawable/text_select_handle_left</item> - <item>@drawable/text_select_handle_middle</item> - <item>@drawable/text_select_handle_right</item> - <item>@drawable/title_bar</item> + <item>@drawable/btn_check_on_selected</item> + <item>@drawable/btn_check_on_pressed_holo_light</item> + <item>@drawable/btn_check_on_pressed_holo_dark</item> + <item>@drawable/btn_check_on_pressed</item> + <item>@drawable/btn_check_on_holo_light</item> + <item>@drawable/btn_check_on_holo_dark</item> + <item>@drawable/btn_check_on_focused_holo_light</item> + <item>@drawable/btn_check_on_focused_holo_dark</item> + <item>@drawable/btn_check_on_disabled_holo_light</item> + <item>@drawable/btn_check_on_disabled_holo_dark</item> + <item>@drawable/btn_check_on_disabled_focused_holo_light</item> + <item>@drawable/btn_check_on_disabled_focused_holo_dark</item> + <item>@drawable/btn_check_on_disable_focused</item> + <item>@drawable/btn_check_on_disable</item> + <item>@drawable/btn_check_on</item> + <item>@drawable/btn_check_off_selected</item> + <item>@drawable/btn_check_off_pressed_holo_light</item> + <item>@drawable/btn_check_off_pressed_holo_dark</item> + <item>@drawable/btn_check_off_pressed</item> + <item>@drawable/btn_check_off_holo_light</item> + <item>@drawable/btn_check_off_holo_dark</item> + <item>@drawable/btn_check_off_focused_holo_light</item> + <item>@drawable/btn_check_off_focused_holo_dark</item> + <item>@drawable/btn_check_off_disabled_holo_light</item> + <item>@drawable/btn_check_off_disabled_holo_dark</item> + <item>@drawable/btn_check_off_disabled_focused_holo_light</item> + <item>@drawable/btn_check_off_disabled_focused_holo_dark</item> + <item>@drawable/btn_check_off_disable_focused</item> + <item>@drawable/btn_check_off_disable</item> + <item>@drawable/btn_check_off</item> + <item>@drawable/btn_radio_on_selected</item> + <item>@drawable/btn_radio_on_pressed_holo_light</item> + <item>@drawable/btn_radio_on_pressed_holo_dark</item> + <item>@drawable/btn_radio_on_pressed</item> + <item>@drawable/btn_radio_on_holo_light</item> + <item>@drawable/btn_radio_on_holo_dark</item> + <item>@drawable/btn_radio_on_focused_holo_light</item> + <item>@drawable/btn_radio_on_focused_holo_dark</item> + <item>@drawable/btn_radio_on_disabled_holo_light</item> + <item>@drawable/btn_radio_on_disabled_holo_dark</item> + <item>@drawable/btn_radio_on_disabled_focused_holo_light</item> + <item>@drawable/btn_radio_on_disabled_focused_holo_dark</item> + <item>@drawable/btn_radio_on</item> + <item>@drawable/btn_radio_off_selected</item> + <item>@drawable/btn_radio_off_pressed_holo_light</item> + <item>@drawable/btn_radio_off_pressed_holo_dark</item> + <item>@drawable/btn_radio_off_pressed</item> + <item>@drawable/btn_radio_off_holo_light</item> + <item>@drawable/btn_radio_off_holo_dark</item> + <item>@drawable/btn_radio_off_focused_holo_light</item> + <item>@drawable/btn_radio_off_focused_holo_dark</item> + <item>@drawable/btn_radio_off_disabled_holo_light</item> + <item>@drawable/btn_radio_off_disabled_holo_dark</item> + <item>@drawable/btn_radio_off_disabled_focused_holo_light</item> + <item>@drawable/btn_radio_off_disabled_focused_holo_dark</item> + <item>@drawable/btn_radio_off</item> + <item>@drawable/btn_default_transparent_normal</item> + <item>@drawable/btn_default_small_selected</item> + <item>@drawable/btn_default_small_pressed_holo_light</item> + <item>@drawable/btn_default_small_pressed_holo_dark</item> + <item>@drawable/btn_default_small_pressed</item> + <item>@drawable/btn_default_small_normal_holo_light</item> + <item>@drawable/btn_default_small_normal_holo_dark</item> + <item>@drawable/btn_default_small_normal_disable_focused</item> + <item>@drawable/btn_default_small_normal_disable</item> + <item>@drawable/btn_default_small_normal</item> + <item>@drawable/btn_default_small_focused_holo_light</item> + <item>@drawable/btn_default_small_focused_holo_dark</item> + <item>@drawable/btn_default_small_disabled_holo_light</item> + <item>@drawable/btn_default_small_disabled_holo_dark</item> + <item>@drawable/btn_default_small_disabled_focused_holo_light</item> + <item>@drawable/btn_default_small_disabled_focused_holo_dark</item> + <item>@drawable/btn_default_selected</item> + <item>@drawable/btn_default_pressed_holo_light</item> + <item>@drawable/btn_default_pressed_holo_dark</item> + <item>@drawable/btn_default_pressed</item> + <item>@drawable/btn_default_normal_holo_light</item> + <item>@drawable/btn_default_normal_holo_dark</item> + <item>@drawable/btn_default_normal_disable_focused</item> + <item>@drawable/btn_default_normal_disable</item> + <item>@drawable/btn_default_normal</item> + <item>@drawable/btn_default_focused_holo_light</item> + <item>@drawable/btn_default_focused_holo_dark</item> + <item>@drawable/btn_default_disabled_holo_light</item> + <item>@drawable/btn_default_disabled_holo_dark</item> + <item>@drawable/btn_default_disabled_focused_holo_light</item> + <item>@drawable/btn_default_disabled_focused_holo_dark</item> + <item>@drawable/btn_toggle_on_pressed_holo_light</item> + <item>@drawable/btn_toggle_on_pressed_holo_dark</item> + <item>@drawable/btn_toggle_on_normal_holo_light</item> + <item>@drawable/btn_toggle_on_normal_holo_dark</item> + <item>@drawable/btn_toggle_on_focused_holo_light</item> + <item>@drawable/btn_toggle_on_focused_holo_dark</item> + <item>@drawable/btn_toggle_on_disabled_holo_light</item> + <item>@drawable/btn_toggle_on_disabled_holo_dark</item> + <item>@drawable/btn_toggle_on_disabled_focused_holo_light</item> + <item>@drawable/btn_toggle_on_disabled_focused_holo_dark</item> + <item>@drawable/btn_toggle_on</item> + <item>@drawable/btn_toggle_off_pressed_holo_light</item> + <item>@drawable/btn_toggle_off_pressed_holo_dark</item> + <item>@drawable/btn_toggle_off_normal_holo_light</item> + <item>@drawable/btn_toggle_off_normal_holo_dark</item> + <item>@drawable/btn_toggle_off_focused_holo_light</item> + <item>@drawable/btn_toggle_off_focused_holo_dark</item> + <item>@drawable/btn_toggle_off_disabled_holo_light</item> + <item>@drawable/btn_toggle_off_disabled_holo_dark</item> + <item>@drawable/btn_toggle_off_disabled_focused_holo_light</item> + <item>@drawable/btn_toggle_off_disabled_focused_holo_dark</item> + <item>@drawable/btn_toggle_off</item> + <item>@drawable/ic_emergency</item> + <item>@drawable/divider_horizontal_textfield</item> + <item>@drawable/divider_horizontal_dark_opaque</item> + <item>@drawable/divider_horizontal_dark</item> + <item>@drawable/divider_horizontal_bright_opaque</item> + <item>@drawable/divider_horizontal_bright</item> + <item>@drawable/divider_vertical_dark</item> + <item>@drawable/edit_text_holo_light</item> + <item>@drawable/edit_text_holo_dark</item> + <item>@drawable/edit_text</item> + <item>@drawable/expander_group</item> + <item>@drawable/expander_group_holo_dark</item> + <item>@drawable/expander_group_holo_light</item> + <item>@drawable/list_selector_background</item> + <item>@drawable/list_selector_background_light</item> + <item>@drawable/list_selector_background_longpress</item> + <item>@drawable/list_selector_background_longpress_light</item> + <item>@drawable/list_selector_background_pressed</item> + <item>@drawable/list_selector_background_pressed_light</item> + <item>@drawable/list_selector_background_selected</item> + <item>@drawable/list_selector_holo_dark</item> + <item>@drawable/list_selector_holo_light</item> + <item>@drawable/menu_background</item> + <item>@drawable/menu_background_fill_parent_width</item> + <item>@drawable/menu_submenu_background</item> + <item>@drawable/menu_selector</item> + <item>@drawable/panel_background</item> + <item>@drawable/popup_bottom_bright</item> + <item>@drawable/popup_bottom_dark</item> + <item>@drawable/popup_bottom_medium</item> + <item>@drawable/popup_center_bright</item> + <item>@drawable/popup_center_dark</item> + <item>@drawable/popup_center_medium</item> + <item>@drawable/popup_full_bright</item> + <item>@drawable/popup_full_dark</item> + <item>@drawable/popup_top_bright</item> + <item>@drawable/popup_top_dark</item> + <item>@drawable/popup_inline_error_above_holo_dark</item> + <item>@drawable/popup_inline_error_above_holo_light</item> + <item>@drawable/popup_inline_error_holo_dark</item> + <item>@drawable/popup_inline_error_holo_light</item> + <item>@drawable/progress_bg_holo_dark</item> + <item>@drawable/progress_bg_holo_light</item> + <item>@drawable/progress_horizontal</item> + <item>@drawable/progress_horizontal_holo_dark</item> + <item>@drawable/progress_horizontal_holo_light</item> + <item>@drawable/progress_indeterminate_horizontal</item> + <item>@drawable/progress_indeterminate_horizontal_holo</item> + <item>@drawable/progress_large</item> + <item>@drawable/progress_large_holo</item> + <item>@drawable/progress_large_white</item> + <item>@drawable/progress_medium</item> + <item>@drawable/progress_medium_holo</item> + <item>@drawable/progress_medium_white</item> + <item>@drawable/progress_primary_holo_dark</item> + <item>@drawable/progress_primary_holo_light</item> + <item>@drawable/progress_secondary_holo_dark</item> + <item>@drawable/progress_secondary_holo_light</item> + <item>@drawable/progress_small</item> + <item>@drawable/progress_small_holo</item> + <item>@drawable/progress_small_titlebar</item> + <item>@drawable/progress_small_white</item> + <item>@drawable/scrubber_progress_horizontal_holo_dark</item> + <item>@drawable/scrubber_progress_horizontal_holo_light</item> + <item>@drawable/screen_background_dark</item> + <item>@drawable/screen_background_dark_transparent</item> + <item>@drawable/screen_background_light</item> + <item>@drawable/screen_background_light_transparent</item> + <item>@drawable/screen_background_selector_dark</item> + <item>@drawable/screen_background_selector_light</item> + <item>@drawable/scrollbar_handle_holo_dark</item> + <item>@drawable/scrollbar_handle_holo_light</item> + <item>@drawable/scrollbar_handle_horizontal</item> + <item>@drawable/scrollbar_handle_vertical</item> + <item>@drawable/spinner_background_holo_dark</item> + <item>@drawable/spinner_background_holo_light</item> + <item>@drawable/spinner_cab_default_holo_dark</item> + <item>@drawable/spinner_cab_default_holo_light</item> + <item>@drawable/spinner_cab_disabled_holo_dark</item> + <item>@drawable/spinner_cab_disabled_holo_light</item> + <item>@drawable/spinner_cab_focused_holo_dark</item> + <item>@drawable/spinner_cab_focused_holo_light</item> + <item>@drawable/spinner_cab_pressed_holo_dark</item> + <item>@drawable/spinner_cab_pressed_holo_light</item> + <item>@drawable/spinner_default_holo_dark</item> + <item>@drawable/spinner_default_holo_light</item> + <item>@drawable/spinner_disabled_holo_dark</item> + <item>@drawable/spinner_disabled_holo_light</item> + <item>@drawable/spinner_dropdown_background</item> + <item>@drawable/spinner_dropdown_background_down</item> + <item>@drawable/spinner_dropdown_background_up</item> + <item>@drawable/spinner_focused_holo_dark</item> + <item>@drawable/spinner_focused_holo_light</item> + <item>@drawable/spinner_normal</item> + <item>@drawable/spinner_press</item> + <item>@drawable/spinner_pressed_holo_dark</item> + <item>@drawable/spinner_pressed_holo_light</item> + <item>@drawable/spinner_select</item> + <item>@drawable/btn_cab_done</item> + <item>@drawable/btn_cab_done_focused_holo</item> + <item>@drawable/btn_cab_done_holo</item> + <item>@drawable/btn_cab_done_pressed_holo</item> + <item>@drawable/cab_background_light</item> + <item>@drawable/cab_ic_close_focused_holo</item> + <item>@drawable/cab_ic_close_holo</item> + <item>@drawable/cab_ic_close_normal_holo</item> + <item>@drawable/cab_ic_close_pressed_holo</item> + <item>@drawable/ic_cab_close_holo</item> + <item>@drawable/action_bar_background</item> + <item>@drawable/action_bar_divider</item> + <item>@drawable/ic_menu_close_clear_cancel</item> + <item>@drawable/ic_menu_copy_dark</item> + <item>@drawable/ic_menu_copy_light</item> + <item>@drawable/ic_menu_cut_dark</item> + <item>@drawable/ic_menu_cut_light</item> + <item>@drawable/ic_menu_more</item> + <item>@drawable/ic_menu_moreoverflow_holo_dark</item> + <item>@drawable/ic_menu_moreoverflow_holo_light</item> + <item>@drawable/ic_menu_paste_dark</item> + <item>@drawable/ic_menu_paste_light</item> + <item>@drawable/dialog_bottom_holo_dark</item> + <item>@drawable/dialog_bottom_holo_light</item> + <item>@drawable/dialog_full_holo_dark</item> + <item>@drawable/dialog_full_holo_light</item> + <item>@drawable/dialog_middle_holo_dark</item> + <item>@drawable/dialog_middle_holo_light</item> + <item>@drawable/dialog_top_holo_dark</item> + <item>@drawable/dialog_top_holo_light</item> + <item>@drawable/ic_dialog_alert</item> + <item>@drawable/ic_dialog_alert_holo_dark</item> + <item>@drawable/ic_dialog_alert_holo_light</item> + <item>@drawable/list_divider_holo_dark</item> + <item>@drawable/list_divider_holo_light</item> <!-- Visual lock screen --> <item>@drawable/indicator_code_lock_drag_direction_green_up</item> <item>@drawable/indicator_code_lock_drag_direction_red_up</item> @@ -78,18 +275,34 @@ <!-- Do not translate. These are all of the color state list resources that should be preloaded by the zygote process before it starts forking application processes. --> <array name="preloaded_color_state_lists"> - <item>@color/hint_foreground_dark</item> - <item>@color/hint_foreground_light</item> <item>@color/primary_text_dark</item> <item>@color/primary_text_dark_disable_only</item> + <item>@color/primary_text_dark_nodisable</item> + <item>@color/primary_text_disable_only_holo_dark</item> + <item>@color/primary_text_disable_only_holo_light</item> + <item>@color/primary_text_holo_dark</item> + <item>@color/primary_text_holo_light</item> <item>@color/primary_text_light</item> <item>@color/primary_text_light_disable_only</item> <item>@color/primary_text_light_nodisable</item> + <item>@color/primary_text_nodisable_holo_dark</item> + <item>@color/primary_text_nodisable_holo_light</item> <item>@color/secondary_text_dark</item> + <item>@color/secondary_text_dark_nodisable</item> + <item>@color/secondary_text_holo_dark</item> + <item>@color/secondary_text_holo_light</item> <item>@color/secondary_text_light</item> + <item>@color/secondary_text_light_nodisable</item> + <item>@color/secondary_text_nodisable_holo_dark</item> + <item>@color/secondary_text_nodisable_holo_light</item> + <item>@color/secondary_text_nofocus</item> + <item>@color/hint_foreground_dark</item> + <item>@color/hint_foreground_holo_dark</item> + <item>@color/hint_foreground_holo_light</item> + <item>@color/hint_foreground_light</item> + <item>@color/bright_foreground_light</item> + <item>@color/bright_foreground_dark</item> <item>@color/tab_indicator_text</item> - <item>@color/tertiary_text_dark</item> - <item>@color/tertiary_text_light</item> <item>#ff000000</item> <item>#00000000</item> <item>#ffffffff</item> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 260c7c6d41ec..f9809709fa55 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -142,6 +142,11 @@ <!-- EditText background drawable. --> <attr name="editTextBackground" format="reference" /> + <!-- Popup text displayed in TextView when setError is used. --> + <attr name="errorMessageBackground" format="reference" /> + <!-- Background used instead of errorMessageBackground when the popup has to be above. --> + <attr name="errorMessageAboveBackground" format="reference" /> + <!-- A styled string, specifying the style to be used for showing inline candidate text when composing with an input method. The text itself will be ignored, but the style spans will be applied @@ -582,7 +587,11 @@ <attr name="actionBarSize" format="dimension" > <enum name="wrap_content" value="0" /> </attr> - + <!-- TextAppearance style that will be applied to text that + appears within action menu items. --> + <attr name="actionMenuTextAppearance" format="reference" /> + <!-- Color for text that appears within action menu items. --> + <attr name="actionMenuTextColor" format="color|reference" /> <!-- =================== --> <!-- Action mode styles --> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index ff9ef59fe215..9c59cb6eca9c 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -72,6 +72,9 @@ <drawable name="editbox_dropdown_dark_frame">@drawable/editbox_dropdown_background_dark</drawable> <drawable name="editbox_dropdown_light_frame">@drawable/editbox_dropdown_background</drawable> + <drawable name="dialog_holo_dark_frame">@drawable/dialog_full_holo_dark</drawable> + <drawable name="dialog_holo_light_frame">@drawable/dialog_full_holo_light</drawable> + <drawable name="input_method_fullscreen_background">#fff9f9f9</drawable> <!-- For date picker widget --> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index ae269dfbd390..02b42d061405 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1430,6 +1430,8 @@ <public type="attr" name="calendarViewStyle" /> <public type="attr" name="textEditSidePasteWindowLayout" /> <public type="attr" name="textEditSideNoPasteWindowLayout" /> + <public type="attr" name="actionMenuTextAppearance" /> + <public type="attr" name="actionMenuTextColor" /> <!-- A simple fade-in animation. --> <public type="animator" name="fade_in" id="0x010b0000" /> @@ -1496,6 +1498,9 @@ a ListView). --> <public type="layout" name="simple_list_item_activated_2" /> + <public type="drawable" name="dialog_holo_dark_frame" /> + <public type="drawable" name="dialog_holo_light_frame" /> + <public type="style" name="Theme.WithActionBar" /> <public type="style" name="Theme.NoTitleBar.OverlayActionModes" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 529111ec29ec..d09210e0fc46 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2690,4 +2690,11 @@ <!-- Choose Account Activity label --> <string name="choose_account_label">Select an account</string> + + <!-- NumberPicker - accessibility support --> + <!-- Description of the button to increment the NumberPicker value. [CHAR LIMIT=NONE] --> + <string name="number_picker_increment_button">Increment</string> + <!-- Description of the button to decrement the NumberPicker value. [CHAR LIMIT=NONE] --> + <string name="number_picker_decrement_button">Decrement</string> + </resources> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 15341015cb76..b828318c6988 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -1239,7 +1239,7 @@ </style> <style name="TextAppearance.Holo.Widget.EditText"> - <item name="android:textColor">@color/widget_edittext_holo_dark</item> + <item name="android:textColor">@android:color/bright_foreground_light</item> <item name="android:textColorHint">@android:color/hint_foreground_holo_light</item> </style> @@ -1351,7 +1351,7 @@ </style> <style name="TextAppearance.Holo.Light.Widget.EditText"> - <item name="android:textColor">@color/widget_edittext_holo_light</item> + <item name="android:textColor">@android:color/bright_foreground_dark</item> <item name="android:textColorHint">@android:color/hint_foreground_holo_dark</item> </style> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index ddaeb8210bc6..38b068e25c95 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -217,6 +217,8 @@ <item name="starStyle">@android:style/Widget.CompoundButton.Star</item> <item name="tabWidgetStyle">@android:style/Widget.TabWidget</item> <item name="textViewStyle">@android:style/Widget.TextView</item> + <item name="errorMessageBackground">@android:drawable/popup_inline_error</item> + <item name="errorMessageAboveBackground">@android:drawable/popup_inline_error_above</item> <item name="webTextViewStyle">@android:style/Widget.WebTextView</item> <item name="webViewStyle">@android:style/Widget.WebView</item> <item name="dropDownItemStyle">@android:style/Widget.DropDownItem</item> @@ -268,6 +270,8 @@ <item name="actionBarStyle">@android:style/Widget.ActionBar</item> <item name="actionBarSize">56dip</item> <item name="actionModePopupWindowStyle">?android:attr/popupWindowStyle</item> + <item name="actionMenuTextAppearance">?android:attr/textAppearanceMedium</item> + <item name="actionMenuTextColor">?android:attr/textColorPrimary</item> <item name="dividerVertical">@drawable/divider_vertical_dark</item> <item name="dividerHorizontal">@drawable/divider_vertical_dark</item> @@ -934,6 +938,8 @@ <item name="starStyle">@android:style/Widget.Holo.CompoundButton.Star</item> <item name="tabWidgetStyle">@android:style/Widget.Holo.TabWidget</item> <item name="textViewStyle">@android:style/Widget.Holo.TextView</item> + <item name="errorMessageBackground">@android:drawable/popup_inline_error_holo_dark</item> + <item name="errorMessageAboveBackground">@android:drawable/popup_inline_error_above_holo_dark</item> <item name="webTextViewStyle">@android:style/Widget.Holo.WebTextView</item> <item name="webViewStyle">@android:style/Widget.Holo.WebView</item> <item name="dropDownItemStyle">@android:style/Widget.Holo.DropDownItem</item> @@ -1207,6 +1213,8 @@ <item name="starStyle">@android:style/Widget.Holo.Light.CompoundButton.Star</item> <item name="tabWidgetStyle">@android:style/Widget.Holo.Light.TabWidget</item> <item name="textViewStyle">@android:style/Widget.Holo.Light.TextView</item> + <item name="errorMessageBackground">@android:drawable/popup_inline_error_holo_light</item> + <item name="errorMessageAboveBackground">@android:drawable/popup_inline_error_above_holo_light</item> <item name="webTextViewStyle">@android:style/Widget.Holo.Light.WebTextView</item> <item name="webViewStyle">@android:style/Widget.Holo.Light.WebView</item> <item name="dropDownItemStyle">@android:style/Widget.Holo.Light.DropDownItem</item> diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java index cd38bf0788ea..6786700d3228 100644 --- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java +++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java @@ -37,6 +37,7 @@ import junit.framework.Assert; import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Locale; public class DatabaseGeneralTest extends AndroidTestCase implements PerformanceTestCase { @@ -1130,7 +1131,7 @@ public class DatabaseGeneralTest extends AndroidTestCase implements PerformanceT assertTrue(new File(attachedDb1File).exists()); assertNotNull(dbObj); assertTrue(dbObj.isOpen()); - ArrayList<Pair<String, String>> attachedDbs = dbObj.getAttachedDbs(); + List<Pair<String, String>> attachedDbs = dbObj.getAttachedDbs(); try { errorHandler.onCorruption(dbObj); assertFalse(dbfile.exists()); diff --git a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java index 4edd127b910a..16108e62392a 100644 --- a/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java +++ b/core/tests/coretests/src/android/webkit/AccessibilityInjectorTest.java @@ -51,7 +51,7 @@ public class AccessibilityInjectorTest extends AndroidTestCase { private static final long TIMEOUT_ENABLE_ACCESSIBILITY_AND_MOCK_SERVICE = 1000; /** The count of tests to detect when to shut down the service. */ - private static final int TEST_CASE_COUNT = 8; + private static final int TEST_CASE_COUNT = 16; /** The meta state for pressed left ALT. */ private static final int META_STATE_ALT_LEFT_ON = KeyEvent.META_ALT_ON @@ -140,7 +140,8 @@ public class AccessibilityInjectorTest extends AndroidTestCase { "</p>" + "<p>" + "d" + - "<input>e</input>" + + "<p/>" + + "e" + "</p>" + "</body>" + "</html>"; @@ -179,6 +180,10 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString(null); + // go to the fifth character (reverse) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("e"); + // go to the fourth character (reverse) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString("d"); @@ -199,6 +204,10 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString(null); + // go to the first character + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("a"); + // go to the second character (reverse again) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString("<b>b</b>"); @@ -223,11 +232,11 @@ public class AccessibilityInjectorTest extends AndroidTestCase { "</p>" + "<p>" + " scattered " + - "<input>all</input>" + - " over " + + "<p/>" + + " all over " + "</p>" + "<div>" + - "<button>the place.</button>" + + "<p>the place.</p>" + "</div>" + "</body>" + "</html>"; @@ -284,7 +293,7 @@ public class AccessibilityInjectorTest extends AndroidTestCase { // go to the last word (reverse) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); - assertSelectionString("place"); + assertSelectionString("place."); // go to the eight word sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); @@ -322,6 +331,10 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString(null); + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("This"); + // go to the second word (reverse again) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString("is"); @@ -384,6 +397,10 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString(null); + // go to the fifth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("This is the second sentence of the second paragraph."); + // go to the fourth sentence (reverse) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString("This is the first sentence of the second paragraph."); @@ -405,6 +422,11 @@ public class AccessibilityInjectorTest extends AndroidTestCase { sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); assertSelectionString(null); + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("This is the first sentence of the first paragraph and has an " + + "<b>inline bold tag</b>."); + // go to the second sentence (reverse again) sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); assertSelectionString("This is the second sentence of the first paragraph."); @@ -747,6 +769,539 @@ public class AccessibilityInjectorTest extends AndroidTestCase { } /** + * Tests that the selection does not cross anchor boundaries. This is a + * workaround for the asymmetric and inconsistent handling of text with + * links by WebKit while traversing by sentence. + */ + @LargeTest + public void testEnforceSelectionDoesNotCrossAnchorBoundary1() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>First</div>" + + "<p>" + + "<a href=\"\">Second</a> Third" + + "</p>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"\">Second</a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Third"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Third"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"\">Second</a>"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests that the selection does not cross anchor boundaries. This is a + * workaround for the asymmetric and inconsistent handling of text with + * links by WebKit while traversing by sentence. + */ + @LargeTest + public void testEnforceSelectionDoesNotCrossAnchorBoundary2() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>First</div>" + + "<a href=\"#\">Second</a>" + + " " + + "<a href=\"#\">Third</a>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">Second</a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(" "); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">Third</a>"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">Third</a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(" "); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">Second</a>"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests that the selection does not cross anchor boundaries. This is a + * workaround for the asymmetric and inconsistent handling of text with + * links by WebKit while traversing by sentence. + */ + @LargeTest + public void testEnforceSelectionDoesNotCrossAnchorBoundary3() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>" + + "First" + + "<div>" + + "<div>" + + "<a href=\"#\">Second</a>" + + "</div>" + + "<div>" + + "Third" + + "</div>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">Second</a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Third"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Third"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">Second</a>"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests skipping of content with hidden visibility. + */ + @LargeTest + public void testSkipVisibilityHidden() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>First </div>" + + "<div style=\"visibility:hidden;\">Second</div>" + + "<div> Third</div>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // change navigation axis to word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON); + assertSelectionString("1"); // expect the word navigation axis + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the third word (the second is invisible) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Third"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third word (the second is invisible) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Third"); + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests skipping of content with display none. + */ + @LargeTest + public void testSkipDisplayNone() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>First</div>" + + "<div style=\"display: none;\">Second</div>" + + "<div>Third</div>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // change navigation axis to word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, META_STATE_ALT_LEFT_ON); + assertSelectionString("1"); // expect the word navigation axis + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the third word (the second is invisible) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Third"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third word (the second is invisible) + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Third"); + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first word + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests for the selection not getting stuck. + * + * Note: The selection always proceeds but if it can + * be selecting the same content i.e. between the start + * and end are contained the same text nodes. + */ + @LargeTest + public void testSelectionTextProceed() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<a href=\"#\">First</a>" + + "<span><a href=\"#\"><span>Second</span> <small>a</small></a>" + + "</span> <a href=\"#\">Third</a>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">First</a>"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\"><span>Second <small>a</small></a>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(" "); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">Third</a>"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">Third</a>"); + + // NOTE: Here we are a bit asymmetric around whitespace but we can live with it + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(" "); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\"><span>Second <small>a</small></a>"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<a href=\"#\">First</a>"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<a href=\"#\">First</a>"); + } + + /** + * Tests if input elements are selected rather skipped. + */ + @LargeTest + public void testSelectionOfInputElements() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<p>" + + "First" + + "</p>" + + "<input type=\"text\"/>" + + "<p>" + + "Second" + + "</p>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Second"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Second"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + + // go to before the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString(null); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + } + + /** + * Tests traversing of input controls. + */ + @LargeTest + public void testSelectionOfInputElements2() throws Exception { + // a bit ugly but helps detect beginning and end of all tests so accessibility + // and the mock service are not toggled on every test (expensive) + sExecutedTestCount++; + + String html = + "<!DOCTYPE html>" + + "<html>" + + "<head>" + + "</head>" + + "<body>" + + "<div>" + + "First" + + "<input type=\"text\"/>" + + "<span>" + + "<input type=\"text\"/>" + + "</span>" + + "<button type=\"button\">Click Me!</button>" + + "<div>" + + "<input type=\"submit\"/>" + + "</div>" + + "<p>" + + "Second" + + "</p>" + + "</div>" + + "</body>" + + "</html>"; + + WebView webView = createWebVewWithHtml(html); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("First"); + + // go to the second sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<button type=\"button\">Click Me!</button>"); + + // go to the fifth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("<input type=\"submit\">"); + + // go to the sixth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString("Second"); + + // go to past the last sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_DOWN, 0); + assertSelectionString(null); + + // go to the sixth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("Second"); + + // go to the fifth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<input type=\"submit\">"); + + // go to the fourth sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<button type=\"button\">Click Me!</button>"); + + // go to the third sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("<input type=\"text\">"); + + // go to the first sentence + sendKeyEvent(webView, KeyEvent.KEYCODE_DPAD_UP, 0); + assertSelectionString("First"); + } + + /** * Enable accessibility and the mock accessibility service. */ private void enableAccessibilityAndMockAccessibilityService() { @@ -887,7 +1442,8 @@ public class AccessibilityInjectorTest extends AndroidTestCase { */ private void restoreDefaultWebContentKeyBindings() { Settings.Secure.putString(getContext().getContentResolver(), - Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, mDefaultKeyBindings); + Settings.Secure.ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS, + mDefaultKeyBindings); } /** diff --git a/data/etc/android.hardware.touchscreen.multitouch.distinct.xml b/data/etc/android.hardware.touchscreen.multitouch.distinct.xml index a3c116ad7339..35eeefd1fcb8 100644 --- a/data/etc/android.hardware.touchscreen.multitouch.distinct.xml +++ b/data/etc/android.hardware.touchscreen.multitouch.distinct.xml @@ -20,4 +20,5 @@ <feature name="android.hardware.touchscreen" /> <feature name="android.hardware.touchscreen.multitouch" /> <feature name="android.hardware.touchscreen.multitouch.distinct" /> + <feature name="android.hardware.faketouch" /> </permissions> diff --git a/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml b/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml index 80bf859b29cb..ed6606d8de49 100644 --- a/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml +++ b/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml @@ -21,4 +21,5 @@ <feature name="android.hardware.touchscreen.multitouch" /> <feature name="android.hardware.touchscreen.multitouch.distinct" /> <feature name="android.hardware.touchscreen.multitouch.jazzhand" /> + <feature name="android.hardware.faketouch" /> </permissions> diff --git a/data/etc/android.hardware.touchscreen.multitouch.xml b/data/etc/android.hardware.touchscreen.multitouch.xml index 34b518aac027..1d59a27beb18 100644 --- a/data/etc/android.hardware.touchscreen.multitouch.xml +++ b/data/etc/android.hardware.touchscreen.multitouch.xml @@ -20,4 +20,5 @@ <permissions> <feature name="android.hardware.touchscreen" /> <feature name="android.hardware.touchscreen.multitouch" /> + <feature name="android.hardware.faketouch" /> </permissions> diff --git a/data/etc/android.hardware.touchscreen.xml b/data/etc/android.hardware.touchscreen.xml index 10c91f122d33..5b5ddf930191 100644 --- a/data/etc/android.hardware.touchscreen.xml +++ b/data/etc/android.hardware.touchscreen.xml @@ -18,4 +18,5 @@ support multitouch. --> <permissions> <feature name="android.hardware.touchscreen" /> + <feature name="android.hardware.faketouch" /> </permissions> diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 00b06e0303b1..c1deed38ae95 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -1596,51 +1596,6 @@ public class Canvas { } /** - * <p>Acquires the Canvas context. After invoking this method, the Canvas - * context can be modified by the caller. For instance, if you acquire - * the context of an OpenGL Canvas you can reset the GL viewport, scissor, - * etc.</p> - * - * <p>A call to {@link #acquireContext()} should aways be followed by - * a call to {@link #releaseContext()}, preferrably using a try block:</p> - * - * <pre> - * try { - * if (canvas.acquireContext()) { - * // Use the canvas and/or its context - * } - * } finally { - * canvas.releaseContext(); - * } - * </pre> - * - * <p>Acquiring the context can be an expensive operation and should not - * be done unless absolutely necessary.</p> - * - * <p>Applications should never invoke this method directly.</p> - * - * @return True if the context could be acquired successfully, false - * otherwise (if the context is already acquired for instance.) - * - * @see #releaseContext() - * - * @hide - */ - public boolean acquireContext() { - return false; - } - - /** - * <p>Release the context acquired with {@link #acquireContext()}.</p> - * - * @see #acquireContext() - * - * @hide - */ - public void releaseContext() { - } - - /** * Free up as much memory as possible from private caches (e.g. fonts, images) * * @hide diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index b739d838ca9d..d8a7f9d57c7a 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -1690,7 +1690,7 @@ public class Paint { int contextLen = contextEnd - contextStart; char[] buf = TemporaryBuffer.obtain(contextLen); TextUtils.getChars(text, contextStart, contextEnd, buf, 0); - int result = getTextRunCursor(buf, 0, contextLen, flags, offset, cursorOpt); + int result = getTextRunCursor(buf, 0, contextLen, flags, offset - contextStart, cursorOpt); TemporaryBuffer.recycle(buf); return result; } diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java index 64c209a38801..4c659d4dc98c 100644 --- a/graphics/java/android/graphics/SurfaceTexture.java +++ b/graphics/java/android/graphics/SurfaceTexture.java @@ -24,9 +24,9 @@ import android.os.Message; /** * Captures frames from an image stream as an OpenGL ES texture. * - * <p>The image stream may come from either video playback or camera preview. A SurfaceTexture may - * be used in place of a SurfaceHolder when specifying the output destination of a MediaPlayer or - * Camera object. This will cause all the frames from that image stream to be sent to the + * <p>The image stream may come from either camera preview. A SurfaceTexture may be used in place + * of a SurfaceHolder when specifying the output destination of a {@link android.hardware.Camera} + * object. Doing so will cause all the frames from the image stream to be sent to the * SurfaceTexture object rather than to the device's display. When {@link #updateTexImage} is * called, the contents of the texture object specified when the SurfaceTexture was created is * updated to contain the most recent image from the image stream. This may cause some frames of @@ -34,6 +34,11 @@ import android.os.Message; * * <p>The texture object uses the GL_TEXTURE_EXTERNAL_OES texture target, which is defined by the * OES_EGL_image_external OpenGL ES extension. This limits how the texture may be used. + * + * <p>SurfaceTexture objects may be created on any thread. {@link #updateTexImage} may only be + * called on the thread with the OpenGL ES context that contains the texture object. The + * frame-available callback is called on an arbitrary thread, so unless special care is taken {@link + * #updateTexImage} should not be called directly from the callback. */ public class SurfaceTexture { diff --git a/graphics/java/android/graphics/drawable/package.html b/graphics/java/android/graphics/drawable/package.html index da49df763bfa..60b7a2c3c2df 100644 --- a/graphics/java/android/graphics/drawable/package.html +++ b/graphics/java/android/graphics/drawable/package.html @@ -1,9 +1,10 @@ <HTML> <BODY> -Provides classes to manage a variety of visual elements that are intended for +<p>Provides classes to manage a variety of visual elements that are intended for display only, such as bitmaps and gradients. These elements are often used by widgets as background images or simply as indicators (for example, a volume -level indicator). You can create most of these in XML as described in <a -href="{@docRoot}guide/topics/resources/available-resources.html">Availeble Resource Types</a>. +level indicator).</p> +<p>You can create most of these drawables using XML, as described in <a +href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.</p> </BODY> </HTML> diff --git a/include/media/stagefright/CameraSource.h b/include/media/stagefright/CameraSource.h index 794355b5f17b..4a39fbf26575 100644 --- a/include/media/stagefright/CameraSource.h +++ b/include/media/stagefright/CameraSource.h @@ -158,6 +158,7 @@ protected: int32_t mNumFramesReceived; int64_t mLastFrameTimestampUs; bool mStarted; + int32_t mNumFramesEncoded; CameraSource(const sp<ICamera>& camera, int32_t cameraId, Size videoSize, int32_t frameRate, @@ -189,7 +190,6 @@ private: List<int64_t> mFrameTimes; int64_t mFirstFrameTimeUs; - int32_t mNumFramesEncoded; int32_t mNumFramesDropped; int32_t mNumGlitches; int64_t mGlitchDurationThresholdUs; diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index 3251c28d493b..82948cb400c5 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -47,6 +47,9 @@ struct OMXCodec : public MediaSource, // Store meta data in video buffers kStoreMetaDataInVideoBuffers = 32, + + // Only submit one input buffer at one time. + kOnlySubmitOneInputBufferAtOneTime = 64, }; static sp<MediaSource> Create( const sp<IOMX> &omx, @@ -192,6 +195,7 @@ private: Condition mBufferFilled; bool mIsMetaDataStoredInVideoBuffers; + bool mOnlySubmitOneBufferAtOneTime; OMXCodec(const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks, bool isEncoder, const char *mime, const char *componentName, diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index c2106d49f7e4..cfc853cc048b 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -82,8 +82,6 @@ void PathHeap::flatten(SkFlattenableWriteBuffer& buffer) const { /////////////////////////////////////////////////////////////////////////////// const char* DisplayList::OP_NAMES[] = { - "AcquireContext", - "ReleaseContext", "Save", "Restore", "RestoreToCount", @@ -239,16 +237,6 @@ bool DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) { needsInvalidate |= renderer.callDrawGLFunction(functor); } break; - case AcquireContext: { - DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); - renderer.acquireContext(); - } - break; - case ReleaseContext: { - DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); - renderer.releaseContext(); - } - break; case Save: { int rendererNum = getInt(); DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); @@ -644,15 +632,9 @@ void DisplayListRenderer::finish() { } void DisplayListRenderer::interrupt() { - } -void DisplayListRenderer::resume() { -} -void DisplayListRenderer::acquireContext() { - // TODO: probably noop instead of calling super - addOp(DisplayList::AcquireContext); - OpenGLRenderer::acquireContext(); +void DisplayListRenderer::resume() { } bool DisplayListRenderer::callDrawGLFunction(Functor *functor) { @@ -661,12 +643,6 @@ bool DisplayListRenderer::callDrawGLFunction(Functor *functor) { return false; // No invalidate needed at record-time } -void DisplayListRenderer::releaseContext() { - // TODO: probably noop instead of calling super - addOp(DisplayList::ReleaseContext); - OpenGLRenderer::releaseContext(); -} - int DisplayListRenderer::save(int flags) { addOp(DisplayList::Save); addInt(flags); diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index bab5149b093a..a6d2bfe2b1bb 100644 --- a/libs/hwui/DisplayListRenderer.h +++ b/libs/hwui/DisplayListRenderer.h @@ -89,9 +89,7 @@ public: // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file // when modifying this file enum Op { - AcquireContext = 0, - ReleaseContext, - Save, + Save = 0, Restore, RestoreToCount, SaveLayer, @@ -245,8 +243,6 @@ public: void finish(); bool callDrawGLFunction(Functor *functor); - void acquireContext(); - void releaseContext(); void interrupt(); void resume(); diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index 36709dcf98c7..691f6497f641 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -43,7 +43,7 @@ void LayerRenderer::finish() { generateMesh(); - LAYER_RENDERER_LOGD("Finished rendering into layer, fbo = %d", mLayer->mFbo); + LAYER_RENDERER_LOGD("Finished rendering into layer, fbo = %d", mLayer->fbo); // No need to unbind our FBO, this will be taken care of by the caller // who will invoke OpenGLRenderer::resume() @@ -99,11 +99,13 @@ void LayerRenderer::generateMesh() { mLayer->meshIndices = NULL; } + bool rebuildIndices = false; if (!mLayer->mesh) { mLayer->mesh = new TextureVertex[count * 4]; mLayer->meshIndices = new uint16_t[elementCount]; - mLayer->meshElementCount = elementCount; + rebuildIndices = true; } + mLayer->meshElementCount = elementCount; const float texX = 1.0f / float(mLayer->width); const float texY = 1.0f / float(mLayer->height); @@ -125,14 +127,16 @@ void LayerRenderer::generateMesh() { TextureVertex::set(mesh++, r->left, r->bottom, u1, v2); TextureVertex::set(mesh++, r->right, r->bottom, u2, v2); - uint16_t quad = i * 4; - int index = i * 6; - indices[index ] = quad; // top-left - indices[index + 1] = quad + 1; // top-right - indices[index + 2] = quad + 2; // bottom-left - indices[index + 3] = quad + 2; // bottom-left - indices[index + 4] = quad + 1; // top-right - indices[index + 5] = quad + 3; // bottom-right + if (rebuildIndices) { + uint16_t quad = i * 4; + int index = i * 6; + indices[index ] = quad; // top-left + indices[index + 1] = quad + 1; // top-right + indices[index + 2] = quad + 2; // bottom-left + indices[index + 3] = quad + 2; // bottom-left + indices[index + 4] = quad + 1; // top-right + indices[index + 5] = quad + 3; // bottom-right + } } #endif } diff --git a/libs/hwui/OpenGLDebugRenderer.cpp b/libs/hwui/OpenGLDebugRenderer.cpp index 58d6c26940c7..05870bb2e07e 100644 --- a/libs/hwui/OpenGLDebugRenderer.cpp +++ b/libs/hwui/OpenGLDebugRenderer.cpp @@ -23,10 +23,11 @@ namespace android { namespace uirenderer { -void OpenGLDebugRenderer::prepare(bool opaque) { +void OpenGLDebugRenderer::prepareDirty(float left, float top, + float right, float bottom, bool opaque) { mPrimitivesCount = 0; LOGD("========= Frame start ========="); - OpenGLRenderer::prepare(opaque); + OpenGLRenderer::prepareDirty(left, top, right, bottom, opaque); } void OpenGLDebugRenderer::finish() { @@ -105,6 +106,33 @@ void OpenGLDebugRenderer::drawRect(float left, float top, float right, float bot OpenGLRenderer::drawRect(left, top, right, bottom, paint); } +void OpenGLDebugRenderer::drawRoundRect(float left, float top, float right, float bottom, + float rx, float ry, SkPaint* paint) { + mPrimitivesCount++; + StopWatch w("drawRoundRect"); + OpenGLRenderer::drawRoundRect(left, top, right, bottom, rx, ry, paint); +} + +void OpenGLDebugRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) { + mPrimitivesCount++; + StopWatch w("drawCircle"); + OpenGLRenderer::drawCircle(x, y, radius, paint); +} + +void OpenGLDebugRenderer::drawOval(float left, float top, float right, float bottom, + SkPaint* paint) { + mPrimitivesCount++; + StopWatch w("drawOval"); + OpenGLRenderer::drawOval(left, top, right, bottom, paint); +} + +void OpenGLDebugRenderer::drawArc(float left, float top, float right, float bottom, + float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { + mPrimitivesCount++; + StopWatch w("drawArc"); + OpenGLRenderer::drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint); +} + void OpenGLDebugRenderer::drawPath(SkPath* path, SkPaint* paint) { mPrimitivesCount++; StopWatch w("drawPath"); diff --git a/libs/hwui/OpenGLDebugRenderer.h b/libs/hwui/OpenGLDebugRenderer.h index 76e6a2e90b0f..1a18a6727f9f 100644 --- a/libs/hwui/OpenGLDebugRenderer.h +++ b/libs/hwui/OpenGLDebugRenderer.h @@ -34,7 +34,7 @@ public: ~OpenGLDebugRenderer() { } - void prepare(bool opaque); + void prepareDirty(float left, float top, float right, float bottom, bool opaque); void finish(); int saveLayer(float left, float top, float right, float bottom, @@ -52,6 +52,12 @@ public: float left, float top, float right, float bottom, SkPaint* paint); void drawColor(int color, SkXfermode::Mode mode); void drawRect(float left, float top, float right, float bottom, SkPaint* paint); + void drawRoundRect(float left, float top, float right, float bottom, + float rx, float ry, SkPaint* paint); + void drawCircle(float x, float y, float radius, SkPaint* paint); + void drawOval(float left, float top, float right, float bottom, SkPaint* paint); + void drawArc(float left, float top, float right, float bottom, + float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); void drawPath(SkPath* path, SkPaint* paint); void drawLines(float* points, int count, SkPaint* paint); void drawText(const char* text, int bytesCount, int count, float x, float y, diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index c378f46117bb..29603955b30a 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -191,10 +191,6 @@ void OpenGLRenderer::interrupt() { mCaches.unbindMeshBuffer(); } -void OpenGLRenderer::acquireContext() { - interrupt(); -} - void OpenGLRenderer::resume() { glViewport(0, 0, mSnapshot->viewport.getWidth(), mSnapshot->viewport.getHeight()); @@ -212,10 +208,6 @@ void OpenGLRenderer::resume() { glBlendEquation(GL_FUNC_ADD); } -void OpenGLRenderer::releaseContext() { - resume(); -} - bool OpenGLRenderer::callDrawGLFunction(Functor *functor) { interrupt(); if (mDirtyClip) { @@ -1621,10 +1613,12 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { setupDrawColorFilter(); setupDrawBlending(layer->blend || layer->alpha < 255, layer->mode, false); setupDrawProgram(); - setupDrawDirtyRegionsDisabled(); setupDrawPureColorUniforms(); setupDrawColorFilterUniforms(); setupDrawTexture(layer->texture); + // TODO: The current layer, if any, will be dirtied with the bounding box + // of the layer we are drawing. Since the layer we are drawing has + // a mesh, we know the dirty region, we should use it instead setupDrawModelViewTranslate(rect.left, rect.top, rect.right, rect.bottom); setupDrawMesh(&layer->mesh[0].position[0], &layer->mesh[0].texture[0]); diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index 77de1d2270a8..64def03d9ede 100644 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -71,8 +71,6 @@ public: virtual void resume(); virtual bool callDrawGLFunction(Functor *functor); - virtual void acquireContext(); - virtual void releaseContext(); int getSaveCount() const; virtual int save(int flags); diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 40cb5c746e47..1dfedb3bd53c 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -528,6 +528,7 @@ void * Context::threadProc(void *vrsc) { void Context::destroyWorkerThreadResources() { //LOGV("destroyWorkerThreadResources 1"); + ObjectBase::zeroAllUserRef(this); if (mIsGraphicsContext) { mRaster.clear(); mFragment.clear(); @@ -542,7 +543,6 @@ void Context::destroyWorkerThreadResources() { mStateFont.deinit(this); mShaderCache.cleanupAll(); } - ObjectBase::zeroAllUserRef(this); //LOGV("destroyWorkerThreadResources 2"); mExit = true; } diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp index 8571c32e95ec..7fdfbe05f287 100644 --- a/libs/rs/rsFont.cpp +++ b/libs/rs/rsFont.cpp @@ -74,6 +74,15 @@ bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data return true; } +void Font::preDestroy() const { + for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) { + if (mRSC->mStateFont.mActiveFonts[ct] == this) { + mRSC->mStateFont.mActiveFonts.removeAt(ct); + break; + } + } +} + void Font::invalidateTextureCache() { for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) { mCachedGlyphs.valueAt(i)->mIsValid = false; @@ -309,13 +318,6 @@ Font::~Font() { FT_Done_Face(mFace); } - for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) { - if (mRSC->mStateFont.mActiveFonts[ct] == this) { - mRSC->mStateFont.mActiveFonts.removeAt(ct); - break; - } - } - for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) { CachedGlyphInfo *glyph = mCachedGlyphs.valueAt(i); delete glyph; @@ -799,11 +801,6 @@ void FontState::deinit(Context *rsc) { mDefault.clear(); - Vector<Font*> fontsToDereference = mActiveFonts; - for (uint32_t i = 0; i < fontsToDereference.size(); i ++) { - fontsToDereference[i]->zeroUserRef(); - } - if (mLibrary) { FT_Done_FreeType( mLibrary ); mLibrary = NULL; diff --git a/libs/rs/rsFont.h b/libs/rs/rsFont.h index 00d77c84587c..48209992e9b1 100644 --- a/libs/rs/rsFont.h +++ b/libs/rs/rsFont.h @@ -119,6 +119,7 @@ protected: Font(Context *rsc); bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0); + virtual void preDestroy() const; FT_Face mFace; bool mInitialized; bool mHasKerning; diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp index 3f8854330acf..70b72783863e 100644 --- a/libs/rs/rsLocklessFifo.cpp +++ b/libs/rs/rsLocklessFifo.cpp @@ -100,7 +100,9 @@ void LocklessCommandFifo::commit(uint32_t command, uint32_t sizeInBytes) { //dumpState("commit 1"); reinterpret_cast<uint16_t *>(mPut)[0] = command; reinterpret_cast<uint16_t *>(mPut)[1] = sizeInBytes; - mPut += ((sizeInBytes + 3) & ~3) + 4; + + int32_t s = ((sizeInBytes + 3) & ~3) + 4; + android_atomic_add(s, (int32_t *)&mPut); //dumpState("commit 2"); mSignalToWorker.set(); } diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp index efdc626071f8..9ada9c299ac4 100644 --- a/libs/rs/rsScript.cpp +++ b/libs/rs/rsScript.cpp @@ -78,8 +78,6 @@ void Script::setVarObj(uint32_t slot, ObjectBase *val) { (*destPtr)->decSysRef(); } *destPtr = val; - } else { - LOGV("Calling setVarObj on slot = %i which is null. This is dangerous because the script will not hold a ref count on the object.", slot); } } diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 3858e1cfc0de..fc673a2d517b 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -94,16 +94,24 @@ char *genCacheFileName(const char *cacheDir, } ScriptC::ScriptC(Context *rsc) : Script(rsc) { - LOGD(">>>> ScriptC ctor called, obj=%p", this); mBccScript = NULL; memset(&mProgram, 0, sizeof(mProgram)); } ScriptC::~ScriptC() { - LOGD(">>>> ~ScriptC() mBccScript = %p", mBccScript); if (mBccScript) { + if (mProgram.mObjectSlotList) { + for (size_t ct=0; ct < mProgram.mObjectSlotCount; ct++) { + setVarObj(mProgram.mObjectSlotList[ct], NULL); + } + delete [] mProgram.mObjectSlotList; + mProgram.mObjectSlotList = NULL; + mProgram.mObjectSlotCount = 0; + } + + + LOGD(">>>> ~ScriptC bccDisposeScript(%p)", mBccScript); bccDisposeScript(mBccScript); - LOGD(">>>> ~ScriptC(mBCCScript)"); } free(mEnviroment.mScriptText); mEnviroment.mScriptText = NULL; @@ -589,6 +597,16 @@ bool ScriptCState::runCompiler(Context *rsc, return false; } } + + size_t objectSlotCount = bccGetObjectSlotCount(s->mBccScript); + uint32_t *objectSlots = NULL; + if (objectSlotCount) { + objectSlots = new uint32_t[objectSlotCount]; + bccGetObjectSlotList(s->mBccScript, objectSlotCount, objectSlots); + s->mProgram.mObjectSlotList = objectSlots; + s->mProgram.mObjectSlotCount = objectSlotCount; + } + return true; } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 7143c671a658..e794feb10edb 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -42,8 +42,12 @@ public: RunScript_t mRoot; VoidFunc_t mInit; + + uint32_t * mObjectSlotList; + uint32_t mObjectSlotCount; }; + Program_t mProgram; BCCScriptRef mBccScript; diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp index beb4d724e05e..8a85f6ed5308 100644 --- a/libs/rs/rsScriptC_Lib.cpp +++ b/libs/rs/rsScriptC_Lib.cpp @@ -347,6 +347,489 @@ void SC_ForEach2(RsScript vs, s->runForEach(rsc, ain, aout, usr, call); } + +////////////////////////////////////////////////////////////////////////////// +// Heavy math functions +////////////////////////////////////////////////////////////////////////////// + +typedef struct { + float m[16]; +} rs_matrix4x4; + +typedef struct { + float m[9]; +} rs_matrix3x3; + +typedef struct { + float m[4]; +} rs_matrix2x2; + +static inline void +rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v) { + m->m[row * 4 + col] = v; +} + +static inline float +rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col) { + return m->m[row * 4 + col]; +} + +static inline void +rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v) { + m->m[row * 3 + col] = v; +} + +static inline float +rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col) { + return m->m[row * 3 + col]; +} + +static inline void +rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v) { + m->m[row * 2 + col] = v; +} + +static inline float +rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col) { + return m->m[row * 2 + col]; +} + + +static void SC_MatrixLoadIdentity_4x4(rs_matrix4x4 *m) { + m->m[0] = 1.f; + m->m[1] = 0.f; + m->m[2] = 0.f; + m->m[3] = 0.f; + m->m[4] = 0.f; + m->m[5] = 1.f; + m->m[6] = 0.f; + m->m[7] = 0.f; + m->m[8] = 0.f; + m->m[9] = 0.f; + m->m[10] = 1.f; + m->m[11] = 0.f; + m->m[12] = 0.f; + m->m[13] = 0.f; + m->m[14] = 0.f; + m->m[15] = 1.f; +} + +static void SC_MatrixLoadIdentity_3x3(rs_matrix3x3 *m) { + m->m[0] = 1.f; + m->m[1] = 0.f; + m->m[2] = 0.f; + m->m[3] = 0.f; + m->m[4] = 1.f; + m->m[5] = 0.f; + m->m[6] = 0.f; + m->m[7] = 0.f; + m->m[8] = 1.f; +} + +static void SC_MatrixLoadIdentity_2x2(rs_matrix2x2 *m) { + m->m[0] = 1.f; + m->m[1] = 0.f; + m->m[2] = 0.f; + m->m[3] = 1.f; +} + +static void SC_MatrixLoad_4x4_f(rs_matrix4x4 *m, const float *v) { + m->m[0] = v[0]; + m->m[1] = v[1]; + m->m[2] = v[2]; + m->m[3] = v[3]; + m->m[4] = v[4]; + m->m[5] = v[5]; + m->m[6] = v[6]; + m->m[7] = v[7]; + m->m[8] = v[8]; + m->m[9] = v[9]; + m->m[10] = v[10]; + m->m[11] = v[11]; + m->m[12] = v[12]; + m->m[13] = v[13]; + m->m[14] = v[14]; + m->m[15] = v[15]; +} + +static void SC_MatrixLoad_3x3_f(rs_matrix3x3 *m, const float *v) { + m->m[0] = v[0]; + m->m[1] = v[1]; + m->m[2] = v[2]; + m->m[3] = v[3]; + m->m[4] = v[4]; + m->m[5] = v[5]; + m->m[6] = v[6]; + m->m[7] = v[7]; + m->m[8] = v[8]; +} + +static void SC_MatrixLoad_2x2_f(rs_matrix2x2 *m, const float *v) { + m->m[0] = v[0]; + m->m[1] = v[1]; + m->m[2] = v[2]; + m->m[3] = v[3]; +} + +static void SC_MatrixLoad_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *v) { + m->m[0] = v->m[0]; + m->m[1] = v->m[1]; + m->m[2] = v->m[2]; + m->m[3] = v->m[3]; + m->m[4] = v->m[4]; + m->m[5] = v->m[5]; + m->m[6] = v->m[6]; + m->m[7] = v->m[7]; + m->m[8] = v->m[8]; + m->m[9] = v->m[9]; + m->m[10] = v->m[10]; + m->m[11] = v->m[11]; + m->m[12] = v->m[12]; + m->m[13] = v->m[13]; + m->m[14] = v->m[14]; + m->m[15] = v->m[15]; +} + +static void SC_MatrixLoad_4x4_3x3(rs_matrix4x4 *m, const rs_matrix3x3 *v) { + m->m[0] = v->m[0]; + m->m[1] = v->m[1]; + m->m[2] = v->m[2]; + m->m[3] = 0.f; + m->m[4] = v->m[3]; + m->m[5] = v->m[4]; + m->m[6] = v->m[5]; + m->m[7] = 0.f; + m->m[8] = v->m[6]; + m->m[9] = v->m[7]; + m->m[10] = v->m[8]; + m->m[11] = 0.f; + m->m[12] = 0.f; + m->m[13] = 0.f; + m->m[14] = 0.f; + m->m[15] = 1.f; +} + +static void SC_MatrixLoad_4x4_2x2(rs_matrix4x4 *m, const rs_matrix2x2 *v) { + m->m[0] = v->m[0]; + m->m[1] = v->m[1]; + m->m[2] = 0.f; + m->m[3] = 0.f; + m->m[4] = v->m[2]; + m->m[5] = v->m[3]; + m->m[6] = 0.f; + m->m[7] = 0.f; + m->m[8] = 0.f; + m->m[9] = 0.f; + m->m[10] = 1.f; + m->m[11] = 0.f; + m->m[12] = 0.f; + m->m[13] = 0.f; + m->m[14] = 0.f; + m->m[15] = 1.f; +} + +static void SC_MatrixLoad_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *v) { + m->m[0] = v->m[0]; + m->m[1] = v->m[1]; + m->m[2] = v->m[2]; + m->m[3] = v->m[3]; + m->m[4] = v->m[4]; + m->m[5] = v->m[5]; + m->m[6] = v->m[6]; + m->m[7] = v->m[7]; + m->m[8] = v->m[8]; +} + +static void SC_MatrixLoad_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *v) { + m->m[0] = v->m[0]; + m->m[1] = v->m[1]; + m->m[2] = v->m[2]; + m->m[3] = v->m[3]; +} + +static void SC_MatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z) { + float c, s; + m->m[3] = 0; + m->m[7] = 0; + m->m[11]= 0; + m->m[12]= 0; + m->m[13]= 0; + m->m[14]= 0; + m->m[15]= 1; + rot *= (float)(M_PI / 180.0f); + c = cos(rot); + s = sin(rot); + + const float len = x*x + y*y + z*z; + if (len != 1) { + const float recipLen = 1.f / sqrt(len); + x *= recipLen; + y *= recipLen; + z *= recipLen; + } + const float nc = 1.0f - c; + const float xy = x * y; + const float yz = y * z; + const float zx = z * x; + const float xs = x * s; + const float ys = y * s; + const float zs = z * s; + m->m[ 0] = x*x*nc + c; + m->m[ 4] = xy*nc - zs; + m->m[ 8] = zx*nc + ys; + m->m[ 1] = xy*nc + zs; + m->m[ 5] = y*y*nc + c; + m->m[ 9] = yz*nc - xs; + m->m[ 2] = zx*nc - ys; + m->m[ 6] = yz*nc + xs; + m->m[10] = z*z*nc + c; +} + +static void SC_MatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z) { + SC_MatrixLoadIdentity_4x4(m); + m->m[0] = x; + m->m[5] = y; + m->m[10] = z; +} + +static void SC_MatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z) { + SC_MatrixLoadIdentity_4x4(m); + m->m[12] = x; + m->m[13] = y; + m->m[14] = z; +} + +static void SC_MatrixLoadMultiply_4x4_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) { + for (int i=0 ; i<4 ; i++) { + float ri0 = 0; + float ri1 = 0; + float ri2 = 0; + float ri3 = 0; + for (int j=0 ; j<4 ; j++) { + const float rhs_ij = rsMatrixGet(rhs, i,j); + ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; + ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; + ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij; + ri3 += rsMatrixGet(lhs, j, 3) * rhs_ij; + } + rsMatrixSet(m, i, 0, ri0); + rsMatrixSet(m, i, 1, ri1); + rsMatrixSet(m, i, 2, ri2); + rsMatrixSet(m, i, 3, ri3); + } +} + +static void SC_MatrixMultiply_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *rhs) { + rs_matrix4x4 mt; + SC_MatrixLoadMultiply_4x4_4x4_4x4(&mt, m, rhs); + SC_MatrixLoad_4x4_4x4(m, &mt); +} + +static void SC_MatrixLoadMultiply_3x3_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) { + for (int i=0 ; i<3 ; i++) { + float ri0 = 0; + float ri1 = 0; + float ri2 = 0; + for (int j=0 ; j<3 ; j++) { + const float rhs_ij = rsMatrixGet(rhs, i,j); + ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; + ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; + ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij; + } + rsMatrixSet(m, i, 0, ri0); + rsMatrixSet(m, i, 1, ri1); + rsMatrixSet(m, i, 2, ri2); + } +} + +static void SC_MatrixMultiply_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *rhs) { + rs_matrix3x3 mt; + SC_MatrixLoadMultiply_3x3_3x3_3x3(&mt, m, rhs); + SC_MatrixLoad_3x3_3x3(m, &mt); +} + +static void SC_MatrixLoadMultiply_2x2_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) { + for (int i=0 ; i<2 ; i++) { + float ri0 = 0; + float ri1 = 0; + for (int j=0 ; j<2 ; j++) { + const float rhs_ij = rsMatrixGet(rhs, i,j); + ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; + ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; + } + rsMatrixSet(m, i, 0, ri0); + rsMatrixSet(m, i, 1, ri1); + } +} + +static void SC_MatrixMultiply_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *rhs) { + rs_matrix2x2 mt; + SC_MatrixLoadMultiply_2x2_2x2_2x2(&mt, m, rhs); + SC_MatrixLoad_2x2_2x2(m, &mt); +} + +static void SC_MatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z) { + rs_matrix4x4 m1; + SC_MatrixLoadRotate(&m1, rot, x, y, z); + SC_MatrixMultiply_4x4_4x4(m, &m1); +} + +static void SC_MatrixScale(rs_matrix4x4 *m, float x, float y, float z) { + rs_matrix4x4 m1; + SC_MatrixLoadScale(&m1, x, y, z); + SC_MatrixMultiply_4x4_4x4(m, &m1); +} + +static void SC_MatrixTranslate(rs_matrix4x4 *m, float x, float y, float z) { + rs_matrix4x4 m1; + SC_MatrixLoadTranslate(&m1, x, y, z); + SC_MatrixMultiply_4x4_4x4(m, &m1); +} + +static void SC_MatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far) { + SC_MatrixLoadIdentity_4x4(m); + m->m[0] = 2.f / (right - left); + m->m[5] = 2.f / (top - bottom); + m->m[10]= -2.f / (far - near); + m->m[12]= -(right + left) / (right - left); + m->m[13]= -(top + bottom) / (top - bottom); + m->m[14]= -(far + near) / (far - near); +} + +static void SC_MatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far) { + SC_MatrixLoadIdentity_4x4(m); + m->m[0] = 2.f * near / (right - left); + m->m[5] = 2.f * near / (top - bottom); + m->m[8] = (right + left) / (right - left); + m->m[9] = (top + bottom) / (top - bottom); + m->m[10]= -(far + near) / (far - near); + m->m[11]= -1.f; + m->m[14]= -2.f * far * near / (far - near); + m->m[15]= 0.f; +} + +static void SC_MatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far) { + float top = near * tan((float) (fovy * M_PI / 360.0f)); + float bottom = -top; + float left = bottom * aspect; + float right = top * aspect; + SC_MatrixLoadFrustum(m, left, right, bottom, top, near, far); +} + + +// Returns true if the matrix was successfully inversed +static bool SC_MatrixInverse_4x4(rs_matrix4x4 *m) { + rs_matrix4x4 result; + + int i, j; + for (i = 0; i < 4; ++i) { + for (j = 0; j < 4; ++j) { + // computeCofactor for int i, int j + int c0 = (i+1) % 4; + int c1 = (i+2) % 4; + int c2 = (i+3) % 4; + int r0 = (j+1) % 4; + int r1 = (j+2) % 4; + int r2 = (j+3) % 4; + + float minor = (m->m[c0 + 4*r0] * (m->m[c1 + 4*r1] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r1])) + - (m->m[c0 + 4*r1] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r0])) + + (m->m[c0 + 4*r2] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r1] - m->m[c1 + 4*r1] * m->m[c2 + 4*r0])); + + float cofactor = (i+j) & 1 ? -minor : minor; + + result.m[4*i + j] = cofactor; + } + } + + // Dot product of 0th column of source and 0th row of result + float det = m->m[0]*result.m[0] + m->m[4]*result.m[1] + + m->m[8]*result.m[2] + m->m[12]*result.m[3]; + + if (fabs(det) < 1e-6) { + return false; + } + + det = 1.0f / det; + for (i = 0; i < 16; ++i) { + m->m[i] = result.m[i] * det; + } + + return true; +} + +// Returns true if the matrix was successfully inversed +static bool SC_MatrixInverseTranspose_4x4(rs_matrix4x4 *m) { + rs_matrix4x4 result; + + int i, j; + for (i = 0; i < 4; ++i) { + for (j = 0; j < 4; ++j) { + // computeCofactor for int i, int j + int c0 = (i+1) % 4; + int c1 = (i+2) % 4; + int c2 = (i+3) % 4; + int r0 = (j+1) % 4; + int r1 = (j+2) % 4; + int r2 = (j+3) % 4; + + float minor = (m->m[c0 + 4*r0] * (m->m[c1 + 4*r1] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r1])) + - (m->m[c0 + 4*r1] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r0])) + + (m->m[c0 + 4*r2] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r1] - m->m[c1 + 4*r1] * m->m[c2 + 4*r0])); + + float cofactor = (i+j) & 1 ? -minor : minor; + + result.m[4*j + i] = cofactor; + } + } + + // Dot product of 0th column of source and 0th column of result + float det = m->m[0]*result.m[0] + m->m[4]*result.m[4] + + m->m[8]*result.m[8] + m->m[12]*result.m[12]; + + if (fabs(det) < 1e-6) { + return false; + } + + det = 1.0f / det; + for (i = 0; i < 16; ++i) { + m->m[i] = result.m[i] * det; + } + + return true; +} + +static void SC_MatrixTranspose_4x4(rs_matrix4x4 *m) { + int i, j; + float temp; + for (i = 0; i < 3; ++i) { + for (j = i + 1; j < 4; ++j) { + temp = m->m[i*4 + j]; + m->m[i*4 + j] = m->m[j*4 + i]; + m->m[j*4 + i] = temp; + } + } +} + +static void SC_MatrixTranspose_3x3(rs_matrix3x3 *m) { + int i, j; + float temp; + for (i = 0; i < 2; ++i) { + for (j = i + 1; j < 3; ++j) { + temp = m->m[i*3 + j]; + m->m[i*3 + j] = m->m[j*4 + i]; + m->m[j*3 + i] = temp; + } + } +} + +static void SC_MatrixTranspose_2x2(rs_matrix2x2 *m) { + float temp = m->m[1]; + m->m[1] = m->m[2]; + m->m[2] = temp; +} + + ////////////////////////////////////////////////////////////////////////////// // Class implementation ////////////////////////////////////////////////////////////////////////////// @@ -473,6 +956,45 @@ static ScriptCState::SymbolTable_t gSyms[] = { { "_Z22rsSendToClientBlockingi", (void *)&SC_toClientBlocking, false }, { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_toClientBlocking2, false }, + // matrix + { "_Z20rsMatrixLoadIdentityP12rs_matrix4x4", (void *)&SC_MatrixLoadIdentity_4x4, false }, + { "_Z20rsMatrixLoadIdentityP12rs_matrix3x3", (void *)&SC_MatrixLoadIdentity_3x3, false }, + { "_Z20rsMatrixLoadIdentityP12rs_matrix2x2", (void *)&SC_MatrixLoadIdentity_2x2, false }, + + { "_Z12rsMatrixLoadP12rs_matrix4x4PKf", (void *)&SC_MatrixLoad_4x4_f, false }, + { "_Z12rsMatrixLoadP12rs_matrix3x3PKf", (void *)&SC_MatrixLoad_3x3_f, false }, + { "_Z12rsMatrixLoadP12rs_matrix2x2PKf", (void *)&SC_MatrixLoad_2x2_f, false }, + + { "_Z12rsMatrixLoadP12rs_matrix4x4PKS_", (void *)&SC_MatrixLoad_4x4_4x4, false }, + { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix3x3", (void *)&SC_MatrixLoad_4x4_3x3, false }, + { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix2x2", (void *)&SC_MatrixLoad_4x4_2x2, false }, + { "_Z12rsMatrixLoadP12rs_matrix3x3PKS_", (void *)&SC_MatrixLoad_3x3_3x3, false }, + { "_Z12rsMatrixLoadP12rs_matrix2x2PKS_", (void *)&SC_MatrixLoad_2x2_2x2, false }, + + { "_Z18rsMatrixLoadRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadRotate, false }, + { "_Z17rsMatrixLoadScaleP12rs_matrix4x4fff", (void *)&SC_MatrixLoadScale, false }, + { "_Z21rsMatrixLoadTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixLoadTranslate, false }, + { "_Z14rsMatrixRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixRotate, false }, + { "_Z13rsMatrixScaleP12rs_matrix4x4fff", (void *)&SC_MatrixScale, false }, + { "_Z17rsMatrixTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixTranslate, false }, + + { "_Z20rsMatrixLoadMultiplyP12rs_matrix4x4PKS_S2_", (void *)&SC_MatrixLoadMultiply_4x4_4x4_4x4, false }, + { "_Z16rsMatrixMultiplyP12rs_matrix4x4PKS_", (void *)&SC_MatrixMultiply_4x4_4x4, false }, + { "_Z20rsMatrixLoadMultiplyP12rs_matrix3x3PKS_S2_", (void *)&SC_MatrixLoadMultiply_3x3_3x3_3x3, false }, + { "_Z16rsMatrixMultiplyP12rs_matrix3x3PKS_", (void *)&SC_MatrixMultiply_3x3_3x3, false }, + { "_Z20rsMatrixLoadMultiplyP12rs_matrix2x2PKS_S2_", (void *)&SC_MatrixLoadMultiply_2x2_2x2_2x2, false }, + { "_Z16rsMatrixMultiplyP12rs_matrix2x2PKS_", (void *)&SC_MatrixMultiply_2x2_2x2, false }, + + { "_Z17rsMatrixLoadOrthoP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadOrtho, false }, + { "_Z19rsMatrixLoadFrustumP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadFrustum, false }, + { "_Z23rsMatrixLoadPerspectiveP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadPerspective, false }, + + { "_Z15rsMatrixInverseP12rs_matrix4x4", (void *)&SC_MatrixInverse_4x4, false }, + { "_Z24rsMatrixInverseTransposeP12rs_matrix4x4", (void *)&SC_MatrixInverseTranspose_4x4, false }, + { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_4x4, false }, + { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_3x3, false }, + { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_2x2, false }, + { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach, false }, //{ "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach2, true }, diff --git a/libs/rs/rsScriptC_LibCL.cpp b/libs/rs/rsScriptC_LibCL.cpp index 02d33b768abe..57855db2cf20 100644 --- a/libs/rs/rsScriptC_LibCL.cpp +++ b/libs/rs/rsScriptC_LibCL.cpp @@ -195,7 +195,7 @@ static ScriptCState::SymbolTable_t gSyms[] = { { "_Z4logbf", (void *)&logbf, true }, { "_Z3madfff", (void *)&SC_mad, true }, { "_Z4modffPf", (void *)&modff, true }, - //{ "nan", (void *)&, true }, + //{ "_Z3nanj", (void *)&SC_nan, true }, { "_Z9nextafterff", (void *)&nextafterf, true }, { "_Z3powff", (void *)&powf, true }, { "_Z9remainderff", (void *)&remainderf, true }, @@ -210,7 +210,7 @@ static ScriptCState::SymbolTable_t gSyms[] = { { "_Z4sqrtf", (void *)&sqrtf, true }, { "_Z3tanf", (void *)&tanf, true }, { "_Z4tanhf", (void *)&tanhf, true }, - { "_Z6tgammaf", (void *)&lgammaf, true }, // FIXME!!! NEEDS TO USE tgammaf + { "_Z6tgammaf", (void *)&tgammaf, true }, { "_Z5truncf", (void *)&truncf, true }, // OpenCL Int diff --git a/libs/rs/scriptc/rs_cl.rsh b/libs/rs/scriptc/rs_cl.rsh index 3a9686bdaee2..d78e62e1d54a 100644 --- a/libs/rs/scriptc/rs_cl.rsh +++ b/libs/rs/scriptc/rs_cl.rsh @@ -1,15 +1,15 @@ #ifndef __RS_CL_RSH__ #define __RS_CL_RSH__ -#define _RS_STATIC extern +#define _RS_RUNTIME extern // Conversions #define CVT_FUNC_2(typeout, typein) \ -_RS_STATIC typeout##2 __attribute__((overloadable)) \ +_RS_RUNTIME typeout##2 __attribute__((overloadable)) \ convert_##typeout##2(typein##2 v); \ -_RS_STATIC typeout##3 __attribute__((overloadable)) \ +_RS_RUNTIME typeout##3 __attribute__((overloadable)) \ convert_##typeout##3(typein##3 v); \ -_RS_STATIC typeout##4 __attribute__((overloadable)) \ +_RS_RUNTIME typeout##4 __attribute__((overloadable)) \ convert_##typeout##4(typein##4 v); @@ -32,62 +32,62 @@ CVT_FUNC(float) // Float ops, 6.11.2 #define FN_FUNC_FN(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v); \ -_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v); \ -_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v); +_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v); \ +_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v); \ +_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v); #define IN_FUNC_FN(fnc) \ -_RS_STATIC int2 __attribute__((overloadable)) fnc(float2 v); \ -_RS_STATIC int3 __attribute__((overloadable)) fnc(float3 v); \ -_RS_STATIC int4 __attribute__((overloadable)) fnc(float4 v); +_RS_RUNTIME int2 __attribute__((overloadable)) fnc(float2 v); \ +_RS_RUNTIME int3 __attribute__((overloadable)) fnc(float3 v); \ +_RS_RUNTIME int4 __attribute__((overloadable)) fnc(float4 v); #define FN_FUNC_FN_FN(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2); \ -_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2); \ -_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2); +_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2); \ +_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2); \ +_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2); #define FN_FUNC_FN_F(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float v2); \ -_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float v2); \ -_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float v2); +_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, float v2); \ +_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, float v2); \ +_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, float v2); #define FN_FUNC_FN_IN(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2); \ -_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2); \ -_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2); \ +_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2); \ +_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2); \ +_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2); \ #define FN_FUNC_FN_I(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int v2); \ -_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int v2); \ -_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int v2); +_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int v2); \ +_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int v2); \ +_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int v2); #define FN_FUNC_FN_PFN(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) \ +_RS_RUNTIME float2 __attribute__((overloadable)) \ fnc(float2 v1, float2 *v2); \ -_RS_STATIC float3 __attribute__((overloadable)) \ +_RS_RUNTIME float3 __attribute__((overloadable)) \ fnc(float3 v1, float3 *v2); \ -_RS_STATIC float4 __attribute__((overloadable)) \ +_RS_RUNTIME float4 __attribute__((overloadable)) \ fnc(float4 v1, float4 *v2); #define FN_FUNC_FN_PIN(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2); \ -_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2); \ -_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2); +_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2); \ +_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2); \ +_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2); #define FN_FUNC_FN_FN_FN(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) \ +_RS_RUNTIME float2 __attribute__((overloadable)) \ fnc(float2 v1, float2 v2, float2 v3); \ -_RS_STATIC float3 __attribute__((overloadable)) \ +_RS_RUNTIME float3 __attribute__((overloadable)) \ fnc(float3 v1, float3 v2, float3 v3); \ -_RS_STATIC float4 __attribute__((overloadable)) \ +_RS_RUNTIME float4 __attribute__((overloadable)) \ fnc(float4 v1, float4 v2, float4 v3); #define FN_FUNC_FN_FN_PIN(fnc) \ -_RS_STATIC float2 __attribute__((overloadable)) \ +_RS_RUNTIME float2 __attribute__((overloadable)) \ fnc(float2 v1, float2 v2, int2 *v3); \ -_RS_STATIC float3 __attribute__((overloadable)) \ +_RS_RUNTIME float3 __attribute__((overloadable)) \ fnc(float3 v1, float3 v2, int3 *v3); \ -_RS_STATIC float4 __attribute__((overloadable)) \ +_RS_RUNTIME float4 __attribute__((overloadable)) \ fnc(float4 v1, float4 v2, int4 *v3); @@ -97,7 +97,7 @@ FN_FUNC_FN(acos) extern float __attribute__((overloadable)) acosh(float); FN_FUNC_FN(acosh) -_RS_STATIC float __attribute__((overloadable)) acospi(float v); +_RS_RUNTIME float __attribute__((overloadable)) acospi(float v); FN_FUNC_FN(acospi) @@ -109,7 +109,7 @@ extern float __attribute__((overloadable)) asinh(float); FN_FUNC_FN(asinh) -_RS_STATIC float __attribute__((overloadable)) asinpi(float v); +_RS_RUNTIME float __attribute__((overloadable)) asinpi(float v); FN_FUNC_FN(asinpi) extern float __attribute__((overloadable)) atan(float); @@ -122,11 +122,11 @@ extern float __attribute__((overloadable)) atanh(float); FN_FUNC_FN(atanh) -_RS_STATIC float __attribute__((overloadable)) atanpi(float v); +_RS_RUNTIME float __attribute__((overloadable)) atanpi(float v); FN_FUNC_FN(atanpi) -_RS_STATIC float __attribute__((overloadable)) atan2pi(float y, float x); +_RS_RUNTIME float __attribute__((overloadable)) atan2pi(float y, float x); FN_FUNC_FN_FN(atan2pi) extern float __attribute__((overloadable)) cbrt(float); @@ -145,7 +145,7 @@ extern float __attribute__((overloadable)) cosh(float); FN_FUNC_FN(cosh) -_RS_STATIC float __attribute__((overloadable)) cospi(float v); +_RS_RUNTIME float __attribute__((overloadable)) cospi(float v); FN_FUNC_FN(cospi) extern float __attribute__((overloadable)) erfc(float); @@ -162,7 +162,7 @@ FN_FUNC_FN(exp2) extern float __attribute__((overloadable)) pow(float, float); -_RS_STATIC float __attribute__((overloadable)) exp10(float v); +_RS_RUNTIME float __attribute__((overloadable)) exp10(float v); FN_FUNC_FN(exp10) extern float __attribute__((overloadable)) expm1(float); @@ -192,7 +192,7 @@ extern float __attribute__((overloadable)) fmod(float, float); FN_FUNC_FN_FN(fmod) -_RS_STATIC float __attribute__((overloadable)) fract(float v, float *iptr); +_RS_RUNTIME float __attribute__((overloadable)) fract(float v, float *iptr); FN_FUNC_FN_PFN(fract) extern float __attribute__((overloadable)) frexp(float, int *); @@ -221,7 +221,7 @@ extern float __attribute__((overloadable)) log10(float); FN_FUNC_FN(log10) -_RS_STATIC float __attribute__((overloadable)) log2(float v); +_RS_RUNTIME float __attribute__((overloadable)) log2(float v); FN_FUNC_FN(log2) extern float __attribute__((overloadable)) log1p(float); @@ -243,15 +243,15 @@ FN_FUNC_FN_FN(nextafter) FN_FUNC_FN_FN(pow) -_RS_STATIC float __attribute__((overloadable)) pown(float v, int p); -_RS_STATIC float2 __attribute__((overloadable)) pown(float2 v, int2 p); -_RS_STATIC float3 __attribute__((overloadable)) pown(float3 v, int3 p); -_RS_STATIC float4 __attribute__((overloadable)) pown(float4 v, int4 p); +_RS_RUNTIME float __attribute__((overloadable)) pown(float v, int p); +_RS_RUNTIME float2 __attribute__((overloadable)) pown(float2 v, int2 p); +_RS_RUNTIME float3 __attribute__((overloadable)) pown(float3 v, int3 p); +_RS_RUNTIME float4 __attribute__((overloadable)) pown(float4 v, int4 p); -_RS_STATIC float __attribute__((overloadable)) powr(float v, float p); -_RS_STATIC float2 __attribute__((overloadable)) powr(float2 v, float2 p); -_RS_STATIC float3 __attribute__((overloadable)) powr(float3 v, float3 p); -_RS_STATIC float4 __attribute__((overloadable)) powr(float4 v, float4 p); +_RS_RUNTIME float __attribute__((overloadable)) powr(float v, float p); +_RS_RUNTIME float2 __attribute__((overloadable)) powr(float2 v, float2 p); +_RS_RUNTIME float3 __attribute__((overloadable)) powr(float3 v, float3 p); +_RS_RUNTIME float4 __attribute__((overloadable)) powr(float4 v, float4 p); extern float __attribute__((overloadable)) remainder(float, float); FN_FUNC_FN_FN(remainder) @@ -263,10 +263,10 @@ extern float __attribute__((overloadable)) rint(float); FN_FUNC_FN(rint) -_RS_STATIC float __attribute__((overloadable)) rootn(float v, int r); -_RS_STATIC float2 __attribute__((overloadable)) rootn(float2 v, int2 r); -_RS_STATIC float3 __attribute__((overloadable)) rootn(float3 v, int3 r); -_RS_STATIC float4 __attribute__((overloadable)) rootn(float4 v, int4 r); +_RS_RUNTIME float __attribute__((overloadable)) rootn(float v, int r); +_RS_RUNTIME float2 __attribute__((overloadable)) rootn(float2 v, int2 r); +_RS_RUNTIME float3 __attribute__((overloadable)) rootn(float3 v, int3 r); +_RS_RUNTIME float4 __attribute__((overloadable)) rootn(float4 v, int4 r); extern float __attribute__((overloadable)) round(float); @@ -274,21 +274,21 @@ FN_FUNC_FN(round) extern float __attribute__((overloadable)) sqrt(float); -_RS_STATIC float __attribute__((overloadable)) rsqrt(float v); +_RS_RUNTIME float __attribute__((overloadable)) rsqrt(float v); FN_FUNC_FN(rsqrt) extern float __attribute__((overloadable)) sin(float); FN_FUNC_FN(sin) -_RS_STATIC float __attribute__((overloadable)) sincos(float v, float *cosptr); -_RS_STATIC float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr); -_RS_STATIC float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr); -_RS_STATIC float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr); +_RS_RUNTIME float __attribute__((overloadable)) sincos(float v, float *cosptr); +_RS_RUNTIME float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr); +_RS_RUNTIME float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr); +_RS_RUNTIME float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr); extern float __attribute__((overloadable)) sinh(float); FN_FUNC_FN(sinh) -_RS_STATIC float __attribute__((overloadable)) sinpi(float v); +_RS_RUNTIME float __attribute__((overloadable)) sinpi(float v); FN_FUNC_FN(sinpi) FN_FUNC_FN(sqrt) @@ -299,7 +299,7 @@ FN_FUNC_FN(tan) extern float __attribute__((overloadable)) tanh(float); FN_FUNC_FN(tanh) -_RS_STATIC float __attribute__((overloadable)) tanpi(float v); +_RS_RUNTIME float __attribute__((overloadable)) tanpi(float v); FN_FUNC_FN(tanpi) @@ -313,9 +313,9 @@ FN_FUNC_FN(trunc) #define XN_FUNC_YN(typeout, fnc, typein) \ extern typeout __attribute__((overloadable)) fnc(typein); \ -_RS_STATIC typeout##2 __attribute__((overloadable)) fnc(typein##2 v); \ -_RS_STATIC typeout##3 __attribute__((overloadable)) fnc(typein##3 v); \ -_RS_STATIC typeout##4 __attribute__((overloadable)) fnc(typein##4 v); +_RS_RUNTIME typeout##2 __attribute__((overloadable)) fnc(typein##2 v); \ +_RS_RUNTIME typeout##3 __attribute__((overloadable)) fnc(typein##3 v); \ +_RS_RUNTIME typeout##4 __attribute__((overloadable)) fnc(typein##4 v); #define UIN_FUNC_IN(fnc) \ XN_FUNC_YN(uchar, fnc, char) \ @@ -332,13 +332,13 @@ XN_FUNC_YN(int, fnc, int) #define XN_FUNC_XN_XN_BODY(type, fnc, body) \ -_RS_STATIC type __attribute__((overloadable)) \ +_RS_RUNTIME type __attribute__((overloadable)) \ fnc(type v1, type v2); \ -_RS_STATIC type##2 __attribute__((overloadable)) \ +_RS_RUNTIME type##2 __attribute__((overloadable)) \ fnc(type##2 v1, type##2 v2); \ -_RS_STATIC type##3 __attribute__((overloadable)) \ +_RS_RUNTIME type##3 __attribute__((overloadable)) \ fnc(type##3 v1, type##3 v2); \ -_RS_STATIC type##4 __attribute__((overloadable)) \ +_RS_RUNTIME type##4 __attribute__((overloadable)) \ fnc(type##4 v1, type##4 v2); #define IN_FUNC_IN_IN_BODY(fnc, body) \ @@ -361,35 +361,35 @@ FN_FUNC_FN_F(max) // 6.11.4 -_RS_STATIC float __attribute__((overloadable)) clamp(float amount, float low, float high); -_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high); -_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high); -_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high); -_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high); -_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high); -_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high); +_RS_RUNTIME float __attribute__((overloadable)) clamp(float amount, float low, float high); +_RS_RUNTIME float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high); +_RS_RUNTIME float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high); +_RS_RUNTIME float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high); +_RS_RUNTIME float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high); +_RS_RUNTIME float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high); +_RS_RUNTIME float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high); -_RS_STATIC float __attribute__((overloadable)) degrees(float radians); +_RS_RUNTIME float __attribute__((overloadable)) degrees(float radians); FN_FUNC_FN(degrees) -_RS_STATIC float __attribute__((overloadable)) mix(float start, float stop, float amount); -_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount); -_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount); -_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount); -_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount); -_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount); -_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount); +_RS_RUNTIME float __attribute__((overloadable)) mix(float start, float stop, float amount); +_RS_RUNTIME float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount); +_RS_RUNTIME float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount); +_RS_RUNTIME float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount); +_RS_RUNTIME float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount); +_RS_RUNTIME float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount); +_RS_RUNTIME float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount); -_RS_STATIC float __attribute__((overloadable)) radians(float degrees); +_RS_RUNTIME float __attribute__((overloadable)) radians(float degrees); FN_FUNC_FN(radians) -_RS_STATIC float __attribute__((overloadable)) step(float edge, float v); -_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float2 v); -_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float3 v); -_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float4 v); -_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float v); -_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float v); -_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float v); +_RS_RUNTIME float __attribute__((overloadable)) step(float edge, float v); +_RS_RUNTIME float2 __attribute__((overloadable)) step(float2 edge, float2 v); +_RS_RUNTIME float3 __attribute__((overloadable)) step(float3 edge, float3 v); +_RS_RUNTIME float4 __attribute__((overloadable)) step(float4 edge, float4 v); +_RS_RUNTIME float2 __attribute__((overloadable)) step(float2 edge, float v); +_RS_RUNTIME float3 __attribute__((overloadable)) step(float3 edge, float v); +_RS_RUNTIME float4 __attribute__((overloadable)) step(float4 edge, float v); extern float __attribute__((overloadable)) smoothstep(float, float, float); extern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2); @@ -399,33 +399,33 @@ extern float2 __attribute__((overloadable)) smoothstep(float, float, float2); extern float3 __attribute__((overloadable)) smoothstep(float, float, float3); extern float4 __attribute__((overloadable)) smoothstep(float, float, float4); -_RS_STATIC float __attribute__((overloadable)) sign(float v); +_RS_RUNTIME float __attribute__((overloadable)) sign(float v); FN_FUNC_FN(sign) // 6.11.5 -_RS_STATIC float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs); +_RS_RUNTIME float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs); -_RS_STATIC float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs); +_RS_RUNTIME float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs); -_RS_STATIC float __attribute__((overloadable)) dot(float lhs, float rhs); -_RS_STATIC float __attribute__((overloadable)) dot(float2 lhs, float2 rhs); -_RS_STATIC float __attribute__((overloadable)) dot(float3 lhs, float3 rhs); -_RS_STATIC float __attribute__((overloadable)) dot(float4 lhs, float4 rhs); +_RS_RUNTIME float __attribute__((overloadable)) dot(float lhs, float rhs); +_RS_RUNTIME float __attribute__((overloadable)) dot(float2 lhs, float2 rhs); +_RS_RUNTIME float __attribute__((overloadable)) dot(float3 lhs, float3 rhs); +_RS_RUNTIME float __attribute__((overloadable)) dot(float4 lhs, float4 rhs); -_RS_STATIC float __attribute__((overloadable)) length(float v); -_RS_STATIC float __attribute__((overloadable)) length(float2 v); -_RS_STATIC float __attribute__((overloadable)) length(float3 v); -_RS_STATIC float __attribute__((overloadable)) length(float4 v); +_RS_RUNTIME float __attribute__((overloadable)) length(float v); +_RS_RUNTIME float __attribute__((overloadable)) length(float2 v); +_RS_RUNTIME float __attribute__((overloadable)) length(float3 v); +_RS_RUNTIME float __attribute__((overloadable)) length(float4 v); -_RS_STATIC float __attribute__((overloadable)) distance(float lhs, float rhs); -_RS_STATIC float __attribute__((overloadable)) distance(float2 lhs, float2 rhs); -_RS_STATIC float __attribute__((overloadable)) distance(float3 lhs, float3 rhs); -_RS_STATIC float __attribute__((overloadable)) distance(float4 lhs, float4 rhs); +_RS_RUNTIME float __attribute__((overloadable)) distance(float lhs, float rhs); +_RS_RUNTIME float __attribute__((overloadable)) distance(float2 lhs, float2 rhs); +_RS_RUNTIME float __attribute__((overloadable)) distance(float3 lhs, float3 rhs); +_RS_RUNTIME float __attribute__((overloadable)) distance(float4 lhs, float4 rhs); -_RS_STATIC float __attribute__((overloadable)) normalize(float v); -_RS_STATIC float2 __attribute__((overloadable)) normalize(float2 v); -_RS_STATIC float3 __attribute__((overloadable)) normalize(float3 v); -_RS_STATIC float4 __attribute__((overloadable)) normalize(float4 v); +_RS_RUNTIME float __attribute__((overloadable)) normalize(float v); +_RS_RUNTIME float2 __attribute__((overloadable)) normalize(float2 v); +_RS_RUNTIME float3 __attribute__((overloadable)) normalize(float3 v); +_RS_RUNTIME float4 __attribute__((overloadable)) normalize(float4 v); #undef CVT_FUNC #undef CVT_FUNC_2 @@ -444,6 +444,6 @@ _RS_STATIC float4 __attribute__((overloadable)) normalize(float4 v); #undef IN_FUNC_IN #undef XN_FUNC_XN_XN_BODY #undef IN_FUNC_IN_IN_BODY -#undef _RS_STATIC +#undef _RS_RUNTIME #endif diff --git a/libs/rs/scriptc/rs_core.rsh b/libs/rs/scriptc/rs_core.rsh index 21c0f7b6832a..e32d4351d99f 100644 --- a/libs/rs/scriptc/rs_core.rsh +++ b/libs/rs/scriptc/rs_core.rsh @@ -1,11 +1,7 @@ #ifndef __RS_CORE_RSH__ #define __RS_CORE_RSH__ -#ifdef BCC_PREPARE_BC -#define _RS_STATIC extern -#else -#define _RS_STATIC static -#endif +#define _RS_RUNTIME extern // Debugging, print to the LOG a description string and a value. extern void __attribute__((overloadable)) @@ -41,56 +37,19 @@ extern void __attribute__((overloadable)) #define RS_DEBUG(a) rsDebug(#a, a) #define RS_DEBUG_MARKER rsDebug(__FILE__, __LINE__) -_RS_STATIC void __attribute__((overloadable)) rsDebug(const char *s, float2 v) { - rsDebug(s, v.x, v.y); -} -_RS_STATIC void __attribute__((overloadable)) rsDebug(const char *s, float3 v) { - rsDebug(s, v.x, v.y, v.z); -} -_RS_STATIC void __attribute__((overloadable)) rsDebug(const char *s, float4 v) { - rsDebug(s, v.x, v.y, v.z, v.w); -} - -_RS_STATIC uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b) -{ - uchar4 c; - c.x = (uchar)(r * 255.f); - c.y = (uchar)(g * 255.f); - c.z = (uchar)(b * 255.f); - c.w = 255; - return c; -} - -_RS_STATIC uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a) -{ - uchar4 c; - c.x = (uchar)(r * 255.f); - c.y = (uchar)(g * 255.f); - c.z = (uchar)(b * 255.f); - c.w = (uchar)(a * 255.f); - return c; -} - -_RS_STATIC uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color) -{ - color *= 255.f; - uchar4 c = {color.x, color.y, color.z, 255}; - return c; -} - -_RS_STATIC uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color) -{ - color *= 255.f; - uchar4 c = {color.x, color.y, color.z, color.w}; - return c; -} - -_RS_STATIC float4 rsUnpackColor8888(uchar4 c) -{ - float4 ret = (float4)0.0039156862745f; - ret *= convert_float4(c); - return ret; -} +_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float2 v); +_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float3 v); +_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float4 v); + +_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b); + +_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a); + +_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color); + +_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color); + +_RS_RUNTIME float4 rsUnpackColor8888(uchar4 c); //extern uchar4 __attribute__((overloadable)) rsPackColorTo565(float r, float g, float b); //extern uchar4 __attribute__((overloadable)) rsPackColorTo565(float3); @@ -101,830 +60,117 @@ _RS_STATIC float4 rsUnpackColor8888(uchar4 c) // Matrix ops ///////////////////////////////////////////////////// -_RS_STATIC void __attribute__((overloadable)) -rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v) { - m->m[row * 4 + col] = v; -} - -_RS_STATIC float __attribute__((overloadable)) -rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col) { - return m->m[row * 4 + col]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v) { - m->m[row * 3 + col] = v; -} - -_RS_STATIC float __attribute__((overloadable)) -rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col) { - return m->m[row * 3 + col]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v) { - m->m[row * 2 + col] = v; -} - -_RS_STATIC float __attribute__((overloadable)) -rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col) { - return m->m[row * 2 + col]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadIdentity(rs_matrix4x4 *m) { - m->m[0] = 1.f; - m->m[1] = 0.f; - m->m[2] = 0.f; - m->m[3] = 0.f; - m->m[4] = 0.f; - m->m[5] = 1.f; - m->m[6] = 0.f; - m->m[7] = 0.f; - m->m[8] = 0.f; - m->m[9] = 0.f; - m->m[10] = 1.f; - m->m[11] = 0.f; - m->m[12] = 0.f; - m->m[13] = 0.f; - m->m[14] = 0.f; - m->m[15] = 1.f; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadIdentity(rs_matrix3x3 *m) { - m->m[0] = 1.f; - m->m[1] = 0.f; - m->m[2] = 0.f; - m->m[3] = 0.f; - m->m[4] = 1.f; - m->m[5] = 0.f; - m->m[6] = 0.f; - m->m[7] = 0.f; - m->m[8] = 1.f; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadIdentity(rs_matrix2x2 *m) { - m->m[0] = 1.f; - m->m[1] = 0.f; - m->m[2] = 0.f; - m->m[3] = 1.f; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoad(rs_matrix4x4 *m, const float *v) { - m->m[0] = v[0]; - m->m[1] = v[1]; - m->m[2] = v[2]; - m->m[3] = v[3]; - m->m[4] = v[4]; - m->m[5] = v[5]; - m->m[6] = v[6]; - m->m[7] = v[7]; - m->m[8] = v[8]; - m->m[9] = v[9]; - m->m[10] = v[10]; - m->m[11] = v[11]; - m->m[12] = v[12]; - m->m[13] = v[13]; - m->m[14] = v[14]; - m->m[15] = v[15]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoad(rs_matrix3x3 *m, const float *v) { - m->m[0] = v[0]; - m->m[1] = v[1]; - m->m[2] = v[2]; - m->m[3] = v[3]; - m->m[4] = v[4]; - m->m[5] = v[5]; - m->m[6] = v[6]; - m->m[7] = v[7]; - m->m[8] = v[8]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoad(rs_matrix2x2 *m, const float *v) { - m->m[0] = v[0]; - m->m[1] = v[1]; - m->m[2] = v[2]; - m->m[3] = v[3]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v) { - m->m[0] = v->m[0]; - m->m[1] = v->m[1]; - m->m[2] = v->m[2]; - m->m[3] = v->m[3]; - m->m[4] = v->m[4]; - m->m[5] = v->m[5]; - m->m[6] = v->m[6]; - m->m[7] = v->m[7]; - m->m[8] = v->m[8]; - m->m[9] = v->m[9]; - m->m[10] = v->m[10]; - m->m[11] = v->m[11]; - m->m[12] = v->m[12]; - m->m[13] = v->m[13]; - m->m[14] = v->m[14]; - m->m[15] = v->m[15]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v) { - m->m[0] = v->m[0]; - m->m[1] = v->m[1]; - m->m[2] = v->m[2]; - m->m[3] = 0.f; - m->m[4] = v->m[3]; - m->m[5] = v->m[4]; - m->m[6] = v->m[5]; - m->m[7] = 0.f; - m->m[8] = v->m[6]; - m->m[9] = v->m[7]; - m->m[10] = v->m[8]; - m->m[11] = 0.f; - m->m[12] = 0.f; - m->m[13] = 0.f; - m->m[14] = 0.f; - m->m[15] = 1.f; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v) { - m->m[0] = v->m[0]; - m->m[1] = v->m[1]; - m->m[2] = 0.f; - m->m[3] = 0.f; - m->m[4] = v->m[3]; - m->m[5] = v->m[4]; - m->m[6] = 0.f; - m->m[7] = 0.f; - m->m[8] = v->m[6]; - m->m[9] = v->m[7]; - m->m[10] = 1.f; - m->m[11] = 0.f; - m->m[12] = 0.f; - m->m[13] = 0.f; - m->m[14] = 0.f; - m->m[15] = 1.f; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v) { - m->m[0] = v->m[0]; - m->m[1] = v->m[1]; - m->m[2] = v->m[2]; - m->m[3] = v->m[3]; - m->m[4] = v->m[4]; - m->m[5] = v->m[5]; - m->m[6] = v->m[6]; - m->m[7] = v->m[7]; - m->m[8] = v->m[8]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v) { - m->m[0] = v->m[0]; - m->m[1] = v->m[1]; - m->m[2] = v->m[2]; - m->m[3] = v->m[3]; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z) { - float c, s; - m->m[3] = 0; - m->m[7] = 0; - m->m[11]= 0; - m->m[12]= 0; - m->m[13]= 0; - m->m[14]= 0; - m->m[15]= 1; - rot *= (float)(M_PI / 180.0f); - c = cos(rot); - s = sin(rot); - - const float len = x*x + y*y + z*z; - if (len != 1) { - const float recipLen = 1.f / sqrt(len); - x *= recipLen; - y *= recipLen; - z *= recipLen; - } - const float nc = 1.0f - c; - const float xy = x * y; - const float yz = y * z; - const float zx = z * x; - const float xs = x * s; - const float ys = y * s; - const float zs = z * s; - m->m[ 0] = x*x*nc + c; - m->m[ 4] = xy*nc - zs; - m->m[ 8] = zx*nc + ys; - m->m[ 1] = xy*nc + zs; - m->m[ 5] = y*y*nc + c; - m->m[ 9] = yz*nc - xs; - m->m[ 2] = zx*nc - ys; - m->m[ 6] = yz*nc + xs; - m->m[10] = z*z*nc + c; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z) { - rsMatrixLoadIdentity(m); - m->m[0] = x; - m->m[5] = y; - m->m[10] = z; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z) { - rsMatrixLoadIdentity(m); - m->m[12] = x; - m->m[13] = y; - m->m[14] = z; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) { - for (int i=0 ; i<4 ; i++) { - float ri0 = 0; - float ri1 = 0; - float ri2 = 0; - float ri3 = 0; - for (int j=0 ; j<4 ; j++) { - const float rhs_ij = rsMatrixGet(rhs, i,j); - ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; - ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; - ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij; - ri3 += rsMatrixGet(lhs, j, 3) * rhs_ij; - } - rsMatrixSet(m, i, 0, ri0); - rsMatrixSet(m, i, 1, ri1); - rsMatrixSet(m, i, 2, ri2); - rsMatrixSet(m, i, 3, ri3); - } -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs) { - rs_matrix4x4 mt; - rsMatrixLoadMultiply(&mt, m, rhs); - rsMatrixLoad(m, &mt); -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) { - for (int i=0 ; i<3 ; i++) { - float ri0 = 0; - float ri1 = 0; - float ri2 = 0; - for (int j=0 ; j<3 ; j++) { - const float rhs_ij = rsMatrixGet(rhs, i,j); - ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; - ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; - ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij; - } - rsMatrixSet(m, i, 0, ri0); - rsMatrixSet(m, i, 1, ri1); - rsMatrixSet(m, i, 2, ri2); - } -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs) { - rs_matrix3x3 mt; - rsMatrixLoadMultiply(&mt, m, rhs); - rsMatrixLoad(m, &mt); -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) { - for (int i=0 ; i<2 ; i++) { - float ri0 = 0; - float ri1 = 0; - for (int j=0 ; j<2 ; j++) { - const float rhs_ij = rsMatrixGet(rhs, i,j); - ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; - ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; - } - rsMatrixSet(m, i, 0, ri0); - rsMatrixSet(m, i, 1, ri1); - } -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs) { - rs_matrix2x2 mt; - rsMatrixLoadMultiply(&mt, m, rhs); - rsMatrixLoad(m, &mt); -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z) { - rs_matrix4x4 m1; - rsMatrixLoadRotate(&m1, rot, x, y, z); - rsMatrixMultiply(m, &m1); -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixScale(rs_matrix4x4 *m, float x, float y, float z) { - rs_matrix4x4 m1; - rsMatrixLoadScale(&m1, x, y, z); - rsMatrixMultiply(m, &m1); -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z) { - rs_matrix4x4 m1; - rsMatrixLoadTranslate(&m1, x, y, z); - rsMatrixMultiply(m, &m1); -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far) { - rsMatrixLoadIdentity(m); - m->m[0] = 2.f / (right - left); - m->m[5] = 2.f / (top - bottom); - m->m[10]= -2.f / (far - near); - m->m[12]= -(right + left) / (right - left); - m->m[13]= -(top + bottom) / (top - bottom); - m->m[14]= -(far + near) / (far - near); -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far) { - rsMatrixLoadIdentity(m); - m->m[0] = 2.f * near / (right - left); - m->m[5] = 2.f * near / (top - bottom); - m->m[8] = (right + left) / (right - left); - m->m[9] = (top + bottom) / (top - bottom); - m->m[10]= -(far + near) / (far - near); - m->m[11]= -1.f; - m->m[14]= -2.f * far * near / (far - near); - m->m[15]= 0.f; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far) { - float top = near * tan((float) (fovy * M_PI / 360.0f)); - float bottom = -top; - float left = bottom * aspect; - float right = top * aspect; - rsMatrixLoadFrustum(m, left, right, bottom, top, near, far); -} - -_RS_STATIC float4 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix4x4 *m, float4 in) { - float4 ret; - ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + (m->m[12] * in.w); - ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + (m->m[13] * in.w); - ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + (m->m[14] * in.w); - ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + (m->m[15] * in.w); - return ret; -} - -_RS_STATIC float4 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix4x4 *m, float3 in) { - float4 ret; - ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + m->m[12]; - ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + m->m[13]; - ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + m->m[14]; - ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + m->m[15]; - return ret; -} - -_RS_STATIC float4 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix4x4 *m, float2 in) { - float4 ret; - ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + m->m[12]; - ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + m->m[13]; - ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + m->m[14]; - ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + m->m[15]; - return ret; -} - -_RS_STATIC float3 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix3x3 *m, float3 in) { - float3 ret; - ret.x = (m->m[0] * in.x) + (m->m[3] * in.y) + (m->m[6] * in.z); - ret.y = (m->m[1] * in.x) + (m->m[4] * in.y) + (m->m[7] * in.z); - ret.z = (m->m[2] * in.x) + (m->m[5] * in.y) + (m->m[8] * in.z); - return ret; -} - -_RS_STATIC float3 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix3x3 *m, float2 in) { - float3 ret; - ret.x = (m->m[0] * in.x) + (m->m[3] * in.y); - ret.y = (m->m[1] * in.x) + (m->m[4] * in.y); - ret.z = (m->m[2] * in.x) + (m->m[5] * in.y); - return ret; -} - -_RS_STATIC float2 __attribute__((overloadable)) -rsMatrixMultiply(rs_matrix2x2 *m, float2 in) { - float2 ret; - ret.x = (m->m[0] * in.x) + (m->m[2] * in.y); - ret.y = (m->m[1] * in.x) + (m->m[3] * in.y); - return ret; -} +_RS_RUNTIME void __attribute__((overloadable)) +rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v); -// Returns true if the matrix was successfully inversed -_RS_STATIC bool __attribute__((overloadable)) -rsMatrixInverse(rs_matrix4x4 *m) { - rs_matrix4x4 result; - - int i, j; - for (i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) { - // computeCofactor for int i, int j - int c0 = (i+1) % 4; - int c1 = (i+2) % 4; - int c2 = (i+3) % 4; - int r0 = (j+1) % 4; - int r1 = (j+2) % 4; - int r2 = (j+3) % 4; - - float minor = (m->m[c0 + 4*r0] * (m->m[c1 + 4*r1] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r1])) - - (m->m[c0 + 4*r1] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r0])) - + (m->m[c0 + 4*r2] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r1] - m->m[c1 + 4*r1] * m->m[c2 + 4*r0])); - - float cofactor = (i+j) & 1 ? -minor : minor; - - result.m[4*i + j] = cofactor; - } - } - - // Dot product of 0th column of source and 0th row of result - float det = m->m[0]*result.m[0] + m->m[4]*result.m[1] + - m->m[8]*result.m[2] + m->m[12]*result.m[3]; - - if (fabs(det) < 1e-6) { - return false; - } - - det = 1.0f / det; - for (i = 0; i < 16; ++i) { - m->m[i] = result.m[i] * det; - } - - return true; -} +_RS_RUNTIME float __attribute__((overloadable)) +rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col); -// Returns true if the matrix was successfully inversed -_RS_STATIC bool __attribute__((overloadable)) -rsMatrixInverseTranspose(rs_matrix4x4 *m) { - rs_matrix4x4 result; - - int i, j; - for (i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) { - // computeCofactor for int i, int j - int c0 = (i+1) % 4; - int c1 = (i+2) % 4; - int c2 = (i+3) % 4; - int r0 = (j+1) % 4; - int r1 = (j+2) % 4; - int r2 = (j+3) % 4; - - float minor = (m->m[c0 + 4*r0] * (m->m[c1 + 4*r1] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r1])) - - (m->m[c0 + 4*r1] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r0])) - + (m->m[c0 + 4*r2] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r1] - m->m[c1 + 4*r1] * m->m[c2 + 4*r0])); - - float cofactor = (i+j) & 1 ? -minor : minor; - - result.m[4*j + i] = cofactor; - } - } - - // Dot product of 0th column of source and 0th column of result - float det = m->m[0]*result.m[0] + m->m[4]*result.m[4] + - m->m[8]*result.m[8] + m->m[12]*result.m[12]; - - if (fabs(det) < 1e-6) { - return false; - } - - det = 1.0f / det; - for (i = 0; i < 16; ++i) { - m->m[i] = result.m[i] * det; - } - - return true; -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixTranspose(rs_matrix4x4 *m) { - int i, j; - float temp; - for (i = 0; i < 3; ++i) { - for (j = i + 1; j < 4; ++j) { - temp = m->m[i*4 + j]; - m->m[i*4 + j] = m->m[j*4 + i]; - m->m[j*4 + i] = temp; - } - } -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixTranspose(rs_matrix3x3 *m) { - int i, j; - float temp; - for (i = 0; i < 2; ++i) { - for (j = i + 1; j < 3; ++j) { - temp = m->m[i*3 + j]; - m->m[i*3 + j] = m->m[j*4 + i]; - m->m[j*3 + i] = temp; - } - } -} - -_RS_STATIC void __attribute__((overloadable)) -rsMatrixTranspose(rs_matrix2x2 *m) { - float temp = m->m[1]; - m->m[1] = m->m[2]; - m->m[2] = temp; -} +_RS_RUNTIME void __attribute__((overloadable)) +rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v); -///////////////////////////////////////////////////// -// quaternion ops -///////////////////////////////////////////////////// +_RS_RUNTIME float __attribute__((overloadable)) +rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col); -_RS_STATIC void __attribute__((overloadable)) -rsQuaternionSet(rs_quaternion *q, float w, float x, float y, float z) { - q->w = w; - q->x = x; - q->y = y; - q->z = z; -} - -_RS_STATIC void __attribute__((overloadable)) -rsQuaternionSet(rs_quaternion *q, const rs_quaternion *rhs) { - q->w = rhs->w; - q->x = rhs->x; - q->y = rhs->y; - q->z = rhs->z; -} - -_RS_STATIC void __attribute__((overloadable)) -rsQuaternionMultiply(rs_quaternion *q, float s) { - q->w *= s; - q->x *= s; - q->y *= s; - q->z *= s; -} - -_RS_STATIC void __attribute__((overloadable)) -rsQuaternionMultiply(rs_quaternion *q, const rs_quaternion *rhs) { - q->w = -q->x*rhs->x - q->y*rhs->y - q->z*rhs->z + q->w*rhs->w; - q->x = q->x*rhs->w + q->y*rhs->z - q->z*rhs->y + q->w*rhs->x; - q->y = -q->x*rhs->z + q->y*rhs->w + q->z*rhs->x + q->w*rhs->y; - q->z = q->x*rhs->y - q->y*rhs->x + q->z*rhs->w + q->w*rhs->z; -} - -_RS_STATIC void -rsQuaternionAdd(rs_quaternion *q, const rs_quaternion *rhs) { - q->w *= rhs->w; - q->x *= rhs->x; - q->y *= rhs->y; - q->z *= rhs->z; -} - -_RS_STATIC void -rsQuaternionLoadRotateUnit(rs_quaternion *q, float rot, float x, float y, float z) { - rot *= (float)(M_PI / 180.0f) * 0.5f; - float c = cos(rot); - float s = sin(rot); - - q->w = c; - q->x = x * s; - q->y = y * s; - q->z = z * s; -} - -_RS_STATIC void -rsQuaternionLoadRotate(rs_quaternion *q, float rot, float x, float y, float z) { - const float len = x*x + y*y + z*z; - if (len != 1) { - const float recipLen = 1.f / sqrt(len); - x *= recipLen; - y *= recipLen; - z *= recipLen; - } - rsQuaternionLoadRotateUnit(q, rot, x, y, z); -} - -_RS_STATIC void -rsQuaternionConjugate(rs_quaternion *q) { - q->x = -q->x; - q->y = -q->y; - q->z = -q->z; -} - -_RS_STATIC float -rsQuaternionDot(const rs_quaternion *q0, const rs_quaternion *q1) { - return q0->w*q1->w + q0->x*q1->x + q0->y*q1->y + q0->z*q1->z; -} - -_RS_STATIC void -rsQuaternionNormalize(rs_quaternion *q) { - const float len = rsQuaternionDot(q, q); - if (len != 1) { - const float recipLen = 1.f / sqrt(len); - rsQuaternionMultiply(q, recipLen); - } -} - -_RS_STATIC void -rsQuaternionSlerp(rs_quaternion *q, const rs_quaternion *q0, const rs_quaternion *q1, float t) { - if (t <= 0.0f) { - rsQuaternionSet(q, q0); - return; - } - if (t >= 1.0f) { - rsQuaternionSet(q, q1); - return; - } - - rs_quaternion tempq0, tempq1; - rsQuaternionSet(&tempq0, q0); - rsQuaternionSet(&tempq1, q1); - - float angle = rsQuaternionDot(q0, q1); - if (angle < 0) { - rsQuaternionMultiply(&tempq0, -1.0f); - angle *= -1.0f; - } - - float scale, invScale; - if (angle + 1.0f > 0.05f) { - if (1.0f - angle >= 0.05f) { - float theta = acos(angle); - float invSinTheta = 1.0f / sin(theta); - scale = sin(theta * (1.0f - t)) * invSinTheta; - invScale = sin(theta * t) * invSinTheta; - } else { - scale = 1.0f - t; - invScale = t; - } - } else { - rsQuaternionSet(&tempq1, tempq0.z, -tempq0.y, tempq0.x, -tempq0.w); - scale = sin(M_PI * (0.5f - t)); - invScale = sin(M_PI * t); - } - - rsQuaternionSet(q, tempq0.w*scale + tempq1.w*invScale, tempq0.x*scale + tempq1.x*invScale, - tempq0.y*scale + tempq1.y*invScale, tempq0.z*scale + tempq1.z*invScale); -} - -_RS_STATIC void rsQuaternionGetMatrixUnit(rs_matrix4x4 *m, const rs_quaternion *q) { - float x2 = 2.0f * q->x * q->x; - float y2 = 2.0f * q->y * q->y; - float z2 = 2.0f * q->z * q->z; - float xy = 2.0f * q->x * q->y; - float wz = 2.0f * q->w * q->z; - float xz = 2.0f * q->x * q->z; - float wy = 2.0f * q->w * q->y; - float wx = 2.0f * q->w * q->x; - float yz = 2.0f * q->y * q->z; - - m->m[0] = 1.0f - y2 - z2; - m->m[1] = xy - wz; - m->m[2] = xz + wy; - m->m[3] = 0.0f; - - m->m[4] = xy + wz; - m->m[5] = 1.0f - x2 - z2; - m->m[6] = yz - wx; - m->m[7] = 0.0f; - - m->m[8] = xz - wy; - m->m[9] = yz - wx; - m->m[10] = 1.0f - x2 - y2; - m->m[11] = 0.0f; - - m->m[12] = 0.0f; - m->m[13] = 0.0f; - m->m[14] = 0.0f; - m->m[15] = 1.0f; -} +_RS_RUNTIME void __attribute__((overloadable)) +rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v); -///////////////////////////////////////////////////// -// utility funcs -///////////////////////////////////////////////////// -__inline__ _RS_STATIC void __attribute__((overloadable, always_inline)) -rsExtractFrustumPlanes(const rs_matrix4x4 *modelViewProj, - float4 *left, float4 *right, - float4 *top, float4 *bottom, - float4 *near, float4 *far) { - // x y z w = a b c d in the plane equation - left->x = modelViewProj->m[3] + modelViewProj->m[0]; - left->y = modelViewProj->m[7] + modelViewProj->m[4]; - left->z = modelViewProj->m[11] + modelViewProj->m[8]; - left->w = modelViewProj->m[15] + modelViewProj->m[12]; - - right->x = modelViewProj->m[3] - modelViewProj->m[0]; - right->y = modelViewProj->m[7] - modelViewProj->m[4]; - right->z = modelViewProj->m[11] - modelViewProj->m[8]; - right->w = modelViewProj->m[15] - modelViewProj->m[12]; - - top->x = modelViewProj->m[3] - modelViewProj->m[1]; - top->y = modelViewProj->m[7] - modelViewProj->m[5]; - top->z = modelViewProj->m[11] - modelViewProj->m[9]; - top->w = modelViewProj->m[15] - modelViewProj->m[13]; - - bottom->x = modelViewProj->m[3] + modelViewProj->m[1]; - bottom->y = modelViewProj->m[7] + modelViewProj->m[5]; - bottom->z = modelViewProj->m[11] + modelViewProj->m[9]; - bottom->w = modelViewProj->m[15] + modelViewProj->m[13]; - - near->x = modelViewProj->m[3] + modelViewProj->m[2]; - near->y = modelViewProj->m[7] + modelViewProj->m[6]; - near->z = modelViewProj->m[11] + modelViewProj->m[10]; - near->w = modelViewProj->m[15] + modelViewProj->m[14]; - - far->x = modelViewProj->m[3] - modelViewProj->m[2]; - far->y = modelViewProj->m[7] - modelViewProj->m[6]; - far->z = modelViewProj->m[11] - modelViewProj->m[10]; - far->w = modelViewProj->m[15] - modelViewProj->m[14]; - - float len = length(left->xyz); - *left /= len; - len = length(right->xyz); - *right /= len; - len = length(top->xyz); - *top /= len; - len = length(bottom->xyz); - *bottom /= len; - len = length(near->xyz); - *near /= len; - len = length(far->xyz); - *far /= len; -} - -__inline__ _RS_STATIC bool __attribute__((overloadable, always_inline)) -rsIsSphereInFrustum(float4 *sphere, - float4 *left, float4 *right, - float4 *top, float4 *bottom, - float4 *near, float4 *far) { - - float distToCenter = dot(left->xyz, sphere->xyz) + left->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(right->xyz, sphere->xyz) + right->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(top->xyz, sphere->xyz) + top->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(near->xyz, sphere->xyz) + near->w; - if (distToCenter < -sphere->w) { - return false; - } - distToCenter = dot(far->xyz, sphere->xyz) + far->w; - if (distToCenter < -sphere->w) { - return false; - } - return true; -} +_RS_RUNTIME float __attribute__((overloadable)) +rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col); + +extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m); +extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m); +extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m); +extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v); +extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v); +extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v); +extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v); +extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v); +extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v); +extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v); +extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v); + +extern void __attribute__((overloadable)) +rsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); + +extern void __attribute__((overloadable)) +rsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z); + +extern void __attribute__((overloadable)) +rsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z); + +extern void __attribute__((overloadable)) +rsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs); + +extern void __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs); + +extern void __attribute__((overloadable)) +rsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs); + +extern void __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs); + +extern void __attribute__((overloadable)) +rsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs); + +extern void __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs); + +extern void __attribute__((overloadable)) +rsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); + +extern void __attribute__((overloadable)) +rsMatrixScale(rs_matrix4x4 *m, float x, float y, float z); + +extern void __attribute__((overloadable)) +rsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z); + +extern void __attribute__((overloadable)) +rsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far); +extern void __attribute__((overloadable)) +rsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far); + +extern void __attribute__((overloadable)) +rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far); + +_RS_RUNTIME float4 __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix4x4 *m, float4 in); + +_RS_RUNTIME float4 __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix4x4 *m, float3 in); + +_RS_RUNTIME float4 __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix4x4 *m, float2 in); + +_RS_RUNTIME float3 __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix3x3 *m, float3 in); + +_RS_RUNTIME float3 __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix3x3 *m, float2 in); + +_RS_RUNTIME float2 __attribute__((overloadable)) +rsMatrixMultiply(rs_matrix2x2 *m, float2 in); + +// Returns true if the matrix was successfully inversed +extern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m); +extern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m); +extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m); +extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m); +extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m); ///////////////////////////////////////////////////// // int ops ///////////////////////////////////////////////////// -__inline__ _RS_STATIC uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high) { - return amount < low ? low : (amount > high ? high : amount); -} -__inline__ _RS_STATIC int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high) { - return amount < low ? low : (amount > high ? high : amount); -} -__inline__ _RS_STATIC ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high) { - return amount < low ? low : (amount > high ? high : amount); -} -__inline__ _RS_STATIC short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high) { - return amount < low ? low : (amount > high ? high : amount); -} -__inline__ _RS_STATIC uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high) { - return amount < low ? low : (amount > high ? high : amount); -} -__inline__ _RS_STATIC char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high) { - return amount < low ? low : (amount > high ? high : amount); -} - -#undef _RS_STATIC +_RS_RUNTIME uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high); +_RS_RUNTIME int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high); +_RS_RUNTIME ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high); +_RS_RUNTIME short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high); +_RS_RUNTIME uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high); +_RS_RUNTIME char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high); -#endif +#undef _RS_RUNTIME +#endif diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp index bbf50934df92..73ff2302d917 100644 --- a/libs/utils/ResourceTypes.cpp +++ b/libs/utils/ResourceTypes.cpp @@ -3703,9 +3703,9 @@ void ResTable::getConfigurations(Vector<ResTable_config>* configs) const void ResTable::getLocales(Vector<String8>* locales) const { Vector<ResTable_config> configs; - LOGD("calling getConfigurations"); + LOGV("calling getConfigurations"); getConfigurations(&configs); - LOGD("called getConfigurations size=%d", (int)configs.size()); + LOGV("called getConfigurations size=%d", (int)configs.size()); const size_t I = configs.size(); for (size_t i=0; i<I; i++) { char locale[6]; diff --git a/location/java/android/location/package.html b/location/java/android/location/package.html index bbaeb42f8f67..be3477476311 100644 --- a/location/java/android/location/package.html +++ b/location/java/android/location/package.html @@ -1,12 +1,11 @@ <html> -<head> -<script type="text/javascript" src="http://www.corp.google.com/style/prettify.js"></script> -<script src="http://www.corp.google.com/eng/techpubs/include/navbar.js" type="text/javascript"></script> -</head> <body> -<p>Classes defining Android location-based and related services.</p> +<p>Contains classes that define Android location-based and related services.</p> +<p>For more information about location services, see the documentation for <a +href="{@docRoot}guide/topics/location/obtaining-user-location.html">Obtaining User Location</a>.</p> +{@more} </body> </html> diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 7312d75707dd..cbc7529803a4 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -1450,7 +1450,7 @@ public class AudioService extends IAudioService.Stub { if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION) == AudioSystem.FORCE_BT_SCO) { // Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO..."); return AudioSystem.STREAM_BLUETOOTH_SCO; - } else if (isOffhook || AudioSystem.isStreamActive(AudioSystem.STREAM_VOICE_CALL)) { + } else if (isOffhook || getMode() == AudioManager.MODE_IN_COMMUNICATION) { // Log.v(TAG, "getActiveStreamType: Forcing STREAM_VOICE_CALL..."); return AudioSystem.STREAM_VOICE_CALL; } else if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC)) { diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java index f10f5e80aed5..f438be8d27ee 100755..100644 --- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java +++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java @@ -24,15 +24,16 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; import android.media.videoeditor.VideoEditor.ExportProgressListener; import android.media.videoeditor.VideoEditor.PreviewProgressListener; import android.media.videoeditor.VideoEditor.MediaProcessingProgressListener; import android.util.Log; import android.util.Pair; import android.view.Surface; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Rect; /** *This class provide Native methods to be used by MediaArtist {@hide} @@ -70,11 +71,17 @@ class MediaArtistNativeHelper { private boolean mExportDone = false; private int mProgressToApp; + /** * The resize paint */ private static final Paint sResizePaint = new Paint(Paint.FILTER_BITMAP_FLAG); + private String mRenderPreviewOverlayFile; + private int mRenderPreviewRenderingMode; + + private boolean mIsFirstProgress; + public static final int TASK_LOADING_SETTINGS = 1; public static final int TASK_ENCODING = 2; @@ -1899,12 +1906,35 @@ class MediaArtistNativeHelper { } @SuppressWarnings("unused") - private void onPreviewProgressUpdate(int progress, boolean isFinished) { + private void onPreviewProgressUpdate(int progress, boolean isFinished, + boolean updateOverlay, String filename, int renderingMode) { if (mPreviewProgressListener != null) { - mPreviewProgressListener.onProgress(mVideoEditor, progress, isFinished); + if (mIsFirstProgress) { + mPreviewProgressListener.onStart(mVideoEditor); + mIsFirstProgress = false; + } + + final VideoEditor.OverlayData overlayData; + if (updateOverlay) { + overlayData = new VideoEditor.OverlayData(); + if (filename != null) { + overlayData.set(BitmapFactory.decodeFile(filename), renderingMode); + } else { + overlayData.setClear(); + } + } else { + overlayData = null; + } + + mPreviewProgressListener.onProgress(mVideoEditor, progress, overlayData); + if (progress != 0) { mPreviewProgress = progress; } + + if (isFinished) { + mPreviewProgressListener.onStop(mVideoEditor); + } } } @@ -2075,7 +2105,6 @@ class MediaArtistNativeHelper { //For image get the scaled height. Aspect ratio would remain the same mediaItemHeight = ((MediaImageItem)overlay.getMediaItem()).getScaledHeight(); aspectRatio = overlay.getMediaItem().getAspectRatio(); - effectSettings.framingResize = false; //since the image can be of odd size. } } else { aspectRatio = overlay.getMediaItem().getAspectRatio(); @@ -2894,6 +2923,7 @@ class MediaArtistNativeHelper { maxHeight = populateMediaItemProperties(lMediaItem, previewIndex, maxHeight); + /* Get the clip properties of the media item. */ if (lMediaItem instanceof MediaImageItem) { int tmpCnt = 0; @@ -3014,11 +3044,11 @@ class MediaArtistNativeHelper { * @param callbackAfterFrameCount INdicated after how many frames * the callback is needed * @param listener The PreviewProgressListener - * */ public void doPreview(Surface surface, long fromMs, long toMs, boolean loop, int callbackAfterFrameCount, PreviewProgressListener listener) { mPreviewProgress = fromMs; + mIsFirstProgress = true; mPreviewProgressListener = listener; if (!mInvalidatePreviewArray) { @@ -3042,9 +3072,6 @@ class MediaArtistNativeHelper { Log.e("MediaArtistNativeHelper", "Runtime exception in nativeStartPreview"); throw ex; } - - } else { - return; } } @@ -3064,22 +3091,37 @@ class MediaArtistNativeHelper { * @param time The time in ms at which the frame has to be rendered * @param surfaceWidth The surface width * @param surfaceHeight The surface height + * @param overlayData The overlay data * * @return The actual time from the story board at which the frame was extracted * and rendered */ public long renderPreviewFrame(Surface surface, long time, int surfaceWidth, - int surfaceHeight) { + int surfaceHeight, VideoEditor.OverlayData overlayData) { long timeMs = 0; if (!mInvalidatePreviewArray) { try { - for (int clipCnt = 0; clipCnt < mPreviewEditSettings.clipSettingsArray.length; clipCnt++) { + for (int clipCnt = 0; + clipCnt < mPreviewEditSettings.clipSettingsArray.length; + clipCnt++) { + if (mPreviewEditSettings.clipSettingsArray[clipCnt].fileType == FileType.JPG) { - mPreviewEditSettings.clipSettingsArray[clipCnt].clipPath = mPreviewEditSettings.clipSettingsArray[clipCnt].clipDecodedPath; + mPreviewEditSettings.clipSettingsArray[clipCnt].clipPath = + mPreviewEditSettings.clipSettingsArray[clipCnt].clipDecodedPath; } } + + // Reset the render preview frame params that shall be set by native. + mRenderPreviewOverlayFile = null; + mRenderPreviewRenderingMode = MediaRendering.RESIZING; nativePopulateSettings(mPreviewEditSettings, mClipProperties, mAudioSettings); timeMs = (long)nativeRenderPreviewFrame(surface, time, surfaceWidth, surfaceHeight); + + if (mRenderPreviewOverlayFile != null) { + overlayData.set(BitmapFactory.decodeFile(mRenderPreviewOverlayFile), mRenderPreviewRenderingMode); + } else { + overlayData.setClear(); + } } catch (IllegalArgumentException ex) { Log.e("MediaArtistNativeHelper", "Illegal Argument exception in nativeRenderPreviewFrame"); @@ -3094,11 +3136,16 @@ class MediaArtistNativeHelper { } return timeMs; } else { - throw new RuntimeException("Call generate preview first"); } } + private void previewFrameEditInfo(String filename, int renderingMode) { + mRenderPreviewOverlayFile = filename; + mRenderPreviewRenderingMode = renderingMode; + } + + /** * This function is responsible for rendering a single frame * from a single media item on the surface @@ -3551,7 +3598,6 @@ class MediaArtistNativeHelper { int outBitrate = 0; mExportFilename = filePath; previewStoryBoard(mediaItemsList, mediaTransitionList, mediaBGMList,null); - mExportProgressListener = listener; mProgressToApp = 0; @@ -3678,7 +3724,6 @@ class MediaArtistNativeHelper { int outBitrate = 0; mExportFilename = filePath; previewStoryBoard(mediaItemsList, mediaTransitionList, mediaBGMList,null); - mExportProgressListener = listener; mProgressToApp = 0; @@ -4003,6 +4048,7 @@ class MediaArtistNativeHelper { public void clearPreviewSurface(Surface surface) { nativeClearSurface(surface); } + /** Native Methods */ native Properties getMediaProperties(String file) throws IllegalArgumentException, IllegalStateException, RuntimeException, Exception; diff --git a/media/java/android/media/videoeditor/MediaImageItem.java b/media/java/android/media/videoeditor/MediaImageItem.java index a977b8ed63ca..f1315c042b55 100755 --- a/media/java/android/media/videoeditor/MediaImageItem.java +++ b/media/java/android/media/videoeditor/MediaImageItem.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 The Android Open Source Project + * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,6 +71,7 @@ public class MediaImageItem extends MediaItem { private String mDecodedFilename; private int mGeneratedClipHeight; private int mGeneratedClipWidth; + private String mFileName; private final MediaArtistNativeHelper mMANativeHelper; @@ -116,7 +117,7 @@ public class MediaImageItem extends MediaItem { } catch (Exception e) { throw new IllegalArgumentException("Unsupported file or file not found: " + filename); } - + mFileName = filename; /** * Determine the dimensions of the image */ @@ -149,108 +150,53 @@ public class MediaImageItem extends MediaItem { /** * Get the highest resolution */ - final FileOutputStream fl = new FileOutputStream(mDecodedFilename); - final DataOutputStream dos = new DataOutputStream(fl); final Pair<Integer, Integer> maxResolution = resolutions[resolutions.length - 1]; + + final Bitmap imageBitmap; + if (mHeight > maxResolution.second) { /** * We need to scale the image */ - final Bitmap scaledImage = scaleImage(filename, maxResolution.first, - maxResolution.second); + imageBitmap = scaleImage(filename, maxResolution.first, + maxResolution.second); mScaledFilename = String.format(mMANativeHelper.getProjectPath() + "/" + "scaled" + getId()+ ".JPG"); if (!((new File(mScaledFilename)).exists())) { super.mRegenerateClip = true; final FileOutputStream f1 = new FileOutputStream(mScaledFilename); - scaledImage.compress(Bitmap.CompressFormat.JPEG, 50,f1); + imageBitmap.compress(Bitmap.CompressFormat.JPEG, 50,f1); f1.close(); } - mScaledWidth = scaledImage.getWidth(); - mScaledHeight = scaledImage.getHeight(); - - int mNewWidth = 0; - int mNewHeight = 0; - if ((mScaledWidth % 2 ) != 0) { - mNewWidth = mScaledWidth - 1; - } else { - mNewWidth = mScaledWidth; - } - - if ((mScaledHeight % 2 ) != 0) { - mNewHeight = mScaledHeight - 1; - } else { - mNewHeight = mScaledHeight; - } - - final int [] framingBuffer = new int[mNewWidth]; + mScaledWidth = (imageBitmap.getWidth() >> 1) << 1; + mScaledHeight = (imageBitmap.getHeight() >> 1) << 1; + } else { + mScaledFilename = filename; + mScaledWidth = (mWidth >> 1) << 1; + mScaledHeight = (mHeight >> 1) << 1; + imageBitmap = BitmapFactory.decodeFile(mScaledFilename); + } + int newWidth = mScaledWidth; + int newHeight = mScaledHeight; + if (!((new File(mDecodedFilename)).exists())) { + final FileOutputStream fl = new FileOutputStream(mDecodedFilename); + final DataOutputStream dos = new DataOutputStream(fl); + final int [] framingBuffer = new int[newWidth]; final ByteBuffer byteBuffer = ByteBuffer.allocate(framingBuffer.length * 4); IntBuffer intBuffer; - final byte[] array = byteBuffer.array(); int tmp = 0; - while (tmp < mNewHeight) { - scaledImage.getPixels(framingBuffer,0,mScaledWidth,0, - tmp,mNewWidth,1); - intBuffer = byteBuffer.asIntBuffer(); - intBuffer.put(framingBuffer,0,mNewWidth); - dos.write(array); - tmp += 1; - } - - mScaledWidth = mNewWidth; - mScaledHeight = mNewHeight; - scaledImage.recycle(); - } else { - final Bitmap scaledImage = BitmapFactory.decodeFile(filename); - mScaledFilename = String.format(mMANativeHelper.getProjectPath() - + "/" + "scaled" + getId()+ ".JPG"); - if (!((new File(mScaledFilename)).exists())) { - super.mRegenerateClip = true; - final FileOutputStream f1 = new FileOutputStream(mScaledFilename); - scaledImage.compress(Bitmap.CompressFormat.JPEG, 50,f1); - f1.close(); - } - - mScaledWidth = scaledImage.getWidth(); - mScaledHeight = scaledImage.getHeight(); - - int mNewWidth = 0; - int mNewheight = 0; - if ((mScaledWidth % 2 ) != 0) { - mNewWidth = mScaledWidth - 1; - } else { - mNewWidth = mScaledWidth; - } - - if ((mScaledHeight % 2 ) != 0) { - mNewheight = mScaledHeight - 1; - } else { - mNewheight = mScaledHeight; - } - - final Bitmap imageBitmap = BitmapFactory.decodeFile(mScaledFilename); - final int [] framingBuffer = new int[mNewWidth]; - ByteBuffer byteBuffer = ByteBuffer.allocate(framingBuffer.length * 4); - IntBuffer intBuffer; - - byte[] array = byteBuffer.array(); - int tmp = 0; - while (tmp < mNewheight) { - imageBitmap.getPixels(framingBuffer,0,mScaledWidth,0, - tmp,mNewWidth,1); + while (tmp < newHeight) { + imageBitmap.getPixels(framingBuffer, 0, mScaledWidth, 0, + tmp, newWidth, 1); intBuffer = byteBuffer.asIntBuffer(); - intBuffer.put(framingBuffer,0,mNewWidth); + intBuffer.put(framingBuffer, 0, newWidth); dos.write(array); tmp += 1; } - - mScaledWidth = mNewWidth; - mScaledHeight = mNewheight; - imageBitmap.recycle(); + fl.close(); } - - fl.close(); + imageBitmap.recycle(); System.gc(); } @@ -772,7 +718,9 @@ public class MediaImageItem extends MediaItem { } if (mScaledFilename != null) { - new File(mScaledFilename).delete(); + if(mFileName != mScaledFilename) { + new File(mScaledFilename).delete(); + } mScaledFilename = null; } diff --git a/media/java/android/media/videoeditor/OverlayFrame.java b/media/java/android/media/videoeditor/OverlayFrame.java index 834fc6689bc4..0a928fea5d70 100755 --- a/media/java/android/media/videoeditor/OverlayFrame.java +++ b/media/java/android/media/videoeditor/OverlayFrame.java @@ -235,7 +235,7 @@ public class OverlayFrame extends Overlay { mOFWidth = width; } /** - * Delete the overlay file + * Delete the overlay files */ void invalidate() { if (mFilename != null) { @@ -244,5 +244,9 @@ public class OverlayFrame extends Overlay { mBitmap.recycle(); mBitmap = null; } + if (mBitmapFileName != null) { + new File(mBitmapFileName).delete(); + mBitmapFileName = null; + } } } diff --git a/media/java/android/media/videoeditor/Transition.java b/media/java/android/media/videoeditor/Transition.java index feec284bf2bf..4d1bafbc6a32 100755 --- a/media/java/android/media/videoeditor/Transition.java +++ b/media/java/android/media/videoeditor/Transition.java @@ -332,8 +332,6 @@ public abstract class Transition { List<EffectSettings> effectSettings_clip2; String output = null; - String effectClip1 = null; - String effectClip2 = null; if (mNativeHelper == null) { if (m1 != null) diff --git a/media/java/android/media/videoeditor/VideoEditor.java b/media/java/android/media/videoeditor/VideoEditor.java index f1ad921afa85..9006613b9296 100755 --- a/media/java/android/media/videoeditor/VideoEditor.java +++ b/media/java/android/media/videoeditor/VideoEditor.java @@ -20,7 +20,10 @@ package android.media.videoeditor; import java.io.IOException; import java.util.List; import java.util.concurrent.CancellationException; - +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.Canvas; +import android.graphics.Rect; import android.view.SurfaceHolder; /** @@ -78,9 +81,26 @@ public interface VideoEditor { * @param videoEditor The VideoEditor instance * @param timeMs The current preview position (expressed in milliseconds * since the beginning of the storyboard timeline). - * @param end true if the end of the timeline was reached + * @param overlayData The overlay data (null if the overlay data + * is unchanged) + */ + public void onProgress(VideoEditor videoEditor, long timeMs, + OverlayData overlayData); + /** + * This method notifies the listener when the preview is started + * previewing a project. + * + * @param videoEditor The VideoEditor instance */ - public void onProgress(VideoEditor videoEditor, long timeMs, boolean end); + public void onStart(VideoEditor videoEditor); + + /** + * This method notifies the listener when the preview is stopped + * previewing a project. + * + * @param videoEditor The VideoEditor instance + */ + public void onStop(VideoEditor videoEditor); } /** @@ -126,6 +146,158 @@ public interface VideoEditor { } /** + * The overlay data + */ + public static final class OverlayData { + // Instance variables + private Bitmap mOverlayBitmap; + private int mRenderingMode; + private boolean mClear; + + /** + * Default constructor + */ + public OverlayData() { + mOverlayBitmap = null; + mRenderingMode = MediaArtistNativeHelper.MediaRendering.BLACK_BORDERS; + mClear = false; + } + + /** + * Releases the bitmap + */ + public void release() { + if (mOverlayBitmap != null) { + mOverlayBitmap.recycle(); + mOverlayBitmap = null; + } + } + + /** + * Check if the overlay needs to be rendered + * + * @return true if rendering is needed + */ + public boolean needsRendering() { + return (mClear || mOverlayBitmap != null); + } + + /** + * Store the overlay data + * + * @param overlayBitmap The overlay bitmap + * @param renderingMode The rendering mode + */ + void set(Bitmap overlayBitmap, int renderingMode) { + mOverlayBitmap = overlayBitmap; + mRenderingMode = renderingMode; + mClear = false; + } + + /** + * Clear the overlay + */ + void setClear() { + mClear = true; + } + + /** + * Render the overlay by either clearing it or by + * rendering the overlay bitmap with the specified + * rendering mode + * + * @param destBitmap The destination bitmap + */ + public void renderOverlay(Bitmap destBitmap) { + if (mClear) { + destBitmap.eraseColor(Color.TRANSPARENT); + } else if (mOverlayBitmap != null) { + final Canvas overlayCanvas = new Canvas(destBitmap); + final Rect destRect; + final Rect srcRect; + switch (mRenderingMode) { + case MediaArtistNativeHelper.MediaRendering.RESIZING: { + destRect = new Rect(0, 0, overlayCanvas.getWidth(), + overlayCanvas.getHeight()); + srcRect = new Rect(0, 0, mOverlayBitmap.getWidth(), + mOverlayBitmap.getHeight()); + break; + } + + case MediaArtistNativeHelper.MediaRendering.BLACK_BORDERS: { + int left, right, top, bottom; + float aROverlayImage, aRCanvas; + aROverlayImage = (float)(mOverlayBitmap.getWidth()) / + (float)(mOverlayBitmap.getHeight()); + + aRCanvas = (float)(overlayCanvas.getWidth()) / + (float)(overlayCanvas.getHeight()); + + if (aROverlayImage > aRCanvas) { + int newHeight = ((overlayCanvas.getWidth() * mOverlayBitmap.getHeight()) + / mOverlayBitmap.getWidth()); + left = 0; + top = (overlayCanvas.getHeight() - newHeight) / 2; + right = overlayCanvas.getWidth(); + bottom = top + newHeight; + } else { + int newWidth = ((overlayCanvas.getHeight() * mOverlayBitmap.getWidth()) + / mOverlayBitmap.getHeight()); + left = (overlayCanvas.getWidth() - newWidth) / 2; + top = 0; + right = left + newWidth; + bottom = overlayCanvas.getHeight(); + } + + destRect = new Rect(left, top, right, bottom); + srcRect = new Rect(0, 0, mOverlayBitmap.getWidth(), mOverlayBitmap.getHeight()); + break; + } + + case MediaArtistNativeHelper.MediaRendering.CROPPING: { + // Calculate the source rect + int left, right, top, bottom; + float aROverlayImage, aRCanvas; + aROverlayImage = (float)(mOverlayBitmap.getWidth()) / + (float)(mOverlayBitmap.getHeight()); + aRCanvas = (float)(overlayCanvas.getWidth()) / + (float)(overlayCanvas.getHeight()); + if (aROverlayImage < aRCanvas) { + int newHeight = ((mOverlayBitmap.getWidth() * overlayCanvas.getHeight()) + / overlayCanvas.getWidth()); + + left = 0; + top = (mOverlayBitmap.getHeight() - newHeight) / 2; + right = mOverlayBitmap.getWidth(); + bottom = top + newHeight; + } else { + int newWidth = ((mOverlayBitmap.getHeight() * overlayCanvas.getWidth()) + / overlayCanvas.getHeight()); + left = (mOverlayBitmap.getWidth() - newWidth) / 2; + top = 0; + right = left + newWidth; + bottom = mOverlayBitmap.getHeight(); + } + + srcRect = new Rect(left, top, right, bottom); + destRect = new Rect(0, 0, overlayCanvas.getWidth(), overlayCanvas.getHeight()); + break; + } + + default: { + throw new IllegalStateException("Rendering mode: " + mRenderingMode); + } + } + + destBitmap.eraseColor(Color.TRANSPARENT); + overlayCanvas.drawBitmap(mOverlayBitmap, srcRect, destRect, null); + + mOverlayBitmap.recycle(); + } + } + } + + /** * @return The path where the VideoEditor stores all files related to the * project */ @@ -518,6 +690,7 @@ public interface VideoEditor { * * @param surfaceHolder SurfaceHolder used by the application * @param timeMs time corresponding to the frame to display + * @param overlayData The overlay data * * @return The accurate time stamp of the frame that is rendered. * @@ -526,7 +699,8 @@ public interface VideoEditor { * @throws IllegalArgumentException if time is negative or beyond the * preview duration */ - public long renderPreviewFrame(SurfaceHolder surfaceHolder, long timeMs); + public long renderPreviewFrame(SurfaceHolder surfaceHolder, long timeMs, + OverlayData overlayData); /** * This method must be called after any changes made to the storyboard @@ -535,7 +709,6 @@ public interface VideoEditor { */ public void generatePreview(MediaProcessingProgressListener listener); - /** * Start the preview of all the storyboard items applied on all MediaItems * This method does not block (does not wait for the preview to complete). @@ -580,5 +753,4 @@ public interface VideoEditor { * and needs to be cleared. */ public void clearSurface(SurfaceHolder surfaceHolder); - } diff --git a/media/java/android/media/videoeditor/VideoEditorImpl.java b/media/java/android/media/videoeditor/VideoEditorImpl.java index 672ce19a20ef..54b3837f6896 100755 --- a/media/java/android/media/videoeditor/VideoEditorImpl.java +++ b/media/java/android/media/videoeditor/VideoEditorImpl.java @@ -327,16 +327,6 @@ public class VideoEditorImpl implements VideoEditor { public void export(String filename, int height, int bitrate, int audioCodec, int videoCodec, ExportProgressListener listener) throws IOException { - if ( filename == null) { - throw new IllegalArgumentException("export: filename is null"); - } - File tempPathFile = new File(filename); - if (tempPathFile == null) { - throw new IOException(filename + "can not be created"); - } - if (mMediaItems.size() == 0) { - throw new IllegalStateException("No MediaItems added"); - } switch (audioCodec) { case MediaProperties.ACODEC_AAC_LC: @@ -345,7 +335,8 @@ public class VideoEditorImpl implements VideoEditor { break; default : - throw new IllegalArgumentException("Audio codec type incorrect"); + String message = "Unsupported audio codec type " + audioCodec; + throw new IllegalArgumentException(message); } switch (videoCodec) { @@ -357,64 +348,11 @@ public class VideoEditorImpl implements VideoEditor { break; default : - throw new IllegalArgumentException("Video codec type incorrect"); - } - - switch (height) { - case MediaProperties.HEIGHT_144: - break; - case MediaProperties.HEIGHT_360: - break; - case MediaProperties.HEIGHT_480: - break; - case MediaProperties.HEIGHT_720: - break; - - default: - throw new IllegalArgumentException("Argument Height incorrect"); - } - - switch (bitrate) { - case MediaProperties.BITRATE_28K: - break; - case MediaProperties.BITRATE_40K: - break; - case MediaProperties.BITRATE_64K: - break; - case MediaProperties.BITRATE_96K: - break; - case MediaProperties.BITRATE_128K: - break; - case MediaProperties.BITRATE_192K: - break; - case MediaProperties.BITRATE_256K: - break; - case MediaProperties.BITRATE_384K: - break; - case MediaProperties.BITRATE_512K: - break; - case MediaProperties.BITRATE_800K: - break; - case MediaProperties.BITRATE_2M: - break; - case MediaProperties.BITRATE_5M: - break; - case MediaProperties.BITRATE_8M: - break; - - default: - throw new IllegalArgumentException("Argument Bitrate incorrect"); + String message = "Unsupported video codec type " + videoCodec; + throw new IllegalArgumentException(message); } - try { - mExportSemaphore.acquire(); - mMANativeHelper.export(filename, mProjectPath, height,bitrate,audioCodec, - videoCodec,mMediaItems, mTransitions, mAudioTracks,listener); - } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in export"); - } finally { - mExportSemaphore.release(); - } + export(filename, height, bitrate, listener); } /* @@ -444,7 +382,8 @@ public class VideoEditorImpl implements VideoEditor { break; default: - throw new IllegalArgumentException("Argument Height incorrect"); + String message = "Unsupported height value " + height; + throw new IllegalArgumentException(message); } switch (bitrate) { case MediaProperties.BITRATE_28K: @@ -475,7 +414,8 @@ public class VideoEditorImpl implements VideoEditor { break; default: - throw new IllegalArgumentException("Argument Bitrate incorrect"); + final String message = "Unsupported bitrate value " + bitrate; + throw new IllegalArgumentException(message); } try { @@ -484,7 +424,7 @@ public class VideoEditorImpl implements VideoEditor { mMediaItems, mTransitions, mAudioTracks, listener); } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in export"); + Log.e(TAG, "Sem acquire NOT successful in export"); } finally { mExportSemaphore.release(); } @@ -504,7 +444,7 @@ public class VideoEditorImpl implements VideoEditor { mAudioTracks, listener); } } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in previewStoryBoard"); + Log.e(TAG, "Sem acquire NOT successful in previewStoryBoard"); } finally { if (semAcquireDone) { mPreviewSemaphore.release(); @@ -899,7 +839,8 @@ public class VideoEditorImpl implements VideoEditor { /* * {@inheritDoc} */ - public long renderPreviewFrame(SurfaceHolder surfaceHolder, long timeMs) { + public long renderPreviewFrame(SurfaceHolder surfaceHolder, long timeMs, + OverlayData overlayData) { long result = 0; int surfaceWidth = 0; int surfaceHeight = 0; @@ -939,7 +880,7 @@ public class VideoEditorImpl implements VideoEditor { if (!mMANativeHelper.mInvalidatePreviewArray) { if (mMediaItems.size() > 0) { result = mMANativeHelper.renderPreviewFrame(surface, - timeMs,surfaceWidth,surfaceHeight); + timeMs,surfaceWidth,surfaceHeight, overlayData); } else { result = 0; @@ -950,7 +891,7 @@ public class VideoEditorImpl implements VideoEditor { } } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in renderPreviewFrame"); + Log.e(TAG, "Sem acquire NOT successful in renderPreviewFrame"); } finally { if (semAcquireDone) { @@ -1626,16 +1567,14 @@ public class VideoEditorImpl implements VideoEditor { mPreviewSemaphore.acquire(); semAcquireDone = true; } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in startPreview"); + Log.e(TAG, "Sem acquire NOT successful in startPreview"); } if (semAcquireDone) { Surface mSurface = surfaceHolder.getSurface(); if (mSurface == null) { - Log.e("VideoEditoeImpl", - "Surface could not be retrieved from surface holder"); throw new - RuntimeException(); + throw new RuntimeException("Surface could not be retrieved from surface holder"); } if (mMediaItems.size() > 0) { @@ -1643,19 +1582,19 @@ public class VideoEditorImpl implements VideoEditor { mMANativeHelper.previewStoryBoard(mMediaItems, mTransitions, mAudioTracks, null); mMANativeHelper.doPreview(mSurface, fromMs, toMs, loop, - callbackAfterFrameCount, listener); + callbackAfterFrameCount, listener); mPreviewInProgress = true; } catch (IllegalArgumentException ex) { mPreviewSemaphore.release(); - Log.e("VideoEditorImpl", "Illegal Argument exception in do preview"); + Log.e(TAG, "Illegal Argument exception in do preview"); throw ex; } catch (IllegalStateException ex) { mPreviewSemaphore.release(); - Log.e("VideoEditorImpl", "Illegal State exception in do preview"); + Log.e(TAG, "Illegal State exception in do preview"); throw ex; } catch (RuntimeException ex) { mPreviewSemaphore.release(); - Log.e("VideoEditorImpl", "Runtime exception in do preview"); + Log.e(TAG, "Runtime exception in do preview"); throw ex; } } @@ -1683,7 +1622,7 @@ public class VideoEditorImpl implements VideoEditor { } } - /** + /* * Remove transitions associated with the specified media item * * @param mediaItem The media item @@ -1791,7 +1730,7 @@ public class VideoEditorImpl implements VideoEditor { if (mMediaItems.size() > 0) { MediaItem mI = mMediaItems.get(0); /* - * Lets initialise the width for default aspect ratio i.e 16:9 + * Lets initialiZe the width for default aspect ratio i.e 16:9 */ int height = 480; int width = 854; @@ -1843,18 +1782,19 @@ public class VideoEditorImpl implements VideoEditor { * and needs to be cleared. */ public void clearSurface(SurfaceHolder surfaceHolder) { + if (surfaceHolder == null) { + throw new IllegalArgumentException("Invalid surface holder"); + } - if (surfaceHolder == null) { - throw new IllegalArgumentException(); - } - Surface surface = surfaceHolder.getSurface(); - - if (surface == null) { - Log.e("VideoEditorImpl", - "Surface could not be retrieved from surface holder"); - throw new RuntimeException(); - } - mMANativeHelper.clearPreviewSurface(surface); - } + final Surface surface = surfaceHolder.getSurface(); + if (surface == null) { + throw new RuntimeException("Surface could not be retrieved from surface holder"); + } + if (mMANativeHelper != null) { + mMANativeHelper.clearPreviewSurface(surface); + } else { + Log.w(TAG, "Native helper was not ready!"); + } + } } diff --git a/media/jni/mediaeditor/VideoEditorClasses.cpp b/media/jni/mediaeditor/VideoEditorClasses.cpp index 52e032a2a882..369faa9522dc 100755 --- a/media/jni/mediaeditor/VideoEditorClasses.cpp +++ b/media/jni/mediaeditor/VideoEditorClasses.cpp @@ -2481,7 +2481,7 @@ videoEditClasses_getEffectSettings( pSettings->xVSS.width = pSettings->xVSS.pFramingBuffer->u_width; pSettings->xVSS.height = pSettings->xVSS.pFramingBuffer->u_height; - pSettings->xVSS.rgbType = M4VSS3GPP_kRGB888; + pSettings->xVSS.rgbType = M4VSS3GPP_kRGB565; VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_CLASSES", "pFramingBuffer u_width %d ", pSettings->xVSS.pFramingBuffer->u_width); diff --git a/media/jni/mediaeditor/VideoEditorMain.cpp b/media/jni/mediaeditor/VideoEditorMain.cpp index 8ce788b1a042..4149bc98cf16 100755 --- a/media/jni/mediaeditor/VideoEditorMain.cpp +++ b/media/jni/mediaeditor/VideoEditorMain.cpp @@ -86,6 +86,7 @@ typedef struct jmethodID onWarningMethodId; jmethodID onProgressUpdateMethodId; jmethodID onPreviewProgressUpdateMethodId; + jmethodID previewFrameEditInfoId; M4xVSS_InitParams initParams; void* pTextRendererHandle; M4xVSS_getTextRgbBufferFct pTextRendererFunction; @@ -102,6 +103,9 @@ typedef struct M4OSA_Bool bSkipState; jmethodID onAudioGraphProgressUpdateMethodId; Mutex mLock; + bool mIsUpdateOverlay; + char *mOverlayFileName; + int mOverlayRenderingMode; } ManualEditContext; extern "C" M4OSA_ERR M4MCS_open_normalMode( @@ -224,7 +228,7 @@ static int videoEditor_registerManualEditMethods( JNIEnv* pEnv); static void jniPreviewProgressCallback(void* cookie, M4OSA_UInt32 msgType, - M4OSA_UInt32 argc); + void *argc); static int videoEditor_renderMediaItemPreviewFrame(JNIEnv* pEnv, jobject thiz, @@ -374,35 +378,105 @@ getClipSetting( } static void jniPreviewProgressCallback (void* cookie, M4OSA_UInt32 msgType, - M4OSA_UInt32 argc) + void *argc) { ManualEditContext *pContext = (ManualEditContext *)cookie; JNIEnv* pEnv = NULL; bool isFinished = false; int currentMs = 0; int error = M4NO_ERROR; + bool isUpdateOverlay = false; + int overlayEffectIndex; + char *extPos; + bool isSendProgress = true; + jstring tmpFileName; + VideoEditorCurretEditInfo *pCurrEditInfo; // Attach the current thread. pContext->pVM->AttachCurrentThread(&pEnv, NULL); switch(msgType) { case MSG_TYPE_PROGRESS_INDICATION: - currentMs = argc; + currentMs = *(int*)argc; break; case MSG_TYPE_PLAYER_ERROR: currentMs = -1; - error = argc; + error = *(int*)argc; break; case MSG_TYPE_PREVIEW_END: isFinished = true; break; + case MSG_TYPE_OVERLAY_UPDATE: + { + int overlayFileNameLen = 0; + isSendProgress = false; + pContext->mIsUpdateOverlay = true; + pCurrEditInfo = (VideoEditorCurretEditInfo*)argc; + overlayEffectIndex = pCurrEditInfo->overlaySettingsIndex; + LOGV("MSG_TYPE_OVERLAY_UPDATE"); + + if (pContext->mOverlayFileName != NULL) { + M4OSA_free((M4OSA_MemAddr32)pContext->mOverlayFileName); + pContext->mOverlayFileName = NULL; + } + + overlayFileNameLen = + strlen((const char*)pContext->pEditSettings->Effects[overlayEffectIndex].xVSS.pFramingFilePath); + + pContext->mOverlayFileName = + (char*)M4OSA_malloc(overlayFileNameLen+1, + M4VS, (M4OSA_Char*)"videoEdito JNI overlayFile"); + if (pContext->mOverlayFileName != NULL) { + strncpy (pContext->mOverlayFileName, + (const char*)pContext->pEditSettings->\ + Effects[overlayEffectIndex].xVSS.pFramingFilePath, overlayFileNameLen); + //Change the name to png file + extPos = strstr(pContext->mOverlayFileName, ".rgb"); + if (extPos != NULL) { + *extPos = '\0'; + } else { + LOGE("ERROR the overlay file is incorrect"); + } + + strcat(pContext->mOverlayFileName, ".png"); + LOGV("Conv string is %s", pContext->mOverlayFileName); + LOGV("Current Clip index = %d", pCurrEditInfo->clipIndex); + + pContext->mOverlayRenderingMode = pContext->pEditSettings->\ + pClipList[pCurrEditInfo->clipIndex]->xVSS.MediaRendering; + LOGI("rendering mode %d ", pContext->mOverlayRenderingMode); + + } + + break; + } + + case MSG_TYPE_OVERLAY_CLEAR: + isSendProgress = false; + pContext->mOverlayFileName = NULL; + LOGI("MSG_TYPE_OVERLAY_CLEAR"); + //argc is not used + pContext->mIsUpdateOverlay = true; + break; default: break; } - pEnv->CallVoidMethod(pContext->engine, - pContext->onPreviewProgressUpdateMethodId, - currentMs,isFinished); + if (isSendProgress) { + tmpFileName = pEnv->NewStringUTF(pContext->mOverlayFileName); + pEnv->CallVoidMethod(pContext->engine, + pContext->onPreviewProgressUpdateMethodId, + currentMs,isFinished, pContext->mIsUpdateOverlay, + tmpFileName, pContext->mOverlayRenderingMode); + + if (pContext->mIsUpdateOverlay) { + pContext->mIsUpdateOverlay = false; + } + + if (tmpFileName) { + pEnv->DeleteLocalRef(tmpFileName); + } + } // Detach the current thread. pContext->pVM->DetachCurrentThread(); @@ -422,6 +496,11 @@ static void videoEditor_stopPreview(JNIEnv* pEnv, (M4OSA_NULL == pContext), "not initialized"); pContext->mPreviewController->stopPreview(); + + if (pContext->mOverlayFileName != NULL) { + M4OSA_free((M4OSA_MemAddr32)pContext->mOverlayFileName); + pContext->mOverlayFileName = NULL; + } } static void videoEditor_clearSurface(JNIEnv* pEnv, @@ -507,6 +586,7 @@ static int videoEditor_renderPreviewFrame(JNIEnv* pEnv, M4OSA_Context tnContext = M4OSA_NULL; const char* pMessage = NULL; M4VIFI_ImagePlane *yuvPlane = NULL; + VideoEditorCurretEditInfo currEditInfo; VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR", "surfaceWidth = %d",surfaceWidth); @@ -770,9 +850,36 @@ static int videoEditor_renderPreviewFrame(JNIEnv* pEnv, pContext->pEditSettings->\ pClipList[iCurrentClipIndex]->xVSS.MediaRendering, pContext->pEditSettings->xVSS.outputVideoSize); - result = pContext->mPreviewController->renderPreviewFrame(previewSurface, - &frameStr); + &frameStr, &currEditInfo); + + if (currEditInfo.overlaySettingsIndex != -1) { + char tmpOverlayFilename[100]; + char *extPos = NULL; + jstring tmpOverlayString; + int tmpRenderingMode = 0; + + strncpy (tmpOverlayFilename, + (const char*)pContext->pEditSettings->Effects[currEditInfo.overlaySettingsIndex].xVSS.pFramingFilePath, 99); + + //Change the name to png file + extPos = strstr(tmpOverlayFilename, ".rgb"); + if (extPos != NULL) { + *extPos = '\0'; + } else { + LOGE("ERROR the overlay file is incorrect"); + } + + strcat(tmpOverlayFilename, ".png"); + + tmpRenderingMode = pContext->pEditSettings->pClipList[iCurrentClipIndex]->xVSS.MediaRendering; + tmpOverlayString = pEnv->NewStringUTF(tmpOverlayFilename); + pEnv->CallVoidMethod(pContext->engine, + pContext->previewFrameEditInfoId, + tmpOverlayString, tmpRenderingMode); + + } + videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv, (M4NO_ERROR != result), result); @@ -937,7 +1044,7 @@ static int videoEditor_renderMediaItemPreviewFrame(JNIEnv* pEnv, /* pContext->mPreviewController->setPreviewFrameRenderingMode(M4xVSS_kBlackBorders, (M4VIDEOEDITING_VideoFrameSize)(M4VIDEOEDITING_kHD960+1));*/ result - = pContext->mPreviewController->renderPreviewFrame(previewSurface,&frameStr); + = pContext->mPreviewController->renderPreviewFrame(previewSurface,&frameStr, NULL); videoEditJava_checkAndThrowRuntimeException(&needToBeLoaded, pEnv, (M4NO_ERROR != result), result); @@ -1325,7 +1432,7 @@ videoEditor_populateSettings( "not initialized"); pContext->onPreviewProgressUpdateMethodId = pEnv->GetMethodID(engineClass, - "onPreviewProgressUpdate", "(IZ)V"); + "onPreviewProgressUpdate", "(IZZLjava/lang/String;I)V"); // Check if the context is valid (required because the context is dereferenced). if (needToBeLoaded) { // Make sure that we are in a correct state. @@ -1342,6 +1449,9 @@ videoEditor_populateSettings( } M4OSA_TRACE1_0("videoEditorC_getEditSettings done"); + pContext->previewFrameEditInfoId = pEnv->GetMethodID(engineClass, + "previewFrameEditInfo", "(Ljava/lang/String;I)V"); + if ( pContext->pEditSettings != NULL ) { // Check if the edit settings could be retrieved. @@ -1440,22 +1550,22 @@ videoEditor_populateSettings( width = pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_width; height = pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_height; - pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_stride = width*3; + //RGB 565 + pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_stride = width*2; - //for RGB888 + //for RGB565 pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->u_topleft = 0; - pContext->pEditSettings->Effects[j].xVSS.pFramingBuffer->pac_data = - (M4VIFI_UInt8 *)M4OSA_malloc(width*height*3, - 0x00,(M4OSA_Char *)"pac_data buffer"); + (M4VIFI_UInt8 *)M4OSA_malloc(width*height*2, + 0x00,(M4OSA_Char *)"pac_data buffer"); M4OSA_memcpy((M4OSA_Int8 *)&pContext->pEditSettings->\ Effects[j].xVSS.pFramingBuffer->\ - pac_data[0],(M4OSA_Int8 *)&aFramingCtx->FramingRgb->pac_data[0],(width*height*3)); + pac_data[0],(M4OSA_Int8 *)&aFramingCtx->FramingRgb->pac_data[0],(width*height*2)); - //As of now rgb type is always rgb888, can be changed in future for rgb 565 + //As of now rgb type is 565 pContext->pEditSettings->Effects[j].xVSS.rgbType = - (M4VSS3GPP_RGBType)M4VSS3GPP_kRGB888; //M4VSS3GPP_kRGB565; + (M4VSS3GPP_RGBType) M4VSS3GPP_kRGB565; if (aFramingCtx->FramingYuv != M4OSA_NULL ) { @@ -2153,6 +2263,8 @@ videoEditor_init( M4OSA_chrNCat((M4OSA_Char*)pContext->initParams.pTempPath, tmpString, M4OSA_chrLength(tmpString)); M4OSA_chrNCat((M4OSA_Char*)pContext->initParams.pTempPath, (M4OSA_Char*)"/", 1); M4OSA_free((M4OSA_MemAddr32)tmpString); + pContext->mIsUpdateOverlay = false; + pContext->mOverlayFileName = NULL; } // Check if the initialization succeeded diff --git a/media/jni/mediaeditor/VideoEditorMain.h b/media/jni/mediaeditor/VideoEditorMain.h index b73913a07f99..ca4a9454d4e7 100755 --- a/media/jni/mediaeditor/VideoEditorMain.h +++ b/media/jni/mediaeditor/VideoEditorMain.h @@ -21,11 +21,18 @@ typedef enum { - MSG_TYPE_PROGRESS_INDICATION, /* Playback progress indication event*/ - MSG_TYPE_PLAYER_ERROR, /* Playback error*/ - MSG_TYPE_PREVIEW_END, /* Preview of clips is complete */ + MSG_TYPE_PROGRESS_INDICATION, // Playback progress indication event + MSG_TYPE_PLAYER_ERROR, // Playback error + MSG_TYPE_PREVIEW_END, // Preview of clips is complete + MSG_TYPE_OVERLAY_UPDATE, // update overlay during preview + MSG_TYPE_OVERLAY_CLEAR, // clear the overlay } progress_callback_msg_type; +typedef struct { + int overlaySettingsIndex; + int clipIndex; +} VideoEditorCurretEditInfo; + typedef struct { M4OSA_Void *pFile; /** PCM file path */ diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index 65df68c4bf00..f134cba9b287 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -1239,6 +1239,14 @@ status_t StagefrightRecorder::setupVideoEncoder( encoder_flags |= OMXCodec::kHardwareCodecsOnly; encoder_flags |= OMXCodec::kStoreMetaDataInVideoBuffers; } + + // Do not wait for all the input buffers to become available. + // This give timelapse video recording faster response in + // receiving output from video encoder component. + if (mCaptureTimeLapse) { + encoder_flags |= OMXCodec::kOnlySubmitOneInputBufferAtOneTime; + } + sp<MediaSource> encoder = OMXCodec::Create( client.interface(), enc_meta, true /* createEncoder */, cameraSource, diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 11ac56ce296e..89b3dab46d73 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -378,14 +378,11 @@ status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { } void AwesomePlayer::reset() { - LOGI("reset"); - Mutex::Autolock autoLock(mLock); reset_l(); } void AwesomePlayer::reset_l() { - LOGI("reset_l"); mDisplayWidth = 0; mDisplayHeight = 0; @@ -411,10 +408,6 @@ void AwesomePlayer::reset_l() { } } - if (mFlags & PREPARING) { - LOGI("waiting until preparation is completes."); - } - while (mFlags & PREPARING) { mPreparedCondition.wait(mLock); } @@ -438,8 +431,6 @@ void AwesomePlayer::reset_l() { } mAudioSource.clear(); - LOGI("audio source cleared"); - mTimeSource = NULL; delete mAudioPlayer; @@ -480,8 +471,6 @@ void AwesomePlayer::reset_l() { IPCThreadState::self()->flushCommands(); } - LOGI("video source cleared"); - mDurationUs = -1; mFlags = 0; mExtractorFlags = 0; @@ -498,8 +487,6 @@ void AwesomePlayer::reset_l() { mFileSource.clear(); mBitrate = -1; - - LOGI("reset_l completed"); } void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index b1c6b18d7229..66e0657b7b67 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -147,8 +147,8 @@ CameraSource::CameraSource( mNumFramesReceived(0), mLastFrameTimestampUs(0), mStarted(false), - mFirstFrameTimeUs(0), mNumFramesEncoded(0), + mFirstFrameTimeUs(0), mNumFramesDropped(0), mNumGlitches(0), mGlitchDurationThresholdUs(200000), diff --git a/media/libstagefright/CameraSourceTimeLapse.cpp b/media/libstagefright/CameraSourceTimeLapse.cpp index b58b9d84bfae..e6fe6186d45b 100644 --- a/media/libstagefright/CameraSourceTimeLapse.cpp +++ b/media/libstagefright/CameraSourceTimeLapse.cpp @@ -491,7 +491,10 @@ bool CameraSourceTimeLapse::skipFrameAndModifyTimeStamp(int64_t *timestampUs) { } } - if (*timestampUs < + // Workaround to bypass the first 2 input frames for skipping. + // The first 2 output frames from the encoder are: decoder specific info and + // the compressed video frame data for the first input video frame. + if (mNumFramesEncoded >= 1 && *timestampUs < (mLastTimeLapseFrameRealTimestampUs + mTimeBetweenTimeLapseFrameCaptureUs)) { // Skip all frames from last encoded frame until // sufficient time (mTimeBetweenTimeLapseFrameCaptureUs) has passed. diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 94694a3b74ff..2a19b25bfa20 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -522,6 +522,12 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta, uint32_t flags) { if (flags & kStoreMetaDataInVideoBuffers) { mIsMetaDataStoredInVideoBuffers = true; } + + mOnlySubmitOneBufferAtOneTime = false; + if (flags & kOnlySubmitOneInputBufferAtOneTime) { + mOnlySubmitOneBufferAtOneTime = true; + } + if (!(flags & kIgnoreCodecSpecificData)) { uint32_t type; const void *data; @@ -2203,8 +2209,9 @@ void OMXCodec::onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { crop.right = right; crop.bottom = bottom; - CHECK_EQ(0, native_window_set_crop( - mNativeWindow.get(), &crop)); + // We'll ignore any errors here, if the surface is + // already invalid, we'll know soon enough. + native_window_set_crop(mNativeWindow.get(), &crop); } } } @@ -2609,7 +2616,17 @@ void OMXCodec::drainInputBuffers() { Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput]; for (size_t i = 0; i < buffers->size(); ++i) { - if (!drainInputBuffer(&buffers->editItemAt(i))) { + BufferInfo *info = &buffers->editItemAt(i); + + if (info->mStatus != OWNED_BY_US) { + continue; + } + + if (!drainInputBuffer(info)) { + break; + } + + if (mOnlySubmitOneBufferAtOneTime) { break; } } @@ -3316,7 +3333,7 @@ status_t OMXCodec::stop() { mSource->stop(); - CODEC_LOGV("stopped"); + CODEC_LOGI("stopped in state %d", mState); return OK; } diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index 9b6d441a6e87..c7c14099f992 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -//#define LOG_NDEBUG 0 +#define LOG_NDEBUG 0 #define LOG_TAG "OMXNodeInstance" #include <utils/Log.h> @@ -124,6 +124,8 @@ static status_t StatusFromOMXError(OMX_ERRORTYPE err) { } status_t OMXNodeInstance::freeNode(OMXMaster *master) { + static int32_t kMaxNumIterations = 10; + // Transition the node from its current state all the way down // to "Loaded". // This ensures that all active buffers are properly freed even @@ -143,9 +145,16 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) { LOGV("forcing Executing->Idle"); sendCommand(OMX_CommandStateSet, OMX_StateIdle); OMX_ERRORTYPE err; + int32_t iteration = 0; while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone && state != OMX_StateIdle && state != OMX_StateInvalid) { + if (++iteration > kMaxNumIterations) { + LOGE("component failed to enter Idle state, aborting."); + state = OMX_StateInvalid; + break; + } + usleep(100000); } CHECK_EQ(err, OMX_ErrorNone); @@ -165,9 +174,16 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) { freeActiveBuffers(); OMX_ERRORTYPE err; + int32_t iteration = 0; while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone && state != OMX_StateLoaded && state != OMX_StateInvalid) { + if (++iteration > kMaxNumIterations) { + LOGE("component failed to enter Loaded state, aborting."); + state = OMX_StateInvalid; + break; + } + LOGV("waiting for Loaded state..."); usleep(100000); } @@ -185,8 +201,10 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) { break; } + LOGV("calling destroyComponentInstance"); OMX_ERRORTYPE err = master->destroyComponentInstance( static_cast<OMX_COMPONENTTYPE *>(mHandle)); + LOGV("destroyComponentInstance returned err %d", err); mHandle = NULL; diff --git a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp index bbde516bb3f1..8bfe2852f17d 100644 --- a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp +++ b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp @@ -359,7 +359,10 @@ sp<ABuffer> AMPEG4AudioAssembler::removeLATMFraming(const sp<ABuffer> &buffer) { } } - CHECK_EQ(offset, buffer->size()); + if (offset < buffer->size()) { + LOGI("ignoring %d bytes of trailing data", buffer->size() - offset); + } + CHECK_LE(offset, buffer->size()); return out; } diff --git a/media/libstagefright/rtsp/ASessionDescription.cpp b/media/libstagefright/rtsp/ASessionDescription.cpp index 77917b3a793d..3e710dc4a7b3 100644 --- a/media/libstagefright/rtsp/ASessionDescription.cpp +++ b/media/libstagefright/rtsp/ASessionDescription.cpp @@ -254,26 +254,12 @@ bool ASessionDescription::getDurationUs(int64_t *durationUs) const { return false; } - if (value == "npt=now-" || value == "npt=0-") { - return false; - } - if (strncmp(value.c_str(), "npt=", 4)) { return false; } - const char *s = value.c_str() + 4; - char *end; - double from = strtod(s, &end); - - if (end == s || *end != '-') { - return false; - } - - s = end + 1; - double to = strtod(s, &end); - - if (end == s || *end != '\0' || to < from) { + float from, to; + if (!parseNTPRange(value.c_str() + 4, &from, &to)) { return false; } @@ -307,5 +293,39 @@ void ASessionDescription::ParseFormatDesc( } } +// static +bool ASessionDescription::parseNTPRange( + const char *s, float *npt1, float *npt2) { + if (s[0] == '-') { + return false; // no start time available. + } + + if (!strncmp("now", s, 3)) { + return false; // no absolute start time available + } + + char *end; + *npt1 = strtof(s, &end); + + if (end == s || *end != '-') { + // Failed to parse float or trailing "dash". + return false; + } + + s = end + 1; // skip the dash. + + if (!strncmp("now", s, 3)) { + return false; // no absolute end time available + } + + *npt2 = strtof(s, &end); + + if (end == s || *end != '\0') { + return false; + } + + return *npt2 > *npt1; +} + } // namespace android diff --git a/media/libstagefright/rtsp/ASessionDescription.h b/media/libstagefright/rtsp/ASessionDescription.h index a3fa79ed5a00..b4629834b68d 100644 --- a/media/libstagefright/rtsp/ASessionDescription.h +++ b/media/libstagefright/rtsp/ASessionDescription.h @@ -55,6 +55,14 @@ struct ASessionDescription : public RefBase { bool findAttribute(size_t index, const char *key, AString *value) const; + // parses strings of the form + // npt := npt-time "-" npt-time? | "-" npt-time + // npt-time := "now" | [0-9]+("." [0-9]*)? + // + // Returns true iff both "npt1" and "npt2" times were available, + // i.e. we have a fixed duration, otherwise this is live streaming. + static bool parseNTPRange(const char *s, float *npt1, float *npt2); + protected: virtual ~ASessionDescription(); diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index 9bb8c46453b0..306a9c1c260b 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -938,13 +938,11 @@ struct MyHandler : public AHandler { AString val; CHECK(GetAttribute(range.c_str(), "npt", &val)); - float npt1, npt2; - if (val == "now-" || val == "0-") { + float npt1, npt2; + if (!ASessionDescription::parseNTPRange(val.c_str(), &npt1, &npt2)) { // This is a live stream and therefore not seekable. return; - } else { - CHECK_EQ(sscanf(val.c_str(), "%f-%f", &npt1, &npt2), 2); } i = response->mHeaders.indexOfKey("rtp-info"); diff --git a/media/mtp/MtpUtils.cpp b/media/mtp/MtpUtils.cpp index ab01ef566370..6ec88766b66c 100644 --- a/media/mtp/MtpUtils.cpp +++ b/media/mtp/MtpUtils.cpp @@ -55,7 +55,7 @@ bool parseDateTime(const char* dateTime, time_t& outSeconds) { tm.tm_min = minute; tm.tm_hour = hour; tm.tm_mday = day; - tm.tm_mon = month; + tm.tm_mon = month - 1; // mktime uses months in 0 - 11 range tm.tm_year = year - 1900; tm.tm_wday = 0; tm.tm_isdst = -1; @@ -72,7 +72,9 @@ void formatDateTime(time_t seconds, char* buffer, int bufferLength) { localtime_r(&seconds, &tm); snprintf(buffer, bufferLength, "%04d%02d%02dT%02d%02d%02d", - tm.tm_year + 1900, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); + tm.tm_year + 1900, + tm.tm_mon + 1, // localtime_r uses months in 0 - 11 range + tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); } } // namespace android diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket.png Binary files differdeleted file mode 100644 index 12b6ceaa4af0..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_drag.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_drag.png Binary files differdeleted file mode 100644 index 28590bca66fc..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_drag.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_hidden.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_hidden.png Binary files differdeleted file mode 100644 index c66ad777a1c1..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_hidden.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_holding.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_holding.png Binary files differdeleted file mode 100644 index 6416969748b4..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_pocket_holding.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/scrubber_control_disabled_holo.png b/packages/SystemUI/res/drawable-hdpi/scrubber_control_disabled_holo.png Binary files differnew file mode 100644 index 000000000000..18bd8b49978d --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/scrubber_control_disabled_holo.png diff --git a/packages/SystemUI/res/drawable-hdpi/scrubber_control_holo.png b/packages/SystemUI/res/drawable-hdpi/scrubber_control_holo.png Binary files differnew file mode 100644 index 000000000000..993ccf4c3e54 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/scrubber_control_holo.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png Binary files differindex 150c9fc87058..61f65bf164f8 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png Binary files differindex ecb39515cd82..ff74c3563710 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png Binary files differindex e375a8a85b83..6375b1bae9da 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png Binary files differindex 13dde32a0738..ef886b831720 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png Binary files differindex 24ade2c92220..92882bd099c7 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png Binary files differindex efa6f79d953c..cf5c4c3bc8b9 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png Binary files differindex 5b5baed65919..24b6d2562b97 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png Binary files differindex 2eaff9869e06..b147583d59e4 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png Binary files differindex b515cf051435..594ad6ac67eb 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png Binary files differindex d8599b512f15..2879550d4919 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png Binary files differindex 1b404b376df7..7cd2893e8e38 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png Binary files differindex ba9cc9c69b6c..23eb1d6d43c2 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex 3e29d5e98bb9..ad28667e6b93 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png Binary files differindex e1900eaf3302..048dfd1d53dc 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 2b00f3baa6d2..224ae1f54a90 100755 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png Binary files differindex 6158e66ce057..b85859b84442 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex b183160e50bd..d7f39602b5e7 100755 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png Binary files differindex 1b96f39691f9..54915b98c065 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex cf504f5d7de1..bd44b529ee74 100755 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png Binary files differdeleted file mode 100644 index 90dffa973c2d..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_drag.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_drag.png Binary files differdeleted file mode 100644 index dcce49574465..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_drag.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png Binary files differdeleted file mode 100644 index 93b0d238fb0c..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_holding.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_holding.png Binary files differdeleted file mode 100644 index 9eb9dc62d7b3..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_holding.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/scrubber_control_disabled_holo.png b/packages/SystemUI/res/drawable-mdpi/scrubber_control_disabled_holo.png Binary files differindex b8adc97a4c33..7e679edd4bb1 100644 --- a/packages/SystemUI/res/drawable-mdpi/scrubber_control_disabled_holo.png +++ b/packages/SystemUI/res/drawable-mdpi/scrubber_control_disabled_holo.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png Binary files differindex e5e98f91201e..3a0fce0f9515 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png Binary files differindex cf11f0dd40f3..8654aa096a3f 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png Binary files differindex 3b69d1ea6c40..c10629fe58bf 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png Binary files differindex b012b184a11d..753c9f95e83a 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png Binary files differindex 87362349367a..65a886abe618 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png Binary files differindex cc68512477e7..6e90ce4bab7c 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png Binary files differindex 5a2d3c0c5eb8..cce7d9b2046e 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png Binary files differindex a93d49c85bd3..c4e33bd0a475 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png Binary files differindex 3fbf7fc8c09b..433a2c5e6a5e 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png Binary files differindex e3ff8b9b7b89..81401b2b44f5 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png Binary files differindex b11ad16539dc..75906a2c2829 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png Binary files differindex 94d40e078f8c..528e4ce92313 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex 4a896f32cf5d..1eb5aad93bde 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png Binary files differindex b09b40dce070..5f2c2303c39f 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 0f9c18721ffb..2c27620ed885 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png Binary files differindex b852dba30caf..4cb06bec0721 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex 0468d0603deb..fd9c35030510 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png Binary files differindex 06bbb4a7498c..e8aed953289b 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex 1858af3a32df..c629387c20b8 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_ticker_tile.png b/packages/SystemUI/res/drawable-mdpi/status_bar_ticker_tile.png Binary files differnew file mode 100644 index 000000000000..85394fa7d6f3 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/status_bar_ticker_tile.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_1x.png Binary files differnew file mode 100644 index 000000000000..8e039ce8cea0 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_3g.png Binary files differnew file mode 100644 index 000000000000..0cb0a08325f4 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_4g.png Binary files differnew file mode 100644 index 000000000000..c3cd10b0f2e3 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_e.png Binary files differnew file mode 100644 index 000000000000..650f67be850d --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_g.png Binary files differnew file mode 100644 index 000000000000..f5b1618d7c9f --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_h.png Binary files differnew file mode 100644 index 000000000000..eddc48705244 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_1x.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_1x.png Binary files differnew file mode 100644 index 000000000000..39dfcd3d4101 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_3g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_3g.png Binary files differnew file mode 100644 index 000000000000..e78d872920b9 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_4g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_4g.png Binary files differnew file mode 100644 index 000000000000..5f88279ffce3 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_e.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_e.png Binary files differnew file mode 100644 index 000000000000..ad73252ee034 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_g.png Binary files differnew file mode 100644 index 000000000000..d02de5b2058c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_h.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_h.png Binary files differnew file mode 100644 index 000000000000..cb13b91cfb57 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_in_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_1x.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_1x.png Binary files differnew file mode 100644 index 000000000000..39dfcd3d4101 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_3g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_3g.png Binary files differnew file mode 100644 index 000000000000..e78d872920b9 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_4g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_4g.png Binary files differnew file mode 100644 index 000000000000..8c04bd611cb0 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_e.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_e.png Binary files differnew file mode 100644 index 000000000000..ad73252ee034 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_g.png Binary files differnew file mode 100644 index 000000000000..d02de5b2058c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_h.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_h.png Binary files differnew file mode 100644 index 000000000000..cb13b91cfb57 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_inandout_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_1x.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_1x.png Binary files differnew file mode 100644 index 000000000000..39dfcd3d4101 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_3g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_3g.png Binary files differnew file mode 100644 index 000000000000..e78d872920b9 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_4g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_4g.png Binary files differnew file mode 100644 index 000000000000..456d0b6ef060 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_e.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_e.png Binary files differnew file mode 100644 index 000000000000..ad73252ee034 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_g.png Binary files differnew file mode 100644 index 000000000000..d02de5b2058c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_h.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_h.png Binary files differnew file mode 100644 index 000000000000..cb13b91cfb57 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_out_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_roam.png Binary files differnew file mode 100644 index 000000000000..1eb0142fcd1c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_connected_roam.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_1x.png Binary files differnew file mode 100644 index 000000000000..4c8e7c369d98 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_3g.png Binary files differnew file mode 100644 index 000000000000..657dc04829e7 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_4g.png Binary files differnew file mode 100644 index 000000000000..359e8f87eb69 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_e.png Binary files differnew file mode 100644 index 000000000000..e5b08417613f --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_g.png Binary files differnew file mode 100644 index 000000000000..4fe8df3b3147 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_h.png Binary files differnew file mode 100644 index 000000000000..a7a7beacb295 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_connected_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_1x.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_1x.png Binary files differnew file mode 100644 index 000000000000..39dfcd3d4101 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_3g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_3g.png Binary files differnew file mode 100644 index 000000000000..e78d872920b9 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_4g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_4g.png Binary files differnew file mode 100644 index 000000000000..456d0b6ef060 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_e.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_e.png Binary files differnew file mode 100644 index 000000000000..ad73252ee034 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_g.png Binary files differnew file mode 100644 index 000000000000..d02de5b2058c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_h.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_h.png Binary files differnew file mode 100644 index 000000000000..cb13b91cfb57 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_in_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_1x.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_1x.png Binary files differnew file mode 100644 index 000000000000..39dfcd3d4101 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_3g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_3g.png Binary files differnew file mode 100644 index 000000000000..e78d872920b9 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_4g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_4g.png Binary files differnew file mode 100644 index 000000000000..456d0b6ef060 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_e.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_e.png Binary files differnew file mode 100644 index 000000000000..ad73252ee034 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_g.png Binary files differnew file mode 100644 index 000000000000..d02de5b2058c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_h.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_h.png Binary files differnew file mode 100644 index 000000000000..cb13b91cfb57 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_inandout_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_1x.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_1x.png Binary files differnew file mode 100644 index 000000000000..39dfcd3d4101 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_3g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_3g.png Binary files differnew file mode 100644 index 000000000000..e78d872920b9 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_4g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_4g.png Binary files differnew file mode 100644 index 000000000000..456d0b6ef060 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_e.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_e.png Binary files differnew file mode 100644 index 000000000000..ad73252ee034 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_g.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_g.png Binary files differnew file mode 100644 index 000000000000..d02de5b2058c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_h.png b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_h.png Binary files differnew file mode 100644 index 000000000000..cb13b91cfb57 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-hdpi/stat_sys_data_fully_out_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_1x.png Binary files differnew file mode 100644 index 000000000000..2cbec7b3e097 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_3g.png Binary files differnew file mode 100644 index 000000000000..0efb9c9d09ab --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_4g.png Binary files differnew file mode 100644 index 000000000000..2eae1e1a5659 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_e.png Binary files differnew file mode 100644 index 000000000000..7e82c4cc5d8b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_g.png Binary files differnew file mode 100644 index 000000000000..d37f1e59e78d --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_h.png Binary files differnew file mode 100644 index 000000000000..5f7349e7b1f3 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_1x.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_1x.png Binary files differnew file mode 100644 index 000000000000..f50c9872c7e4 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_3g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_3g.png Binary files differnew file mode 100644 index 000000000000..1fff17eec67b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_4g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_4g.png Binary files differnew file mode 100644 index 000000000000..821d00e650b1 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_e.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_e.png Binary files differnew file mode 100644 index 000000000000..e27439e2f75d --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_g.png Binary files differnew file mode 100644 index 000000000000..8b53f0fd577c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_h.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_h.png Binary files differnew file mode 100644 index 000000000000..a23ec6e5e413 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_in_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_1x.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_1x.png Binary files differnew file mode 100644 index 000000000000..f50c9872c7e4 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_3g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_3g.png Binary files differnew file mode 100644 index 000000000000..1fff17eec67b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_4g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_4g.png Binary files differnew file mode 100644 index 000000000000..4cdce84ba45a --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_e.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_e.png Binary files differnew file mode 100644 index 000000000000..e27439e2f75d --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_g.png Binary files differnew file mode 100644 index 000000000000..8b53f0fd577c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_h.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_h.png Binary files differnew file mode 100644 index 000000000000..a23ec6e5e413 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_inandout_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_1x.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_1x.png Binary files differnew file mode 100644 index 000000000000..f50c9872c7e4 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_3g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_3g.png Binary files differnew file mode 100644 index 000000000000..1fff17eec67b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_4g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_4g.png Binary files differnew file mode 100644 index 000000000000..5a2662a2e851 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_e.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_e.png Binary files differnew file mode 100644 index 000000000000..e27439e2f75d --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_g.png Binary files differnew file mode 100644 index 000000000000..8b53f0fd577c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_h.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_h.png Binary files differnew file mode 100644 index 000000000000..a23ec6e5e413 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_out_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_roam.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_roam.png Binary files differnew file mode 100644 index 000000000000..31358ec65b6b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_connected_roam.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_1x.png Binary files differnew file mode 100644 index 000000000000..e5a348472373 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_3g.png Binary files differnew file mode 100644 index 000000000000..2a3a5dc0c9a1 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_4g.png Binary files differnew file mode 100644 index 000000000000..5dbd1abb95d3 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_e.png Binary files differnew file mode 100644 index 000000000000..51d1f7662a19 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_g.png Binary files differnew file mode 100644 index 000000000000..10d81caff64a --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_h.png Binary files differnew file mode 100644 index 000000000000..1d9bda09413b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_connected_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_1x.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_1x.png Binary files differnew file mode 100644 index 000000000000..f50c9872c7e4 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_3g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_3g.png Binary files differnew file mode 100644 index 000000000000..1fff17eec67b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_4g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_4g.png Binary files differnew file mode 100644 index 000000000000..5a2662a2e851 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_e.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_e.png Binary files differnew file mode 100644 index 000000000000..e27439e2f75d --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_g.png Binary files differnew file mode 100644 index 000000000000..8b53f0fd577c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_h.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_h.png Binary files differnew file mode 100644 index 000000000000..a23ec6e5e413 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_in_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_1x.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_1x.png Binary files differnew file mode 100644 index 000000000000..f50c9872c7e4 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_3g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_3g.png Binary files differnew file mode 100644 index 000000000000..1fff17eec67b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_4g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_4g.png Binary files differnew file mode 100644 index 000000000000..5a2662a2e851 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_e.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_e.png Binary files differnew file mode 100644 index 000000000000..e27439e2f75d --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_g.png Binary files differnew file mode 100644 index 000000000000..8b53f0fd577c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_h.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_h.png Binary files differnew file mode 100644 index 000000000000..a23ec6e5e413 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_inandout_h.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_1x.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_1x.png Binary files differnew file mode 100644 index 000000000000..f50c9872c7e4 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_1x.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_3g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_3g.png Binary files differnew file mode 100644 index 000000000000..1fff17eec67b --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_3g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_4g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_4g.png Binary files differnew file mode 100644 index 000000000000..5a2662a2e851 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_4g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_e.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_e.png Binary files differnew file mode 100644 index 000000000000..e27439e2f75d --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_e.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_g.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_g.png Binary files differnew file mode 100644 index 000000000000..8b53f0fd577c --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_g.png diff --git a/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_h.png b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_h.png Binary files differnew file mode 100644 index 000000000000..a23ec6e5e413 --- /dev/null +++ b/packages/SystemUI/res/drawable-xlarge-mdpi/stat_sys_data_fully_out_h.png diff --git a/packages/SystemUI/res/drawable/status_bar_ticker_background.xml b/packages/SystemUI/res/drawable/status_bar_ticker_background.xml index c230358e077f..83524a658134 100644 --- a/packages/SystemUI/res/drawable/status_bar_ticker_background.xml +++ b/packages/SystemUI/res/drawable/status_bar_ticker_background.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project +<!-- Copyright (C) 2011 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,14 +14,8 @@ limitations under the License. --> -<layer-list +<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:opacity="translucent" - > - <item - android:drawable="@drawable/ticker_background_color" - android:top="12dp" - /> -</layer-list> - - + android:tileMode="repeat" + android:src="@drawable/status_bar_ticker_tile" + /> diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index 852b72974f37..6c173c932b3d 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -40,23 +40,24 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" + android:layout_marginTop="1dp" /> <!-- navigation controls --> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" + android:layout_width="80dip" + android:layout_height="match_parent" + android:src="@drawable/ic_sysbar_back" + android:layout_alignParentLeft="true" + systemui:keyCode="4" + /> <LinearLayout android:id="@+id/navigationArea" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_alignParentLeft="true" + android:layout_toRightOf="@+id/back" android:orientation="horizontal" > - - <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" - android:layout_width="80dip" - android:layout_height="match_parent" - android:src="@drawable/ic_sysbar_back" - systemui:keyCode="4" - /> <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" android:layout_width="80dip" android:layout_height="match_parent" diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_notification_area.xml b/packages/SystemUI/res/layout-xlarge/status_bar_notification_area.xml index 2ee2ac427e98..0925f775146a 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_notification_area.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_notification_area.xml @@ -45,7 +45,6 @@ android:id="@+id/notificationIcons" android:layout_width="wrap_content" android:layout_height="match_parent" - android:orientation="horizontal" > <view class="com.android.systemui.statusbar.tablet.NotificationIconArea$IconLayout" @@ -55,6 +54,14 @@ android:layout_gravity="center_vertical" android:layout_marginLeft="8dp" /> + <View + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_alignLeft="@id/icons" + android:layout_alignRight="@id/icons" + android:background="@drawable/notification_icon_area_smoke" + android:clickable="false" + /> </com.android.systemui.statusbar.tablet.NotificationIconArea> </LinearLayout> diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_notification_row.xml b/packages/SystemUI/res/layout-xlarge/status_bar_notification_row.xml index 0f3f5f0afb10..8e456b2d701f 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_notification_row.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_notification_row.xml @@ -27,7 +27,7 @@ <com.android.systemui.statusbar.LatestItemView android:id="@+id/content" android:layout_width="match_parent" - android:layout_height="64sp" + android:layout_height="64dp" android:layout_alignParentTop="true" android:layout_toRightOf="@id/large_icon" android:layout_toLeftOf="@id/veto" diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml index a1216aa86029..ecd2b6f225c7 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_recent_panel.xml @@ -30,7 +30,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentBottom="true" - android:paddingBottom="48dip" + android:paddingBottom="@*android:dimen/status_bar_height" android:clipToPadding="false"> <LinearLayout android:id="@+id/recents_glow" @@ -52,4 +52,20 @@ </FrameLayout> + <!-- The outer FrameLayout is just used as an opaque background for the dismiss icon --> + <FrameLayout + android:layout_width="80px" + android:layout_height="@*android:dimen/status_bar_height" + android:layout_alignParentBottom="true" + android:layout_alignParentLeft="true" + android:background="#ff000000"> + + <View android:id="@+id/recents_dismiss_button" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/ic_sysbar_back_ime" + /> + + </FrameLayout> + </com.android.systemui.statusbar.tablet.RecentAppsPanel> diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_settings_view.xml b/packages/SystemUI/res/layout-xlarge/status_bar_settings_view.xml index 20a992dae4b8..d0afbb232875 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_settings_view.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_settings_view.xml @@ -21,7 +21,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:background="@drawable/status_bar_item_background" android:paddingRight="48dp" > diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_ticker_compat.xml b/packages/SystemUI/res/layout-xlarge/status_bar_ticker_compat.xml index 6de76977aea0..d963de163f51 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_ticker_compat.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_ticker_compat.xml @@ -18,9 +18,9 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="@*android:dimen/status_bar_height" + android:layout_height="match_parent" android:orientation="horizontal" - android:background="@drawable/status_bar_ticker_background" + android:gravity="bottom" > <ImageView @@ -30,29 +30,38 @@ android:scaleType="center" android:visibility="gone" /> - - <ImageView android:id="@+id/left_icon" - android:layout_width="64dp" - android:layout_height="match_parent" - android:scaleType="center" - android:visibility="gone" - /> - <TextView android:id="@+id/text" - android:textAppearance="@*android:style/TextAppearance.StatusBar.Ticker" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="center_vertical" - android:layout_marginLeft="12dp" - android:gravity="center_vertical" - android:maxLines="2" - /> + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="@*android:dimen/status_bar_height" + android:layout_weight="1" + android:background="@drawable/status_bar_ticker_background" + > + + <ImageView android:id="@+id/left_icon" + android:layout_width="64dp" + android:layout_height="match_parent" + android:scaleType="center" + android:visibility="gone" + /> - <ImageView android:id="@+id/right_icon" - android:layout_width="64dp" - android:layout_height="match_parent" - android:scaleType="center" - android:visibility="gone" - /> + <TextView android:id="@+id/text" + android:textAppearance="@*android:style/TextAppearance.StatusBar.Ticker" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center_vertical" + android:layout_marginLeft="12dp" + android:gravity="center_vertical" + android:maxLines="2" + /> + + <ImageView android:id="@+id/right_icon" + android:layout_width="64dp" + android:layout_height="match_parent" + android:scaleType="center" + android:visibility="gone" + /> + + </LinearLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_ticker_panel.xml b/packages/SystemUI/res/layout-xlarge/status_bar_ticker_panel.xml index d570acec10c6..6cd8899b3415 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_ticker_panel.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_ticker_panel.xml @@ -18,14 +18,10 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:orientation="horizontal" - android:background="@drawable/status_bar_ticker_background" android:gravity="bottom" > - <!-- - android:background="@drawable/ticker_background" - --> <ImageView android:id="@+id/large_icon" @@ -34,6 +30,12 @@ android:scaleType="center" android:visibility="gone" /> - <!-- TODO: scaleType should be top-left but ImageView doesn't support that. --> + <FrameLayout + android:id="@+id/ticker_expanded" + android:layout_weight="1" + android:layout_height="@*android:dimen/status_bar_height" + android:layout_width="match_parent" + android:background="@drawable/status_bar_ticker_background" + /> </LinearLayout> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index b0eac55e4d54..b5e59353a201 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"التنبيهات"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"حديثة"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"ليس هناك أية تطبيقات حديثة."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"التطبيقات"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 53c44c688fb1..a31af2210a8e 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Известия"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Скорошни"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Няма скорошни приложения."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Приложения"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 168d8af9a231..1596717e8485 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificacions"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recents"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"No hi ha aplicacions recents."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplicacions"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-cs-land/strings.xml b/packages/SystemUI/res/values-cs-land/strings.xml new file mode 100644 index 000000000000..0d7682d2d181 --- /dev/null +++ b/packages/SystemUI/res/values-cs-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Obrazovka je nyní uzamčena v orientaci na šířku."</string> +</resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 1ff4a80109e1..cb1520ebf742 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Oznámení"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Nejnovější"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Žádné nedávno použité aplikace."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplikace"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-da-land/strings.xml b/packages/SystemUI/res/values-da-land/strings.xml new file mode 100644 index 000000000000..0bc7522e7b4d --- /dev/null +++ b/packages/SystemUI/res/values-da-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Skærmen er nu låst i liggende retning."</string> +</resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 969a7d83a0e2..bb36ad764086 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Meddelelser"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Seneste"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Der er ingen nye programmer."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Programmer"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-de-land/strings.xml b/packages/SystemUI/res/values-de-land/strings.xml new file mode 100644 index 000000000000..d4ce8fbbc5ff --- /dev/null +++ b/packages/SystemUI/res/values-de-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Der Bildschirm ist jetzt im Querformat gesperrt."</string> +</resources> diff --git a/packages/SystemUI/res/values-de-xlarge/strings.xml b/packages/SystemUI/res/values-de-xlarge/strings.xml index 73c563c3a4b5..e542638af66e 100644 --- a/packages/SystemUI/res/values-de-xlarge/strings.xml +++ b/packages/SystemUI/res/values-de-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <!-- outdated translation 4341545325987974494 --> <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Alle löschen"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Keine Internetverbindung"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Mit WLAN verbunden"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index cc741ee2674c..53fedbdce58e 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Benachrichtigungen"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Zuletzt verwendet"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Keine neuen Anwendungen"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Apps"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-el-land/strings.xml b/packages/SystemUI/res/values-el-land/strings.xml new file mode 100644 index 000000000000..b30a36e7e9e2 --- /dev/null +++ b/packages/SystemUI/res/values-el-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Η οθόνη έχει κλειδωθεί σε οριζόντιο προσανατολισμό."</string> +</resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 83f29ffb4deb..4b527b11bec6 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Ειδοποιήσεις"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Πρόσφατα"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Δεν υπάρχουν πρόσφατες εφαρμογές."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Εφαρμογές"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 068451e75161..cd7f0a20aab4 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notifications"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"No recent applications."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Apps"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-es-land/strings.xml b/packages/SystemUI/res/values-es-land/strings.xml new file mode 100644 index 000000000000..971f062214ce --- /dev/null +++ b/packages/SystemUI/res/values-es-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"La pantalla está ahora bloqueada en orientación horizontal."</string> +</resources> diff --git a/packages/SystemUI/res/values-es-rUS-land/strings.xml b/packages/SystemUI/res/values-es-rUS-land/strings.xml new file mode 100644 index 000000000000..7be086d34e11 --- /dev/null +++ b/packages/SystemUI/res/values-es-rUS-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"La pantalla está bloqueada en orientación paisaje."</string> +</resources> diff --git a/packages/SystemUI/res/values-es-rUS-xlarge-land/strings.xml b/packages/SystemUI/res/values-es-rUS-xlarge-land/strings.xml deleted file mode 100644 index 78a4c180fffb..000000000000 --- a/packages/SystemUI/res/values-es-rUS-xlarge-land/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- XL --> - <string name="toast_rotation_locked" msgid="2686639138967158852">"La pantalla está bloqueada en orientación paisaje."</string> -</resources> diff --git a/packages/SystemUI/res/values-es-rUS-xlarge-port/strings.xml b/packages/SystemUI/res/values-es-rUS-xlarge-port/strings.xml deleted file mode 100644 index 9daef6a93164..000000000000 --- a/packages/SystemUI/res/values-es-rUS-xlarge-port/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- XL --> - <string name="toast_rotation_locked" msgid="4297721709987511908">"La pantalla está bloqueada en orientación retrato."</string> -</resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index da742e6ec064..a550a0b1ecdb 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -40,10 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificaciones"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"No hay aplicaciones recientes."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> - <!-- no translation found for bluetooth_tethered (7094101612161133267) --> - <skip /> - <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Google Apps"</string> + <!-- outdated translation 8017158699581472359 --> <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth anclado"</string> + <!-- outdated translation 3875357213648023768 --> <string name="status_bar_input_method_settings_configure_input_methods" msgid="737483394044014246">"Configurar métodos de entrada"</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 58046ab3dfe2..97371a41d43a 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificaciones"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"No hay aplicaciones recientes."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplicaciones"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 3c6505107153..eae022cbcd96 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"اعلان ها"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"اخیر"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"برنامه اخیری موجود نیست."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"برنامه های کاربردی"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index cbb2eecc40d4..1eb3c167d928 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Ilmoitukset"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Viimeisimmät"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Ei viimeaikaisia sovelluksia."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Sovellukset"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-fr-land/strings.xml b/packages/SystemUI/res/values-fr-land/strings.xml new file mode 100644 index 000000000000..307b4bcd84f2 --- /dev/null +++ b/packages/SystemUI/res/values-fr-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"L\'écran est désormais verrouillé au format paysage."</string> +</resources> diff --git a/packages/SystemUI/res/values-fr-xlarge/strings.xml b/packages/SystemUI/res/values-fr-xlarge/strings.xml index 76e72211e728..5fc804413405 100644 --- a/packages/SystemUI/res/values-fr-xlarge/strings.xml +++ b/packages/SystemUI/res/values-fr-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <!-- outdated translation 4341545325987974494 --> <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Tout effacer"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Aucune connexion Internet"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Connecté au Wi-Fi"</string> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index d199d9a7cc75..83e070e87930 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notifications"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Récentes"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Aucune application récente"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Applications"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 3e60b8d299cb..d481c4881a88 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Obavijesti"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavni"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Nema nedavnih aplikacija."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplikacije"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index dbcd29d5a436..7b98c472d46f 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Értesítések"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Legutóbbiak"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Nincsenek nemrég használt alkalmazások"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Alkalmazások"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index db87cd3b7e6f..a7926d722843 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Pemberitahuan"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Terbaru"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Tidak ada aplikasi terbaru."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Apps"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-it-land/strings.xml b/packages/SystemUI/res/values-it-land/strings.xml new file mode 100644 index 000000000000..0225572bce4e --- /dev/null +++ b/packages/SystemUI/res/values-it-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Ora lo schermo è bloccato nell\'orientamento orizzontale."</string> +</resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 9d7517954dc9..cfccdafbd50e 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notifiche"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recenti"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Nessuna applicazione recente."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Applicazioni"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 34eb41fcd28d..c6ef37cc5a19 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"התראות"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"אחרונות"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"אין יישומים חדשים."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"יישומים"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-ja-land/strings.xml b/packages/SystemUI/res/values-ja-land/strings.xml new file mode 100644 index 000000000000..80685da585f1 --- /dev/null +++ b/packages/SystemUI/res/values-ja-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"画面を横向きにロックしました。"</string> +</resources> diff --git a/packages/SystemUI/res/values-ja-xlarge/strings.xml b/packages/SystemUI/res/values-ja-xlarge/strings.xml index a6af041938a1..d4ed9588082b 100644 --- a/packages/SystemUI/res/values-ja-xlarge/strings.xml +++ b/packages/SystemUI/res/values-ja-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <!-- outdated translation 4341545325987974494 --> <string name="status_bar_clear_all_button" msgid="4722520806446512408">"すべて消去"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"インターネット未接続"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi接続済み"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 3b598448d655..153831a013a7 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"通知"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"新着"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"新着のアプリケーションはありません。"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"アプリ"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-ko-land/strings.xml b/packages/SystemUI/res/values-ko-land/strings.xml new file mode 100644 index 000000000000..843ce606b9fb --- /dev/null +++ b/packages/SystemUI/res/values-ko-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"화면이 가로 방향으로 잠깁니다."</string> +</resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 35d75036c4f8..0ec819fdabbb 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"알림"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"최근 사용한 앱"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"최근에 사용한 애플리케이션이 없습니다."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"애플리케이션"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index a5848a90b96e..083a0ba1d5d6 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Pranešimai"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Naujos"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Nėra naujausių programų."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Apps"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index cf81e85a6102..e3f31cbadbd2 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Paziņojumi"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Nesens"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Nav nesenu lietojumprogrammu."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Lietotnes"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-nb-land/strings.xml b/packages/SystemUI/res/values-nb-land/strings.xml new file mode 100644 index 000000000000..e7effde2e48a --- /dev/null +++ b/packages/SystemUI/res/values-nb-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Skjermen er nå låst i liggende retning."</string> +</resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 4d6140ff105b..c1ee429c4a90 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Varslinger"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Nylig"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Ingen nylig brukte programmer."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Programmer"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-nl-land/strings.xml b/packages/SystemUI/res/values-nl-land/strings.xml new file mode 100644 index 000000000000..9b31fabe19d8 --- /dev/null +++ b/packages/SystemUI/res/values-nl-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Het scherm is nu vergrendeld in liggende (landschap) stand."</string> +</resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 339d14682f58..bf61e621386d 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Meldingen"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Geen recente toepassingen."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Toepassingen"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-pl-land/strings.xml b/packages/SystemUI/res/values-pl-land/strings.xml new file mode 100644 index 000000000000..c19df7427e5f --- /dev/null +++ b/packages/SystemUI/res/values-pl-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekran jest teraz zablokowany w orientacji poziomej."</string> +</resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index b50c422c9185..8148ed30dc56 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Powiadomienia"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Najnowsze"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Brak ostatnio używanych aplikacji."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplikacje"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-pt-land/strings.xml b/packages/SystemUI/res/values-pt-land/strings.xml new file mode 100644 index 000000000000..a9ad47d25124 --- /dev/null +++ b/packages/SystemUI/res/values-pt-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"A tela está bloqueada na orientação paisagem."</string> +</resources> diff --git a/packages/SystemUI/res/values-pt-rPT-land/strings.xml b/packages/SystemUI/res/values-pt-rPT-land/strings.xml new file mode 100644 index 000000000000..8d46040dc776 --- /dev/null +++ b/packages/SystemUI/res/values-pt-rPT-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"O ecrã está agora bloqueado na orientação horizontal."</string> +</resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 01544b5e9d3f..553e8afc1aa0 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificações"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Nenhuma aplicação recente."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplicações"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-pt-xlarge/strings.xml b/packages/SystemUI/res/values-pt-xlarge/strings.xml index 103b2ad5f3da..27d9ac1e7922 100644 --- a/packages/SystemUI/res/values-pt-xlarge/strings.xml +++ b/packages/SystemUI/res/values-pt-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <!-- outdated translation 4341545325987974494 --> <string name="status_bar_clear_all_button" msgid="4722520806446512408">"Limpar tudo"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"Sem conex. à inter."</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi conectado"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 35ffabbef5a3..0cbbc0089d40 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificações"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Nenhum aplicativo recente."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplicativos"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 4e32019540f1..c2b054fede43 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Notificări"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Nu există aplicaţii recente."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplicaţii"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-ru-land/strings.xml b/packages/SystemUI/res/values-ru-land/strings.xml new file mode 100644 index 000000000000..c475a4730997 --- /dev/null +++ b/packages/SystemUI/res/values-ru-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Экран зафиксирован горизонтально."</string> +</resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 7a6a71e568b7..f6a779eff056 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Уведомления"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Недавние"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Новых приложений нет"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Приложения"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 6b497b9eae44..f535b4855518 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Upozornenia"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Najnovšie"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Žiadne nedávno použité aplikácie."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Aplikácie"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 54145f207a8b..b70ab426a1e9 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Obvestila"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavno"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Ni novih programov."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Programi"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 6ee4009c1250..1e4b221b8ed2 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Обавештења"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Недавно"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Нема недавних апликација"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Apps"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-sv-land/strings.xml b/packages/SystemUI/res/values-sv-land/strings.xml new file mode 100644 index 000000000000..31f598a6904a --- /dev/null +++ b/packages/SystemUI/res/values-sv-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Bildskärmens riktning är nu låst i liggande format."</string> +</resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 99623c3ab206..58774be6c221 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Aviseringar"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Senaste"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Inga nya program."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Appar"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 7d154a6020c6..923b3dba7e16 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"การแจ้งเตือน"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"เมื่อเร็วๆ นี้"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"ไม่มีแอปพลิเคชันล่าสุด"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"แอปพลิเคชัน"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index bb56bc28dc87..888e886bf19b 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Mga Notification"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Kamakailan"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Walang kamakailang mga application."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Apps"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-tr-land/strings.xml b/packages/SystemUI/res/values-tr-land/strings.xml new file mode 100644 index 000000000000..bfe32dbfc6a1 --- /dev/null +++ b/packages/SystemUI/res/values-tr-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekran yatay yönde kilitlendi"</string> +</resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 361d7ee32242..68d5e8587657 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Bildirimler"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"En Son Görevler"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Hiçbir yeni uygulama yok."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Uygulamalar"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index ae40e56f6dcd..8c47d4858dd4 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Сповіщення"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Останні"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Немає останніх програм."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Служби"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 2ec07f1d5caf..248626a2b795 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Thông báo"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Gần đây"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"Không có ứng dụng nào gần đây."</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"Ứng dụng"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-xlarge/colors.xml b/packages/SystemUI/res/values-xlarge/colors.xml index 14161c3f0c0f..43af2c7404b3 100644 --- a/packages/SystemUI/res/values-xlarge/colors.xml +++ b/packages/SystemUI/res/values-xlarge/colors.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="status_bar_background">#000000</drawable> + <drawable name="notification_icon_area_smoke">#A0000000</drawable> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN-land/strings.xml b/packages/SystemUI/res/values-zh-rCN-land/strings.xml new file mode 100644 index 000000000000..52af5287e429 --- /dev/null +++ b/packages/SystemUI/res/values-zh-rCN-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"屏幕的横向浏览模式已锁定。"</string> +</resources> diff --git a/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml index 59c094e3479f..b25044a60965 100644 --- a/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml @@ -19,8 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> - <skip /> + <!-- outdated translation 4341545325987974494 --> <string name="status_bar_clear_all_button" msgid="4722520806446512408">"全部清除"</string> <string name="status_bar_settings_signal_meter_disconnected" msgid="4684094636492991496">"未连接至互联网"</string> <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="1456658018593445677">"Wi-Fi 已连接"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index cb1561350c8c..52585c36b8ad 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"通知"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"近期任务"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"没有最近使用的应用程序。"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"应用程序"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/res/values-zh-rTW-land/strings.xml b/packages/SystemUI/res/values-zh-rTW-land/strings.xml new file mode 100644 index 000000000000..f18fda111a4c --- /dev/null +++ b/packages/SystemUI/res/values-zh-rTW-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- outdated translation 2686639138967158852 --> <string name="toast_rotation_locked" msgid="7609673011431556092">"螢幕目前鎖定為橫向瀏覽模式。"</string> +</resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 960130ffecc0..879dd44b376a 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -40,8 +40,7 @@ <string name="status_bar_settings_notifications" msgid="397146176280905137">"通知"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"最新的"</string> <string name="recent_tasks_empty" msgid="1905484479067697884">"沒有最近用過的應用程式。"</string> - <!-- no translation found for recent_tasks_app_label (3796483981246752469) --> - <skip /> + <!-- outdated translation 5550538721034982973 --> <string name="recent_tasks_app_label" msgid="3796483981246752469">"應用程式"</string> <!-- no translation found for bluetooth_tethered (7094101612161133267) --> <skip /> <!-- no translation found for status_bar_input_method_settings_configure_input_methods (737483394044014246) --> diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java index a81484cbf92a..f07f1d7d8555 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java @@ -218,7 +218,6 @@ public class PowerUI extends SystemUI { mLowBatteryDialog = d; } -if (false) { // getRingtone ANRs final ContentResolver cr = mContext.getContentResolver(); if (Settings.System.getInt(cr, Settings.System.POWER_SOUNDS_ENABLED, 1) == 1) { final String soundPath = Settings.System.getString(cr, @@ -234,7 +233,6 @@ if (false) { // getRingtone ANRs } } } -} } void dismissInvalidChargerDialog() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 37939df08aac..76aa7934f4ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -82,7 +82,7 @@ public class CommandQueue extends IStatusBar.Stub { public void animateCollapse(); public void setLightsOn(boolean on); public void setMenuKeyVisible(boolean visible); - public void setIMEButtonVisible(IBinder token, boolean visible); + public void setImeWindowStatus(IBinder token, int vis, int backDisposition); } public CommandQueue(Callbacks callbacks, StatusBarIconList list) { @@ -165,10 +165,11 @@ public class CommandQueue extends IStatusBar.Stub { } } - public void setIMEButtonVisible(IBinder token, boolean visible) { + public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { synchronized (mList) { mHandler.removeMessages(MSG_SHOW_IME_BUTTON); - mHandler.obtainMessage(MSG_SHOW_IME_BUTTON, visible ? 1 : 0, 0, token).sendToTarget(); + mHandler.obtainMessage(MSG_SHOW_IME_BUTTON, vis, backDisposition, token) + .sendToTarget(); } } @@ -233,7 +234,7 @@ public class CommandQueue extends IStatusBar.Stub { mCallbacks.setMenuKeyVisible(msg.arg1 != 0); break; case MSG_SHOW_IME_BUTTON: - mCallbacks.setIMEButtonVisible((IBinder)msg.obj, msg.arg1 != 0); + mCallbacks.setImeWindowStatus((IBinder)msg.obj, msg.arg1, msg.arg2); break; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java index 8fca759ebf15..da8e831710ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java @@ -67,7 +67,7 @@ public abstract class StatusBar extends SystemUI implements CommandQueue.Callbac mCommandQueue = new CommandQueue(this, iconList); mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); - int[] switches = new int[4]; + int[] switches = new int[5]; ArrayList<IBinder> binders = new ArrayList<IBinder>(); try { mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications, @@ -80,7 +80,7 @@ public abstract class StatusBar extends SystemUI implements CommandQueue.Callbac setLightsOn(switches[1] != 0); setMenuKeyVisible(switches[2] != 0); // StatusBarManagerService has a back up of IME token and it's restored here. - setIMEButtonVisible(binders.get(0), switches[3] != 0); + setImeWindowStatus(binders.get(0), switches[3], switches[4]); // Set up the initial icon state int N = iconList.size(); 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 132433b40cd7..950539112b06 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1020,7 +1020,7 @@ public class PhoneStatusBar extends StatusBar { // Not supported public void setMenuKeyVisible(boolean visible) { } - public void setIMEButtonVisible(IBinder token, boolean visible) { } + public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { } private class Launcher implements View.OnClickListener { private PendingIntent mIntent; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java index 28f485c1e350..f131111075d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java @@ -53,7 +53,7 @@ public class InputMethodButton extends ImageView { private final int mId; private ImageView mIcon; private IBinder mToken; - private boolean mKeyboardVisible = false; + private boolean mShowButton = false; private boolean mScreenLocked = false; private InputMethodInfo mShortcutInfo; private InputMethodSubtype mShortcutSubtype; @@ -144,7 +144,7 @@ public class InputMethodButton extends ImageView { // * There are no explicitly enabled (by the user) subtypes of the IME, or the IME doesn't have // its subtypes at all private boolean needsToShowIMEButton() { - if (!mKeyboardVisible || mScreenLocked) return false; + if (!mShowButton || mScreenLocked) return false; List<InputMethodInfo> imis = mImm.getEnabledInputMethodList(); final int size = imis.size(); final int visibility = loadInputMethodSelectorVisibility(); @@ -194,9 +194,9 @@ public class InputMethodButton extends ImageView { } } - public void setIMEButtonVisible(IBinder token, boolean keyboardVisible) { + public void setImeWindowStatus(IBinder token, boolean showButton) { mToken = token; - mKeyboardVisible = keyboardVisible; + mShowButton = showButton; refreshStatusIcon(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java index a1cc274ef99c..474ef456c37c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java @@ -75,6 +75,7 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O private LinearLayout mInputMethodMenuList; private PackageManager mPackageManager; private String mEnabledInputMethodAndSubtypesCacheStr; + private String mLastSystemLocaleString; private View mConfigureImeShortcut; private class InputMethodComparator implements Comparator<InputMethodInfo> { @@ -335,8 +336,10 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O getEnabledInputMethodAndSubtypeList() { String newEnabledIMIs = Settings.Secure.getString( mContext.getContentResolver(), Settings.Secure.ENABLED_INPUT_METHODS); - if (mEnabledInputMethodAndSubtypesCacheStr == null - || !mEnabledInputMethodAndSubtypesCacheStr.equals(newEnabledIMIs) + String currentSystemLocaleString = + mContext.getResources().getConfiguration().locale.toString(); + if (!TextUtils.equals(mEnabledInputMethodAndSubtypesCacheStr, newEnabledIMIs) + || !TextUtils.equals(mLastSystemLocaleString, currentSystemLocaleString) || mPackageChanged) { mEnabledInputMethodAndSubtypesCache.clear(); final List<InputMethodInfo> imis = mImm.getEnabledInputMethodList(); @@ -346,6 +349,7 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O } mEnabledInputMethodAndSubtypesCacheStr = newEnabledIMIs; mPackageChanged = false; + mLastSystemLocaleString = currentSystemLocaleString; } return mEnabledInputMethodAndSubtypesCache; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java index df29f95ed5e4..3d6c1a2f8a19 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java @@ -23,13 +23,14 @@ import android.util.AttributeSet; import android.util.Slog; import android.view.View; import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.ImageView; import android.view.MotionEvent; import com.android.systemui.R; -public class NotificationIconArea extends LinearLayout { +public class NotificationIconArea extends RelativeLayout { private static final String TAG = "NotificationIconArea"; IconLayout mIconLayout; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java index 1004e18ee064..372aa90410eb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java @@ -60,6 +60,9 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, View mSettingsView; ViewGroup mContentParent; + // amount to slide mContentParent down by when mContentFrame is missing + float mContentFrameMissingTranslation; + Choreographer mChoreo = new Choreographer(); public NotificationPanel(Context context, AttributeSet attrs) { @@ -87,11 +90,17 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, mNotificationScroller = findViewById(R.id.notification_scroller); mContentFrame = (ViewGroup)findViewById(R.id.content_frame); + mContentFrameMissingTranslation = + mContentFrame.getBackground().getMinimumHeight() + 10; + + mShowing = false; + + setContentFrameVisible(mNotificationCount > 0, false); } public void show(boolean show, boolean animate) { if (show && !mShowing) { - setContentFrameVisible(mNotificationCount > 0, false); + setContentFrameVisible(mSettingsView != null || mNotificationCount > 0, false); } if (animate) { @@ -120,7 +129,7 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, public void onVisibilityChanged(View v, int vis) { super.onVisibilityChanged(v, vis); // when we hide, put back the notifications - if (!isShown()) { + if (vis != View.VISIBLE) { if (mSettingsView != null) removeSettingsView(); mNotificationScroller.setVisibility(View.VISIBLE); mNotificationScroller.setAlpha(1f); @@ -161,10 +170,8 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, setContentFrameVisible(n > 0, false); } else if (mSettingsView == null) { // we're looking at the notifications; time to maybe make some changes - if (mNotificationCount == 0 && n > 0) { - setContentFrameVisible(true, true); - } else if (mNotificationCount > 0 && n == 0) { - setContentFrameVisible(false, true); + if (mNotificationCount != n) { + setContentFrameVisible(n > 0, true); } } mNotificationCount = n; @@ -173,22 +180,35 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, public void setContentFrameVisible(final boolean showing, boolean animate) { if (!animate) { mContentFrame.setVisibility(showing ? View.VISIBLE : View.GONE); - mContentParent.setTranslationY(showing ? 0f : 100f); + mContentFrame.setAlpha(1f); + // the translation will be patched up when the window is slid into place return; } - mContentFrame.setVisibility(showing ? View.VISIBLE : View.GONE); + if (showing) { + mContentFrame.setVisibility(View.VISIBLE); + } AnimatorSet set = new AnimatorSet(); - float adjust = mContentFrame.getBackground().getMinimumHeight() + 8; // fudge factor set.play(ObjectAnimator.ofFloat( mContentFrame, "alpha", showing ? 0f : 1f, showing ? 1f : 0f)) .with(ObjectAnimator.ofFloat( mContentParent, "translationY", - showing ? adjust : 0f, - showing ? 0f : adjust)); + showing ? mContentFrameMissingTranslation : 0f, + showing ? 0f : mContentFrameMissingTranslation)) + ; + set.setDuration(200); + if (!showing) { + set.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator _a) { + mContentFrame.setVisibility(View.GONE); + mContentFrame.setAlpha(1f); + } + }); + } set.start(); } @@ -238,10 +258,15 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, } public boolean isInContentArea(int x, int y) { - mContentArea.left = mContentFrame.getLeft() + mContentFrame.getPaddingLeft(); - mContentArea.top = mTitleArea.getTop() + mTitleArea.getPaddingTop(); - mContentArea.right = mContentFrame.getRight() - mContentFrame.getPaddingRight(); - mContentArea.bottom = mContentFrame.getBottom() - mContentFrame.getPaddingBottom(); + mContentArea.left = mTitleArea.getLeft() + mTitleArea.getPaddingLeft(); + mContentArea.top = mTitleArea.getTop() + mTitleArea.getPaddingTop() + + (int)mContentParent.getTranslationY(); // account for any adjustment + mContentArea.right = mTitleArea.getRight() - mTitleArea.getPaddingRight(); + + View theBottom = (mContentFrame.getVisibility() == View.VISIBLE) + ? mContentFrame : mTitleArea; + mContentArea.bottom = theBottom.getBottom() - theBottom.getPaddingBottom(); + offsetDescendantRectToMyCoords(mContentParent, mContentArea); return mContentArea.contains(x, y); } @@ -291,12 +316,16 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, if (appearing) { // we want to go from near-the-top to the top, unless we're half-open in the right // general vicinity - start = (y < HYPERSPACE_OFFRAMP) ? y : HYPERSPACE_OFFRAMP; end = 0; + if (mNotificationCount == 0) { + end += mContentFrameMissingTranslation; + } + start = (y < (HYPERSPACE_OFFRAMP+end)) ? y : (HYPERSPACE_OFFRAMP+end); } else { start = y; end = y + HYPERSPACE_OFFRAMP; } + Animator posAnim = ObjectAnimator.ofFloat(mContentParent, "translationY", start, end); posAnim.setInterpolator(appearing diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java index a5e2fda01913..86c3e7597884 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java @@ -70,6 +70,7 @@ public class RecentAppsPanel extends RelativeLayout implements StatusBarPanel, O private Bitmap mGlowBitmap; private boolean mShowing; private Choreographer mChoreo; + private View mRecentsDismissButton; static class ActivityDescription { int id; @@ -272,6 +273,12 @@ public class RecentAppsPanel extends RelativeLayout implements StatusBarPanel, O mRecentsGlowView = findViewById(R.id.recents_glow); mRecentsScrim = (View) findViewById(R.id.recents_bg_protect); mChoreo = new Choreographer(this, mRecentsScrim, mRecentsGlowView); + mRecentsDismissButton = findViewById(R.id.recents_dismiss_button); + mRecentsDismissButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + hide(true); + } + }); // In order to save space, we make the background texture repeat in the Y direction if (mRecentsScrim != null && mRecentsScrim.getBackground() instanceof BitmapDrawable) { @@ -399,8 +406,7 @@ public class RecentAppsPanel extends RelativeLayout implements StatusBarPanel, O } else { // Immediately hide this panel mShowing = false; - setVisibility(View.GONE); - // mBar.animateCollapse(); + hide(false); } } @@ -445,8 +451,8 @@ public class RecentAppsPanel extends RelativeLayout implements StatusBarPanel, O appIcon.setImageDrawable(activityDescription.icon); appLabel.setText(activityDescription.label); appDesc.setText(activityDescription.description); - view.setOnClickListener(this); - view.setTag(activityDescription); + appThumbnail.setOnClickListener(this); + appThumbnail.setTag(activityDescription); mRecentsContainer.addView(view); } @@ -469,7 +475,13 @@ public class RecentAppsPanel extends RelativeLayout implements StatusBarPanel, O if (DEBUG) Log.v(TAG, "Starting activity " + intent); getContext().startActivity(intent); } + hide(true); + } + + private void hide(boolean animate) { setVisibility(View.GONE); - mBar.animateCollapse(); + if (animate) { + mBar.animateCollapse(); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index d46de15c8878..6c8a20d57329 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -33,6 +33,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; +import android.inputmethodservice.InputMethodService; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; @@ -97,8 +98,6 @@ public class TabletStatusBar extends StatusBar implements // Fitts' Law assistance for LatinIME; TODO: replace with a more general approach private static final boolean FAKE_SPACE_BAR = true; - public static final int LIGHTS_ON_DELAY = 5000; - // The height of the bar, as definied by the build. It may be taller if we're plugged // into hdmi. int mNaturalBarHeight = -1; @@ -369,8 +368,8 @@ public class TabletStatusBar extends StatusBar implements (ImageView)sb.findViewById(R.id.network_type)); // The navigation buttons + mBackButton = (ImageView)sb.findViewById(R.id.back); mNavigationArea = sb.findViewById(R.id.navigationArea); - mBackButton = (ImageView)mNavigationArea.findViewById(R.id.back); mHomeButton = mNavigationArea.findViewById(R.id.home); mMenuButton = mNavigationArea.findViewById(R.id.menu); mRecentButton = mNavigationArea.findViewById(R.id.recent_apps); @@ -391,8 +390,17 @@ public class TabletStatusBar extends StatusBar implements new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { + // even though setting the systemUI visibility below will turn these views + // on, we need them to come up faster so that they can catch this motion + // event mShadow.setVisibility(View.GONE); mBarContents.setVisibility(View.VISIBLE); + + try { + mBarService.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); + } catch (RemoteException ex) { + // system process dead + } } return false; } @@ -785,6 +793,18 @@ public class TabletStatusBar extends StatusBar implements mInputMethodSwitchButton.setScreenLocked(false); } } + if ((diff & StatusBarManager.DISABLE_BACK) != 0) { + if ((state & StatusBarManager.DISABLE_BACK) != 0) { + Slog.i(TAG, "DISABLE_BACK: yes"); + mBackButton.setVisibility(View.INVISIBLE); + mInputMethodSwitchButton.setScreenLocked(true); + } else { + Slog.i(TAG, "DISABLE_BACK: no"); + mBackButton.setVisibility(View.VISIBLE); + mInputMethodSwitchButton.setScreenLocked(false); + } + } + } private boolean hasTicker(Notification n) { @@ -856,17 +876,32 @@ public class TabletStatusBar extends StatusBar implements if (visible) setLightsOn(true); } - public void setIMEButtonVisible(IBinder token, boolean visible) { - if (DEBUG) { - Slog.d(TAG, (visible?"showing":"hiding") + " the IME button"); - } - mInputMethodSwitchButton.setIMEButtonVisible(token, visible); + public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { + mInputMethodSwitchButton.setImeWindowStatus(token, + (vis & InputMethodService.IME_ACTIVE) != 0); updateNotificationIcons(); mInputMethodsPanel.setImeToken(token); - mBackButton.setImageResource( - visible ? R.drawable.ic_sysbar_back_ime : R.drawable.ic_sysbar_back); + int res; + switch (backDisposition) { + case InputMethodService.BACK_DISPOSITION_WILL_NOT_DISMISS: + res = R.drawable.ic_sysbar_back; + break; + case InputMethodService.BACK_DISPOSITION_WILL_DISMISS: + res = R.drawable.ic_sysbar_back_ime; + break; + case InputMethodService.BACK_DISPOSITION_DEFAULT: + default: + if ((vis & InputMethodService.IME_VISIBLE) != 0) { + res = R.drawable.ic_sysbar_back_ime; + } else { + res = R.drawable.ic_sysbar_back; + } + break; + } + mBackButton.setImageResource(res); if (FAKE_SPACE_BAR) { - mFakeSpaceBar.setVisibility(visible ? View.VISIBLE : View.GONE); + mFakeSpaceBar.setVisibility(((vis & InputMethodService.IME_VISIBLE) != 0) + ? View.VISIBLE : View.GONE); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java index 440d68081fd0..a072aedd08b6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletTicker.java @@ -38,7 +38,7 @@ import android.view.WindowManager; import android.view.WindowManagerImpl; import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.LinearLayout; +import android.widget.FrameLayout; import android.widget.TextView; import com.android.internal.statusbar.StatusBarIcon; @@ -53,7 +53,7 @@ public class TabletTicker private static final String TAG = "StatusBar.TabletTicker"; - private static final boolean CLICKABLE_TICKER = false; + private static final boolean CLICKABLE_TICKER = true; // 3 is enough to let us see most cases, but not get so far behind that it's too annoying. private static final int QUEUE_LENGTH = 3; @@ -173,6 +173,7 @@ public class TabletTicker mWindow = makeWindow(); WindowManagerImpl.getDefault().addView(mWindow, mWindow.getLayoutParams()); } + mWindow.addView(mCurrentView); sendEmptyMessageDelayed(MSG_ADVANCE, ADVANCE_DELAY); break; @@ -259,10 +260,11 @@ public class TabletTicker } if (n.tickerView != null) { group = (ViewGroup)inflater.inflate(R.layout.status_bar_ticker_panel, null, false); + ViewGroup content = (FrameLayout) group.findViewById(R.id.ticker_expanded); View expanded = null; Exception exception = null; try { - expanded = n.tickerView.apply(mContext, group); + expanded = n.tickerView.apply(mContext, content); } catch (RuntimeException e) { exception = e; @@ -273,12 +275,10 @@ public class TabletTicker Slog.e(TAG, "couldn't inflate view for notification " + ident, exception); return null; } - final int statusBarHeight = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height); - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, statusBarHeight, 1.0f); - lp.gravity = Gravity.BOTTOM; - group.addView(expanded, lp); + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT); + content.addView(expanded, lp); } else if (n.tickerText != null) { group = (ViewGroup)inflater.inflate(R.layout.status_bar_ticker_compat, mWindow, false); final Drawable icon = StatusBarIconView.getIcon(mContext, @@ -300,8 +300,16 @@ public class TabletTicker if (CLICKABLE_TICKER) { PendingIntent contentIntent = notification.notification.contentIntent; if (contentIntent != null) { - group.setOnClickListener(mBar.makeClicker(contentIntent, - notification.pkg, notification.tag, notification.id)); + // create the usual notification clicker, but chain it together with a halt() call + // to abort the ticker too + final View.OnClickListener clicker = mBar.makeClicker(contentIntent, + notification.pkg, notification.tag, notification.id); + group.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + halt(); + clicker.onClick(v); + } + }); } else { group.setOnClickListener(null); } diff --git a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java index b225e56b3b72..e775dac88c89 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java @@ -62,7 +62,7 @@ public class KeyguardUpdateMonitor { static private final String TAG = "KeyguardUpdateMonitor"; static private final boolean DEBUG = false; - private static final int LOW_BATTERY_THRESHOLD = 20; + /* package */ static final int LOW_BATTERY_THRESHOLD = 20; private final Context mContext; diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java index 6b524549faa0..36afd750c528 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java @@ -50,6 +50,8 @@ public abstract class KeyguardViewBase extends FrameLayout { public KeyguardViewBase(Context context) { super(context); + setSystemUiVisibility(STATUS_BAR_DISABLE_BACK); + // This is a faster way to draw the background on devices without hardware acceleration setBackgroundDrawable(new Drawable() { @Override @@ -235,4 +237,9 @@ public abstract class KeyguardViewBase extends FrameLayout { return false; } + @Override + public void dispatchSystemUiVisibilityChanged(int visibility) { + super.dispatchSystemUiVisibilityChanged(visibility); + setSystemUiVisibility(STATUS_BAR_DISABLE_BACK); + } } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 88f30eda57e7..8afb53e1aaca 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -2026,6 +2026,14 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } + @Override + public void setBackgroundDrawable(Drawable d) { + super.setBackgroundDrawable(d); + if (getWindowToken() != null) { + updateWindowResizeState(); + } + } + public void setWindowFrame(Drawable drawable) { if (getForeground() != drawable) { setForeground(drawable); @@ -2126,10 +2134,18 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } + void updateWindowResizeState() { + Drawable bg = getBackground(); + hackTurnOffWindowResizeAnim(bg == null || bg.getOpacity() + != PixelFormat.OPAQUE); + } + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); + updateWindowResizeState(); + final Callback cb = getCallback(); if (cb != null && mFeatureId < 0) { cb.onAttachedToWindow(); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 9b5c42e158a3..066daa89d267 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1402,7 +1402,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, metaState); if (shortcutIntent != null) { shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(shortcutIntent); + try { + mContext.startActivity(shortcutIntent); + } catch (ActivityNotFoundException ex) { + Slog.w(TAG, "Dropping shortcut key combination because " + + "the activity to which it is registered was not found: " + + KeyEvent.keyCodeToString(mShortcutKeyPressed) + + "+" + KeyEvent.keyCodeToString(keyCode), ex); + } } else { Slog.i(TAG, "Dropping unregistered shortcut key combination: " + KeyEvent.keyCodeToString(mShortcutKeyPressed) @@ -1892,14 +1899,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { + (topNeedsMenu ? "needs" : "does not need") + " the MENU key"); - final boolean changedFullscreen = (mTopIsFullscreen != topIsFullscreen); + mTopIsFullscreen = topIsFullscreen; final boolean changedMenu = (topNeedsMenu != mShowMenuKey); - if (changedFullscreen || changedMenu) { - final boolean topIsFullscreenF = topIsFullscreen; + if (changedMenu) { final boolean topNeedsMenuF = topNeedsMenu; - mTopIsFullscreen = topIsFullscreen; mShowMenuKey = topNeedsMenu; mHandler.post(new Runnable() { @@ -1918,9 +1923,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (changedMenu) { sbs.setMenuKeyVisible(topNeedsMenuF); } - if (changedFullscreen) { - sbs.setActiveWindowIsFullscreen(topIsFullscreenF); - } } catch (RemoteException e) { // This should be impossible because we're in the same process. mStatusBarService = null; @@ -2860,7 +2862,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // If there is no window focused, there will be nobody to handle the events // anyway, so just hang on in whatever state we're in until things settle down. if (mFocusedWindow != null) { - final int visibility = mFocusedWindow.getAttrs().systemUiVisibility; + final WindowManager.LayoutParams params = mFocusedWindow.getAttrs(); + final int visibility = params.systemUiVisibility | params.subtreeSystemUiVisibility; mHandler.post(new Runnable() { public void run() { if (mStatusBarService == null) { diff --git a/policy/src/com/android/internal/policy/impl/StatusView.java b/policy/src/com/android/internal/policy/impl/StatusView.java index 4b91b6564bd4..1732adb4cf71 100644 --- a/policy/src/com/android/internal/policy/impl/StatusView.java +++ b/policy/src/com/android/internal/policy/impl/StatusView.java @@ -193,12 +193,15 @@ class StatusView { mBatteryLevel)); } mStatus1.setCompoundDrawablesWithIntrinsicBounds(CHARGING_ICON, 0, 0, 0); - } else { + mStatus1.setVisibility(View.VISIBLE); + } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) { // Battery is low mStatus1.setText(getContext().getString(R.string.lockscreen_low_battery)); mStatus1.setCompoundDrawablesWithIntrinsicBounds(BATTERY_LOW_ICON, 0, 0, 0); + mStatus1.setVisibility(View.VISIBLE); + } else { + mStatus1.setVisibility(View.INVISIBLE); } - mStatus1.setVisibility(View.VISIBLE); } else { // nothing specific to show; show help message and icon, if provided if (mHelpMessageId != 0) { diff --git a/services/java/com/android/server/AppWidgetService.java b/services/java/com/android/server/AppWidgetService.java index 59a540b8f175..ad256571afc7 100644 --- a/services/java/com/android/server/AppWidgetService.java +++ b/services/java/com/android/server/AppWidgetService.java @@ -22,6 +22,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -62,6 +63,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.util.AttributeSet; +import android.util.Log; import android.util.Pair; import android.util.Slog; import android.util.TypedValue; @@ -121,18 +123,15 @@ class AppWidgetService extends IAppWidgetService.Stub * globally and may lead us to leak AppWidgetService instances (if there were more than one). */ static class ServiceConnectionProxy implements ServiceConnection { - private final AppWidgetService mAppWidgetService; private final Pair<Integer, Intent.FilterComparison> mKey; private final IBinder mConnectionCb; - ServiceConnectionProxy(AppWidgetService appWidgetService, - Pair<Integer, Intent.FilterComparison> key, IBinder connectionCb) { - mAppWidgetService = appWidgetService; + ServiceConnectionProxy(Pair<Integer, Intent.FilterComparison> key, IBinder connectionCb) { mKey = key; mConnectionCb = connectionCb; } public void onServiceConnected(ComponentName name, IBinder service) { - IRemoteViewsAdapterConnection cb = + final IRemoteViewsAdapterConnection cb = IRemoteViewsAdapterConnection.Stub.asInterface(mConnectionCb); try { cb.onServiceConnected(service); @@ -141,19 +140,13 @@ class AppWidgetService extends IAppWidgetService.Stub } } public void onServiceDisconnected(ComponentName name) { - IRemoteViewsAdapterConnection cb = + disconnect(); + } + public void disconnect() { + final IRemoteViewsAdapterConnection cb = IRemoteViewsAdapterConnection.Stub.asInterface(mConnectionCb); try { cb.onServiceDisconnected(); - mAppWidgetService.mServiceConnectionUpdateHandler.post(new Runnable() { - public void run() { - // We don't want to touch mBoundRemoteViewsServices from any other thread - // so queue this to run on the main thread. - if (mAppWidgetService.mBoundRemoteViewsServices.containsKey(mKey)) { - mAppWidgetService.mBoundRemoteViewsServices.remove(mKey); - } - } - }); } catch (RemoteException e) { e.printStackTrace(); } @@ -163,7 +156,6 @@ class AppWidgetService extends IAppWidgetService.Stub // Manages connections to RemoteViewsServices private final HashMap<Pair<Integer, FilterComparison>, ServiceConnection> mBoundRemoteViewsServices = new HashMap<Pair<Integer,FilterComparison>,ServiceConnection>(); - private final Handler mServiceConnectionUpdateHandler = new Handler(); Context mContext; Locale mLocale; @@ -456,13 +448,24 @@ class AppWidgetService extends IAppWidgetService.Stub throw new IllegalArgumentException("Unknown component " + componentName); } - // Bind to the RemoteViewsService (which will trigger a callback to the - // RemoteViewsAdapter) + // If there is already a connection made for this service intent, then disconnect from + // that first. (This does not allow multiple connections to the same service under + // the same key) + ServiceConnectionProxy conn = null; Pair<Integer, FilterComparison> key = Pair.create(appWidgetId, new FilterComparison(intent)); - final ServiceConnection conn = new ServiceConnectionProxy(this, key, connection); + if (mBoundRemoteViewsServices.containsKey(key)) { + conn = (ServiceConnectionProxy) mBoundRemoteViewsServices.get(key); + conn.disconnect(); + mContext.unbindService(conn); + mBoundRemoteViewsServices.remove(key); + } + + // Bind to the RemoteViewsService (which will trigger a callback to the + // RemoteViewsAdapter.onServiceConnected()) final long token = Binder.clearCallingIdentity(); try { + conn = new ServiceConnectionProxy(key, connection); mContext.bindService(intent, conn, Context.BIND_AUTO_CREATE); mBoundRemoteViewsServices.put(key, conn); } finally { @@ -473,37 +476,43 @@ class AppWidgetService extends IAppWidgetService.Stub public void unbindRemoteViewsService(int appWidgetId, Intent intent) { synchronized (mAppWidgetIds) { - AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId); - if (id == null) { - throw new IllegalArgumentException("bad appWidgetId"); - } - // Unbind from the RemoteViewsService (which will trigger a callback to the bound // RemoteViewsAdapter) Pair<Integer, FilterComparison> key = Pair.create(appWidgetId, new FilterComparison(intent)); if (mBoundRemoteViewsServices.containsKey(key)) { - final ServiceConnection conn = mBoundRemoteViewsServices.get(key); - mBoundRemoteViewsServices.remove(key); - conn.onServiceDisconnected(null); + // We don't need to use the appWidgetId until after we are sure there is something + // to unbind. Note that this may mask certain issues with apps calling unbind() + // more than necessary. + AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId); + if (id == null) { + throw new IllegalArgumentException("bad appWidgetId"); + } + + ServiceConnectionProxy conn = + (ServiceConnectionProxy) mBoundRemoteViewsServices.get(key); + conn.disconnect(); mContext.unbindService(conn); + mBoundRemoteViewsServices.remove(key); + } else { + Log.e("AppWidgetService", "Error (unbindRemoteViewsService): Connection not bound"); } } } private void unbindAppWidgetRemoteViewsServicesLocked(AppWidgetId id) { + int appWidgetId = id.appWidgetId; + // Unbind all connections to Services bound to this AppWidgetId Iterator<Pair<Integer, Intent.FilterComparison>> it = mBoundRemoteViewsServices.keySet().iterator(); - int appWidgetId = id.appWidgetId; - - // Unbind all connections to AppWidgets bound to this id while (it.hasNext()) { final Pair<Integer, Intent.FilterComparison> key = it.next(); if (key.first.intValue() == appWidgetId) { - final ServiceConnection conn = mBoundRemoteViewsServices.get(key); - it.remove(); - conn.onServiceDisconnected(null); + final ServiceConnectionProxy conn = (ServiceConnectionProxy) + mBoundRemoteViewsServices.get(key); + conn.disconnect(); mContext.unbindService(conn); + it.remove(); } } } diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index bd3c554a5be5..e689654110b6 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -1152,7 +1152,17 @@ public class ConnectivityService extends IConnectivityManager.Stub { if (checkType == prevNetType) continue; if (mNetAttributes[checkType] == null) continue; if (!mNetAttributes[checkType].isDefault()) continue; - if (!mNetTrackers[checkType].isAvailable()) continue; + +// Enabling the isAvailable() optimization caused mobile to not get +// selected if it was in the middle of error handling. Specifically +// a moble connection that took 30 seconds to complete the DEACTIVATE_DATA_CALL +// would not be available and we wouldn't get connected to anything. +// So removing the isAvailable() optimization below for now. TODO: This +// optimization should work and we need to investigate why it doesn't work. +// This could be related to how DEACTIVATE_DATA_CALL is reporting its +// complete before it is really complete. +// if (!mNetTrackers[checkType].isAvailable()) continue; + // if (currentPriority >= mNetAttributes[checkType].mPriority) continue; NetworkStateTracker checkTracker = mNetTrackers[checkType]; diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index 0147b1ac3794..8d6d3a1644b6 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -49,6 +49,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.database.ContentObserver; +import android.inputmethodservice.InputMethodService; import android.os.Binder; import android.os.Handler; import android.os.IBinder; @@ -311,6 +312,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub */ boolean mScreenOn = true; + int mBackDisposition = InputMethodService.BACK_DISPOSITION_DEFAULT; + int mImeWindowVis; + AlertDialog.Builder mDialogBuilder; AlertDialog mSwitchingDialog; InputMethodInfo[] mIms; @@ -430,7 +434,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // Uh oh, current input method is no longer around! // Pick another one... Slog.i(TAG, "Current input method removed: " + curInputMethodId); - mStatusBar.setIMEButtonVisible(mCurToken, false); + mImeWindowVis = 0; + mStatusBar.setImeWindowStatus(mCurToken, mImeWindowVis, + mBackDisposition); if (!chooseNewDefaultIMELocked()) { changed = true; curIm = null; @@ -982,17 +988,19 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } - public void setIMEButtonVisible(IBinder token, boolean visible) { + public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { int uid = Binder.getCallingUid(); long ident = Binder.clearCallingIdentity(); try { if (token == null || mCurToken != token) { - Slog.w(TAG, "Ignoring setIMEButtonVisible of uid " + uid + " token: " + token); + Slog.w(TAG, "Ignoring setImeWindowStatus of uid " + uid + " token: " + token); return; } synchronized (mMethodMap) { - mStatusBar.setIMEButtonVisible(token, visible); + mImeWindowVis = vis; + mBackDisposition = backDisposition; + mStatusBar.setImeWindowStatus(token, vis, backDisposition); } } finally { Binder.restoreCallingIdentity(ident); @@ -1045,12 +1053,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } if (mCurMethod != null) { try { - if (mInputShown) { - // If mInputShown is false, there is no IME button on the - // system bar. - // Thus there is no need to make it invisible explicitly. - mStatusBar.setIMEButtonVisible(mCurToken, true); - } + mImeWindowVis = 0; + mStatusBar.setImeWindowStatus(mCurToken, mImeWindowVis, + mBackDisposition); // If subtype is null, try to find the most applicable one from // getCurrentInputMethodSubtype. if (subtype == null) { @@ -1168,11 +1173,14 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (!mIWindowManager.inputMethodClientHasFocus(client)) { if (DEBUG) Slog.w(TAG, "Ignoring hideSoftInput of uid " + uid + ": " + client); - mStatusBar.setIMEButtonVisible(mCurToken, false); + mImeWindowVis = 0; + mStatusBar.setImeWindowStatus(mCurToken, mImeWindowVis, + mBackDisposition); return false; } } catch (RemoteException e) { - mStatusBar.setIMEButtonVisible(mCurToken, false); + mImeWindowVis = 0; + mStatusBar.setImeWindowStatus(mCurToken, mImeWindowVis, mBackDisposition); return false; } } diff --git a/services/java/com/android/server/ScreenRotationAnimation.java b/services/java/com/android/server/ScreenRotationAnimation.java index bef64b3bf0ff..90318f19044e 100644 --- a/services/java/com/android/server/ScreenRotationAnimation.java +++ b/services/java/com/android/server/ScreenRotationAnimation.java @@ -102,7 +102,7 @@ class ScreenRotationAnimation { Slog.w(TAG, "Unable to allocate freeze surface", e); } - if (false) { + if (true) { try { int size = mOriginalWidth > mOriginalHeight ? mOriginalWidth : mOriginalHeight; mBlackSurface = new Surface(session, 0, "BlackSurface", diff --git a/services/java/com/android/server/StatusBarManagerService.java b/services/java/com/android/server/StatusBarManagerService.java index 50ea3fa351b8..1a2f86763dc2 100644 --- a/services/java/com/android/server/StatusBarManagerService.java +++ b/services/java/com/android/server/StatusBarManagerService.java @@ -67,14 +67,16 @@ public class StatusBarManagerService extends IStatusBarService.Stub // for disabling the status bar ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>(); + IBinder mSysUiVisToken = new Binder(); int mDisabled = 0; Object mLock = new Object(); // We usually call it lights out mode, but double negatives are annoying boolean mLightsOn = true; boolean mMenuVisible = false; - boolean mIMEButtonVisible = false; - IBinder mIMEToken = null; + int mImeWindowVis = 0; + int mImeBackDisposition; + IBinder mImeToken = null; private class DisableRecord implements IBinder.DeathRecipient { String pkg; @@ -140,25 +142,29 @@ public class StatusBarManagerService extends IStatusBarService.Stub public void disable(int what, IBinder token, String pkg) { enforceStatusBar(); + synchronized (mLock) { + disableLocked(what, token, pkg); + } + } + + private void disableLocked(int what, IBinder token, String pkg) { // It's important that the the callback and the call to mBar get done // in the same order when multiple threads are calling this function // so they are paired correctly. The messages on the handler will be // handled in the order they were enqueued, but will be outside the lock. - synchronized (mDisableRecords) { - manageDisableListLocked(what, token, pkg); - final int net = gatherDisableActionsLocked(); - if (net != mDisabled) { - mDisabled = net; - mHandler.post(new Runnable() { - public void run() { - mNotificationCallbacks.onSetDisabled(net); - } - }); - if (mBar != null) { - try { - mBar.disable(net); - } catch (RemoteException ex) { + manageDisableListLocked(what, token, pkg); + final int net = gatherDisableActionsLocked(); + if (net != mDisabled) { + mDisabled = net; + mHandler.post(new Runnable() { + public void run() { + mNotificationCallbacks.onSetDisabled(net); } + }); + if (mBar != null) { + try { + mBar.disable(net); + } catch (RemoteException ex) { } } } @@ -259,22 +265,25 @@ public class StatusBarManagerService extends IStatusBarService.Stub } } - public void setIMEButtonVisible(final IBinder token, final boolean visible) { + public void setImeWindowStatus(final IBinder token, final int vis, final int backDisposition) { enforceStatusBar(); - if (SPEW) Slog.d(TAG, (visible?"showing":"hiding") + " IME Button"); + if (SPEW) { + Slog.d(TAG, "swetImeWindowStatus vis=" + vis + " backDisposition=" + backDisposition); + } synchronized(mLock) { - // In case of IME change, we need to call up setIMEButtonVisible() regardless of - // mIMEButtonVisible because mIMEButtonVisible may not have been set to false when the + // In case of IME change, we need to call up setImeWindowStatus() regardless of + // mImeWindowVis because mImeWindowVis may not have been set to false when the // previous IME was destroyed. - mIMEButtonVisible = visible; - mIMEToken = token; + mImeWindowVis = vis; + mImeBackDisposition = backDisposition; + mImeToken = token; mHandler.post(new Runnable() { public void run() { if (mBar != null) { try { - mBar.setIMEButtonVisible(token, visible); + mBar.setImeWindowStatus(token, vis, backDisposition); } catch (RemoteException ex) { } } @@ -283,38 +292,15 @@ public class StatusBarManagerService extends IStatusBarService.Stub } } - /** - * This is used for the automatic version of lights-out mode. Only call this from - * the window manager. - * - * @see setLightsOn(boolean) - */ - public void setActiveWindowIsFullscreen(boolean fullscreen) { - // We could get away with a separate permission here, but STATUS_BAR is - // signatureOrSystem which is probably good enough. There is no public API - // for this, so the question is a security issue, not an API compatibility issue. - enforceStatusBar(); - - synchronized (mLock) { - updateLightsOnLocked(!fullscreen); - } - } - - /** - * This is used for the user-controlled version of lights-out mode. Only call this from - * the status bar itself. - * - * We have two different functions here, because I think we're going to want to - * tweak the behavior when the user keeps turning lights-out mode off and the - * app keeps trying to turn it on. For now they can just fight it out. Having - * these two separte inputs will allow us to keep that change local to here. --joeo - */ public void setSystemUiVisibility(int vis) { + // also allows calls from window manager which is in this process. enforceStatusBarService(); synchronized (mLock) { final boolean lightsOn = (vis & View.STATUS_BAR_HIDDEN) == 0; updateLightsOnLocked(lightsOn); + disableLocked(vis & StatusBarManager.DISABLE_MASK, mSysUiVisToken, + "WindowManager.LayoutParams"); } } @@ -373,8 +359,9 @@ public class StatusBarManagerService extends IStatusBarService.Stub switches[0] = gatherDisableActionsLocked(); switches[1] = mLightsOn ? 1 : 0; switches[2] = mMenuVisible ? 1 : 0; - switches[3] = mIMEButtonVisible ? 1 : 0; - binders.add(mIMEToken); + switches[3] = mImeWindowVis; + switches[4] = mImeBackDisposition; + binders.add(mImeToken); } } @@ -472,37 +459,35 @@ public class StatusBarManagerService extends IStatusBarService.Stub Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) + " pkg=" + pkg); } // update the list - synchronized (mDisableRecords) { - final int N = mDisableRecords.size(); - DisableRecord tok = null; - int i; - for (i=0; i<N; i++) { - DisableRecord t = mDisableRecords.get(i); - if (t.token == token) { - tok = t; - break; - } + final int N = mDisableRecords.size(); + DisableRecord tok = null; + int i; + for (i=0; i<N; i++) { + DisableRecord t = mDisableRecords.get(i); + if (t.token == token) { + tok = t; + break; } - if (what == 0 || !token.isBinderAlive()) { - if (tok != null) { - mDisableRecords.remove(i); - tok.token.unlinkToDeath(tok, 0); + } + if (what == 0 || !token.isBinderAlive()) { + if (tok != null) { + mDisableRecords.remove(i); + tok.token.unlinkToDeath(tok, 0); + } + } else { + if (tok == null) { + tok = new DisableRecord(); + try { + token.linkToDeath(tok, 0); } - } else { - if (tok == null) { - tok = new DisableRecord(); - try { - token.linkToDeath(tok, 0); - } - catch (RemoteException ex) { - return; // give up - } - mDisableRecords.add(tok); + catch (RemoteException ex) { + return; // give up } - tok.what = what; - tok.token = token; - tok.pkg = pkg; + mDisableRecords.add(tok); } + tok.what = what; + tok.token = token; + tok.pkg = pkg; } } @@ -543,7 +528,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub } } - synchronized (mDisableRecords) { + synchronized (mLock) { final int N = mDisableRecords.size(); pw.println(" mDisableRecords.size=" + N + " mDisabled=0x" + Integer.toHexString(mDisabled)); diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 2c8403c82751..faaa28d7e2d1 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -1315,7 +1315,20 @@ public class WindowManagerService extends IWindowManager.Stub static boolean canBeImeTarget(WindowState w) { final int fl = w.mAttrs.flags & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM); - if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM)) { + if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM) + || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { + if (DEBUG_INPUT_METHOD) { + Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding()); + if (!w.isVisibleOrAdding()) { + Slog.i(TAG, " mSurface=" + w.mSurface + " reportDestroy=" + w.mReportDestroySurface + + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility + + " policyVis=" + w.mPolicyVisibility + " attachHid=" + w.mAttachedHidden + + " exiting=" + w.mExiting + " destroying=" + w.mDestroying); + if (w.mAppToken != null) { + Slog.i(TAG, " mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested); + } + } + } return w.isVisibleOrAdding(); } return false; @@ -1330,8 +1343,8 @@ public class WindowManagerService extends IWindowManager.Stub i--; w = localmWindows.get(i); - //Slog.i(TAG, "Checking window @" + i + " " + w + " fl=0x" - // + Integer.toHexString(w.mAttrs.flags)); + if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i + + " " + w + " fl=0x" + Integer.toHexString(w.mAttrs.flags)); if (canBeImeTarget(w)) { //Slog.i(TAG, "Putting input method here!"); @@ -1353,6 +1366,8 @@ public class WindowManagerService extends IWindowManager.Stub } } + if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w); + // Now, a special case -- if the last target's window is in the // process of exiting, and is above the new target, keep on the // last target to avoid flicker. Consider for example a Dialog with @@ -1365,6 +1380,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mInputMethodTarget.mAnimLayer > w.mAnimLayer) { w = mInputMethodTarget; i = localmWindows.indexOf(w); + if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, switching to: " + w); } } @@ -1420,6 +1436,7 @@ public class WindowManagerService extends IWindowManager.Stub // with an animation, and it is on top of the next target // we will be over, then hold off on moving until // that is done. + mInputMethodTargetWaitingAnim = true; mInputMethodTarget = highestTarget; return highestPos + 1; } @@ -1440,6 +1457,7 @@ public class WindowManagerService extends IWindowManager.Stub + mInputMethodTarget + " to " + w, e); } mInputMethodTarget = w; + mInputMethodTargetWaitingAnim = false; if (w.mAppToken != null) { setInputMethodAnimLayerAdjustment(w.mAppToken.animLayerAdjustment); } else { @@ -1918,9 +1936,10 @@ public class WindowManagerService extends IWindowManager.Stub WindowState wb = localmWindows.get(foundI-1); if (wb.mBaseLayer < maxLayer && wb.mAttachedWindow != foundW && - wb.mAttachedWindow != foundW.mAttachedWindow && + (foundW.mAttachedWindow == null || + wb.mAttachedWindow != foundW.mAttachedWindow) && (wb.mAttrs.type != TYPE_APPLICATION_STARTING || - wb.mToken != foundW.mToken)) { + foundW.mToken == null || wb.mToken != foundW.mToken)) { // This window is not related to the previous one in any // interesting way, so stop here. break; @@ -5003,7 +5022,6 @@ public class WindowManagerService extends IWindowManager.Stub Bitmap rawss; int maxLayer = 0; - boolean foundApp; final Rect frame = new Rect(); float scale; @@ -5013,24 +5031,49 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { long ident = Binder.clearCallingIdentity(); + dw = mDisplay.getWidth(); + dh = mDisplay.getHeight(); + int aboveAppLayer = mPolicy.windowTypeToLayerLw( WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER + TYPE_LAYER_OFFSET; aboveAppLayer += TYPE_LAYER_MULTIPLIER; + boolean isImeTarget = mInputMethodTarget != null + && mInputMethodTarget.mAppToken != null + && mInputMethodTarget.mAppToken.appToken != null + && mInputMethodTarget.mAppToken.appToken.asBinder() == appToken; + // Figure out the part of the screen that is actually the app. - for (int i=0; i<mWindows.size(); i++) { + boolean including = false; + for (int i=mWindows.size()-1; i>=0; i--) { WindowState ws = mWindows.get(i); if (ws.mSurface == null) { continue; } if (ws.mLayer >= aboveAppLayer) { - break; - } - if (appToken != null && (ws.mAppToken == null - || ws.mAppToken.token != appToken)) { continue; } + // When we will skip windows: when we are not including + // ones behind a window we didn't skip, and we are actually + // taking a screenshot of a specific app. + if (!including && appToken != null) { + // Also, we can possibly skip this window if it is not + // an IME target or the application for the screenshot + // is not the current IME target. + if (!ws.mIsImWindow || !isImeTarget) { + // And finally, this window is of no interest if it + // is not associated with the screenshot app. + if (ws.mAppToken == null || ws.mAppToken.token != appToken) { + continue; + } + } + } + + // We keep on including windows until we go past a full-screen + // window. + including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh); + if (maxLayer < ws.mAnimLayer) { maxLayer = ws.mAnimLayer; } @@ -5065,8 +5108,8 @@ public class WindowManagerService extends IWindowManager.Stub } // The screen shot will contain the entire screen. - dw = (int)(mDisplay.getWidth()*scale); - dh = (int)(mDisplay.getHeight()*scale); + dw = (int)(dw*scale); + dh = (int)(dh*scale); if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) { int tmp = dw; dw = dh; @@ -8514,7 +8557,7 @@ public class WindowManagerService extends IWindowManager.Stub w.mAnimLayer = w.mLayer + adj; if (DEBUG_LAYERS) Slog.v(TAG, "Updating layer " + w + ": " + w.mAnimLayer); - if (w == mInputMethodTarget) { + if (w == mInputMethodTarget && !mInputMethodTargetWaitingAnim) { setInputMethodAnimLayerAdjustment(adj); } if (w == mWallpaperTarget && mLowerWallpaperTarget == null) { @@ -8605,6 +8648,10 @@ public class WindowManagerService extends IWindowManager.Stub clearAnimation(); animating = false; + if (animLayerAdjustment != 0) { + animLayerAdjustment = 0; + updateLayers(); + } if (mInputMethodTarget != null && mInputMethodTarget.mAppToken == this) { moveInputMethodWindowsIfNeededLocked(true); } @@ -8614,10 +8661,6 @@ public class WindowManagerService extends IWindowManager.Stub + ": reportedVisible=" + reportedVisible); transformation.clear(); - if (animLayerAdjustment != 0) { - animLayerAdjustment = 0; - updateLayers(); - } final int N = windows.size(); for (int i=0; i<N; i++) { @@ -9223,11 +9266,47 @@ public class WindowManagerService extends IWindowManager.Stub WindowState imFocus; if (idx > 0) { imFocus = mWindows.get(idx-1); + //Log.i(TAG, "Desired input method target: " + imFocus); + //Log.i(TAG, "Current focus: " + this.mCurrentFocus); + //Log.i(TAG, "Last focus: " + this.mLastFocus); if (imFocus != null) { + // This may be a starting window, in which case we still want + // to count it as okay. + if (imFocus.mAttrs.type == LayoutParams.TYPE_APPLICATION_STARTING + && imFocus.mAppToken != null) { + // The client has definitely started, so it really should + // have a window in this app token. Let's look for it. + for (int i=0; i<imFocus.mAppToken.windows.size(); i++) { + WindowState w = imFocus.mAppToken.windows.get(i); + if (w != imFocus) { + //Log.i(TAG, "Switching to real app window: " + w); + imFocus = w; + break; + } + } + } + //Log.i(TAG, "IM target client: " + imFocus.mSession.mClient); + //if (imFocus.mSession.mClient != null) { + // Log.i(TAG, "IM target client binder: " + imFocus.mSession.mClient.asBinder()); + // Log.i(TAG, "Requesting client binder: " + client.asBinder()); + //} if (imFocus.mSession.mClient != null && imFocus.mSession.mClient.asBinder() == client.asBinder()) { return true; } + + // Okay, how about this... what is the current focus? + // It seems in some cases we may not have moved the IM + // target window, such as when it was in a pop-up window, + // so let's also look at the current focus. (An example: + // go to Gmail, start searching so the keyboard goes up, + // press home. Sometimes the IME won't go down.) + // Would be nice to fix this more correctly, but it's + // way at the end of a release, and this should be good enough. + if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null && + mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) { + return true; + } } } } @@ -10856,17 +10935,19 @@ public class WindowManagerService extends IWindowManager.Stub mInputMonitor.updateInputWindowsLw(true /*force*/); setHoldScreenLocked(holdScreen != null); - if (screenBrightness < 0 || screenBrightness > 1.0f) { - mPowerManager.setScreenBrightnessOverride(-1); - } else { - mPowerManager.setScreenBrightnessOverride((int) - (screenBrightness * Power.BRIGHTNESS_ON)); - } - if (buttonBrightness < 0 || buttonBrightness > 1.0f) { - mPowerManager.setButtonBrightnessOverride(-1); - } else { - mPowerManager.setButtonBrightnessOverride((int) - (buttonBrightness * Power.BRIGHTNESS_ON)); + if (!mDisplayFrozen) { + if (screenBrightness < 0 || screenBrightness > 1.0f) { + mPowerManager.setScreenBrightnessOverride(-1); + } else { + mPowerManager.setScreenBrightnessOverride((int) + (screenBrightness * Power.BRIGHTNESS_ON)); + } + if (buttonBrightness < 0 || buttonBrightness > 1.0f) { + mPowerManager.setButtonBrightnessOverride(-1); + } else { + mPowerManager.setButtonBrightnessOverride((int) + (buttonBrightness * Power.BRIGHTNESS_ON)); + } } if (holdScreen != mHoldingScreenOn) { mHoldingScreenOn = holdScreen; @@ -11234,13 +11315,13 @@ public class WindowManagerService extends IWindowManager.Stub mInputMonitor.thawInputDispatchingLw(); + boolean configChanged; + // While the display is frozen we don't re-compute the orientation // to avoid inconsistent states. However, something interesting // could have actually changed during that time so re-evaluate it // now to catch that. - if (updateOrientationFromAppTokensLocked(false)) { - mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); - } + configChanged = updateOrientationFromAppTokensLocked(false); // A little kludge: a lot could have happened while the // display was frozen, so now that we are coming back we @@ -11255,11 +11336,12 @@ public class WindowManagerService extends IWindowManager.Stub if (updateRotation) { if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); - boolean changed = setRotationUncheckedLocked( + configChanged |= setRotationUncheckedLocked( WindowManagerPolicy.USE_LAST_ROTATION, 0, false); - if (changed) { - sendNewConfiguration(); - } + } + + if (configChanged) { + mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); } } diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 6bb19b04736e..254a19b534ff 100755 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -11944,28 +11944,6 @@ public final class ActivityManagerService extends ActivityManagerNative adj = FOREGROUND_APP_ADJ; schedGroup = Process.THREAD_GROUP_DEFAULT; app.adjType = "exec-service"; - } else if (app.foregroundServices) { - // The user is aware of this app, so make it visible. - adj = PERCEPTIBLE_APP_ADJ; - schedGroup = Process.THREAD_GROUP_DEFAULT; - app.adjType = "foreground-service"; - } else if (app.forcingToForeground != null) { - // The user is aware of this app, so make it visible. - adj = PERCEPTIBLE_APP_ADJ; - schedGroup = Process.THREAD_GROUP_DEFAULT; - app.adjType = "force-foreground"; - app.adjSource = app.forcingToForeground; - } else if (app == mHeavyWeightProcess) { - // We don't want to kill the current heavy-weight process. - adj = HEAVY_WEIGHT_APP_ADJ; - schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE; - app.adjType = "heavy"; - } else if (app == mHomeProcess) { - // This process is hosting what we currently consider to be the - // home app, so we don't want to let it go into the background. - adj = HOME_APP_ADJ; - schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE; - app.adjType = "home"; } else if ((N=app.activities.size()) != 0) { // This app is in the background with paused activities. app.hidden = true; @@ -11998,7 +11976,37 @@ public final class ActivityManagerService extends ActivityManagerNative adj = hiddenAdj; app.adjType = "bg-empty"; } + + if (adj > PERCEPTIBLE_APP_ADJ) { + if (app.foregroundServices) { + // The user is aware of this app, so make it visible. + adj = PERCEPTIBLE_APP_ADJ; + schedGroup = Process.THREAD_GROUP_DEFAULT; + app.adjType = "foreground-service"; + } else if (app.forcingToForeground != null) { + // The user is aware of this app, so make it visible. + adj = PERCEPTIBLE_APP_ADJ; + schedGroup = Process.THREAD_GROUP_DEFAULT; + app.adjType = "force-foreground"; + app.adjSource = app.forcingToForeground; + } + } + + if (adj > HEAVY_WEIGHT_APP_ADJ && app == mHeavyWeightProcess) { + // We don't want to kill the current heavy-weight process. + adj = HEAVY_WEIGHT_APP_ADJ; + schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE; + app.adjType = "heavy"; + } + if (adj > HOME_APP_ADJ && app == mHomeProcess) { + // This process is hosting what we currently consider to be the + // home app, so we don't want to let it go into the background. + adj = HOME_APP_ADJ; + schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE; + app.adjType = "home"; + } + //Slog.i(TAG, "OOM " + app + ": initial adj=" + adj); // By default, we use the computed adjustment. It may be changed if diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 2040cbd956ef..5b44d39037d2 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -3187,7 +3187,6 @@ public class ActivityStack { EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, System.identityHashCode(r), r.task.taskId, r.shortComponentName, reason); - r.task.numActivities--; if (index < (mHistory.size()-1)) { ActivityRecord next = (ActivityRecord)mHistory.get(index+1); if (next.task == r.task) { diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp index 464841b3962e..8d83f0b4ebfc 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -563,10 +563,15 @@ sp<LayerBaseClient::Surface> LayerBaseClient::getSurface() if (s == 0) { s = createSurface(); mClientSurface = s; + mClientSurfaceBinder = s->asBinder(); } return s; } +wp<IBinder> LayerBaseClient::getSurfaceBinder() const { + return mClientSurfaceBinder; +} + sp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const { return new Surface(mFlinger, mIdentity, diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index 1a34f52ad317..8ed474972b94 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -285,6 +285,7 @@ public: virtual ~LayerBaseClient(); sp<Surface> getSurface(); + wp<IBinder> getSurfaceBinder() const; virtual sp<Surface> createSurface() const; virtual sp<LayerBaseClient> getLayerBaseClient() const { return const_cast<LayerBaseClient*>(this); } @@ -325,6 +326,7 @@ protected: private: mutable Mutex mLock; mutable wp<Surface> mClientSurface; + wp<IBinder> mClientSurfaceBinder; const wp<Client> mClientRef; // only read const uint32_t mIdentity; diff --git a/services/surfaceflinger/LayerDim.cpp b/services/surfaceflinger/LayerDim.cpp index 80cc52c42deb..11f8feb1ff69 100644 --- a/services/surfaceflinger/LayerDim.cpp +++ b/services/surfaceflinger/LayerDim.cpp @@ -67,8 +67,14 @@ void LayerDim::onDraw(const Region& clip) const const GLfloat alpha = s.alpha/255.0f; const uint32_t fbHeight = hw.getHeight(); glDisable(GL_DITHER); - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + if (s.alpha == 0xFF) { + glDisable(GL_BLEND); + } else { + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + } + glColor4f(0, 0, 0, alpha); #if defined(GL_OES_EGL_image_external) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 291ebc57043c..87b66eafa985 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1088,7 +1088,7 @@ status_t SurfaceFlinger::removeLayer_l(const sp<LayerBase>& layerBase) { sp<LayerBaseClient> lbc(layerBase->getLayerBaseClient()); if (lbc != 0) { - mLayerMap.removeItem( lbc->getSurface()->asBinder() ); + mLayerMap.removeItem( lbc->getSurfaceBinder() ); } ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase); if (index >= 0) { diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java index 39bbd63da94b..9479a2db7a20 100644 --- a/telephony/java/com/android/internal/telephony/RIL.java +++ b/telephony/java/com/android/internal/telephony/RIL.java @@ -226,7 +226,15 @@ public final class RIL extends BaseCommands implements CommandsInterface { private Context mContext; WakeLock mWakeLock; int mWakeLockTimeout; + // The number of requests pending to be sent out, it increases before calling + // EVENT_SEND and decreases while handling EVENT_SEND. It gets cleared while + // WAKE_LOCK_TIMEOUT occurs. int mRequestMessagesPending; + // The number of requests sent out but waiting for response. It increases while + // sending request and decreases while handling response. It should match + // mRequestList.size() unless there are requests no replied while + // WAKE_LOCK_TIMEOUT occurs. + int mRequestMessagesWaiting; // Is this the first radio state change? private boolean mInitialRadioStateChange = true; @@ -308,16 +316,19 @@ public final class RIL extends BaseCommands implements CommandsInterface { if (s == null) { rr.onError(RADIO_NOT_AVAILABLE, null); rr.release(); - mRequestMessagesPending--; + if (mRequestMessagesPending > 0) + mRequestMessagesPending--; alreadySubtracted = true; return; } synchronized (mRequestsList) { mRequestsList.add(rr); + mRequestMessagesWaiting++; } - mRequestMessagesPending--; + if (mRequestMessagesPending > 0) + mRequestMessagesPending--; alreadySubtracted = true; byte[] data; @@ -366,7 +377,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { releaseWakeLockIfDone(); } - if (!alreadySubtracted) { + if (!alreadySubtracted && mRequestMessagesPending > 0) { mRequestMessagesPending--; } @@ -381,20 +392,44 @@ public final class RIL extends BaseCommands implements CommandsInterface { // new send request. So when WAKE_LOCK_TIMEOUT occurs // all requests in mRequestList already waited at // least DEFAULT_WAKE_LOCK_TIMEOUT but no response. - // Therefore all should be treated as lost requests. - // Those lost requests return GENERIC_FAILURE and - // request list is cleared. + // Reset mRequestMessagesWaiting to enable + // releaseWakeLockIfDone(). // - // Note: mRequestMessagesPending shows how many - // requests are waiting to be sent (and before - // to be added in request list) since star the - // timer. It should be - // zero here since all request should already - // be put in request list while TIMEOUT occurs. - clearRequestsList(GENERIC_FAILURE, true); + // Note: Keep mRequestList so that delayed response + // can still be handled when response finally comes. + if (mRequestMessagesWaiting != 0) { + Log.d(LOG_TAG, "NOTE: mReqWaiting is NOT 0 but" + + mRequestMessagesWaiting + " at TIMEOUT, reset!" + + " There still msg waitng for response"); + + mRequestMessagesWaiting = 0; + + if (RILJ_LOGD) { + synchronized (mRequestsList) { + int count = mRequestsList.size(); + Log.d(LOG_TAG, "WAKE_LOCK_TIMEOUT " + + " mRequestList=" + count); + + for (int i = 0; i < count; i++) { + rr = mRequestsList.get(i); + Log.d(LOG_TAG, i + ": [" + rr.mSerial + "] " + + requestToString(rr.mRequest)); + } + } + } + } + // mRequestMessagesPending shows how many + // requests are waiting to be sent (and before + // to be added in request list) since star the + // WAKE_LOCK_TIMEOUT timer. Since WAKE_LOCK_TIMEOUT + // is the expected time to get response, all requests + // should already sent out (i.e. + // mRequestMessagesPending is 0 )while TIMEOUT occurs. if (mRequestMessagesPending != 0) { - Log.e(LOG_TAG, "ERROR: mReqPending is NOT 0 at TIMEOUT, " - + "mReqPending = " + mRequestMessagesPending); + Log.e(LOG_TAG, "ERROR: mReqPending is NOT 0 but" + + mRequestMessagesPending + " at TIMEOUT, reset!"); + mRequestMessagesPending = 0; + } mWakeLock.release(); } @@ -612,6 +647,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { mWakeLockTimeout = SystemProperties.getInt(TelephonyProperties.PROPERTY_WAKE_LOCK_TIMEOUT, DEFAULT_WAKE_LOCK_TIMEOUT); mRequestMessagesPending = 0; + mRequestMessagesWaiting = 0; mContext = context; @@ -1980,7 +2016,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { /** * Holds a PARTIAL_WAKE_LOCK whenever * a) There is outstanding RIL request sent to RIL deamon and no replied - * b) There is a request waiting to be sent out. + * b) There is a request pending to be sent out. * * There is a WAKE_LOCK_TIMEOUT to release the lock, though it shouldn't * happen often. @@ -2003,7 +2039,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { synchronized (mWakeLock) { if (mWakeLock.isHeld() && (mRequestMessagesPending == 0) && - (mRequestsList.size() == 0)) { + (mRequestMessagesWaiting == 0)) { mSender.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); mWakeLock.release(); } @@ -2067,6 +2103,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { rr.release(); } mRequestsList.clear(); + mRequestMessagesWaiting = 0; } } @@ -2077,6 +2114,8 @@ public final class RIL extends BaseCommands implements CommandsInterface { if (rr.mSerial == serial) { mRequestsList.remove(i); + if (mRequestMessagesWaiting > 0) + mRequestMessagesWaiting--; return rr; } } diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java index 19e7faeaeb88..a7f786664fec 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java @@ -1069,6 +1069,8 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { cdmaDataConnectionState = newCdmaDataConnectionState; networkType = newNetworkType; + // this new state has been applied - forget it until we get a new new state + newNetworkType = 0; newSS.setStateOutOfService(); // clean slate for next time diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java index c107d174919f..bb99e4564c1d 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java @@ -957,6 +957,9 @@ final class GsmServiceStateTracker extends ServiceStateTracker { gprsState = newGPRSState; networkType = newNetworkType; + // this new state has been applied - forget it until we get a new new state + newNetworkType = 0; + newSS.setStateOutOfService(); // clean slate for next time diff --git a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java index 5fd946e8bdb8..13665e183559 100644 --- a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java +++ b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java @@ -70,6 +70,12 @@ public class StatusBarTest extends TestActivity } private Test[] mTests = new Test[] { + new Test("DISABLE_NAVIGATION") { + public void run() { + View v = findViewById(android.R.id.list); + v.setSystemUiVisibility(View.STATUS_BAR_DISABLE_NAVIGATION); + } + }, new Test("STATUS_BAR_HIDDEN") { public void run() { View v = findViewById(android.R.id.list); @@ -77,7 +83,7 @@ public class StatusBarTest extends TestActivity v.setOnSystemUiVisibilityChangeListener(mOnSystemUiVisibilityChangeListener); } }, - new Test("not STATUS_BAR_HIDDEN") { + new Test("no setSystemUiVisibility") { public void run() { View v = findViewById(android.R.id.list); v.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); diff --git a/tools/layoutlib/bridge/.classpath b/tools/layoutlib/bridge/.classpath index 2102eb196b0c..64c1fb543074 100644 --- a/tools/layoutlib/bridge/.classpath +++ b/tools/layoutlib/bridge/.classpath @@ -8,5 +8,6 @@ <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_PLAT_SRC/dalvik/libcore/xml/src/main/java"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar" sourcepath="/ANDROID_PLAT_SRC/frameworks/base"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/ninepatch/ninepatch-prebuilt.jar"/> + <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/resources/resources-prebuilt.jar"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/tools/layoutlib/bridge/Android.mk b/tools/layoutlib/bridge/Android.mk index a0a7307a8cc0..57dd7aee49f0 100644 --- a/tools/layoutlib/bridge/Android.mk +++ b/tools/layoutlib/bridge/Android.mk @@ -20,7 +20,8 @@ LOCAL_SRC_FILES := $(call all-java-files-under,src) LOCAL_JAVA_LIBRARIES := \ kxml2-2.3.0 \ - layoutlib_api-prebuilt + layoutlib_api-prebuilt \ + resources-prebuilt LOCAL_STATIC_JAVA_LIBRARIES := \ temp_layoutlib \ diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java index db3cf44d89c8..993c30543e32 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java @@ -17,8 +17,8 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; -import com.android.ide.common.rendering.api.ResourceDensity; import com.android.layoutlib.bridge.Bridge; +import com.android.resources.Density; import android.content.res.AssetManager; import android.content.res.Resources; @@ -462,9 +462,9 @@ public class BitmapFactory { // into is.read(...) This number is not related to the value passed // to mark(...) above. try { - ResourceDensity density = ResourceDensity.MEDIUM; + Density density = Density.MEDIUM; if (opts != null) { - density = ResourceDensity.getEnum(opts.inDensity); + density = Density.getEnum(opts.inDensity); } bm = Bitmap_Delegate.createBitmap(is, true, density); } catch (IOException e) { diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java index 108d1838db7b..efe69552118f 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java @@ -17,9 +17,9 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; -import com.android.ide.common.rendering.api.ResourceDensity; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.resources.Density; import android.graphics.Bitmap.Config; import android.os.Parcel; @@ -89,12 +89,12 @@ public final class Bitmap_Delegate { * @see Bitmap#isMutable() * @see Bitmap#getDensity() */ - public static Bitmap createBitmap(File input, boolean isMutable, ResourceDensity density) + public static Bitmap createBitmap(File input, boolean isMutable, Density density) throws IOException { // create a delegate with the content of the file. Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); - return createBitmap(delegate, isMutable, density.getDpi()); + return createBitmap(delegate, isMutable, density.getDpiValue()); } /** @@ -107,12 +107,12 @@ public final class Bitmap_Delegate { * @see Bitmap#isMutable() * @see Bitmap#getDensity() */ - public static Bitmap createBitmap(InputStream input, boolean isMutable, ResourceDensity density) + public static Bitmap createBitmap(InputStream input, boolean isMutable, Density density) throws IOException { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); - return createBitmap(delegate, isMutable, density.getDpi()); + return createBitmap(delegate, isMutable, density.getDpiValue()); } /** @@ -126,11 +126,11 @@ public final class Bitmap_Delegate { * @see Bitmap#getDensity() */ public static Bitmap createBitmap(BufferedImage image, boolean isMutable, - ResourceDensity density) throws IOException { + Density density) throws IOException { // create a delegate with the given image. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888); - return createBitmap(delegate, isMutable, density.getDpi()); + return createBitmap(delegate, isMutable, density.getDpiValue()); } /** @@ -425,7 +425,7 @@ public final class Bitmap_Delegate { // the density doesn't matter, it's set by the Java method. return createBitmap(delegate, false /*isMutable*/, - ResourceDensity.DEFAULT_DENSITY /*density*/); + Density.DEFAULT_DENSITY /*density*/); } /*package*/ static void nativePrepareToDraw(int nativeBitmap) { diff --git a/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java index 7a0c2f776775..38c092d8572b 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java @@ -95,7 +95,7 @@ public abstract class Gradient_Delegate extends Shader_Delegate { * Pre-computes the colors for the gradient. This must be called once before any call * to {@link #getGradientColor(float)} */ - protected synchronized void precomputeGradientColors() { + protected void precomputeGradientColors() { if (mGradient == null) { // actually create an array with an extra size, so that we can really go // from 0 to SIZE (100%), or currentPos in the loop below will never equal 1.0 diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java index 0c3aef419c20..0ed430575b62 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java @@ -28,6 +28,7 @@ import com.android.layoutlib.bridge.android.BridgeAssetManager; import com.android.layoutlib.bridge.impl.FontLoader; import com.android.layoutlib.bridge.impl.RenderSessionImpl; import com.android.ninepatch.NinePatchChunk; +import com.android.resources.ResourceType; import com.android.tools.layoutlib.create.MethodAdapter; import com.android.tools.layoutlib.create.OverrideMethod; @@ -304,7 +305,7 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge { if (lastResult.isSuccess()) { lastResult = scene.inflate(); if (lastResult.isSuccess()) { - lastResult = scene.render(); + lastResult = scene.render(true /*freshRender*/); } } } finally { @@ -410,8 +411,9 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge { * @param name the name of the resource. * @return an {@link Integer} containing the resource id, or null if no resource were found. */ - public static Integer getResourceValue(String type, String name) { - Map<String, Integer> map = sRFullMap.get(type); + public static Integer getResourceValue(ResourceType type, String name) { + String typeString = type.getName(); + Map<String, Integer> map = sRFullMap.get(typeString); if (map != null) { return map.get(name); } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java index 3bc02024df84..0c6fa20fc977 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeRenderSession.java @@ -56,6 +56,11 @@ public class BridgeRenderSession extends RenderSession { } @Override + public boolean isAlphaChannelImage() { + return mSession.isAlphaChannelImage(); + } + + @Override public List<ViewInfo> getRootViews() { return mSession.getViewInfos(); } @@ -108,7 +113,7 @@ public class BridgeRenderSession extends RenderSession { Bridge.prepareThread(); mLastResult = mSession.acquire(timeout); if (mLastResult.isSuccess()) { - mLastResult = mSession.render(); + mLastResult = mSession.render(false /*freshRender*/); } } finally { mSession.release(); 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 8d194925652d..abea8c70e978 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 @@ -24,6 +24,7 @@ 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.impl.Stack; +import com.android.resources.ResourceType; import android.app.Activity; import android.app.Fragment; @@ -267,7 +268,7 @@ public final class BridgeContext extends Activity { @Override public final TypedArray obtainStyledAttributes(int[] attrs) { - return createStyleBasedTypedArray(mRenderResources.getTheme(), attrs); + return createStyleBasedTypedArray(mRenderResources.getCurrentTheme(), attrs); } @Override @@ -614,7 +615,7 @@ public final class BridgeContext extends Activity { return null; } - int getFrameworkResourceValue(String resType, String resName, int defValue) { + int getFrameworkResourceValue(ResourceType resType, String resName, int defValue) { Integer value = Bridge.getResourceValue(resType, resName); if (value != null) { return value.intValue(); @@ -623,7 +624,7 @@ public final class BridgeContext extends Activity { return defValue; } - int getProjectResourceValue(String resType, String resName, int defValue) { + int getProjectResourceValue(ResourceType resType, String resName, int defValue) { if (mProjectCallback != null) { Integer value = mProjectCallback.getResourceValue(resType, resName); if (value != null) { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java index 465bf1d956f8..edc92c20636b 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeInflater.java @@ -19,9 +19,9 @@ package com.android.layoutlib.bridge.android; import com.android.ide.common.rendering.api.IProjectCallback; import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.MergeCookie; -import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; import com.android.layoutlib.bridge.Bridge; +import com.android.resources.ResourceType; import org.kxml2.io.KXmlParser; import org.xmlpull.v1.XmlPullParser; @@ -158,13 +158,13 @@ public final class BridgeInflater extends LayoutInflater { String[] layoutInfo = Bridge.resolveResourceValue(resource); if (layoutInfo != null) { value = bridgeContext.getRenderResources().getFrameworkResource( - RenderResources.RES_LAYOUT, layoutInfo[0]); + ResourceType.LAYOUT, layoutInfo[0]); } else { layoutInfo = mProjectCallback.resolveResourceValue(resource); if (layoutInfo != null) { value = bridgeContext.getRenderResources().getProjectResource( - RenderResources.RES_LAYOUT, layoutInfo[0]); + ResourceType.LAYOUT, layoutInfo[0]); } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java index 7b66809d3175..e71bbb234b63 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java @@ -22,6 +22,7 @@ import com.android.ide.common.rendering.api.ResourceValue; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.BridgeConstants; import com.android.layoutlib.bridge.impl.ResourceHelper; +import com.android.resources.ResourceType; import org.kxml2.io.KXmlParser; import org.xmlpull.v1.XmlPullParser; @@ -103,9 +104,14 @@ public final class BridgeResources extends Resources { String[] resourceInfo = Bridge.resolveResourceValue(id); if (resourceInfo != null) { + ResourceType resType = ResourceType.getEnum(resourceInfo[1]); + if (resType == null) { + return null; + } + platformResFlag_out[0] = true; return mContext.getRenderResources().getFrameworkResource( - resourceInfo[1], resourceInfo[0]); + resType, resourceInfo[0]); } // didn't find a match in the framework? look in the project. @@ -113,9 +119,14 @@ public final class BridgeResources extends Resources { resourceInfo = mProjectCallback.resolveResourceValue(id); if (resourceInfo != null) { + ResourceType resType = ResourceType.getEnum(resourceInfo[1]); + if (resType == null) { + return null; + } + platformResFlag_out[0] = false; return mContext.getRenderResources().getProjectResource( - resourceInfo[1], resourceInfo[0]); + resType, resourceInfo[0]); } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java index 8d3c929d6ec2..2b48539228e8 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java @@ -24,6 +24,7 @@ import com.android.internal.util.XmlUtils; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.BridgeConstants; import com.android.layoutlib.bridge.impl.ResourceHelper; +import com.android.resources.ResourceType; import org.kxml2.io.KXmlParser; import org.xmlpull.v1.XmlPullParser; @@ -39,6 +40,7 @@ import android.view.ViewGroup.LayoutParams; import java.io.File; import java.io.FileReader; +import java.util.Arrays; import java.util.Map; /** @@ -587,17 +589,17 @@ public final class BridgeTypedArray extends TypedArray { // then the xml attribute value was "resolved" which leads us to a ResourceValue with a // valid getType() and getName() returning a resource name. // (and getValue() returning null!). We need to handle this! - if (resValue.getType() != null && resValue.getType().startsWith("@+") == false) { + if (resValue.getResourceType() != null && resValue.getType().startsWith("@+") == false) { // if this is a framework id if (mPlatformFile || resValue.isFramework()) { // look for idName in the android R classes return mContext.getFrameworkResourceValue( - resValue.getType(), resValue.getName(), defValue); + resValue.getResourceType(), resValue.getName(), defValue); } // look for idName in the project R class. return mContext.getProjectResourceValue( - resValue.getType(), resValue.getName(), defValue); + resValue.getResourceType(), resValue.getName(), defValue); } // else, try to get the value, and resolve it somehow. @@ -634,21 +636,22 @@ public final class BridgeTypedArray extends TypedArray { // if this is a framework id if (mPlatformFile || value.startsWith("@android") || value.startsWith("@+android")) { // look for idName in the android R classes - return mContext.getFrameworkResourceValue(RenderResources.RES_ID, idName, defValue); + return mContext.getFrameworkResourceValue(ResourceType.ID, idName, defValue); } // look for idName in the project R class. - return mContext.getProjectResourceValue(RenderResources.RES_ID, idName, defValue); + return mContext.getProjectResourceValue(ResourceType.ID, idName, defValue); } // not a direct id valid reference? resolve it Integer idValue = null; if (resValue.isFramework()) { - idValue = Bridge.getResourceValue(resValue.getType(), resValue.getName()); + idValue = Bridge.getResourceValue(resValue.getResourceType(), + resValue.getName()); } else { idValue = mContext.getProjectCallback().getResourceValue( - resValue.getType(), resValue.getName()); + resValue.getResourceType(), resValue.getName()); } if (idValue != null) { @@ -796,6 +799,6 @@ public final class BridgeTypedArray extends TypedArray { @Override public String toString() { - return mResourceData.toString(); + return Arrays.toString(mResourceData); } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlPullAttributes.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlPullAttributes.java index 4a6880b69002..f39961e09958 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlPullAttributes.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeXmlPullAttributes.java @@ -20,6 +20,7 @@ import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.BridgeConstants; +import com.android.resources.ResourceType; import org.xmlpull.v1.XmlPullParser; @@ -58,7 +59,7 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes { String ns = mParser.getAttributeNamespace(index); if (BridgeConstants.NS_RESOURCES.equals(ns)) { - Integer v = Bridge.getResourceValue(RenderResources.RES_ATTR, name); + Integer v = Bridge.getResourceValue(ResourceType.ATTR, name); if (v != null) { return v.intValue(); } @@ -69,7 +70,7 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes { // this is not an attribute in the android namespace, we query the customviewloader, if // the namespaces match. if (mContext.getProjectCallback().getNamespace().equals(ns)) { - Integer v = mContext.getProjectCallback().getResourceValue(RenderResources.RES_ATTR, + Integer v = mContext.getProjectCallback().getResourceValue(ResourceType.ATTR, name); if (v != null) { return v.intValue(); @@ -110,10 +111,10 @@ public class BridgeXmlPullAttributes extends XmlPullAttributes { if (resource != null) { Integer id = null; if (mPlatformFile || resource.isFramework()) { - id = Bridge.getResourceValue(resource.getType(), resource.getName()); + id = Bridge.getResourceValue(resource.getResourceType(), resource.getName()); } else { id = mContext.getProjectCallback().getResourceValue( - resource.getType(), resource.getName()); + resource.getResourceType(), resource.getName()); } if (id != null) { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java index 2bd7cc7a1e21..4c18656fe48a 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/AnimationThread.java @@ -146,7 +146,7 @@ public abstract class AnimationThread extends Thread { } bundle.mTarget.handleMessage(bundle.mMessage); - if (mSession.render().isSuccess()) { + if (mSession.render(false /*freshRender*/).isSuccess()) { mListener.onNewFrame(session); } } finally { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java index 5d56370e7151..f62fad298bdd 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java @@ -163,7 +163,7 @@ public final class FontLoader { mTtfToFontMap.put(ttf, styleMap); } - Font f = styleMap.get(style); + Font f = styleMap.get(style[0]); if (f != null) { return f; 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 d7b70094e494..19251f947d82 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 @@ -32,7 +32,6 @@ import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.Params; import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.RenderSession; -import com.android.ide.common.rendering.api.ResourceDensity; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.Result; import com.android.ide.common.rendering.api.StyleResourceValue; @@ -48,6 +47,9 @@ import com.android.layoutlib.bridge.android.BridgeLayoutParamsMapAttributes; import com.android.layoutlib.bridge.android.BridgeWindow; import com.android.layoutlib.bridge.android.BridgeWindowSession; import com.android.layoutlib.bridge.android.BridgeXmlBlockParser; +import com.android.resources.Density; +import com.android.resources.ResourceType; +import com.android.resources.ScreenSize; import android.animation.Animator; import android.animation.AnimatorInflater; @@ -68,10 +70,12 @@ import android.view.View.MeasureSpec; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; import android.widget.LinearLayout; +import android.widget.QuickContactBadge; import android.widget.TabHost; import android.widget.TabWidget; import android.widget.TabHost.TabSpec; +import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; @@ -107,12 +111,19 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { private BridgeContext mContext; private BridgeXmlBlockParser mBlockParser; private BridgeInflater mInflater; - private int mScreenOffset; private ResourceValue mWindowBackground; private FrameLayout mViewRoot; private Canvas mCanvas; private int mMeasuredScreenWidth = -1; private int mMeasuredScreenHeight = -1; + private boolean mIsAlphaChannelImage = true; + + private int mStatusBarSize; + private int mTopBarSize; + private int mSystemBarSize; + private int mTopOffset; + private int mTotalBarSize; + // information being returned through the API private BufferedImage mImage; @@ -174,19 +185,20 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { mContext = new BridgeContext(mParams.getProjectKey(), metrics, resources, mParams.getProjectCallback(), mParams.getTargetSdkVersion()); + // use default of true in case it's not found to use alpha by default + mIsAlphaChannelImage = getBooleanThemeValue(resources, + "windowIsFloating", true /*defaultValue*/); + setUp(); - // get the screen offset and window-background resource - mWindowBackground = null; - mScreenOffset = 0; - StyleResourceValue theme = resources.getTheme(); - if (theme != null && mParams.isBgColorOverridden() == false) { - mWindowBackground = resources.findItemInTheme("windowBackground"); - mWindowBackground = resources.resolveResValue(mWindowBackground); + findBackground(resources); + findStatusBar(resources, metrics); + findTopBar(resources, metrics); + findSystemBar(resources, metrics); - mScreenOffset = getScreenOffset(resources, metrics); - } + mTopOffset = mStatusBarSize + mTopBarSize; + mTotalBarSize = mTopOffset + mSystemBarSize; // build the inflater and parser. mInflater = new BridgeInflater(mContext, mParams.getProjectCallback()); @@ -385,13 +397,17 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { * <p> * {@link #acquire(long)} must have been called before this. * + * @param freshRender whether the render is a new one and should erase the existing bitmap (in + * the case where bitmaps are reused). This is typically needed when not playing + * animations.) + * * @throws IllegalStateException if the current context is different than the one owned by * the scene, or if {@link #acquire(long)} was not called. * * @see SceneParams#getRenderingMode() * @see LayoutScene#render(long) */ - public Result render() { + public Result render(boolean freshRender) { checkLock(); try { @@ -408,7 +424,7 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { if (mMeasuredScreenWidth == -1) { newRenderSize = true; mMeasuredScreenWidth = mParams.getScreenWidth(); - mMeasuredScreenHeight = mParams.getScreenHeight(); + mMeasuredScreenHeight = mParams.getScreenHeight() - mTotalBarSize; if (renderingMode != RenderingMode.NORMAL) { // measure the full size needed by the layout. @@ -416,7 +432,7 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { renderingMode.isHorizExpand() ? MeasureSpec.UNSPECIFIED // this lets us know the actual needed size : MeasureSpec.EXACTLY); - h_spec = MeasureSpec.makeMeasureSpec(mMeasuredScreenHeight - mScreenOffset, + h_spec = MeasureSpec.makeMeasureSpec(mMeasuredScreenHeight, renderingMode.isVertExpand() ? MeasureSpec.UNSPECIFIED // this lets us know the actual needed size : MeasureSpec.EXACTLY); @@ -431,8 +447,8 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { if (renderingMode.isVertExpand()) { int neededHeight = mViewRoot.getChildAt(0).getMeasuredHeight(); - if (neededHeight > mMeasuredScreenHeight - mScreenOffset) { - mMeasuredScreenHeight = neededHeight + mScreenOffset; + if (neededHeight > mMeasuredScreenHeight) { + mMeasuredScreenHeight = neededHeight; } } } @@ -441,44 +457,83 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { // remeasure with the size we need // This must always be done before the call to layout w_spec = MeasureSpec.makeMeasureSpec(mMeasuredScreenWidth, MeasureSpec.EXACTLY); - h_spec = MeasureSpec.makeMeasureSpec(mMeasuredScreenHeight - mScreenOffset, + h_spec = MeasureSpec.makeMeasureSpec(mMeasuredScreenHeight, MeasureSpec.EXACTLY); mViewRoot.measure(w_spec, h_spec); // now do the layout. - mViewRoot.layout(0, mScreenOffset, mMeasuredScreenWidth, mMeasuredScreenHeight); + mViewRoot.layout(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight); // draw the views // create the BufferedImage into which the layout will be rendered. + boolean newImage = false; if (newRenderSize || mCanvas == null) { if (mParams.getImageFactory() != null) { - mImage = mParams.getImageFactory().getImage(mMeasuredScreenWidth, - mMeasuredScreenHeight - mScreenOffset); + mImage = mParams.getImageFactory().getImage( + mMeasuredScreenWidth, + mMeasuredScreenHeight + mTotalBarSize); } else { - mImage = new BufferedImage(mMeasuredScreenWidth, - mMeasuredScreenHeight - mScreenOffset, BufferedImage.TYPE_INT_ARGB); + mImage = new BufferedImage( + mMeasuredScreenWidth, + mMeasuredScreenHeight + mTotalBarSize, + BufferedImage.TYPE_INT_ARGB); + newImage = true; } if (mParams.isBgColorOverridden()) { + // since we override the content, it's the same as if it was a new image. + newImage = true; Graphics2D gc = mImage.createGraphics(); gc.setColor(new Color(mParams.getOverrideBgColor(), true)); - gc.fillRect(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight - mScreenOffset); + gc.setComposite(AlphaComposite.Src); + gc.fillRect(0, 0, mMeasuredScreenWidth, + mMeasuredScreenHeight + mTotalBarSize); gc.dispose(); } // create an Android bitmap around the BufferedImage Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage, true /*isMutable*/, - ResourceDensity.getEnum(mParams.getDensity())); + Density.getEnum(mParams.getDensity())); // create a Canvas around the Android bitmap mCanvas = new Canvas(bitmap); mCanvas.setDensity(mParams.getDensity()); + mCanvas.translate(0, mTopOffset); + } + + if (freshRender && newImage == false) { + Graphics2D gc = mImage.createGraphics(); + gc.setComposite(AlphaComposite.Src); + + if (mStatusBarSize > 0) { + gc.setColor(new Color(0xFF3C3C3C, true)); + gc.fillRect(0, 0, mMeasuredScreenWidth, mStatusBarSize); + } + + if (mTopBarSize > 0) { + gc.setColor(new Color(0xFF7F7F7F, true)); + gc.fillRect(0, mStatusBarSize, mMeasuredScreenWidth, mTopOffset); + } + + // erase the rest + gc.setColor(new Color(0x00000000, true)); + gc.fillRect(0, mTopOffset, + mMeasuredScreenWidth, mMeasuredScreenHeight + mTopOffset); + + if (mSystemBarSize > 0) { + gc.setColor(new Color(0xFF3C3C3C, true)); + gc.fillRect(0, mMeasuredScreenHeight + mTopOffset, + mMeasuredScreenWidth, mMeasuredScreenHeight + mTotalBarSize); + } + + // done + gc.dispose(); } mViewRoot.draw(mCanvas); - mViewInfoList = visitAllChildren((ViewGroup)mViewRoot, mContext); + mViewInfoList = visitAllChildren((ViewGroup)mViewRoot, mContext, mTopOffset); // success! return SUCCESS.createResult(); @@ -512,17 +567,16 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { int animationId = 0; if (isFrameworkAnimation) { animationResource = mContext.getRenderResources().getFrameworkResource( - RenderResources.RES_ANIMATOR, animationName); + ResourceType.ANIMATOR, animationName); if (animationResource != null) { - animationId = Bridge.getResourceValue(RenderResources.RES_ANIMATOR, - animationName); + animationId = Bridge.getResourceValue(ResourceType.ANIMATOR, animationName); } } else { animationResource = mContext.getRenderResources().getProjectResource( - RenderResources.RES_ANIMATOR, animationName); + ResourceType.ANIMATOR, animationName); if (animationResource != null) { animationId = mContext.getProjectCallback().getResourceValue( - RenderResources.RES_ANIMATOR, animationName); + ResourceType.ANIMATOR, animationName); } } @@ -600,7 +654,7 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { return result; } - result = render(); + result = render(false /*freshRender*/); if (result.isSuccess()) { result = result.getCopyWithData(child); } @@ -678,7 +732,7 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { } try { - result = render(); + result = render(false /*freshRender*/); if (result.isSuccess()) { listener.onNewFrame(RenderSessionImpl.this.getSession()); } @@ -734,7 +788,7 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { return result; } - result = render(); + result = render(false /*freshRender*/); if (layoutParams != null && result.isSuccess()) { result = result.getCopyWithData(layoutParams); } @@ -866,7 +920,7 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { return result; } - return render(); + return render(false /*freshRender*/); } /** @@ -917,73 +971,173 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { } } - /** - * Returns the top screen offset. This depends on whether the current theme defines the user - * of the title and status bars. - * @param resolver The {@link RenderResources} - * @param metrics The display metrics - * @return the pixel height offset - */ - private int getScreenOffset(RenderResources resolver, DisplayMetrics metrics) { - int offset = 0; + private void findBackground(RenderResources resources) { + if (mParams.isBgColorOverridden() == false) { + mWindowBackground = resources.findItemInTheme("windowBackground"); + if (mWindowBackground != null) { + mWindowBackground = resources.resolveResValue(mWindowBackground); + } + } + } - // get the title bar flag from the current theme. - ResourceValue value = resolver.findItemInTheme("windowNoTitle"); + private boolean isTabletUi() { + return mParams.getConfigScreenSize() == ScreenSize.XLARGE; + } - // because it may reference something else, we resolve it. - value = resolver.resolveResValue(value); + private boolean isHCApp() { + RenderResources resources = mContext.getRenderResources(); + + // the app must say it targets 11+ and the theme name must extend Theme.Holo or + // Theme.Holo.Light (which does not extend Theme.Holo, but Theme.Light) + if (mParams.getTargetSdkVersion() < 11) { + return false; + } + + StyleResourceValue currentTheme = resources.getCurrentTheme(); + StyleResourceValue holoTheme = resources.getTheme("Theme.Holo", true /*frameworkTheme*/); + + if (currentTheme == holoTheme || + resources.themeIsParentOf(holoTheme, currentTheme)) { + return true; + } + + StyleResourceValue holoLightTheme = resources.getTheme("Theme.Holo.Light", + true /*frameworkTheme*/); + + if (currentTheme == holoLightTheme || + resources.themeIsParentOf(holoLightTheme, currentTheme)) { + return true; + } + + return false; + } + + private void findStatusBar(RenderResources resources, DisplayMetrics metrics) { + if (isTabletUi() == false) { + boolean windowFullscreen = getBooleanThemeValue(resources, + "windowFullscreen", false /*defaultValue*/); + + if (windowFullscreen == false) { + // default value + mStatusBarSize = DEFAULT_STATUS_BAR_HEIGHT; + + // get the real value + ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN, + "status_bar_height"); + + if (value != null) { + TypedValue typedValue = ResourceHelper.getValue(value.getValue()); + if (typedValue != null) { + // compute the pixel value based on the display metrics + mStatusBarSize = (int)typedValue.getDimension(metrics); + } + } + } + } + } + + private void findTopBar(RenderResources resources, DisplayMetrics metrics) { + boolean windowIsFloating = getBooleanThemeValue(resources, + "windowIsFloating", true /*defaultValue*/); + + if (windowIsFloating == false) { + if (isHCApp()) { + findActionBar(resources, metrics); + } else { + findTitleBar(resources, metrics); + } + } + } + + private void findActionBar(RenderResources resources, DisplayMetrics metrics) { + boolean windowActionBar = getBooleanThemeValue(resources, + "windowActionBar", true /*defaultValue*/); + + // if there's a value and it's false (default is true) + if (windowActionBar) { - // if there's a value and it's true (default is false) - if (value == null || value.getValue() == null || - XmlUtils.convertValueToBoolean(value.getValue(), false /* defValue */) == false) { // default size of the window title bar - int defaultOffset = DEFAULT_TITLE_BAR_HEIGHT; + mTopBarSize = DEFAULT_TITLE_BAR_HEIGHT; // get value from the theme. - value = resolver.findItemInTheme("windowTitleSize"); + ResourceValue value = resources.findItemInTheme("actionBarSize"); // resolve it - value = resolver.resolveResValue(value); + value = resources.resolveResValue(value); if (value != null) { // get the numerical value, if available TypedValue typedValue = ResourceHelper.getValue(value.getValue()); if (typedValue != null) { // compute the pixel value based on the display metrics - defaultOffset = (int)typedValue.getDimension(metrics); + mTopBarSize = (int)typedValue.getDimension(metrics); } } - - offset += defaultOffset; } + } - // get the fullscreen flag from the current theme. - value = resolver.findItemInTheme("windowFullscreen"); + private void findTitleBar(RenderResources resources, DisplayMetrics metrics) { + boolean windowNoTitle = getBooleanThemeValue(resources, + "windowNoTitle", false /*defaultValue*/); - // because it may reference something else, we resolve it. - value = resolver.resolveResValue(value); + if (windowNoTitle == false) { + + // default size of the window title bar + mTopBarSize = DEFAULT_TITLE_BAR_HEIGHT; - if (value == null || value.getValue() == null || - XmlUtils.convertValueToBoolean(value.getValue(), false /* defValue */) == false) { + // get value from the theme. + ResourceValue value = resources.findItemInTheme("windowTitleSize"); + + // resolve it + value = resources.resolveResValue(value); + + if (value != null) { + // get the numerical value, if available + TypedValue typedValue = ResourceHelper.getValue(value.getValue()); + if (typedValue != null) { + // compute the pixel value based on the display metrics + mTopBarSize = (int)typedValue.getDimension(metrics); + } + } + } + } + + private void findSystemBar(RenderResources resources, DisplayMetrics metrics) { + if (isTabletUi() && getBooleanThemeValue( + resources, "windowIsFloating", true /*defaultValue*/) == false) { // default value - int defaultOffset = DEFAULT_STATUS_BAR_HEIGHT; + mSystemBarSize = 56; // ?? // get the real value - value = resolver.getFrameworkResource(RenderResources.RES_DIMEN, "status_bar_height"); + ResourceValue value = resources.getFrameworkResource(ResourceType.DIMEN, + "status_bar_height"); + if (value != null) { TypedValue typedValue = ResourceHelper.getValue(value.getValue()); if (typedValue != null) { // compute the pixel value based on the display metrics - defaultOffset = (int)typedValue.getDimension(metrics); + mSystemBarSize = (int)typedValue.getDimension(metrics); } } + } + } + + private boolean getBooleanThemeValue(RenderResources resources, + String name, boolean defaultValue) { + + // get the title bar flag from the current theme. + ResourceValue value = resources.findItemInTheme(name); + + // because it may reference something else, we resolve it. + value = resources.resolveResValue(value); - // add the computed offset. - offset += defaultOffset; + // if there's no value, return the default. + if (value == null || value.getValue() == null) { + return defaultValue; } - return offset; + return XmlUtils.convertValueToBoolean(value.getValue(), defaultValue); } /** @@ -998,6 +1152,9 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { throws PostInflateException { if (view instanceof TabHost) { setupTabHost((TabHost)view, projectCallback); + } else if (view instanceof QuickContactBadge) { + QuickContactBadge badge = (QuickContactBadge) view; + badge.setImageToDefault(); } else if (view instanceof ViewGroup) { ViewGroup group = (ViewGroup)view; final int count = group.getChildCount(); @@ -1089,32 +1246,33 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { * @param view the root View * @param context the context. */ - private ViewInfo visit(View view, BridgeContext context) { + private ViewInfo visit(View view, BridgeContext context, int offset) { if (view == null) { return null; } ViewInfo result = new ViewInfo(view.getClass().getName(), context.getViewKey(view), - view.getLeft(), view.getTop(), view.getRight(), view.getBottom(), + view.getLeft(), view.getTop() + offset, view.getRight(), view.getBottom() + offset, view, view.getLayoutParams()); if (view instanceof ViewGroup) { ViewGroup group = ((ViewGroup) view); - result.setChildren(visitAllChildren(group, context)); + result.setChildren(visitAllChildren(group, context, 0 /*offset*/)); } return result; } - private List<ViewInfo> visitAllChildren(ViewGroup viewGroup, BridgeContext context) { + private List<ViewInfo> visitAllChildren(ViewGroup viewGroup, BridgeContext context, + int offset) { if (viewGroup == null) { return null; } List<ViewInfo> children = new ArrayList<ViewInfo>(); for (int i = 0; i < viewGroup.getChildCount(); i++) { - children.add(visit(viewGroup.getChildAt(i), context)); + children.add(visit(viewGroup.getChildAt(i), context, offset)); } return children; } @@ -1128,6 +1286,10 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { return mImage; } + public boolean isAlphaChannelImage() { + return mIsAlphaChannelImage; + } + public List<ViewInfo> getViewInfos() { return mViewInfoList; } @@ -1147,7 +1309,7 @@ public class RenderSessionImpl extends FrameworkResourceIdProvider { // --- FrameworkResourceIdProvider methods @Override - public Integer getId(String resType, String resName) { + public Integer getId(ResourceType resType, String resName) { return Bridge.getResourceValue(resType, resName); } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java index 475b4be25314..ae7a77f1f895 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java @@ -18,13 +18,13 @@ package com.android.layoutlib.bridge.impl; import com.android.ide.common.rendering.api.DensityBasedResourceValue; import com.android.ide.common.rendering.api.LayoutLog; -import com.android.ide.common.rendering.api.ResourceDensity; import com.android.ide.common.rendering.api.ResourceValue; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.android.BridgeContext; import com.android.layoutlib.bridge.android.BridgeXmlBlockParser; import com.android.ninepatch.NinePatch; import com.android.ninepatch.NinePatchChunk; +import com.android.resources.Density; import org.kxml2.io.KXmlParser; import org.xmlpull.v1.XmlPullParser; @@ -147,7 +147,7 @@ public final class ResourceHelper { } if (bitmap == null) { - ResourceDensity density = ResourceDensity.MEDIUM; + Density density = Density.MEDIUM; if (value instanceof DensityBasedResourceValue) { density = ((DensityBasedResourceValue)value).getResourceDensity(); @@ -214,7 +214,7 @@ public final class ResourceHelper { isFramework ? null : context.getProjectKey()); if (bitmap == null) { - ResourceDensity density = ResourceDensity.MEDIUM; + Density density = Density.MEDIUM; if (value instanceof DensityBasedResourceValue) { density = ((DensityBasedResourceValue)value).getResourceDensity(); } @@ -298,7 +298,7 @@ public final class ResourceHelper { */ public static boolean stringToFloat(String s, TypedValue outValue) { // remove the space before and after - s.trim(); + s = s.trim(); int len = s.length(); if (len <= 0) { |