diff options
313 files changed, 3797 insertions, 2501 deletions
diff --git a/api/current.xml b/api/current.xml index d2bd8e5..a738761 100644 --- a/api/current.xml +++ b/api/current.xml @@ -6686,6 +6686,17 @@ visibility="public" > </field> +<field name="opacity" + type="int" + transient="false" + volatile="false" + value="16843567" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="order" type="int" transient="false" @@ -14722,6 +14733,28 @@ visibility="public" > </field> +<field name="Theme_Holo_Wallpaper" + type="int" + transient="false" + volatile="false" + value="16973956" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="Theme_Holo_Wallpaper_NoTitleBar" + type="int" + transient="false" + volatile="false" + value="16973957" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="Theme_InputMethod" type="int" transient="false" @@ -19596,6 +19629,17 @@ synchronized="false" static="false" final="false" + deprecated="deprecated" + visibility="public" +> +</method> +<method name="getCustomView" + return="android.view.View" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" deprecated="not deprecated" visibility="public" > @@ -20362,6 +20406,19 @@ <parameter name="view" type="android.view.View"> </parameter> </method> +<method name="setCustomView" + return="android.app.ActionBar.Tab" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="layoutResId" type="int"> +</parameter> +</method> <method name="setIcon" return="android.app.ActionBar.Tab" abstract="true" @@ -20375,6 +20432,19 @@ <parameter name="icon" type="android.graphics.drawable.Drawable"> </parameter> </method> +<method name="setIcon" + return="android.app.ActionBar.Tab" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="resId" type="int"> +</parameter> +</method> <method name="setTabListener" return="android.app.ActionBar.Tab" abstract="true" @@ -20414,6 +20484,19 @@ <parameter name="text" type="java.lang.CharSequence"> </parameter> </method> +<method name="setText" + return="android.app.ActionBar.Tab" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="resId" type="int"> +</parameter> +</method> <field name="INVALID_POSITION" type="int" transient="false" @@ -21911,47 +21994,6 @@ <parameter name="exitAnim" type="int"> </parameter> </method> -<method name="popBackStack" - return="boolean" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="deprecated" - visibility="public" -> -</method> -<method name="popBackStack" - return="boolean" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="deprecated" - visibility="public" -> -<parameter name="name" type="java.lang.String"> -</parameter> -<parameter name="flags" type="int"> -</parameter> -</method> -<method name="popBackStack" - return="boolean" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="deprecated" - visibility="public" -> -<parameter name="id" type="int"> -</parameter> -<parameter name="flags" type="int"> -</parameter> -</method> <method name="registerForContextMenu" return="void" abstract="false" @@ -22637,17 +22679,6 @@ visibility="protected" > </field> -<field name="POP_BACK_STACK_INCLUSIVE" - type="int" - transient="false" - volatile="false" - value="1" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="RESULT_CANCELED" type="int" transient="false" @@ -26523,6 +26554,19 @@ <parameter name="request" type="android.app.DownloadManager.Request"> </parameter> </method> +<method name="getMimeTypeForDownloadedFile" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="id" type="long"> +</parameter> +</method> <method name="getUriForDownloadedFile" return="android.net.Uri" abstract="false" @@ -28360,6 +28404,17 @@ <parameter name="args" type="java.lang.String[]"> </parameter> </method> +<method name="executePendingTransactions" + return="boolean" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="findFragmentById" return="android.app.Fragment" abstract="true" @@ -28426,7 +28481,7 @@ > </method> <method name="popBackStack" - return="boolean" + return="void" abstract="true" native="false" synchronized="false" @@ -28437,7 +28492,7 @@ > </method> <method name="popBackStack" - return="boolean" + return="void" abstract="true" native="false" synchronized="false" @@ -28452,6 +28507,47 @@ </parameter> </method> <method name="popBackStack" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="id" type="int"> +</parameter> +<parameter name="flags" type="int"> +</parameter> +</method> +<method name="popBackStackImmediate" + return="boolean" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="popBackStackImmediate" + return="boolean" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="name" type="java.lang.String"> +</parameter> +<parameter name="flags" type="int"> +</parameter> +</method> +<method name="popBackStackImmediate" return="boolean" abstract="true" native="false" @@ -68648,6 +68744,29 @@ </parameter> <parameter name="selection" type="java.lang.String"> </parameter> +<parameter name="groupBy" type="java.lang.String"> +</parameter> +<parameter name="having" type="java.lang.String"> +</parameter> +<parameter name="sortOrder" type="java.lang.String"> +</parameter> +<parameter name="limit" type="java.lang.String"> +</parameter> +</method> +<method name="buildQuery" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="deprecated" + visibility="public" +> +<parameter name="projectionIn" type="java.lang.String[]"> +</parameter> +<parameter name="selection" type="java.lang.String"> +</parameter> <parameter name="selectionArgs" type="java.lang.String[]"> </parameter> <parameter name="groupBy" type="java.lang.String"> @@ -68725,6 +68844,33 @@ </parameter> <parameter name="selection" type="java.lang.String"> </parameter> +<parameter name="groupBy" type="java.lang.String"> +</parameter> +<parameter name="having" type="java.lang.String"> +</parameter> +</method> +<method name="buildUnionSubQuery" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="deprecated" + visibility="public" +> +<parameter name="typeDiscriminatorColumn" type="java.lang.String"> +</parameter> +<parameter name="unionColumns" type="java.lang.String[]"> +</parameter> +<parameter name="columnsPresentInTable" type="java.util.Set<java.lang.String>"> +</parameter> +<parameter name="computedColumnsOffset" type="int"> +</parameter> +<parameter name="typeDiscriminatorValue" type="java.lang.String"> +</parameter> +<parameter name="selection" type="java.lang.String"> +</parameter> <parameter name="selectionArgs" type="java.lang.String[]"> </parameter> <parameter name="groupBy" type="java.lang.String"> @@ -85905,6 +86051,19 @@ <parameter name="b" type="int"> </parameter> </method> +<method name="setOpacity" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="opacity" type="int"> +</parameter> +</method> <method name="unscheduleDrawable" return="void" abstract="false" @@ -101697,6 +101856,17 @@ visibility="public" > </field> +<field name="VOICE_COMMUNICATION" + type="int" + transient="false" + volatile="false" + value="7" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="VOICE_DOWNLINK" type="int" transient="false" @@ -144657,6 +144827,17 @@ visibility="public" > </method> +<method name="getIcon" + return="android.graphics.drawable.Drawable" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getIntent" return="android.content.Intent" abstract="false" @@ -145243,6 +145424,32 @@ <parameter name="fragment" type="java.lang.String"> </parameter> </method> +<method name="setIcon" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="icon" type="android.graphics.drawable.Drawable"> +</parameter> +</method> +<method name="setIcon" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="iconResId" type="int"> +</parameter> +</method> <method name="setIntent" return="void" abstract="false" @@ -212801,7 +213008,7 @@ type="int" transient="false" volatile="false" - value="-2147483648" + value="16777216" static="true" final="true" deprecated="not deprecated" @@ -212940,6 +213147,17 @@ visibility="public" > </field> +<field name="FLAG_SPLIT_TOUCH" + type="int" + transient="false" + volatile="false" + value="8388608" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="FLAG_TOUCHABLE_WHEN_WAKING" type="int" transient="false" @@ -219233,6 +219451,19 @@ visibility="public" > </method> +<method name="getEnabledInputMethodSubtypeList" + return="java.util.List<android.view.inputmethod.InputMethodSubtype>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="imi" type="android.view.inputmethod.InputMethodInfo"> +</parameter> +</method> <method name="getInputMethodList" return="java.util.List<android.view.inputmethod.InputMethodInfo>" abstract="false" @@ -239896,6 +240127,20 @@ <parameter name="interpolator" type="android.view.animation.Interpolator"> </parameter> </constructor> +<constructor name="Scroller" + type="android.widget.Scroller" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="context" type="android.content.Context"> +</parameter> +<parameter name="interpolator" type="android.view.animation.Interpolator"> +</parameter> +<parameter name="flywheel" type="boolean"> +</parameter> +</constructor> <method name="abortAnimation" return="void" abstract="false" @@ -246809,7 +247054,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="arg0" type="T"> +<parameter name="t" type="T"> </parameter> </method> </interface> diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java index b5fddfa..ac0e410 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -217,8 +217,7 @@ public final class Bmgr { // The rest of the 'list' options work with a restore session on the current transport try { - String curTransport = mBmgr.getCurrentTransport(); - mRestore = mBmgr.beginRestoreSession(curTransport); + mRestore = mBmgr.beginRestoreSession(null, null); if (mRestore == null) { System.err.println(BMGR_NOT_RUNNING_ERR); return; @@ -349,8 +348,7 @@ public final class Bmgr { private void doRestorePackage(String pkg) { try { - String curTransport = mBmgr.getCurrentTransport(); - mRestore = mBmgr.beginRestoreSession(curTransport); + mRestore = mBmgr.beginRestoreSession(pkg, null); if (mRestore == null) { System.err.println(BMGR_NOT_RUNNING_ERR); return; @@ -378,8 +376,7 @@ public final class Bmgr { try { boolean didRestore = false; - String curTransport = mBmgr.getCurrentTransport(); - mRestore = mBmgr.beginRestoreSession(curTransport); + mRestore = mBmgr.beginRestoreSession(null, null); if (mRestore == null) { System.err.println(BMGR_NOT_RUNNING_ERR); return; diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index e6b1c08..8471df9 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -520,6 +520,18 @@ public class AccountManagerService if (account == null) throw new IllegalArgumentException("account is null"); checkManageAccountsPermission(); long identityToken = clearCallingIdentity(); + + cancelNotification(getSigninRequiredNotificationId(account)); + synchronized(mCredentialsPermissionNotificationIds) { + for (Pair<Pair<Account, String>, Integer> pair: + mCredentialsPermissionNotificationIds.keySet()) { + if (account.equals(pair.first.first)) { + int id = mCredentialsPermissionNotificationIds.get(pair); + cancelNotification(id); + } + } + } + try { new RemoveAccountSession(response, account).bind(); } finally { diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java index a57b54a..7a6ad0f 100644 --- a/core/java/android/app/ActionBar.java +++ b/core/java/android/app/ActionBar.java @@ -138,14 +138,19 @@ public abstract class ActionBar { * Set the action bar into custom navigation mode, supplying a view * for custom navigation. * - * Custom navigation views appear between the application icon and + * <p>Custom navigation views appear between the application icon and * any action buttons and may use any space available there. Common * use cases for custom navigation views might include an auto-suggesting * address bar for a browser or other navigation mechanisms that do not - * translate well to provided navigation modes. + * translate well to provided navigation modes.</p> + * + * <p>The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for + * the custom view to be displayed.</p> * * @param view Custom navigation view to place in the ActionBar. * @param layoutParams How this custom view should layout in the bar. + * + * @see #setDisplayOptions(int, int) */ public abstract void setCustomView(View view, LayoutParams layoutParams); @@ -248,39 +253,47 @@ public abstract class ActionBar { public abstract void setStandardNavigationMode(); /** - * Set the action bar's title. This will only be displayed in standard navigation mode. + * Set the action bar's title. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. * * @param title Title to set * * @see #setTitle(int) + * @see #setDisplayOptions(int, int) */ public abstract void setTitle(CharSequence title); /** - * Set the action bar's title. This will only be displayed in standard navigation mode. + * Set the action bar's title. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. * * @param resId Resource ID of title string to set * * @see #setTitle(CharSequence) + * @see #setDisplayOptions(int, int) */ public abstract void setTitle(int resId); /** - * Set the action bar's subtitle. This will only be displayed in standard navigation mode. - * Set to null to disable the subtitle entirely. + * Set the action bar's subtitle. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. Set to null to disable the + * subtitle entirely. * * @param subtitle Subtitle to set * * @see #setSubtitle(int) + * @see #setDisplayOptions(int, int) */ public abstract void setSubtitle(CharSequence subtitle); /** - * Set the action bar's subtitle. This will only be displayed in standard navigation mode. + * Set the action bar's subtitle. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. * * @param resId Resource ID of subtitle string to set * * @see #setSubtitle(CharSequence) + * @see #setDisplayOptions(int, int) */ public abstract void setSubtitle(int resId); @@ -317,9 +330,16 @@ public abstract class ActionBar { /** * @return The current custom navigation view. + * @deprecated Method has been renamed. Use {@link #getCustomView()}. */ + @Deprecated public abstract View getCustomNavigationView(); - + + /** + * @return The current custom view. + */ + public abstract View getCustomView(); + /** * Returns the current ActionBar title in standard mode. * Returns null if {@link #getNavigationMode()} would not return @@ -570,6 +590,14 @@ public abstract class ActionBar { public abstract Tab setIcon(Drawable icon); /** + * Set the icon displayed on this tab. + * + * @param resId Resource ID referring to the drawable to use as an icon + * @return The current instance for call chaining + */ + public abstract Tab setIcon(int resId); + + /** * Set the text displayed on this tab. Text may be truncated if there is not * room to display the entire string. * @@ -579,6 +607,15 @@ public abstract class ActionBar { public abstract Tab setText(CharSequence text); /** + * Set the text displayed on this tab. Text may be truncated if there is not + * room to display the entire string. + * + * @param resId A resource ID referring to the text that should be displayed + * @return The current instance for call chaining + */ + public abstract Tab setText(int resId); + + /** * Set a custom view to be used for this tab. This overrides values set by * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}. * @@ -588,6 +625,15 @@ public abstract class ActionBar { public abstract Tab setCustomView(View view); /** + * Set a custom view to be used for this tab. This overrides values set by + * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}. + * + * @param layoutResId A layout resource to inflate and use as a custom tab view + * @return The current instance for call chaining + */ + public abstract Tab setCustomView(int layoutResId); + + /** * Retrieve a previously set custom view for this tab. * * @return The custom view set by {@link #setCustomView(View)}. diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 07d21fb..5174f19 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2086,63 +2086,12 @@ public class Activity extends ContextThemeWrapper } /** - * Flag for {@link #popBackStack(String, int)} - * and {@link #popBackStack(int, int)}: If set, and the name or ID of - * a back stack entry has been supplied, then all matching entries will - * be consumed until one that doesn't match is found or the bottom of - * the stack is reached. Otherwise, all entries up to but not including that entry - * will be removed. - */ - public static final int POP_BACK_STACK_INCLUSIVE = 1<<0; - - /** - * Pop the top state off the back stack. Returns true if there was one - * to pop, else false. - * @deprecated use {@link #getFragmentManager}. - */ - @Deprecated - public boolean popBackStack() { - return mFragments.popBackStack(); - } - - /** - * Pop the last fragment transition from the local activity's fragment - * back stack. If there is nothing to pop, false is returned. - * @param name If non-null, this is the name of a previous back state - * to look for; if found, all states up to that state will be popped. The - * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether - * the named state itself is popped. If null, only the top state is popped. - * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. - * @deprecated use {@link #getFragmentManager}. - */ - @Deprecated - public boolean popBackStack(String name, int flags) { - return mFragments.popBackStack(name, flags); - } - - /** - * Pop all back stack states up to the one with the given identifier. - * @param id Identifier of the stated to be popped. If no identifier exists, - * false is returned. - * The identifier is the number returned by - * {@link FragmentTransaction#commit() FragmentTransaction.commit()}. The - * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether - * the named state itself is popped. - * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. - * @deprecated use {@link #getFragmentManager}. - */ - @Deprecated - public boolean popBackStack(int id, int flags) { - return mFragments.popBackStack(id, flags); - } - - /** * Called when the activity has detected the user's press of the back * key. The default implementation simply finishes the current activity, * but you can override this to do whatever you want. */ public void onBackPressed() { - if (!mFragments.popBackStack()) { + if (!mFragments.popBackStackImmediate()) { finish(); } } diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index 6e18533..09a21f8 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -886,8 +886,8 @@ public class DownloadManager { * downloaded successfully. otherwise, null is returned. *<p> * If the specified downloaded file is in external storage (for example, /sdcard dir), - * then it is assumed to be safe for anyone to read and the returned {@link Uri} can be used - * by any app to access the downloaded file. + * then it is assumed to be safe for anyone to read and the returned {@link Uri} corresponds + * to the filepath on sdcard. * * @param id the id of the downloaded file. * @return the {@link Uri} for the given downloaded file id, if download was successful. null @@ -903,8 +903,7 @@ public class DownloadManager { return null; } while (cursor.moveToFirst()) { - int status = cursor.getInt(cursor.getColumnIndexOrThrow( - DownloadManager.COLUMN_STATUS)); + int status = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_STATUS)); if (DownloadManager.STATUS_SUCCESSFUL == status) { int indx = cursor.getColumnIndexOrThrow( Downloads.Impl.COLUMN_DESTINATION); @@ -919,8 +918,9 @@ public class DownloadManager { return ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, id); } else { // return public uri - return ContentUris.withAppendedId( - Downloads.Impl.PUBLICLY_ACCESSIBLE_DOWNLOADS_URI, id); + String path = cursor.getString( + cursor.getColumnIndexOrThrow(COLUMN_LOCAL_FILENAME)); + return Uri.fromFile(new File(path)); } } } @@ -934,6 +934,38 @@ public class DownloadManager { } /** + * Returns {@link Uri} for the given downloaded file id, if the file is + * downloaded successfully. otherwise, null is returned. + *<p> + * If the specified downloaded file is in external storage (for example, /sdcard dir), + * then it is assumed to be safe for anyone to read and the returned {@link Uri} corresponds + * to the filepath on sdcard. + * + * @param id the id of the downloaded file. + * @return the {@link Uri} for the given downloaded file id, if download was successful. null + * otherwise. + */ + public String getMimeTypeForDownloadedFile(long id) { + Query query = new Query().setFilterById(id); + Cursor cursor = null; + try { + cursor = query(query); + if (cursor == null) { + return null; + } + while (cursor.moveToFirst()) { + return cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_MEDIA_TYPE)); + } + } finally { + if (cursor != null) { + cursor.close(); + } + } + // downloaded file not found or its status is not 'successfully completed' + return null; + } + + /** * Restart the given downloads, which must have already completed (successfully or not). This * method will only work when called from within the download manager's process. * @param ids the IDs of the downloads diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 9970418..fbad2fe 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -22,6 +22,7 @@ import android.animation.AnimatorListenerAdapter; import android.content.res.TypedArray; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; @@ -99,6 +100,20 @@ public abstract class FragmentManager { public abstract FragmentTransaction openTransaction(); /** + * After a {@link FragmentTransaction} is committed with + * {@link FragmentTransaction#commit FragmentTransaction.commit()}, it + * is scheduled to be executed asynchronously on the process's main thread. + * If you want to immediately executing any such pending operations, you + * can call this function (only from the main thread) to do so. Note that + * all callbacks and other related behavior will be done from within this + * call, so be careful about where this is called from. + * + * @return Returns true if there were any pending transactions to be + * executed. + */ + public abstract boolean executePendingTransactions(); + + /** * Finds a fragment that was identified by the given id either when inflated * from XML or as the container ID when added in a transaction. This first * searches through fragments that are currently added to the manager's @@ -132,7 +147,15 @@ public abstract class FragmentManager { * Pop the top state off the back stack. Returns true if there was one * to pop, else false. */ - public abstract boolean popBackStack(); + public abstract void popBackStack(); + + /** + * Like {@link #popBackStack()}, but performs the operation immediately + * inside of the call. This is like calling {@link #executePendingTransactions()} + * afterwards. + * @return Returns true if there was something popped, else false. + */ + public abstract boolean popBackStackImmediate(); /** * Pop the last fragment transition from the manager's fragment @@ -143,7 +166,15 @@ public abstract class FragmentManager { * the named state itself is popped. If null, only the top state is popped. * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. */ - public abstract boolean popBackStack(String name, int flags); + public abstract void popBackStack(String name, int flags); + + /** + * Like {@link #popBackStack(String, int)}, but performs the operation immediately + * inside of the call. This is like calling {@link #executePendingTransactions()} + * afterwards. + * @return Returns true if there was something popped, else false. + */ + public abstract boolean popBackStackImmediate(String name, int flags); /** * Pop all back stack states up to the one with the given identifier. @@ -155,7 +186,15 @@ public abstract class FragmentManager { * the named state itself is popped. * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}. */ - public abstract boolean popBackStack(int id, int flags); + public abstract void popBackStack(int id, int flags); + + /** + * Like {@link #popBackStack(int, int)}, but performs the operation immediately + * inside of the call. This is like calling {@link #executePendingTransactions()} + * afterwards. + * @return Returns true if there was something popped, else false. + */ + public abstract boolean popBackStackImmediate(int id, int flags); /** * Return the number of entries currently in the back stack. @@ -300,17 +339,58 @@ final class FragmentManagerImpl extends FragmentManager { } @Override - public boolean popBackStack() { + public boolean executePendingTransactions() { + return execPendingActions(); + } + + @Override + public void popBackStack() { + enqueueAction(new Runnable() { + @Override public void run() { + popBackStackState(mActivity.mHandler, null, -1, 0); + } + }, false); + } + + @Override + public boolean popBackStackImmediate() { + checkStateLoss(); + executePendingTransactions(); return popBackStackState(mActivity.mHandler, null, -1, 0); } @Override - public boolean popBackStack(String name, int flags) { + public void popBackStack(final String name, final int flags) { + enqueueAction(new Runnable() { + @Override public void run() { + popBackStackState(mActivity.mHandler, name, -1, flags); + } + }, false); + } + + @Override + public boolean popBackStackImmediate(String name, int flags) { + checkStateLoss(); + executePendingTransactions(); return popBackStackState(mActivity.mHandler, name, -1, flags); } @Override - public boolean popBackStack(int id, int flags) { + public void popBackStack(final int id, final int flags) { + if (id < 0) { + throw new IllegalArgumentException("Bad id: " + id); + } + enqueueAction(new Runnable() { + @Override public void run() { + popBackStackState(mActivity.mHandler, null, id, flags); + } + }, false); + } + + @Override + public boolean popBackStackImmediate(int id, int flags) { + checkStateLoss(); + executePendingTransactions(); if (id < 0) { throw new IllegalArgumentException("Bad id: " + id); } @@ -849,16 +929,20 @@ final class FragmentManagerImpl extends FragmentManager { return null; } + private void checkStateLoss() { + if (mStateSaved) { + throw new IllegalStateException( + "Can not perform this action after onSaveInstanceState"); + } + if (mNoTransactionsBecause != null) { + throw new IllegalStateException( + "Can not perform this action inside of " + mNoTransactionsBecause); + } + } + public void enqueueAction(Runnable action, boolean allowStateLoss) { if (!allowStateLoss) { - if (mStateSaved) { - throw new IllegalStateException( - "Can not perform this action after onSaveInstanceState"); - } - if (mNoTransactionsBecause != null) { - throw new IllegalStateException( - "Can not perform this action inside of " + mNoTransactionsBecause); - } + checkStateLoss(); } synchronized (this) { if (mActivity == null) { @@ -934,17 +1018,23 @@ final class FragmentManagerImpl extends FragmentManager { /** * Only call from main thread! */ - public void execPendingActions() { + public boolean execPendingActions() { if (mExecutingActions) { - throw new IllegalStateException("Recursive entry to execPendingActions"); + throw new IllegalStateException("Recursive entry to executePendingTransactions"); } + if (Looper.myLooper() != mActivity.mHandler.getLooper()) { + throw new IllegalStateException("Must be called from main thread of process"); + } + + boolean didSomething = false; + while (true) { int numActions; synchronized (this) { if (mPendingActions == null || mPendingActions.size() == 0) { - return; + return didSomething; } numActions = mPendingActions.size(); @@ -961,6 +1051,7 @@ final class FragmentManagerImpl extends FragmentManager { mTmpActions[i].run(); } mExecutingActions = false; + didSomething = true; } } @@ -984,19 +1075,14 @@ final class FragmentManagerImpl extends FragmentManager { if (mBackStack == null) { return false; } - if (name == null && id < 0 && (flags&Activity.POP_BACK_STACK_INCLUSIVE) == 0) { + if (name == null && id < 0 && (flags&POP_BACK_STACK_INCLUSIVE) == 0) { int last = mBackStack.size()-1; if (last < 0) { return false; } final BackStackRecord bss = mBackStack.remove(last); - enqueueAction(new Runnable() { - public void run() { - if (DEBUG) Log.v(TAG, "Popping back stack state: " + bss); - bss.popFromBackStack(true); - reportBackStackChanged(); - } - }, false); + bss.popFromBackStack(true); + reportBackStackChanged(); } else { int index = -1; if (name != null || id >= 0) { @@ -1016,7 +1102,7 @@ final class FragmentManagerImpl extends FragmentManager { if (index < 0) { return false; } - if ((flags&Activity.POP_BACK_STACK_INCLUSIVE) != 0) { + if ((flags&POP_BACK_STACK_INCLUSIVE) != 0) { index--; // Consume all following entries that match. while (index >= 0) { @@ -1038,16 +1124,12 @@ final class FragmentManagerImpl extends FragmentManager { for (int i=mBackStack.size()-1; i>index; i--) { states.add(mBackStack.remove(i)); } - enqueueAction(new Runnable() { - public void run() { - final int LAST = states.size()-1; - for (int i=0; i<=LAST; i++) { - if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); - states.get(i).popFromBackStack(i == LAST); - } - reportBackStackChanged(); - } - }, false); + final int LAST = states.size()-1; + for (int i=0; i<=LAST; i++) { + if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i)); + states.get(i).popFromBackStack(i == LAST); + } + reportBackStackChanged(); } return true; } @@ -1084,6 +1166,10 @@ final class FragmentManagerImpl extends FragmentManager { } Parcelable saveAllState() { + // Make sure all pending operations have now been executed to get + // our state update-to-date. + execPendingActions(); + mStateSaved = true; if (mActive == null || mActive.size() <= 0) { diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index 52dd707..80656a1 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -138,8 +138,8 @@ public class BackupManager { if (sService != null) { RestoreSession session = null; try { - String transport = sService.getCurrentTransport(); - IRestoreSession binder = sService.beginRestoreSession(transport); + IRestoreSession binder = sService.beginRestoreSession(mContext.getPackageName(), + null); session = new RestoreSession(mContext, binder); result = session.restorePackage(mContext.getPackageName(), observer); } catch (RemoteException e) { @@ -163,8 +163,8 @@ public class BackupManager { checkServiceBinder(); if (sService != null) { try { - String transport = sService.getCurrentTransport(); - IRestoreSession binder = sService.beginRestoreSession(transport); + // All packages, current transport + IRestoreSession binder = sService.beginRestoreSession(null, null); session = new RestoreSession(mContext, binder); } catch (RemoteException e) { Log.w(TAG, "beginRestoreSession() couldn't connect"); diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl index 23d6351..8af59df 100644 --- a/core/java/android/app/backup/IBackupManager.aidl +++ b/core/java/android/app/backup/IBackupManager.aidl @@ -144,13 +144,25 @@ interface IBackupManager { String selectBackupTransport(String transport); /** - * Begin a restore session with the given transport (which may differ from the - * currently-active backup transport). + * Begin a restore session. Either or both of packageName and transportID + * may be null. If packageName is non-null, then only the given package will be + * considered for restore. If transportID is null, then the restore will use + * the current active transport. + * <p> + * This method requires the android.permission.BACKUP permission <i>except</i> + * when transportID is null and packageName is the name of the caller's own + * package. In that case, the restore session returned is suitable for supporting + * the BackupManager.requestRestore() functionality via RestoreSession.restorePackage() + * without requiring the app to hold any special permission. * - * @param transport The name of the transport to use for the restore operation. + * @param packageName The name of the single package for which a restore will + * be requested. May be null, in which case all packages in the restore + * set can be restored. + * @param transportID The name of the transport to use for the restore operation. + * May be null, in which case the current active transport is used. * @return An interface to the restore session, or null on error. */ - IRestoreSession beginRestoreSession(String transportID); + IRestoreSession beginRestoreSession(String packageName, String transportID); /** * Notify the backup manager that a BackupAgent has completed the operation diff --git a/core/java/android/content/ContentQueryMap.java b/core/java/android/content/ContentQueryMap.java index c955094..8aeaa8f 100644 --- a/core/java/android/content/ContentQueryMap.java +++ b/core/java/android/content/ContentQueryMap.java @@ -33,7 +33,7 @@ import java.util.Observable; * The cursor data is accessed by row key and column name via getValue(). */ public class ContentQueryMap extends Observable { - private Cursor mCursor; + private volatile Cursor mCursor; private String[] mColumnNames; private int mKeyColumn; @@ -71,7 +71,7 @@ public class ContentQueryMap extends Observable { // ContentProvider then read it once into the cache. Otherwise the cache will be filled // automatically. if (!keepUpdated) { - readCursorIntoCache(); + readCursorIntoCache(cursor); } } @@ -128,27 +128,35 @@ public class ContentQueryMap extends Observable { /** Requeries the cursor and reads the contents into the cache */ public void requery() { + final Cursor cursor = mCursor; + if (cursor == null) { + // If mCursor is null then it means there was a requery() in flight + // while another thread called close(), which nulls out mCursor. + // If this happens ignore the requery() since we are closed anyways. + return; + } mDirty = false; - if (!mCursor.requery()) { - throw new IllegalStateException("trying to requery an already closed cursor"); + if (!cursor.requery()) { + // again, don't do anything if the cursor is already closed + return; } - readCursorIntoCache(); + readCursorIntoCache(cursor); setChanged(); notifyObservers(); } - private synchronized void readCursorIntoCache() { + private synchronized void readCursorIntoCache(Cursor cursor) { // Make a new map so old values returned by getRows() are undisturbed. int capacity = mValues != null ? mValues.size() : 0; mValues = new HashMap<String, ContentValues>(capacity); - while (mCursor.moveToNext()) { + while (cursor.moveToNext()) { ContentValues values = new ContentValues(); for (int i = 0; i < mColumnNames.length; i++) { if (i != mKeyColumn) { - values.put(mColumnNames[i], mCursor.getString(i)); + values.put(mColumnNames[i], cursor.getString(i)); } } - mValues.put(mCursor.getString(mKeyColumn), values); + mValues.put(cursor.getString(mKeyColumn), values); } } diff --git a/core/java/android/database/sqlite/SQLiteCursor.java b/core/java/android/database/sqlite/SQLiteCursor.java index fc30da2..5a6c667 100644 --- a/core/java/android/database/sqlite/SQLiteCursor.java +++ b/core/java/android/database/sqlite/SQLiteCursor.java @@ -125,11 +125,11 @@ public class SQLiteCursor extends AbstractWindowedCursor { // the cursor's state doesn't change while (true) { mLock.lock(); - if (mCursorState != mThreadState) { - mLock.unlock(); - break; - } try { + if (mCursorState != mThreadState) { + break; + } + int count = getQuery().fillWindow(cw, mMaxRead, mCount); // return -1 means there is still more data to be retrieved from the resultset if (count != 0) { @@ -241,9 +241,8 @@ public class SQLiteCursor extends AbstractWindowedCursor { mColumnNameMap = null; mQuery = query; + query.mDatabase.lock(); try { - query.mDatabase.lock(); - // Setup the list of columns int columnCount = mQuery.columnCountLocked(); mColumns = new String[columnCount]; diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java index 610bf70..b6aca2b 100644 --- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java +++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java @@ -321,7 +321,7 @@ public class SQLiteQueryBuilder } String sql = buildQuery( - projectionIn, selection, selectionArgs, groupBy, having, + projectionIn, selection, groupBy, having, sortOrder, limit); if (Log.isLoggable(TAG, Log.DEBUG)) { @@ -345,10 +345,6 @@ public class SQLiteQueryBuilder * formatted as an SQL WHERE clause (excluding the WHERE * itself). Passing null will return all rows for the given * URL. - * @param selectionArgs You may include ?s in selection, which - * will be replaced by the values from selectionArgs, in order - * that they appear in the selection. The values will be bound - * as Strings. * @param groupBy A filter declaring how to group rows, formatted * as an SQL GROUP BY clause (excluding the GROUP BY itself). * Passing null will cause the rows to not be grouped. @@ -365,8 +361,8 @@ public class SQLiteQueryBuilder * @return the resulting SQL SELECT statement */ public String buildQuery( - String[] projectionIn, String selection, String[] selectionArgs, - String groupBy, String having, String sortOrder, String limit) { + String[] projectionIn, String selection, String groupBy, + String having, String sortOrder, String limit) { String[] projection = computeProjection(projectionIn); StringBuilder where = new StringBuilder(); @@ -394,6 +390,19 @@ public class SQLiteQueryBuilder } /** + * @deprecated This method's signature is misleading since no SQL parameter + * substitution is carried out. The selection arguments parameter does not get + * used at all. To avoid confusion, call + * {@link #buildQuery(String[], String, String, String, String, String)} instead. + */ + @Deprecated + public String buildQuery( + String[] projectionIn, String selection, String[] selectionArgs, + String groupBy, String having, String sortOrder, String limit) { + return buildQuery(projectionIn, selection, groupBy, having, sortOrder, limit); + } + + /** * Construct a SELECT statement suitable for use in a group of * SELECT statements that will be joined through UNION operators * in buildUnionQuery. @@ -422,10 +431,6 @@ public class SQLiteQueryBuilder * formatted as an SQL WHERE clause (excluding the WHERE * itself). Passing null will return all rows for the given * URL. - * @param selectionArgs You may include ?s in selection, which - * will be replaced by the values from selectionArgs, in order - * that they appear in the selection. The values will be bound - * as Strings. * @param groupBy A filter declaring how to group rows, formatted * as an SQL GROUP BY clause (excluding the GROUP BY itself). * Passing null will cause the rows to not be grouped. @@ -443,7 +448,6 @@ public class SQLiteQueryBuilder int computedColumnsOffset, String typeDiscriminatorValue, String selection, - String[] selectionArgs, String groupBy, String having) { int unionColumnsCount = unionColumns.length; @@ -463,12 +467,36 @@ public class SQLiteQueryBuilder } } return buildQuery( - projectionIn, selection, selectionArgs, groupBy, having, + projectionIn, selection, groupBy, having, null /* sortOrder */, null /* limit */); } /** + * @deprecated This method's signature is misleading since no SQL parameter + * substitution is carried out. The selection arguments parameter does not get + * used at all. To avoid confusion, call + * {@link #buildUnionSubQuery} + * instead. + */ + @Deprecated + public String buildUnionSubQuery( + String typeDiscriminatorColumn, + String[] unionColumns, + Set<String> columnsPresentInTable, + int computedColumnsOffset, + String typeDiscriminatorValue, + String selection, + String[] selectionArgs, + String groupBy, + String having) { + return buildUnionSubQuery( + typeDiscriminatorColumn, unionColumns, columnsPresentInTable, + computedColumnsOffset, typeDiscriminatorValue, selection, + groupBy, having); + } + + /** * Given a set of subqueries, all of which are SELECT statements, * construct a query that returns the union of what those * subqueries return. diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index f8260ca..a402c91 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -324,6 +324,10 @@ public class Binder implements IBinder { } catch (RuntimeException e) { reply.writeException(e); res = true; + } catch (OutOfMemoryError e) { + RuntimeException re = new RuntimeException("Out of memory", e); + reply.writeException(re); + res = true; } reply.recycle(); data.recycle(); diff --git a/core/java/android/os/DropBoxManager.java b/core/java/android/os/DropBoxManager.java index a47c66a..47a7696 100644 --- a/core/java/android/os/DropBoxManager.java +++ b/core/java/android/os/DropBoxManager.java @@ -169,7 +169,12 @@ public class DropBoxManager { is = getInputStream(); if (is == null) return null; byte[] buf = new byte[maxBytes]; - return new String(buf, 0, Math.max(0, is.read(buf))); + int readBytes = 0; + int n = 0; + while (n >= 0 && (readBytes += n) < maxBytes) { + n = is.read(buf, readBytes, maxBytes - readBytes); + } + return new String(buf, 0, readBytes); } catch (IOException e) { return null; } finally { diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index 8762512..93542c6 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -106,6 +106,8 @@ public final class StrictMode { private static final String TAG = "StrictMode"; private static final boolean LOG_V = false; + private static final boolean IS_USER_BUILD = "user".equals(Build.TYPE); + // Only log a duplicate stack trace to the logs every second. private static final long MIN_LOG_INTERVAL_MS = 1000; @@ -693,7 +695,7 @@ public final class StrictMode { public static boolean conditionallyEnableDebugLogging() { // For debug builds, log event loop stalls to dropbox for analysis. // Similar logic also appears in ActivityThread.java for system apps. - if ("user".equals(Build.TYPE)) { + if (IS_USER_BUILD) { setCloseGuardEnabled(false); return false; } @@ -704,8 +706,7 @@ public final class StrictMode { StrictMode.PENALTY_DROPBOX); sVmPolicyMask = StrictMode.DETECT_VM_CURSOR_LEAKS | StrictMode.DETECT_VM_CLOSABLE_LEAKS | - StrictMode.PENALTY_DROPBOX | - StrictMode.PENALTY_LOG; + StrictMode.PENALTY_DROPBOX; setCloseGuardEnabled(vmClosableObjectLeaksEnabled()); return true; } @@ -1240,6 +1241,11 @@ public final class StrictMode { mContainerState = threadState; } + // Empty constructor for the NO_OP_SPAN + protected Span() { + mContainerState = null; + } + /** * To be called when the critical span is complete (i.e. the * animation is done animating). This can be called on any @@ -1269,11 +1275,14 @@ public final class StrictMode { state.mActiveHead = mNext; } + state.mActiveSize--; + + if (LOG_V) Log.d(TAG, "Span finished=" + mName + "; size=" + state.mActiveSize); + this.mCreateMillis = -1; this.mName = null; this.mPrev = null; this.mNext = null; - state.mActiveSize--; // Add ourselves to the freeList, if it's not already // too big. @@ -1286,6 +1295,13 @@ public final class StrictMode { } } + // The no-op span that's used in user builds. + private static final Span NO_OP_SPAN = new Span() { + public void finish() { + // Do nothing. + } + }; + /** * Linked lists of active spans and a freelist. * @@ -1327,6 +1343,9 @@ public final class StrictMode { * @hide */ public static Span enterCriticalSpan(String name) { + if (IS_USER_BUILD) { + return NO_OP_SPAN; + } if (name == null || name.isEmpty()) { throw new IllegalArgumentException("name must be non-null and non-empty"); } @@ -1350,6 +1369,7 @@ public final class StrictMode { if (span.mNext != null) { span.mNext.mPrev = span; } + if (LOG_V) Log.d(TAG, "Span enter=" + name + "; size=" + state.mActiveSize); } return span; } diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java index 12b9f0c..e869f3f 100644 --- a/core/java/android/preference/Preference.java +++ b/core/java/android/preference/Preference.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -31,6 +32,7 @@ import android.view.AbsSavedState; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; @@ -52,6 +54,7 @@ import java.util.Set; * {@link SharedPreferences}. It is up to the subclass to decide how to store * the value. * + * @attr ref android.R.styleable#Preference_icon * @attr ref android.R.styleable#Preference_key * @attr ref android.R.styleable#Preference_title * @attr ref android.R.styleable#Preference_summary @@ -87,6 +90,11 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis private int mOrder = DEFAULT_ORDER; private CharSequence mTitle; private CharSequence mSummary; + /** + * mIconResId is overridden by mIcon, if mIcon is specified. + */ + private int mIconResId; + private Drawable mIcon; private String mKey; private Intent mIntent; private String mFragment; @@ -197,6 +205,10 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis for (int i = a.getIndexCount(); i >= 0; i--) { int attr = a.getIndex(i); switch (attr) { + case com.android.internal.R.styleable.Preference_icon: + mIconResId = a.getResourceId(attr, 0); + break; + case com.android.internal.R.styleable.Preference_key: mKey = a.getString(attr); break; @@ -499,11 +511,20 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis } } + ImageView imageView = (ImageView) view.findViewById(com.android.internal.R.id.icon); + if (imageView != null && (mIconResId != 0 || mIcon != null)) { + if (mIcon == null) { + mIcon = getContext().getResources().getDrawable(mIconResId); + } + if (mIcon != null) { + imageView.setImageDrawable(mIcon); + } + } if (mShouldDisableView) { setEnabledStateOnViews(view, isEnabled()); } } - + /** * Makes sure the view (and any children) get the enabled state changed. */ @@ -587,6 +608,42 @@ public class Preference implements Comparable<Preference>, OnDependencyChangeLis } /** + * Sets the icon for this Preference with a Drawable. + * This icon will be placed into the ID + * {@link android.R.id#icon} within the View created by + * {@link #onCreateView(ViewGroup)}. + * + * @param icon The optional icon for this Preference. + */ + public void setIcon(Drawable icon) { + if ((icon == null && mIcon != null) || (icon != null && mIcon != icon)) { + mIcon = icon; + notifyChanged(); + } + } + + /** + * Sets the icon for this Preference with a resource ID. + * + * @see #setIcon(Drawable) + * @param iconResId The icon as a resource ID. + */ + public void setIcon(int iconResId) { + mIconResId = iconResId; + setIcon(mContext.getResources().getDrawable(iconResId)); + } + + /** + * Returns the icon of this Preference. + * + * @return The icon. + * @see #setIcon(Drawable) + */ + public Drawable getIcon() { + return mIcon; + } + + /** * Returns the summary of this Preference. * * @return The summary. diff --git a/core/java/android/preference/PreferenceActivity.java b/core/java/android/preference/PreferenceActivity.java index 0ce69ad..39f3cee 100644 --- a/core/java/android/preference/PreferenceActivity.java +++ b/core/java/android/preference/PreferenceActivity.java @@ -23,6 +23,7 @@ import org.xmlpull.v1.XmlPullParserException; import android.app.Fragment; import android.app.FragmentBreadCrumbs; +import android.app.FragmentManager; import android.app.FragmentTransaction; import android.app.ListActivity; import android.content.Context; @@ -902,7 +903,8 @@ public abstract class PreferenceActivity extends ListActivity implements } private void switchToHeaderInner(String fragmentName, Bundle args, int direction) { - getFragmentManager().popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE); + getFragmentManager().popBackStack(BACK_STACK_PREFS, + FragmentManager.POP_BACK_STACK_INCLUSIVE); Fragment f = Fragment.instantiate(this, fragmentName, args); FragmentTransaction transaction = getFragmentManager().openTransaction(); transaction.setTransition(direction == 0 ? FragmentTransaction.TRANSIT_NONE @@ -934,7 +936,8 @@ public abstract class PreferenceActivity extends ListActivity implements if (mCurHeader == header) { // This is the header we are currently displaying. Just make sure // to pop the stack up to its root state. - getFragmentManager().popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE); + getFragmentManager().popBackStack(BACK_STACK_PREFS, + FragmentManager.POP_BACK_STACK_INCLUSIVE); } else { int direction = mHeaders.indexOf(header) - mHeaders.indexOf(mCurHeader); switchToHeaderInner(header.fragment, header.fragmentArguments, direction); @@ -1061,14 +1064,14 @@ public abstract class PreferenceActivity extends ListActivity implements setResult(resultCode, resultData); finish(); } else { + // XXX be smarter about popping the stack. + onBackPressed(); if (caller != null) { if (caller.getTargetFragment() != null) { caller.getTargetFragment().onActivityResult(caller.getTargetRequestCode(), resultCode, resultData); } } - // XXX be smarter about popping the stack. - onBackPressed(); } } diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index f0aa878..2d2f205 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -6127,6 +6127,14 @@ public final class ContactsContract { public static final int STATUS_CHANGING_LOCALE = 3; /** + * The status that indicates that there are no accounts and no contacts + * on the device. + * + * @hide + */ + public static final int STATUS_NO_ACCOUNTS_NO_CONTACTS = 4; + + /** * Additional data associated with the status. * * @hide diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index dd25eaa..3fe4f4c 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -26,12 +26,11 @@ import android.graphics.Rect; import android.text.method.TextKeyListener; import android.text.style.AlignmentSpan; import android.text.style.LeadingMarginSpan; +import android.text.style.LeadingMarginSpan.LeadingMarginSpan2; import android.text.style.LineBackgroundSpan; import android.text.style.ParagraphStyle; import android.text.style.ReplacementSpan; import android.text.style.TabStopSpan; -import android.text.style.LeadingMarginSpan.LeadingMarginSpan2; -import android.view.KeyEvent; import java.util.Arrays; @@ -1056,23 +1055,30 @@ public abstract class Layout { int lineEnd = getLineEnd(line); int lineDir = getParagraphDirection(line); + boolean lineChanged = false; boolean advance = toLeft == (lineDir == DIR_RIGHT_TO_LEFT); - if (caret == (advance ? lineEnd : lineStart)) { - // walking off line, so look at the line we're headed to + // if walking off line, look at the line we're headed to + if (advance) { + if (caret == lineEnd) { + if (line < getLineCount() - 1) { + lineChanged = true; + ++line; + } else { + return caret; // at very end, don't move + } + } + } else { if (caret == lineStart) { if (line > 0) { + lineChanged = true; --line; } else { return caret; // at very start, don't move } - } else { - if (line < getLineCount() - 1) { - ++line; - } else { - return caret; // at very end, don't move - } } + } + if (lineChanged) { lineStart = getLineStart(line); lineEnd = getLineEnd(line); int newDir = getParagraphDirection(line); @@ -1672,6 +1678,7 @@ public abstract class Layout { return new String(s); } + @Override public String toString() { char[] s = new char[length()]; getChars(0, length(), s, 0); @@ -1709,6 +1716,7 @@ public abstract class Layout { return mSpanned.nextSpanTransition(start, limit, type); } + @Override public CharSequence subSequence(int start, int end) { char[] s = new char[end - start]; getChars(start, end, s, 0); diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index f9e7d18..a64ee9d 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -628,10 +628,18 @@ public interface WindowManager extends ViewManager { * to which all subsequent touches of that pointer will go until that * pointer goes up thereby enabling touches with multiple pointers * to be split across multiple windows. - * - * {@hide} */ + */ public static final int FLAG_SPLIT_TOUCH = 0x00800000; + + /** + * Indicates whether this window should be hardware accelerated. + * Requesting hardware acceleration does not guarantee it will happen. + */ + public static final int FLAG_HARDWARE_ACCELERATED = 0x01000000; + // ----- HIDDEN FLAGS. + // These start at the high bit and go down. + /** * Flag for a window belonging to an activity that responds to {@link KeyEvent#KEYCODE_MENU} * and therefore needs a Menu key. For devices where Menu is a physical button this flag is @@ -643,7 +651,7 @@ public interface WindowManager extends ViewManager { * * {@hide} */ - public static final int FLAG_NEEDS_MENU_KEY = 0x01000000; + public static final int FLAG_NEEDS_MENU_KEY = 0x08000000; /** Window flag: *sigh* The lock screen wants to continue running its * animation while it is fading. A kind-of hack to allow this. Maybe @@ -664,12 +672,6 @@ public interface WindowManager extends ViewManager { * it is created. * {@hide} */ public static final int FLAG_SYSTEM_ERROR = 0x40000000; - - /** - * Indicates whether this window should be hardware accelerated. - * Requesting hardware acceleration does not guarantee it will happen. - */ - public static final int FLAG_HARDWARE_ACCELERATED = 0x80000000; /** * Given a particular set of window manager flags, determine whether diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 5e7a133..fe55f34 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -27,6 +27,7 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; import android.util.Log; +import android.util.Pair; import android.util.PrintWriterPrinter; import android.util.Printer; import android.view.KeyEvent; @@ -502,6 +503,14 @@ public final class InputMethodManager { } } + public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi) { + try { + return mService.getEnabledInputMethodSubtypeList(imi); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + public void showStatusIcon(IBinder imeToken, String packageName, int iconId) { try { mService.updateStatusIcon(imeToken, packageName, iconId); diff --git a/core/java/android/webkit/CookieSyncManager.java b/core/java/android/webkit/CookieSyncManager.java index 8b76a3b..071eb8c 100644 --- a/core/java/android/webkit/CookieSyncManager.java +++ b/core/java/android/webkit/CookieSyncManager.java @@ -65,11 +65,6 @@ public final class CookieSyncManager extends WebSyncManager { // time when last update happened private long mLastUpdate; - // Used by the Chromium HTTP stack. Everything else in this class is used only by the Android - // Java HTTP stack. - private static String sDatabaseDirectory; - private static String sCacheDirectory; - private CookieSyncManager(Context context) { super(context, "CookieSyncManager"); } @@ -93,11 +88,10 @@ public final class CookieSyncManager extends WebSyncManager { */ public static synchronized CookieSyncManager createInstance( Context context) { + JniUtil.setContext(context); Context appContext = context.getApplicationContext(); if (sRef == null) { sRef = new CookieSyncManager(appContext); - sDatabaseDirectory = appContext.getDatabasePath("dummy").getParent(); - sCacheDirectory = appContext.getCacheDir().getAbsolutePath(); } return sRef; } @@ -222,22 +216,4 @@ public final class CookieSyncManager extends WebSyncManager { + "before CookieSyncManager::getInstance()"); } } - - /** - * Called by JNI. Gets the application's database directory, excluding the trailing slash. - * @return String The application's database directory - */ - private static synchronized String getDatabaseDirectory() { - checkInstanceIsCreated(); - return sDatabaseDirectory; - } - - /** - * Called by JNI. Gets the application's cache directory, excluding the trailing slash. - * @return String The application's cache directory - */ - private static synchronized String getCacheDirectory() { - checkInstanceIsCreated(); - return sCacheDirectory; - } } diff --git a/core/java/android/webkit/GeolocationPermissions.java b/core/java/android/webkit/GeolocationPermissions.java index 4565b75..5d54180 100755 --- a/core/java/android/webkit/GeolocationPermissions.java +++ b/core/java/android/webkit/GeolocationPermissions.java @@ -146,7 +146,7 @@ public final class GeolocationPermissions { boolean allowed = nativeGetAllowed(origin); Map retValues = new HashMap<String, Object>(); retValues.put(CALLBACK, callback); - retValues.put(ALLOWED, new Boolean(allowed)); + retValues.put(ALLOWED, Boolean.valueOf(allowed)); postUIMessage(Message.obtain(null, RETURN_ALLOWED, retValues)); } break; case CLEAR: diff --git a/core/java/android/webkit/JniUtil.java b/core/java/android/webkit/JniUtil.java new file mode 100644 index 0000000..ef44d3a --- /dev/null +++ b/core/java/android/webkit/JniUtil.java @@ -0,0 +1,61 @@ +/* + * 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. + */ + +package android.webkit; + +import android.content.Context; + +class JniUtil { + // Used by the Chromium HTTP stack. + private static String sDatabaseDirectory; + private static String sCacheDirectory; + + private static boolean initialized = false; + + private static void checkIntialized() { + if (!initialized) { + throw new IllegalStateException("Call CookieSyncManager::createInstance() or create a webview before using this class"); + } + } + + protected static synchronized void setContext(Context context) { + if (initialized) + return; + + Context appContext = context.getApplicationContext(); + sDatabaseDirectory = appContext.getDatabasePath("dummy").getParent(); + sCacheDirectory = appContext.getCacheDir().getAbsolutePath(); + initialized = true; + } + + /** + * Called by JNI. Gets the application's database directory, excluding the trailing slash. + * @return String The application's database directory + */ + private static synchronized String getDatabaseDirectory() { + checkIntialized(); + return sDatabaseDirectory; + } + + /** + * Called by JNI. Gets the application's cache directory, excluding the trailing slash. + * @return String The application's cache directory + */ + private static synchronized String getCacheDirectory() { + checkIntialized(); + return sCacheDirectory; + } +} diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 06800d5..f2988bc 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -893,6 +893,9 @@ public class WebView extends AbsoluteLayout Map<String, Object> javascriptInterfaces, boolean privateBrowsing) { super(context, attrs, defStyle); + // Used by the chrome stack to find application paths + JniUtil.setContext(context); + if (AccessibilityManager.getInstance(context).isEnabled()) { if (javascriptInterfaces == null) { javascriptInterfaces = new HashMap<String, Object>(); @@ -3555,6 +3558,7 @@ public class WebView extends AbsoluteLayout if (inEditingMode()) { return mWebTextView.performLongClick(); } + if (mSelectingText) return false; // long click does nothing on selection /* if long click brings up a context menu, the super function * returns true and we're done. Otherwise, nothing happened when * the user clicked. */ @@ -3565,7 +3569,6 @@ public class WebView extends AbsoluteLayout * click action, look for a word under the click. If one is found, * animate the text selection into view. * FIXME: no animation code yet */ - if (mSelectingText) return false; // long click does nothing on selection int x = viewToContentX((int) mLastTouchX + mScrollX); int y = viewToContentY((int) mLastTouchY + mScrollY); setUpSelect(); @@ -4185,9 +4188,8 @@ public class WebView extends AbsoluteLayout if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT || keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) { - if (pageShouldHandleShiftAndArrows()) { - mShiftIsPressed = true; - } else if (!nativeCursorWantsKeyEvents() && !mSelectingText) { + if (!pageShouldHandleShiftAndArrows() && !nativeCursorWantsKeyEvents() + && !mSelectingText) { setUpSelect(); } } @@ -4206,7 +4208,7 @@ public class WebView extends AbsoluteLayout && keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) { switchOutDrawHistory(); if (pageShouldHandleShiftAndArrows()) { - letPageHandleNavKey(keyCode, event.getEventTime(), true); + letPageHandleNavKey(keyCode, event.getEventTime(), true, event.getMetaState()); return true; } if (mSelectingText) { @@ -4248,7 +4250,6 @@ public class WebView extends AbsoluteLayout && keyCode != KeyEvent.KEYCODE_SHIFT_RIGHT) { // turn off copy select if a shift-key combo is pressed selectionDone(); - mShiftIsPressed = false; } if (getSettings().getNavDump()) { @@ -4339,9 +4340,7 @@ public class WebView extends AbsoluteLayout if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT || keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) { - if (pageShouldHandleShiftAndArrows()) { - mShiftIsPressed = false; - } else if (copySelection()) { + if (!pageShouldHandleShiftAndArrows() && copySelection()) { selectionDone(); return true; } @@ -4350,7 +4349,7 @@ public class WebView extends AbsoluteLayout if (keyCode >= KeyEvent.KEYCODE_DPAD_UP && keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) { if (pageShouldHandleShiftAndArrows()) { - letPageHandleNavKey(keyCode, event.getEventTime(), false); + letPageHandleNavKey(keyCode, event.getEventTime(), false, event.getMetaState()); return true; } // always handle the navigation keys in the UI thread @@ -4592,7 +4591,6 @@ public class WebView extends AbsoluteLayout mDrawCursorRing = false; } mGotKeyDown = false; - mShiftIsPressed = false; mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS); mTouchMode = TOUCH_DONE_MODE; if (mNativeClass != 0) { @@ -5529,7 +5527,6 @@ public class WebView extends AbsoluteLayout private int mSelectX = 0; private int mSelectY = 0; private boolean mFocusSizeChanged = false; - private boolean mShiftIsPressed = false; private boolean mTrackballDown = false; private long mTrackballUpTime = 0; private long mLastCursorTime = 0; @@ -5600,7 +5597,7 @@ public class WebView extends AbsoluteLayout } return false; // let common code in onKeyUp at it } - if ((mMapTrackballToArrowKeys && mShiftIsPressed == false) || + if ((mMapTrackballToArrowKeys && (ev.getMetaState() & KeyEvent.META_SHIFT_ON) == 0) || (mAccessibilityInjector != null || mAccessibilityScriptInjected)) { if (DebugFlags.WEB_VIEW) Log.v(LOGTAG, "onTrackballEvent gmail quit"); return false; @@ -5629,7 +5626,7 @@ public class WebView extends AbsoluteLayout } mTrackballRemainsX += ev.getX(); mTrackballRemainsY += ev.getY(); - doTrackball(time); + doTrackball(time, ev.getMetaState()); return true; } @@ -5713,7 +5710,7 @@ public class WebView extends AbsoluteLayout "KEYCODE_DPAD_LEFT}."); } - private void doTrackball(long time) { + private void doTrackball(long time, int metaState) { int elapsed = (int) (mTrackballLastTime - mTrackballFirstTime); if (elapsed == 0) { elapsed = TRACKBALL_TIMEOUT; @@ -5771,9 +5768,9 @@ public class WebView extends AbsoluteLayout } if (mNativeClass != 0 && nativePageShouldHandleShiftAndArrows()) { for (int i = 0; i < count; i++) { - letPageHandleNavKey(selectKeyCode, time, true); + letPageHandleNavKey(selectKeyCode, time, true, metaState); } - letPageHandleNavKey(selectKeyCode, time, false); + letPageHandleNavKey(selectKeyCode, time, false, metaState); } else if (navHandledKey(selectKeyCode, count, false, time)) { playSoundEffect(keyCodeToSoundsEffect(selectKeyCode)); } @@ -6446,7 +6443,8 @@ public class WebView extends AbsoluteLayout mUserScroll = false; break; } - // fall through + setContentScrollTo(msg.arg1, msg.arg2); + break; case SCROLL_TO_MSG_ID: if (setContentScrollTo(msg.arg1, msg.arg2)) { // if we can't scroll to the exact position due to pin, @@ -7282,7 +7280,7 @@ public class WebView extends AbsoluteLayout * Pass the key directly to the page. This assumes that * nativePageShouldHandleShiftAndArrows() returned true. */ - private void letPageHandleNavKey(int keyCode, long time, boolean down) { + private void letPageHandleNavKey(int keyCode, long time, boolean down, int metaState) { int keyEventAction; int eventHubAction; if (down) { @@ -7293,10 +7291,11 @@ public class WebView extends AbsoluteLayout keyEventAction = KeyEvent.ACTION_UP; eventHubAction = EventHub.KEY_UP; } + KeyEvent event = new KeyEvent(time, time, keyEventAction, keyCode, - 1, (mShiftIsPressed ? KeyEvent.META_SHIFT_ON : 0) - | (false ? KeyEvent.META_ALT_ON : 0) // FIXME - | (false ? KeyEvent.META_SYM_ON : 0) // FIXME + 1, (metaState & KeyEvent.META_SHIFT_ON) + | (metaState & KeyEvent.META_ALT_ON) + | (metaState & KeyEvent.META_SYM_ON) , 0, 0, 0); mWebViewCore.sendMessage(eventHubAction, event); } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 8c515db..17f0a97 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -285,7 +285,9 @@ final class WebViewCore { int fileType = MediaFile.getFileTypeForMimeType(mimeType); return MediaFile.isAudioFileType(fileType) || MediaFile.isVideoFileType(fileType) - || MediaFile.isPlayListFileType(fileType); + || MediaFile.isPlayListFileType(fileType) + // The following is not in Media framework, but it's supported. + || (mimeType != null && mimeType.startsWith("video/m4v")); } /** @@ -2054,7 +2056,7 @@ final class WebViewCore { } if (mWebView != null) { Message msg = Message.obtain(mWebView.mPrivateHandler, - WebView.SCROLL_BY_MSG_ID, dx, dy, new Boolean(animate)); + WebView.SCROLL_BY_MSG_ID, dx, dy, Boolean.valueOf(animate)); if (mDrawIsScheduled) { mEventHub.sendMessage(Message.obtain(null, EventHub.MESSAGE_RELAY, msg)); diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index ab5ff3d..d388985 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -29,6 +29,7 @@ import android.os.Debug; import android.os.Handler; import android.os.Parcel; import android.os.Parcelable; +import android.os.StrictMode; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -460,6 +461,15 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te private boolean mFlingProfilingStarted = false; /** + * The StrictMode "critical time span" objects to catch animation + * stutters. Non-null when a time-sensitive animation is + * in-flight. Must call finish() on them when done animating. + * These are no-ops on user builds. + */ + private StrictMode.Span mScrollStrictSpan = null; + private StrictMode.Span mFlingStrictSpan = null; + + /** * The last CheckForLongPress runnable we posted, if any */ private CheckForLongPress mPendingCheckForLongPress; @@ -2089,6 +2099,16 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mAdapter.unregisterDataSetObserver(mDataSetObserver); mDataSetObserver = null; } + + if (mScrollStrictSpan != null) { + mScrollStrictSpan.finish(); + mScrollStrictSpan = null; + } + + if (mFlingStrictSpan != null) { + mFlingStrictSpan.finish(); + mFlingStrictSpan = null; + } } @Override @@ -2523,6 +2543,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mMotionCorrection = 0; motionPosition = findMotionRow(y); reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); + mFlingRunnable.flywheelTouch(); } } } @@ -2559,6 +2580,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } } + if (mScrollStrictSpan == null) { + // If it's non-null, we're already in a scroll. + mScrollStrictSpan = StrictMode.enterCriticalSpan("AbsListView-scroll"); + } + if (y != mLastY) { // We may be here after stopping a fling and continuing to scroll. // If so, we haven't disallowed intercepting touch events yet. @@ -2690,6 +2716,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } else { mTouchMode = TOUCH_MODE_REST; reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); + if (mFlingRunnable != null) { + mFlingRunnable.endFling(); + } } } } else { @@ -2722,13 +2751,18 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mScrollProfilingStarted = false; } } + + if (mScrollStrictSpan != null) { + mScrollStrictSpan.finish(); + mScrollStrictSpan = null; + } break; } case MotionEvent.ACTION_CANCEL: { mTouchMode = TOUCH_MODE_REST; setPressed(false); - View motionView = this.getChildAt(mMotionPosition - mFirstPosition); + View motionView = getChildAt(mMotionPosition - mFirstPosition); if (motionView != null) { motionView.setPressed(false); } @@ -2893,8 +2927,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te void reportScrollStateChange(int newState) { if (newState != mLastScrollState) { if (mOnScrollListener != null) { - mOnScrollListener.onScrollStateChanged(this, newState); mLastScrollState = newState; + mOnScrollListener.onScrollStateChanged(this, newState); } } } @@ -2916,6 +2950,30 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ private int mLastFlingY; + private final Runnable mCheckFlywheel = new Runnable() { + public void run() { + final int activeId = mActivePointerId; + final VelocityTracker vt = mVelocityTracker; + final Scroller scroller = mScroller; + if (vt == null || activeId == INVALID_POINTER) { + return; + } + + vt.computeCurrentVelocity(1000, mMaximumVelocity); + final float yvel = -vt.getYVelocity(activeId); + + if (scroller.isScrollingInDirection(0, yvel)) { + // Keep the fling alive a little longer + postDelayed(this, FLYWHEEL_TIMEOUT); + } else { + endFling(); + mTouchMode = TOUCH_MODE_SCROLL; + } + } + }; + + private static final int FLYWHEEL_TIMEOUT = 40; // milliseconds + FlingRunnable() { mScroller = new Scroller(getContext()); } @@ -2934,6 +2992,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mFlingProfilingStarted = true; } } + + if (mFlingStrictSpan == null) { + mFlingStrictSpan = StrictMode.enterCriticalSpan("AbsListView-fling"); + } } void startScroll(int distance, int duration) { @@ -2944,79 +3006,93 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te post(this); } - private void endFling() { + void endFling() { mTouchMode = TOUCH_MODE_REST; removeCallbacks(this); + removeCallbacks(mCheckFlywheel); if (mPositionScroller != null) { removeCallbacks(mPositionScroller); } reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); clearScrollingCache(); + mScroller.abortAnimation(); + } + + void flywheelTouch() { + postDelayed(mCheckFlywheel, FLYWHEEL_TIMEOUT); } public void run() { switch (mTouchMode) { default: + endFling(); return; - case TOUCH_MODE_FLING: { + case TOUCH_MODE_SCROLL: + if (mScroller.isFinished()) { + return; + } + // Fall through + case TOUCH_MODE_FLING: if (mItemCount == 0 || getChildCount() == 0) { endFling(); return; } + break; + } + final Scroller scroller = mScroller; + boolean more = scroller.computeScrollOffset(); + final int y = scroller.getCurrY(); - final Scroller scroller = mScroller; - boolean more = scroller.computeScrollOffset(); - final int y = scroller.getCurrY(); - - // Flip sign to convert finger direction to list items direction - // (e.g. finger moving down means list is moving towards the top) - int delta = mLastFlingY - y; - - // Pretend that each frame of a fling scroll is a touch scroll - if (delta > 0) { - // List is moving towards the top. Use first view as mMotionPosition - mMotionPosition = mFirstPosition; - final View firstView = getChildAt(0); - mMotionViewOriginalTop = firstView.getTop(); - - // Don't fling more than 1 screen - delta = Math.min(getHeight() - mPaddingBottom - mPaddingTop - 1, delta); - } else { - // List is moving towards the bottom. Use last view as mMotionPosition - int offsetToLast = getChildCount() - 1; - mMotionPosition = mFirstPosition + offsetToLast; + // Flip sign to convert finger direction to list items direction + // (e.g. finger moving down means list is moving towards the top) + int delta = mLastFlingY - y; - final View lastView = getChildAt(offsetToLast); - mMotionViewOriginalTop = lastView.getTop(); + // Pretend that each frame of a fling scroll is a touch scroll + if (delta > 0) { + // List is moving towards the top. Use first view as mMotionPosition + mMotionPosition = mFirstPosition; + final View firstView = getChildAt(0); + mMotionViewOriginalTop = firstView.getTop(); - // Don't fling more than 1 screen - delta = Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1), delta); - } + // Don't fling more than 1 screen + delta = Math.min(getHeight() - mPaddingBottom - mPaddingTop - 1, delta); + } else { + // List is moving towards the bottom. Use last view as mMotionPosition + int offsetToLast = getChildCount() - 1; + mMotionPosition = mFirstPosition + offsetToLast; - // Don't stop just because delta is zero (it could have been rounded) - final boolean atEnd = trackMotionScroll(delta, delta) && (delta != 0); + final View lastView = getChildAt(offsetToLast); + mMotionViewOriginalTop = lastView.getTop(); - if (more && !atEnd) { - invalidate(); - mLastFlingY = y; - post(this); - } else { - endFling(); - - if (PROFILE_FLINGING) { - if (mFlingProfilingStarted) { - Debug.stopMethodTracing(); - mFlingProfilingStarted = false; - } + // Don't fling more than 1 screen + delta = Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1), delta); + } + + // Don't stop just because delta is zero (it could have been rounded) + final boolean atEnd = trackMotionScroll(delta, delta) && (delta != 0); + + if (more && !atEnd) { + invalidate(); + mLastFlingY = y; + post(this); + } else { + endFling(); + + if (PROFILE_FLINGING) { + if (mFlingProfilingStarted) { + Debug.stopMethodTracing(); + mFlingProfilingStarted = false; + } + + if (mFlingStrictSpan != null) { + mFlingStrictSpan.finish(); + mFlingStrictSpan = null; } } - break; - } } - } } @@ -3431,12 +3507,13 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te public void smoothScrollBy(int distance, int duration) { if (mFlingRunnable == null) { mFlingRunnable = new FlingRunnable(); - } else { - mFlingRunnable.endFling(); } // No sense starting to scroll if we're not going anywhere if (distance != 0) { + reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); mFlingRunnable.startScroll(distance, duration); + } else { + mFlingRunnable.endFling(); } } @@ -3569,7 +3646,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te int count = 0; if (down) { - final int top = listPadding.top - incrementalDeltaY; + int top = -incrementalDeltaY; + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + top += listPadding.top; + } for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (child.getBottom() >= top) { @@ -3589,7 +3669,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } } } else { - final int bottom = getHeight() - listPadding.bottom - incrementalDeltaY; + int bottom = getHeight() - incrementalDeltaY; + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + bottom -= listPadding.bottom; + } for (int i = childCount - 1; i >= 0; i--) { final View child = getChildAt(i); if (child.getTop() <= bottom) { diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index b963536..114ae81 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -196,8 +196,12 @@ public class GridView extends AbsListView { final int count = getChildCount(); if (down) { + int paddingTop = 0; + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + paddingTop = getListPaddingTop(); + } final int startOffset = count > 0 ? - getChildAt(count - 1).getBottom() + verticalSpacing : getListPaddingTop(); + getChildAt(count - 1).getBottom() + verticalSpacing : paddingTop; int position = mFirstPosition + count; if (mStackFromBottom) { position += numColumns - 1; @@ -205,8 +209,12 @@ public class GridView extends AbsListView { fillDown(position, startOffset); correctTooHigh(numColumns, verticalSpacing, getChildCount()); } else { + int paddingBottom = 0; + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + paddingBottom = getListPaddingBottom(); + } final int startOffset = count > 0 ? - getChildAt(0).getTop() - verticalSpacing : getHeight() - getListPaddingBottom(); + getChildAt(0).getTop() - verticalSpacing : getHeight() - paddingBottom; int position = mFirstPosition; if (!mStackFromBottom) { position -= numColumns; @@ -232,7 +240,10 @@ public class GridView extends AbsListView { private View fillDown(int pos, int nextTop) { View selectedView = null; - final int end = (mBottom - mTop) - mListPadding.bottom; + int end = (mBottom - mTop); + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + end -= mListPadding.bottom; + } while (nextTop < end && pos < mItemCount) { View temp = makeRow(pos, nextTop, true); @@ -316,7 +327,10 @@ public class GridView extends AbsListView { private View fillUp(int pos, int nextBottom) { View selectedView = null; - final int end = mListPadding.top; + int end = 0; + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + end = mListPadding.top; + } while (nextBottom > end && pos >= 0) { diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index e0119e9..502cc38 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -595,13 +595,21 @@ public class ListView extends AbsListView { void fillGap(boolean down) { final int count = getChildCount(); if (down) { + int paddingTop = 0; + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + paddingTop = getListPaddingTop(); + } final int startOffset = count > 0 ? getChildAt(count - 1).getBottom() + mDividerHeight : - getListPaddingTop(); + paddingTop; fillDown(mFirstPosition + count, startOffset); correctTooHigh(getChildCount()); } else { + int paddingBottom = 0; + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + paddingBottom = getListPaddingBottom(); + } final int startOffset = count > 0 ? getChildAt(0).getTop() - mDividerHeight : - getHeight() - getListPaddingBottom(); + getHeight() - paddingBottom; fillUp(mFirstPosition - 1, startOffset); correctTooLow(getChildCount()); } @@ -621,7 +629,10 @@ public class ListView extends AbsListView { private View fillDown(int pos, int nextTop) { View selectedView = null; - int end = (mBottom - mTop) - mListPadding.bottom; + int end = (mBottom - mTop); + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + end -= mListPadding.bottom; + } while (nextTop < end && pos < mItemCount) { // is this the selected item? @@ -651,7 +662,10 @@ public class ListView extends AbsListView { private View fillUp(int pos, int nextBottom) { View selectedView = null; - int end = mListPadding.top; + int end = 0; + if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { + end = mListPadding.top; + } while (nextBottom > end && pos >= 0) { // is this the selected item? diff --git a/core/java/android/widget/Scroller.java b/core/java/android/widget/Scroller.java index 79ab448..b1f50ba 100644 --- a/core/java/android/widget/Scroller.java +++ b/core/java/android/widget/Scroller.java @@ -18,6 +18,8 @@ package android.widget; import android.content.Context; import android.hardware.SensorManager; +import android.os.Build; +import android.util.FloatMath; import android.view.ViewConfiguration; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; @@ -54,6 +56,7 @@ public class Scroller { private float mViscousFluidNormalize; private boolean mFinished; private Interpolator mInterpolator; + private boolean mFlywheel; private float mCoeffX = 0.0f; private float mCoeffY = 1.0f; @@ -63,9 +66,36 @@ public class Scroller { private static final int SCROLL_MODE = 0; private static final int FLING_MODE = 1; + private static float DECELERATION_RATE = (float) (Math.log(0.75) / Math.log(0.9)); + private static float ALPHA = 800; // pixels / seconds + private static float START_TENSION = 0.4f; // Tension at start: (0.4 * total T, 1.0 * Distance) + private static float END_TENSION = 1.0f - START_TENSION; + private static final int NB_SAMPLES = 100; + private static final float[] SPLINE = new float[NB_SAMPLES + 1]; + private float mDeceleration; private final float mPpi; + static { + float x_min = 0.0f; + for (int i = 0; i <= NB_SAMPLES; i++) { + final float t = (float) i / NB_SAMPLES; + float x_max = 1.0f; + float x, tx, coef; + while (true) { + x = x_min + (x_max - x_min) / 2.0f; + coef = 3.0f * x * (1.0f - x); + tx = coef * ((1.0f - x) * START_TENSION + x * END_TENSION) + x * x * x; + if (Math.abs(tx - t) < 1E-5) break; + if (tx > t) x_max = x; + else x_min = x; + } + final float d = coef + x * x * x; + SPLINE[i] = d; + } + SPLINE[NB_SAMPLES] = 1.0f; + } + /** * Create a Scroller with the default duration and interpolator. */ @@ -73,22 +103,28 @@ public class Scroller { this(context, null); } + public Scroller(Context context, Interpolator interpolator) { + this(context, interpolator, + context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB); + } + /** * Create a Scroller with the specified interpolator. If the interpolator is * null, the default (viscous) interpolator will be used. */ - public Scroller(Context context, Interpolator interpolator) { + public Scroller(Context context, Interpolator interpolator, boolean flywheel) { mFinished = true; mInterpolator = interpolator; mPpi = context.getResources().getDisplayMetrics().density * 160.0f; mDeceleration = computeDeceleration(ViewConfiguration.getScrollFriction()); + mFlywheel = flywheel; } /** * The amount of friction applied to flings. The default value * is {@link ViewConfiguration#getScrollFriction}. * - * @return A scalar dimensionless value representing the coefficient of + * @param friction A scalar dimension-less value representing the coefficient of * friction. */ public final void setFriction(float friction) { @@ -210,7 +246,7 @@ public class Scroller { if (timePassed < mDuration) { switch (mMode) { case SCROLL_MODE: - float x = (float)timePassed * mDurationReciprocal; + float x = timePassed * mDurationReciprocal; if (mInterpolator == null) x = viscousFluid(x); @@ -221,16 +257,20 @@ public class Scroller { mCurrY = mStartY + Math.round(x * mDeltaY); break; case FLING_MODE: - float timePassedSeconds = timePassed / 1000.0f; - float distance = (mVelocity * timePassedSeconds) - - (mDeceleration * timePassedSeconds * timePassedSeconds / 2.0f); + final float t = (float) timePassed / mDuration; + final int index = (int) (NB_SAMPLES * t); + final float t_inf = (float) index / NB_SAMPLES; + final float t_sup = (float) (index + 1) / NB_SAMPLES; + final float d_inf = SPLINE[index]; + final float d_sup = SPLINE[index + 1]; + final float distanceCoef = d_inf + (t - t_inf) / (t_sup - t_inf) * (d_sup - d_inf); - mCurrX = mStartX + Math.round(distance * mCoeffX); + mCurrX = mStartX + Math.round(distanceCoef * (mFinalX - mStartX)); // Pin to mMinX <= mCurrX <= mMaxX mCurrX = Math.min(mCurrX, mMaxX); mCurrX = Math.max(mCurrX, mMinX); - mCurrY = mStartY + Math.round(distance * mCoeffY); + mCurrY = mStartY + Math.round(distanceCoef * (mFinalY - mStartY)); // Pin to mMinY <= mCurrY <= mMaxY mCurrY = Math.min(mCurrY, mMaxY); mCurrY = Math.max(mCurrY, mMinY); @@ -292,7 +332,7 @@ public class Scroller { mFinalY = startY + dy; mDeltaX = dx; mDeltaY = dy; - mDurationReciprocal = 1.0f / (float) mDuration; + mDurationReciprocal = 1.0f / mDuration; // This controls the viscous fluid effect (how much of it) mViscousFluidScale = 8.0f; // must be set to 1.0 (used in viscousFluid()) @@ -321,14 +361,34 @@ public class Scroller { */ public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) { + // Continue a scroll or fling in progress + if (mFlywheel && !mFinished) { + float oldVel = getCurrVelocity(); + + float dx = (float) (mFinalX - mStartX); + float dy = (float) (mFinalY - mStartY); + float hyp = FloatMath.sqrt(dx * dx + dy * dy); + + float ndx = dx / hyp; + float ndy = dy / hyp; + + float oldVelocityX = ndx * oldVel; + float oldVelocityY = ndy * oldVel; + if (Math.signum(velocityX) == Math.signum(oldVelocityX) && + Math.signum(velocityY) == Math.signum(oldVelocityY)) { + velocityX += oldVelocityX; + velocityY += oldVelocityY; + } + } + mMode = FLING_MODE; mFinished = false; - float velocity = (float)Math.hypot(velocityX, velocityY); + float velocity = FloatMath.sqrt(velocityX * velocityX + velocityY * velocityY); mVelocity = velocity; - mDuration = (int) (1000 * velocity / mDeceleration); // Duration is in - // milliseconds + final double l = Math.log(START_TENSION * velocity / ALPHA); + mDuration = (int) (1000.0 * Math.exp(l / (DECELERATION_RATE - 1.0))); mStartTime = AnimationUtils.currentAnimationTimeMillis(); mStartX = startX; mStartY = startY; @@ -336,14 +396,14 @@ public class Scroller { mCoeffX = velocity == 0 ? 1.0f : velocityX / velocity; mCoeffY = velocity == 0 ? 1.0f : velocityY / velocity; - int totalDistance = (int) ((velocity * velocity) / (2 * mDeceleration)); + int totalDistance = + (int) (ALPHA * Math.exp(DECELERATION_RATE / (DECELERATION_RATE - 1.0) * l)); mMinX = minX; mMaxX = maxX; mMinY = minY; mMaxY = maxY; - - + mFinalX = startX + Math.round(totalDistance * mCoeffX); // Pin to mMinX <= mFinalX <= mMaxX mFinalX = Math.min(mFinalX, mMaxX); @@ -395,7 +455,7 @@ public class Scroller { public void extendDuration(int extend) { int passed = timePassed(); mDuration = passed + extend; - mDurationReciprocal = 1.0f / (float)mDuration; + mDurationReciprocal = 1.0f / mDuration; mFinished = false; } @@ -433,4 +493,12 @@ public class Scroller { mDeltaY = mFinalY - mStartY; mFinished = false; } + + /** + * @hide + */ + public boolean isScrollingInDirection(float xvel, float yvel) { + return !mFinished && Math.signum(xvel) == Math.signum(mFinalX - mStartX) && + Math.signum(yvel) == Math.signum(mFinalY - mStartY); + } } diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java index 432dd4a..e2d78c0 100644 --- a/core/java/android/widget/StackView.java +++ b/core/java/android/widget/StackView.java @@ -100,6 +100,8 @@ public class StackView extends AdapterViewAnimator { private static final int FRAME_PADDING = 4; + private final Rect mTouchRect = new Rect(); + /** * These variables are all related to the current state of touch interaction * with the stack @@ -531,7 +533,6 @@ public class StackView extends AdapterViewAnimator { return true; } - private final Rect touchRect = new Rect(); private void onSecondaryPointerUp(MotionEvent ev) { final int activePointerIndex = ev.getActionIndex(); final int pointerId = ev.getPointerId(activePointerIndex); @@ -552,8 +553,8 @@ public class StackView extends AdapterViewAnimator { float x = ev.getX(index); float y = ev.getY(index); - touchRect.set(v.getLeft(), v.getTop(), v.getRight(), v.getBottom()); - if (touchRect.contains(Math.round(x), Math.round(y))) { + mTouchRect.set(v.getLeft(), v.getTop(), v.getRight(), v.getBottom()); + if (mTouchRect.contains(Math.round(x), Math.round(y))) { float oldX = ev.getX(activePointerIndex); float oldY = ev.getY(activePointerIndex); @@ -1049,18 +1050,23 @@ public class StackView extends AdapterViewAnimator { private static final int RES_OUT = 0; private static final int CLICK_FEEDBACK = 1; private float mDensity; + private BlurMaskFilter mSmallBlurMaskFilter; + private BlurMaskFilter mLargeBlurMaskFilter; + private final Canvas mCanvas = new Canvas(); + private final Canvas mMaskCanvas = new Canvas(); + private final int[] mTmpXY = new int[2]; + private final Matrix mIdentityMatrix = new Matrix(); HolographicHelper(Context context) { - initializePaints(context); - } - - void initializePaints(Context context) { mDensity = context.getResources().getDisplayMetrics().density; mHolographicPaint.setFilterBitmap(true); mHolographicPaint.setMaskFilter(TableMaskFilter.CreateClipTable(0, 30)); mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); mErasePaint.setFilterBitmap(true); + + mSmallBlurMaskFilter = new BlurMaskFilter(2 * mDensity, BlurMaskFilter.Blur.NORMAL); + mLargeBlurMaskFilter = new BlurMaskFilter(4 * mDensity, BlurMaskFilter.Blur.NORMAL); } Bitmap createOutline(View v) { @@ -1070,10 +1076,10 @@ public class StackView extends AdapterViewAnimator { Bitmap createOutline(View v, int type) { if (type == RES_OUT) { mHolographicPaint.setColor(0xff6699ff); - mBlurPaint.setMaskFilter(new BlurMaskFilter(2*mDensity, BlurMaskFilter.Blur.NORMAL)); + mBlurPaint.setMaskFilter(mSmallBlurMaskFilter); } else if (type == CLICK_FEEDBACK) { mHolographicPaint.setColor(0x886699ff); - mBlurPaint.setMaskFilter(new BlurMaskFilter(4*mDensity, BlurMaskFilter.Blur.NORMAL)); + mBlurPaint.setMaskFilter(mLargeBlurMaskFilter); } if (v.getMeasuredWidth() == 0 || v.getMeasuredHeight() == 0) { @@ -1082,7 +1088,7 @@ public class StackView extends AdapterViewAnimator { Bitmap bitmap = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); + mCanvas.setBitmap(bitmap); float rotationX = v.getRotationX(); float rotation = v.getRotation(); @@ -1090,23 +1096,22 @@ public class StackView extends AdapterViewAnimator { v.setRotationX(0); v.setRotation(0); v.setTranslationY(0); - v.draw(canvas); + v.draw(mCanvas); v.setRotationX(rotationX); v.setRotation(rotation); v.setTranslationY(translationY); - drawOutline(canvas, bitmap); + drawOutline(mCanvas, bitmap); return bitmap; } - final Matrix id = new Matrix(); void drawOutline(Canvas dest, Bitmap src) { - int[] xy = new int[2]; + final int[] xy = mTmpXY; Bitmap mask = src.extractAlpha(mBlurPaint, xy); - Canvas maskCanvas = new Canvas(mask); - maskCanvas.drawBitmap(src, -xy[0], -xy[1], mErasePaint); + mMaskCanvas.setBitmap(mask); + mMaskCanvas.drawBitmap(src, -xy[0], -xy[1], mErasePaint); dest.drawColor(0, PorterDuff.Mode.CLEAR); - dest.setMatrix(id); + dest.setMatrix(mIdentityMatrix); dest.drawBitmap(mask, xy[0], xy[1], mHolographicPaint); mask.recycle(); } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index b143325..f32ae92 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -305,6 +305,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int mTextSelectHandleRes; int mTextEditPasteWindowLayout; int mTextEditNoPasteWindowLayout; + Drawable mEditTextMultilineBackground; + Drawable mEditTextSingleLineBackground; Drawable mSelectHandleLeft; Drawable mSelectHandleRight; @@ -751,6 +753,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mTextEditNoPasteWindowLayout = a.getResourceId(attr, 0); break; + case com.android.internal.R.styleable.TextView_multilineBackground: + mEditTextMultilineBackground = a.getDrawable(attr); + break; + case com.android.internal.R.styleable.TextView_textLineHeight: int lineHeight = a.getDimensionPixelSize(attr, 0); if (lineHeight != 0) { @@ -765,6 +771,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } a.recycle(); + mEditTextSingleLineBackground = getBackground(); BufferType bufferType = BufferType.EDITABLE; final int variation = @@ -6192,12 +6199,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (applyTransformation) { setTransformationMethod(SingleLineTransformationMethod.getInstance()); } + setBackgroundDrawable(mEditTextSingleLineBackground); } else { setMaxLines(Integer.MAX_VALUE); setHorizontallyScrolling(false); if (applyTransformation) { setTransformationMethod(null); } + // mEditTextMultilineBackground is defined and used only in EditText + if (mEditTextMultilineBackground != null) { + setBackgroundDrawable(mEditTextMultilineBackground); + } } } @@ -6711,7 +6723,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener + " before=" + before + " after=" + after + ": " + buffer); if (AccessibilityManager.getInstance(mContext).isEnabled() - && !isPasswordInputType(mInputType)) { + && !isPasswordInputType(mInputType) + && !hasPasswordTransformationMethod()) { mBeforeText = buffer.toString(); } @@ -7590,7 +7603,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return false; } - final boolean isPassword = isPasswordInputType(mInputType); + final boolean isPassword = hasPasswordTransformationMethod(); if (!isPassword) { CharSequence text = getText(); diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java index cd1cae6..20402a3 100644 --- a/core/java/com/android/internal/app/ActionBarImpl.java +++ b/core/java/com/android/internal/app/ActionBarImpl.java @@ -31,6 +31,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Handler; import android.view.ActionMode; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -212,6 +213,10 @@ public class ActionBarImpl extends ActionBar { } public View getCustomNavigationView() { + return getCustomView(); + } + + public View getCustomView() { return mActionView.getCustomNavigationView(); } @@ -559,6 +564,11 @@ public class ActionBarImpl extends ActionBar { } @Override + public Tab setCustomView(int layoutResId) { + return setCustomView(LayoutInflater.from(mContext).inflate(layoutResId, null)); + } + + @Override public Drawable getIcon() { return mIcon; } @@ -584,12 +594,22 @@ public class ActionBarImpl extends ActionBar { } @Override + public Tab setIcon(int resId) { + return setIcon(mContext.getResources().getDrawable(resId)); + } + + @Override public Tab setText(CharSequence text) { mText = text; return this; } @Override + public Tab setText(int resId) { + return setText(mContext.getResources().getText(resId)); + } + + @Override public void select() { selectTab(this); } diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 7592e8b..63d05ec 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -31,7 +31,7 @@ import com.android.internal.view.IInputMethodClient; interface IInputMethodManager { List<InputMethodInfo> getInputMethodList(); List<InputMethodInfo> getEnabledInputMethodList(); - + List<InputMethodSubtype> getEnabledInputMethodSubtypeList(in InputMethodInfo imi); void addClient(in IInputMethodClient client, in IInputContext inputContext, int uid, int pid); void removeClient(in IInputMethodClient client); diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java index 1d103ed..1406e4e 100644 --- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java +++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java @@ -110,8 +110,10 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On if (isShowing()) { mPopup.dismiss(); } - mTreeObserver.removeGlobalOnLayoutListener(this); - mTreeObserver = null; + if (mTreeObserver != null) { + mTreeObserver.removeGlobalOnLayoutListener(this); + mTreeObserver = null; + } } public boolean isShowing() { diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 1018ddb..e50233e 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -1194,6 +1194,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_text_AndroidBidi), REG_JNI(register_android_text_KeyCharacterMap), REG_JNI(register_android_os_Process), + REG_JNI(register_android_os_SystemProperties), REG_JNI(register_android_os_Binder), REG_JNI(register_android_view_Display), REG_JNI(register_android_nio_utils), @@ -1251,7 +1252,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_ParcelFileDescriptor), REG_JNI(register_android_os_Power), REG_JNI(register_android_os_StatFs), - REG_JNI(register_android_os_SystemProperties), REG_JNI(register_android_os_UEventObserver), REG_JNI(register_android_net_LocalSocketImpl), REG_JNI(register_android_net_NetworkUtils), diff --git a/core/res/res/drawable-hdpi/textfield_active_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_active_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..a38c03a --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_active_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/textfield_active_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_active_holo_light.9.png Binary files differnew file mode 100644 index 0000000..6a88a69 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_active_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/textfield_default_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_default_holo_dark.9.png Binary files differindex 7ec2192..87d9c21 100644 --- a/core/res/res/drawable-hdpi/textfield_default_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/textfield_default_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/textfield_default_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_default_holo_light.9.png Binary files differindex c03e4f6..720ee78 100644 --- a/core/res/res/drawable-hdpi/textfield_default_holo_light.9.png +++ b/core/res/res/drawable-hdpi/textfield_default_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..4275da0 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_light.9.png Binary files differnew file mode 100644 index 0000000..3ec9c1f --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_disabled_focused_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.png Binary files differindex 6642717..227bde2 100644 --- a/core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/textfield_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.png Binary files differindex 9572752..6ddfab0 100644 --- a/core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.png +++ b/core/res/res/drawable-hdpi/textfield_disabled_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_dark.9.png Binary files differdeleted file mode 100644 index 0ad248c..0000000 --- a/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_light.9.png Binary files differdeleted file mode 100644 index b7a07c4..0000000 --- a/core/res/res/drawable-hdpi/textfield_disabled_selected_holo_light.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/textfield_multiline_active_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_multiline_active_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..7528479 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_multiline_active_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/textfield_multiline_active_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_multiline_active_holo_light.9.png Binary files differnew file mode 100644 index 0000000..4c7d9e7 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_multiline_active_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..09ca253 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_multiline_default_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/textfield_multiline_default_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_multiline_default_holo_light.9.png Binary files differnew file mode 100644 index 0000000..0a7d3a1 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_multiline_default_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..54a1519 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_light.9.png Binary files differnew file mode 100644 index 0000000..06ca0d4 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_multiline_disabled_focused_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..9015299 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_light.9.png Binary files differnew file mode 100644 index 0000000..b355cb3 --- /dev/null +++ b/core/res/res/drawable-hdpi/textfield_multiline_disabled_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/textfield_pressed.9.png b/core/res/res/drawable-hdpi/textfield_pressed.9.png Binary files differdeleted file mode 100644 index a42d87f..0000000 --- a/core/res/res/drawable-hdpi/textfield_pressed.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/textfield_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_pressed_holo_dark.9.png Binary files differdeleted file mode 100644 index a271ac9..0000000 --- a/core/res/res/drawable-hdpi/textfield_pressed_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/textfield_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_pressed_holo_light.9.png Binary files differdeleted file mode 100644 index 521722d..0000000 --- a/core/res/res/drawable-hdpi/textfield_pressed_holo_light.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/textfield_selected_holo_dark.9.png b/core/res/res/drawable-hdpi/textfield_selected_holo_dark.9.png Binary files differdeleted file mode 100644 index a271ac9..0000000 --- a/core/res/res/drawable-hdpi/textfield_selected_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/textfield_selected_holo_light.9.png b/core/res/res/drawable-hdpi/textfield_selected_holo_light.9.png Binary files differdeleted file mode 100644 index 521722d..0000000 --- a/core/res/res/drawable-hdpi/textfield_selected_holo_light.9.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png Binary files differnew file mode 100644 index 0000000..6fbd7d2 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png Binary files differnew file mode 100644 index 0000000..3a4cdec --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_focused_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png Binary files differnew file mode 100644 index 0000000..b1c3991 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png Binary files differnew file mode 100644 index 0000000..6fbce8c --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_disabled_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png Binary files differnew file mode 100644 index 0000000..3bb4c29 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png Binary files differnew file mode 100644 index 0000000..8f02162 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_focused_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png Binary files differnew file mode 100644 index 0000000..8f57d2c --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png Binary files differnew file mode 100644 index 0000000..df6f76b --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_longpressed_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png Binary files differnew file mode 100644 index 0000000..a47bf31 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png Binary files differnew file mode 100644 index 0000000..04046aa --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_normal_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png Binary files differnew file mode 100644 index 0000000..b6021e0 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png Binary files differnew file mode 100644 index 0000000..0f38d6b --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_down_pressed_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png Binary files differnew file mode 100644 index 0000000..14a4e31 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png Binary files differnew file mode 100644 index 0000000..21a2ac1 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_focused_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png Binary files differnew file mode 100644 index 0000000..1a1da57 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png Binary files differnew file mode 100644 index 0000000..a242c80 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_disabled_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png Binary files differnew file mode 100644 index 0000000..50045e4 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png Binary files differnew file mode 100644 index 0000000..659b3c7 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_focused_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png Binary files differnew file mode 100644 index 0000000..9112530 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png Binary files differnew file mode 100644 index 0000000..21aa7f7 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_longpressed_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png Binary files differnew file mode 100644 index 0000000..d145975 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png Binary files differnew file mode 100644 index 0000000..167bab7 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_normal_holo_light.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png Binary files differnew file mode 100644 index 0000000..2844c3f --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_dark.png diff --git a/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png Binary files differnew file mode 100644 index 0000000..9d83038 --- /dev/null +++ b/core/res/res/drawable-hdpi/timepicker_up_pressed_holo_light.png diff --git a/core/res/res/drawable-ldpi/textfield_pressed.9.png b/core/res/res/drawable-ldpi/textfield_pressed.9.png Binary files differdeleted file mode 100644 index 1433365..0000000 --- a/core/res/res/drawable-ldpi/textfield_pressed.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_active_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_active_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..d37c8b2 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_active_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/textfield_active_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_active_holo_light.9.png Binary files differnew file mode 100644 index 0000000..16f2197 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_active_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/textfield_default_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_default_holo_dark.9.png Binary files differindex 3a5f36d..c98c951 100644 --- a/core/res/res/drawable-mdpi/textfield_default_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/textfield_default_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/textfield_default_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_default_holo_light.9.png Binary files differindex b8cc76f..7691f81 100644 --- a/core/res/res/drawable-mdpi/textfield_default_holo_light.9.png +++ b/core/res/res/drawable-mdpi/textfield_default_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..500ede3 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png Binary files differnew file mode 100644 index 0000000..99f7f38 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_disabled_focused_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.png Binary files differindex a1f0c71..fab86ac 100644 --- a/core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/textfield_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.png Binary files differindex 71e3103..876eb794 100644 --- a/core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.png +++ b/core/res/res/drawable-mdpi/textfield_disabled_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_dark.9.png Binary files differdeleted file mode 100644 index ac6d406..0000000 --- a/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_light.9.png Binary files differdeleted file mode 100644 index bb6e953..0000000 --- a/core/res/res/drawable-mdpi/textfield_disabled_selected_holo_light.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_multiline_active_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_multiline_active_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..2646899 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_multiline_active_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/textfield_multiline_active_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_multiline_active_holo_light.9.png Binary files differnew file mode 100644 index 0000000..374d457 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_multiline_active_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..65c87ba --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_multiline_default_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/textfield_multiline_default_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_multiline_default_holo_light.9.png Binary files differnew file mode 100644 index 0000000..724b3fd --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_multiline_default_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..5f0ad56 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_light.9.png Binary files differnew file mode 100644 index 0000000..df03a15 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_multiline_disabled_focused_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..2cc7f62 --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_light.9.png Binary files differnew file mode 100644 index 0000000..a2d9d8a --- /dev/null +++ b/core/res/res/drawable-mdpi/textfield_multiline_disabled_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/textfield_pressed.9.png b/core/res/res/drawable-mdpi/textfield_pressed.9.png Binary files differdeleted file mode 100644 index c909ad2..0000000 --- a/core/res/res/drawable-mdpi/textfield_pressed.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_pressed_holo_dark.9.png Binary files differdeleted file mode 100644 index 7667d95..0000000 --- a/core/res/res/drawable-mdpi/textfield_pressed_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_pressed_holo_light.9.png Binary files differdeleted file mode 100644 index 269affd..0000000 --- a/core/res/res/drawable-mdpi/textfield_pressed_holo_light.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_selected_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_selected_holo_dark.9.png Binary files differdeleted file mode 100644 index 7667d95..0000000 --- a/core/res/res/drawable-mdpi/textfield_selected_holo_dark.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/textfield_selected_holo_light.9.png b/core/res/res/drawable-mdpi/textfield_selected_holo_light.9.png Binary files differdeleted file mode 100644 index 269affd..0000000 --- a/core/res/res/drawable-mdpi/textfield_selected_holo_light.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png Binary files differnew file mode 100644 index 0000000..d86534c --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png Binary files differnew file mode 100644 index 0000000..6ae5d4b --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_focused_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png Binary files differnew file mode 100644 index 0000000..fd578b6 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png Binary files differnew file mode 100644 index 0000000..a0caaa9 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_disabled_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png Binary files differnew file mode 100644 index 0000000..f6f4ed2 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png Binary files differnew file mode 100644 index 0000000..2591adb --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_focused_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png Binary files differnew file mode 100644 index 0000000..efee099 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png Binary files differnew file mode 100644 index 0000000..f7b09de --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_longpressed_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png Binary files differnew file mode 100644 index 0000000..76f13a6 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png Binary files differnew file mode 100644 index 0000000..cb8e764 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_normal_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png Binary files differnew file mode 100644 index 0000000..7c0d0bc --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png Binary files differnew file mode 100644 index 0000000..9d7ff6b --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_down_pressed_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png Binary files differnew file mode 100644 index 0000000..cfdfd174 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png Binary files differnew file mode 100644 index 0000000..43bdf1d --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_focused_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png Binary files differnew file mode 100644 index 0000000..2ffe46b --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png Binary files differnew file mode 100644 index 0000000..51bb2d0 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_disabled_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png Binary files differnew file mode 100644 index 0000000..dece157 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png Binary files differnew file mode 100644 index 0000000..384cb32 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_focused_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png Binary files differnew file mode 100644 index 0000000..84ec4f7 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png Binary files differnew file mode 100644 index 0000000..318befc --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_longpressed_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png Binary files differnew file mode 100644 index 0000000..d97a832 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png Binary files differnew file mode 100644 index 0000000..19d75e5 --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_normal_holo_light.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png Binary files differnew file mode 100644 index 0000000..1189e5c --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_dark.png diff --git a/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png Binary files differnew file mode 100644 index 0000000..9f283ab --- /dev/null +++ b/core/res/res/drawable-mdpi/timepicker_up_pressed_holo_light.png diff --git a/core/res/res/drawable/edit_text.xml b/core/res/res/drawable/edit_text.xml index 315278d..e9ba84b 100644 --- a/core/res/res/drawable/edit_text.xml +++ b/core/res/res/drawable/edit_text.xml @@ -15,11 +15,8 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" android:state_enabled="true" - android:drawable="@drawable/textfield_default" /> - <item android:state_window_focused="false" android:state_enabled="false" - android:drawable="@drawable/textfield_disabled" /> - <item android:state_pressed="true" android:drawable="@drawable/textfield_pressed" /> + <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default" /> + <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled" /> <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_selected" /> <item android:state_enabled="true" android:drawable="@drawable/textfield_default" /> <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_selected" /> diff --git a/core/res/res/drawable/edit_text_holo_dark.xml b/core/res/res/drawable/edit_text_holo_dark.xml index b7d24ff..63ccd1d 100644 --- a/core/res/res/drawable/edit_text_holo_dark.xml +++ b/core/res/res/drawable/edit_text_holo_dark.xml @@ -15,14 +15,11 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" android:state_enabled="true" - android:drawable="@drawable/textfield_default_holo_dark" /> - <item android:state_window_focused="false" android:state_enabled="false" - android:drawable="@drawable/textfield_disabled_holo_dark" /> - <item android:state_pressed="true" android:drawable="@drawable/textfield_pressed_holo_dark" /> - <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_selected_holo_dark" /> + <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_dark" /> + <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled_holo_dark" /> + <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_active_holo_dark" /> <item android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_dark" /> - <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_selected_holo_dark" /> + <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_focused_holo_dark" /> <item android:drawable="@drawable/textfield_disabled_holo_dark" /> </selector> diff --git a/core/res/res/drawable/edit_text_holo_light.xml b/core/res/res/drawable/edit_text_holo_light.xml index dae39e3..324acda 100644 --- a/core/res/res/drawable/edit_text_holo_light.xml +++ b/core/res/res/drawable/edit_text_holo_light.xml @@ -15,14 +15,11 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" android:state_enabled="true" - android:drawable="@drawable/textfield_default_holo_light" /> - <item android:state_window_focused="false" android:state_enabled="false" - android:drawable="@drawable/textfield_disabled_holo_light" /> - <item android:state_pressed="true" android:drawable="@drawable/textfield_pressed_holo_light" /> - <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_selected_holo_light" /> + <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_light" /> + <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled_holo_light" /> + <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_active_holo_light" /> <item android:state_enabled="true" android:drawable="@drawable/textfield_default_holo_light" /> - <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_selected_holo_light" /> + <item android:state_focused="true" android:drawable="@drawable/textfield_disabled_focused_holo_light" /> <item android:drawable="@drawable/textfield_disabled_holo_light" /> </selector> diff --git a/core/res/res/drawable/edit_text_multiline_holo_dark.xml b/core/res/res/drawable/edit_text_multiline_holo_dark.xml new file mode 100644 index 0000000..67d2748 --- /dev/null +++ b/core/res/res/drawable/edit_text_multiline_holo_dark.xml @@ -0,0 +1,24 @@ +<?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_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_dark" /> + <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_multiline_disabled_holo_dark" /> + <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_multiline_active_holo_dark" /> + <item android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_dark" /> + <item android:state_focused="true" android:drawable="@drawable/textfield_multiline_disabled_focused_holo_dark" /> + <item android:drawable="@drawable/textfield_multiline_disabled_holo_dark" /> +</selector> diff --git a/core/res/res/drawable/edit_text_multiline_holo_light.xml b/core/res/res/drawable/edit_text_multiline_holo_light.xml new file mode 100644 index 0000000..08b3ec6 --- /dev/null +++ b/core/res/res/drawable/edit_text_multiline_holo_light.xml @@ -0,0 +1,24 @@ +<?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_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_light" /> + <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_multiline_disabled_holo_light" /> + <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_multiline_active_holo_light" /> + <item android:state_enabled="true" android:drawable="@drawable/textfield_multiline_default_holo_light" /> + <item android:state_focused="true" android:drawable="@drawable/textfield_multiline_disabled_focused_holo_light" /> + <item android:drawable="@drawable/textfield_multiline_disabled_holo_light" /> +</selector> diff --git a/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml b/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml index b3645aa..c76e833 100644 --- a/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml +++ b/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml @@ -21,23 +21,22 @@ state of the device, as well as instructions on how to get past it depending on the state of the device. It is the same for landscape and portrait.--> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tabunlock="http://schemas.android.com/apk/res/com.android.tabunlock" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#70000000" - android:gravity="center_horizontal" - android:id="@+id/root"> + android:orientation="vertical" + android:id="@+id/root" + android:background="#70000000"> <!-- left side: status and emergency call button --> <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dip" - android:layout_weight="1" - android:orientation="vertical" - android:gravity="center_vertical" - > - <include layout="@layout/keyguard_screen_status_land" /> + android:layout_width="match_parent" + android:layout_height="0dip" + android:layout_weight="1" + android:orientation="vertical" + android:gravity="center_vertical"> + <include layout="@layout/keyguard_screen_status_port" /> </LinearLayout> <LinearLayout @@ -61,6 +60,7 @@ android:id="@+id/wave_view" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_gravity="center" /> <!-- "emergency calls only" shown when sim is missing or PUKd --> @@ -93,5 +93,5 @@ /> </LinearLayout> -</RelativeLayout> +</LinearLayout> diff --git a/core/res/res/layout-xlarge/status_bar_latest_event_content.xml b/core/res/res/layout-xlarge/status_bar_latest_event_content.xml index c64b90e..d599154 100644 --- a/core/res/res/layout-xlarge/status_bar_latest_event_content.xml +++ b/core/res/res/layout-xlarge/status_bar_latest_event_content.xml @@ -1,56 +1,41 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:paddingTop="7dp" - android:paddingLeft="5dp" > + <ImageView android:id="@+id/icon" + android:layout_width="48dp" + android:layout_height="64dp" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:scaleType="center" + /> + <LinearLayout - android:layout_width="match_parent" + android:layout_width="0dp" android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingTop="3dp" + android:layout_gravity="center_vertical" + android:layout_weight="1" + android:orientation="vertical" + android:paddingLeft="16dp" > - <!--com.android.server.status.AnimatedImageView android:id="@+id/icon" --> - <ImageView android:id="@+id/icon" - android:layout_width="25dp" - android:layout_height="25dp" - android:scaleType="fitCenter" - android:src="@drawable/arrow_down_float"/> <TextView android:id="@+id/title" android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" android:fadingEdge="horizontal" - android:paddingLeft="4dp" /> - </LinearLayout> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - > <TextView android:id="@+id/text" android:textAppearance="@style/TextAppearance.StatusBar.EventContent" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" android:fadingEdge="horizontal" - android:paddingLeft="4dp" - /> - <android.widget.DateTimeView android:id="@+id/time" - android:textAppearance="@style/TextAppearance.StatusBar.EventContent" - android:layout_marginLeft="4dp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:singleLine="true" - android:paddingRight="5dp" /> </LinearLayout> </LinearLayout> + diff --git a/core/res/res/layout/preference.xml b/core/res/res/layout/preference.xml index 46c3e9c..6bd5efa 100644 --- a/core/res/res/layout/preference.xml +++ b/core/res/res/layout/preference.xml @@ -24,13 +24,19 @@ android:gravity="center_vertical" android:paddingRight="?android:attr/scrollbarSize"> - <!-- Preference should place its actual preference widget here. --> - <LinearLayout android:id="@+android:id/widget_frame" + <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:minWidth="@dimen/preference_widget_width" android:gravity="center" - android:orientation="vertical" /> + android:orientation="horizontal"> + <ImageView + android:id="@+android:id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + /> + </LinearLayout> <RelativeLayout android:layout_width="wrap_content" @@ -59,4 +65,12 @@ </RelativeLayout> + <!-- Preference should place its actual preference widget here. --> + <LinearLayout android:id="@+android:id/widget_frame" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:minWidth="@dimen/preference_widget_width" + android:gravity="center" + android:orientation="vertical" /> + </LinearLayout> diff --git a/core/res/res/layout/preference_child.xml b/core/res/res/layout/preference_child.xml index 713aa17..e9b50e0 100644 --- a/core/res/res/layout/preference_child.xml +++ b/core/res/res/layout/preference_child.xml @@ -20,20 +20,26 @@ android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" + android:paddingLeft="16dip" android:paddingRight="?android:attr/scrollbarSize"> - <!-- Preference should place its actual preference widget here. --> - <LinearLayout android:id="@+android:id/widget_frame" + <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:minWidth="@dimen/preference_widget_width" android:gravity="center" - android:orientation="vertical" /> + android:orientation="horizontal"> + <ImageView + android:id="@+android:id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + /> + </LinearLayout> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="16dip" android:layout_marginRight="6dip" android:layout_marginTop="6dip" android:layout_marginBottom="6dip" @@ -58,4 +64,12 @@ </RelativeLayout> + <!-- Preference should place its actual preference widget here. --> + <LinearLayout android:id="@+android:id/widget_frame" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:minWidth="@dimen/preference_widget_width" + android:gravity="center" + android:orientation="vertical" /> + </LinearLayout> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 0aa4247..666032c 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Bez upozornění smazat všechna data telefonu obnovením továrních dat"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Nastavit globální proxy server zařízení"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Vyberte globální proxy server, který se bude používat, když jsou zásady aktivní. Aktuální globální proxy server nastavuje pouze první správce zařízení."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Domů"</item> <item msgid="869923650527136615">"Mobil"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pracovní pager"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistent"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Vlastní"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Narozeniny"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Výročí"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Událost"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Ostatní"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Vlastní"</string> <string name="emailTypeHome" msgid="449227236140433919">"Domů"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Práce"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Práce"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Jiné"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Vlastní"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Vlastní"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistent"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Bratr"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Dítě"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Druh/družka"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Otec"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Známý"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Vedoucí"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Matka"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Rodič"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Doporučující osoba"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Příbuzný"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Sestra"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Manžel(ka)"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Vlastní"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Plocha"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Práce"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Potvrdit"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dvojitým klepnutím můžete zobrazení přiblížit nebo oddálit."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Automaticky vyplnit tento formulář"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Vyjmout"</string> <string name="copy" msgid="2681946229533511987">"Kopírovat"</string> <string name="paste" msgid="5629880836805036433">"Vložit"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Není co vložit"</string> <string name="copyUrl" msgid="2538211579596067402">"Kopírovat adresu URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Vybrat text..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Výběr textu"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Odeslat"</string> <string name="ime_action_next" msgid="3138843904009813834">"Další"</string> <string name="ime_action_done" msgid="8971516117910934605">"Hotovo"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Předch."</string> <string name="ime_action_default" msgid="2840921885558045721">"Spustit"</string> <string name="dial_number_using" msgid="5789176425167573586">"Vytočit číslo"\n" <xliff:g id="NUMBER">%s</xliff:g>."</string> <string name="create_contact_using" msgid="4947405226788104538">"Vytvořit kontakt"\n"pro <xliff:g id="NUMBER">%s</xliff:g>."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index e0be775..36eb27a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Slet telefonens data uden varsel ved at gendanne fabriksindstillinger"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Angiv enhedens globale proxy"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Angiv enhedens globale proxy, der skal bruges, mens politikken er aktiveret. Kun den første enhedsadministrator angiver den effektive globale proxy."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Hjem"</item> <item msgid="869923650527136615">"Mobil"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsøger"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"mms"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Tilpasset"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Fødselsdato"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Årsdag"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Begivenhed"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Andre"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Tilpasset"</string> <string name="emailTypeHome" msgid="449227236140433919">"Hjem"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Arbejde"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Arbejde"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Andre"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Tilpasset"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Tilpasset"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Bror"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Barn"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Samlever"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Far"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Ven"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Chef"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mor"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Forælder"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Henvist af"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Familie"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Søster"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Ægtefælle"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Tilpasset"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Hjem"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbejde"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Bekræft"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tip: Dobbeltklik for at zoome ind eller ud."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autofuldfør denne formular"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Klip"</string> <string name="copy" msgid="2681946229533511987">"Kopier"</string> <string name="paste" msgid="5629880836805036433">"Indsæt"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Intet at indsætte"</string> <string name="copyUrl" msgid="2538211579596067402">"Kopier webadresse"</string> <string name="selectTextMode" msgid="6738556348861347240">"Marker tekst..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstmarkering"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Send"</string> <string name="ime_action_next" msgid="3138843904009813834">"Næste"</string> <string name="ime_action_done" msgid="8971516117910934605">"Udfør"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Forrige"</string> <string name="ime_action_default" msgid="2840921885558045721">"Udfør"</string> <string name="dial_number_using" msgid="5789176425167573586">"Ring til nummer"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Opret kontakt"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 1566b1b..fe7ddc7 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Auf Werkseinstellungen zurücksetzen und Daten auf dem Telefon ohne Warnung löschen"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Den globalen Proxy des Geräts festlegen"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Den globalen Proxy des Geräts zur Verwendung während der Aktivierung der Richtlinie festlegen. Nur der erste Geräteadministrator kann den gültigen globalen Proxy festlegen."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Privat"</item> <item msgid="869923650527136615">"Mobil"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager (geschäftl.)"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Zweite Nummer"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Benutzerdefiniert"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Geburtstag"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Jahrestag"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Termin"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Sonstige"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Benutzerdefiniert"</string> <string name="emailTypeHome" msgid="449227236140433919">"Privat"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Geschäftlich"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Geschäftlich"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Sonstige"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Benutzerdefiniert"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Benutzerdefiniert"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Bruder"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Kind"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Lebenspartner"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Vater"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Freund"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Vorgesetzter"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mutter"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Elternteil"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Weitergeleitet von"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Verwandter"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Schwester"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Gatte/Gattin"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Benutzerdefiniert"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Privat"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Geschäftlich"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Bestätigen"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tipp: Zum Heranzoomen und Vergrößern zweimal tippen"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Dieses Formular automatisch ausfüllen"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Ausschneiden"</string> <string name="copy" msgid="2681946229533511987">"Kopieren"</string> <string name="paste" msgid="5629880836805036433">"Einfügen"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Nichts zum Einfügen"</string> <string name="copyUrl" msgid="2538211579596067402">"URL kopieren"</string> <string name="selectTextMode" msgid="6738556348861347240">"Text auswählen..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Textauswahl"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Senden"</string> <string name="ime_action_next" msgid="3138843904009813834">"Weiter"</string> <string name="ime_action_done" msgid="8971516117910934605">"Fertig"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Zurück"</string> <string name="ime_action_default" msgid="2840921885558045721">"Ausführen"</string> <string name="dial_number_using" msgid="5789176425167573586">"Nummer"\n"mit <xliff:g id="NUMBER">%s</xliff:g> wählen"</string> <string name="create_contact_using" msgid="4947405226788104538">"Neuer Kontakt"\n"mit <xliff:g id="NUMBER">%s</xliff:g> erstellen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index bd86221..2103aef 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Διαγραφή των δεδομένων του τηλεφώνου χωρίς προειδοποίηση με επαναφορά των εργοστασιακών δεδομένων"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Ρύθμιση του γενικού διακομιστή μεσολάβησης της συσκευής"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Ορίστε τη χρήση του γενικού διακομιστή μεσολάβησης της συσκευής όταν είναι ενεργοποιημένη η πολιτική. Μόνο ο διαχειριστής της πρώτης συσκευής ορίζει τον ισχύοντα γενικό διακομιστή μεσολάβησης."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Οικία"</item> <item msgid="869923650527136615">"Κινητό"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Βομβητής εργασίας"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Βοηθός"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Προσαρμοσμένο"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Γενέθλια"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Επέτειος"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Συμβάν"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Άλλο"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Προσαρμοσμένο"</string> <string name="emailTypeHome" msgid="449227236140433919">"Οικία"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Εργασία"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Εργασία"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Άλλο"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Προσαρμοσμένο"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Προσαρμοσμένο"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Βοηθός"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Αδερφός"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Παιδί"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Σύντρ. ελεύθ. συμβ."</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Πατέρας"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Φίλος"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Διευθυντής"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Μητέρα"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Γονέας"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Συνεργάτης"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Συστήθηκε από"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Συγγενής"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Αδερφή"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Σύζυγος"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Προσαρμοσμένο"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Αρχική σελίδα"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Εργασία"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Επιβεβαίωση"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Συμβουλή: διπλό άγγιγμα για μεγέθυνση και σμίκρυνση."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Να γίνει αυτόματη συμπλήρωση αυτής της φόρμας"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Αποκοπή"</string> <string name="copy" msgid="2681946229533511987">"Αντιγραφή"</string> <string name="paste" msgid="5629880836805036433">"Επικόλληση"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Καν. στοιχ. για επικ."</string> <string name="copyUrl" msgid="2538211579596067402">"Αντιγραφή διεύθυνσης URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Επιλογή κειμένου..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Επιλογή κειμένου"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Αποστολή"</string> <string name="ime_action_next" msgid="3138843904009813834">"Επόμενο"</string> <string name="ime_action_done" msgid="8971516117910934605">"Τέλος"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Προηγ."</string> <string name="ime_action_default" msgid="2840921885558045721">"Εκτέλεση"</string> <string name="dial_number_using" msgid="5789176425167573586">"Κλήση αριθμού"\n"με τη χρήση <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Δημιουργία επαφής"\n"με τη χρήση του <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index e303707..bd5371f 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -481,6 +481,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Borrar los datos del teléfono sin advertencias al restablecer la configuración original"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Configura el proxy global de dispositivo"</string> <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> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Casa"</item> <item msgid="869923650527136615">"Celular"</item> @@ -545,11 +549,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Localizador del trabajo"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistente"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizado"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Cumpleaños"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversario"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Otro"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string> <string name="emailTypeHome" msgid="449227236140433919">"Casa"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Trabajo"</string> @@ -576,36 +579,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Trabajo"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Otro"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Personalizado"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizado"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistente"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Hermano"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Hijo"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Conviviente"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Padre"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Amigo"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Gerente"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Madre"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Padre"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Socio"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Recomendado por"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Pariente"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Hermana"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Cónyuge"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizado"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Página principal"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Trabajo"</string> @@ -673,12 +661,10 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Sugerencia: presiona dos veces para acercar y alejar"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autocompletar este formulario"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> - <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> - <skip /> + <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> <!-- no translation found for autofill_address_summary_format (4874459455786827344) --> <skip /> <string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"leer historial y marcadores del navegador"</string> @@ -803,8 +789,7 @@ <string name="cut" msgid="3092569408438626261">"Cortar"</string> <string name="copy" msgid="2681946229533511987">"Copiar"</string> <string name="paste" msgid="5629880836805036433">"Pegar"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Nada que pegar"</string> <string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string> @@ -950,8 +935,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Enviar"</string> <string name="ime_action_next" msgid="3138843904009813834">"Siguiente"</string> <string name="ime_action_done" msgid="8971516117910934605">"Hecho"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Ant."</string> <string name="ime_action_default" msgid="2840921885558045721">"Ejecutar"</string> <string name="dial_number_using" msgid="5789176425167573586">"Marcar el número"\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Crear contacto "\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string> @@ -1008,8 +992,6 @@ <string name="media_shared" product="nosdcard" msgid="5830814349250834225">"Una computadora está utilizando el almacenamiento USB en este momento."</string> <string name="media_shared" product="default" msgid="5706130568133540435">"Una computadora está utilizando la tarjeta SD en este momento."</string> <string name="media_unknown_state" msgid="729192782197290385">"Medios externos en estado desconocido."</string> - <!-- no translation found for share (1778686618230011964) --> - <skip /> - <!-- no translation found for find (4808270900322985960) --> - <skip /> + <string name="share" msgid="1778686618230011964">"Compartir"</string> + <string name="find" msgid="4808270900322985960">"Buscar"</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 452eefd..5de5c9f 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Borrado de los datos del teléfono sin avisar restableciendo datos de fábrica"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Definir el servidor proxy global"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Define el servidor proxy global que se debe utilizar mientras la política esté habilitada. Solo el primer administrador de dispositivos define el servidor proxy global efectivo."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Casa"</item> <item msgid="869923650527136615">"Móvil"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Buscapersonas del trabajo"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistente"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizados"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Cumpleaños"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversario"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Otros"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string> <string name="emailTypeHome" msgid="449227236140433919">"Casa"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Trabajo"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Trabajo"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Otra"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Personalizada"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizada"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Asistente"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Hermano"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Hijo/a"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Pareja de hecho"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Padre"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Amigo/a"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Manager"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Madre"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Padre/madre"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Pareja"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Recomendado por"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Pariente"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Hermana"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Cónyuge"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizada"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Casa"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Trabajo"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Sugerencia: toca dos veces para ampliar o reducir."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autocompletar este formulario"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Cortar"</string> <string name="copy" msgid="2681946229533511987">"Copiar"</string> <string name="paste" msgid="5629880836805036433">"Pegar"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Portapapeles vacío"</string> <string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selección de texto"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Enviar"</string> <string name="ime_action_next" msgid="3138843904009813834">"Siguiente"</string> <string name="ime_action_done" msgid="8971516117910934605">"Listo"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Anterior"</string> <string name="ime_action_default" msgid="2840921885558045721">"Ejecutar"</string> <string name="dial_number_using" msgid="5789176425167573586">"Marcar número"\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Crear un contacto"\n"a partir de <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index a802350..fa97fc0 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Effacer les données du téléphone sans avertissement, en restaurant les valeurs d\'usine"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Définir le proxy global du mobile"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Indiquez le proxy global à utiliser pour ce mobile lorsque les règles sont activées. Seul l\'administrateur principal du mobile peut définir le proxy global utilisé."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Domicile"</item> <item msgid="869923650527136615">"Mobile"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Téléavertisseur (professionnel)"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistant"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Personnalisé"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Anniversaire"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Fête"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Événement"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Autre"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Personnalisé"</string> <string name="emailTypeHome" msgid="449227236140433919">"Domicile"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Bureau"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Bureau"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Autre"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Personnalisé"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Personnalisée"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistant"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Frère"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Enfant"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Concubin"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Père"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Ami"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Responsable"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mère"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Parent"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partenaire"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Recommandé par"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Proche"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Sœur"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Conjoint"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personnalisée"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Accueil"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Professionnelle"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmer"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Conseil : Appuyez deux fois pour effectuer un zoom avant ou arrière."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Permettre le remplissage automatique du formulaire"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Couper"</string> <string name="copy" msgid="2681946229533511987">"Copier"</string> <string name="paste" msgid="5629880836805036433">"Coller"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Presse-papiers vide"</string> <string name="copyUrl" msgid="2538211579596067402">"Copier l\'URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Sélect. le texte..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Sélection de texte"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Envoyer"</string> <string name="ime_action_next" msgid="3138843904009813834">"Suivant"</string> <string name="ime_action_done" msgid="8971516117910934605">"OK"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Préc."</string> <string name="ime_action_default" msgid="2840921885558045721">"Exécuter"</string> <string name="dial_number_using" msgid="5789176425167573586">"Composer le numéro"\n"en utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Ajouter un contact"\n"en utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 6e5987e..89d0a32 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Cancella i dati del telefono senza preavviso eseguendo un ripristino dati di fabbrica"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Imposta il proxy globale del dispositivo"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Imposta il proxy globale del dispositivo in modo da utilizzarlo mentre la norma è attiva. Il proxy globale effettivo è impostabile solo dal primo amministratore del dispositivo."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Casa"</item> <item msgid="869923650527136615">"Cellulare"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Cercapersone lavoro"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistente"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizzato"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Compleanno"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Anniversario"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Altri"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Personalizzato"</string> <string name="emailTypeHome" msgid="449227236140433919">"Casa"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Lavoro"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Lavoro"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Altro"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Personalizzato"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizzato"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistente"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Fratello"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Figlio"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Convivente"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Padre"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Amico"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Dirigente"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Madre"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Genitore"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Riferito da"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Parente"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Sorella"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Coniuge"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizzato"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Casa"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Lavoro"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Conferma"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Suggerimento. Tocca due volte per aumentare/ridurre lo zoom."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Compila automaticamente il modulo"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Taglia"</string> <string name="copy" msgid="2681946229533511987">"Copia"</string> <string name="paste" msgid="5629880836805036433">"Incolla"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Niente da incollare"</string> <string name="copyUrl" msgid="2538211579596067402">"Copia URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Seleziona testo..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selezione testo"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Invia"</string> <string name="ime_action_next" msgid="3138843904009813834">"Avanti"</string> <string name="ime_action_done" msgid="8971516117910934605">"Fine"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Prec."</string> <string name="ime_action_default" msgid="2840921885558045721">"Esegui"</string> <string name="dial_number_using" msgid="5789176425167573586">"Componi numero"\n"utilizzando <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Crea contatto"\n"utilizzando <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 12cb290..dcbcdc2 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"警告せずにデータの初期化を実行して端末内のデータを消去します。"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"端末のグローバルプロキシを設定"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"ポリシーが有効になっている場合は端末のグローバルプロキシが使用されるように設定します。有効なグローバルプロキシを設定できるのは最初のデバイス管理者だけです。"</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"自宅"</item> <item msgid="869923650527136615">"携帯"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"ポケベル(勤務先)"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"アシスタント"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"カスタム"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"誕生日"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"記念日"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"予定"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"その他"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"カスタム"</string> <string name="emailTypeHome" msgid="449227236140433919">"自宅"</string> <string name="emailTypeWork" msgid="3548058059601149973">"勤務先"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"勤務先"</string> <string name="orgTypeOther" msgid="3951781131570124082">"その他"</string> <string name="orgTypeCustom" msgid="225523415372088322">"カスタム"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"カスタム"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"アシスタント"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"兄弟"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"子ども"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"パートナー(国内)"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"父"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"友だち"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"上司"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"母"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"親"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"パートナー"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"紹介者"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"親戚"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"姉妹"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"配偶者"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"カスタム"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"自宅"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"勤務先"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"確認"</string> <string name="double_tap_toast" msgid="1068216937244567247">"ヒント: ダブルタップで拡大/縮小できます。"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"このフォームを自動入力"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"切り取り"</string> <string name="copy" msgid="2681946229533511987">"コピー"</string> <string name="paste" msgid="5629880836805036433">"貼り付け"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"クリップボードが空です"</string> <string name="copyUrl" msgid="2538211579596067402">"URLをコピー"</string> <string name="selectTextMode" msgid="6738556348861347240">"テキストを選択..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"テキスト選択"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"送信"</string> <string name="ime_action_next" msgid="3138843904009813834">"次へ"</string> <string name="ime_action_done" msgid="8971516117910934605">"完了"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"前へ"</string> <string name="ime_action_default" msgid="2840921885558045721">"実行"</string> <string name="dial_number_using" msgid="5789176425167573586">"<xliff:g id="NUMBER">%s</xliff:g>を使って"\n"発信"</string> <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>を使って"\n"連絡先を新規登録"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 36e5134..8fe117f 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"초기화를 수행하여 경고 없이 휴대전화 데이터를 지웁니다."</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"기기 전체 프록시 설정"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"정책이 사용 설정되어 있는 동안 사용될 기기 전체 프록시를 설정합니다. 첫 번째 기기 관리자가 설정한 전체 프록시만 유효합니다."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"집"</item> <item msgid="869923650527136615">"모바일"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"직장 호출기"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"비서"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"맞춤설정"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"생일"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"기념일"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"일정"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"기타"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"맞춤설정"</string> <string name="emailTypeHome" msgid="449227236140433919">"집"</string> <string name="emailTypeWork" msgid="3548058059601149973">"직장"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"직장"</string> <string name="orgTypeOther" msgid="3951781131570124082">"기타"</string> <string name="orgTypeCustom" msgid="225523415372088322">"맞춤설정"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"맞춤설정"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"비서"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"남자 형제"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"자녀"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"동거인"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"아버지"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"친구"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"상사"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"어머니"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"부모"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"파트너"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"추천인"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"친척"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"여자 형제"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"배우자"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"맞춤설정"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"홈"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"직장"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"확인"</string> <string name="double_tap_toast" msgid="1068216937244567247">"도움말: 축소/확대하려면 두 번 누릅니다."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"양식 자동완성"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"잘라내기"</string> <string name="copy" msgid="2681946229533511987">"복사"</string> <string name="paste" msgid="5629880836805036433">"붙여넣기"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"붙여넣을 내용이 없습니다."</string> <string name="copyUrl" msgid="2538211579596067402">"URL 복사"</string> <string name="selectTextMode" msgid="6738556348861347240">"텍스트 선택..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"텍스트 선택"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"전송"</string> <string name="ime_action_next" msgid="3138843904009813834">"다음"</string> <string name="ime_action_done" msgid="8971516117910934605">"완료"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"이전"</string> <string name="ime_action_default" msgid="2840921885558045721">"실행"</string> <string name="dial_number_using" msgid="5789176425167573586">"전화하기 "\n"<xliff:g id="NUMBER">%s</xliff:g>에 연결"</string> <string name="create_contact_using" msgid="4947405226788104538">"전화번호부에"\n"<xliff:g id="NUMBER">%s</xliff:g> 추가"</string> diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml index d562d96..b1f12b5 100644 --- a/core/res/res/values-land/dimens.xml +++ b/core/res/res/values-land/dimens.xml @@ -21,6 +21,6 @@ <resources> <dimen name="password_keyboard_key_height">47dip</dimen> <dimen name="password_keyboard_spacebar_vertical_correction">2dip</dimen> - <dimen name="preference_screen_side_margin">32dp</dimen> - <dimen name="preference_widget_width">64dp</dimen> + <dimen name="preference_screen_side_margin">96dp</dimen> + <dimen name="preference_widget_width">72dp</dimen> </resources>
\ No newline at end of file diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index e43aabd..cdc3f0a 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Tilbakestill telefonens data uten advarsel ved å utføre tilbakestilling til fabrikkstandard"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Angi enhetens globale mellomtjener"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Angir den globale mellomtjeneren på enheten som skal brukes når regelen er aktivert. Kun den opprinnelige administratoren av enheten kan angi den globale mellomtjeneren."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Hjemmenummer"</item> <item msgid="869923650527136615">"Mobil"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsøker arbeid"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Egendefinert"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Bursdag"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Jubileum"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Akivitet"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Andre"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Egendefinert"</string> <string name="emailTypeHome" msgid="449227236140433919">"Hjemme"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Arbeid"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Arbeid"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Annen"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Egendefinert"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Egendefinert"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Bror"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Barn"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Samboer"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Far"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Venn"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Sjef"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mor"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Foresatt"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Anbefalt av"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Slektning"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Søster"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Ektefelle"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Egendefinert"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Startside"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbeid"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Bekreft"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Dobbelttrykk for å zoome inn og ut."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Fyll ut dette skjemaet automatisk"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Klipp ut"</string> <string name="copy" msgid="2681946229533511987">"Kopier"</string> <string name="paste" msgid="5629880836805036433">"Lim inn"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Ingenting å lime inn"</string> <string name="copyUrl" msgid="2538211579596067402">"Kopier URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Marker tekst"</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Merket tekst"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Send"</string> <string name="ime_action_next" msgid="3138843904009813834">"Neste"</string> <string name="ime_action_done" msgid="8971516117910934605">"Utført"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Forrige"</string> <string name="ime_action_default" msgid="2840921885558045721">"Utfør"</string> <string name="dial_number_using" msgid="5789176425167573586">"Ring nummeret"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Lag kontakt"\n"med nummeret <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index d66b694..12034f2 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"De gegevens van de telefoon zonder waarschuwing wissen door de fabrieksinstellingen te herstellen"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Algemene proxy voor het apparaat instellen"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Stel de algemene proxy voor het apparaat in die moet worden gebruikt terwijl het beleid is geactiveerd. Alleen de eerste apparaatbeheerder stelt de algemene proxy in."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Thuis"</item> <item msgid="869923650527136615">"Mobiel"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager werk"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Aangepast"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Verjaardag"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Jubileum"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Afspraak"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Overig"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Aangepast"</string> <string name="emailTypeHome" msgid="449227236140433919">"Thuis"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Werk"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Werk"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Overig"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Aangepast"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Aangepast"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Broer"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Kind"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Levenspartner"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Vader"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Vriend"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Manager"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Moeder"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Ouder"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Genoemd door"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Familielid"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Zus"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Echtgenoot/-genote"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Aangepast"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Startpagina"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Werk"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Bevestigen"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tip: tik tweemaal om in of uit te zoomen."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Dit formulier automatisch aanvullen"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Knippen"</string> <string name="copy" msgid="2681946229533511987">"Kopiëren"</string> <string name="paste" msgid="5629880836805036433">"Plakken"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Niets te plakken"</string> <string name="copyUrl" msgid="2538211579596067402">"URL kopiëren"</string> <string name="selectTextMode" msgid="6738556348861347240">"Tekst selecteren..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Tekstselectie"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Verzenden"</string> <string name="ime_action_next" msgid="3138843904009813834">"Volgende"</string> <string name="ime_action_done" msgid="8971516117910934605">"Gereed"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Vorige"</string> <string name="ime_action_default" msgid="2840921885558045721">"Uitvoeren"</string> <string name="dial_number_using" msgid="5789176425167573586">"Nummer bellen"\n"met <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Contact maken"\n"met <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 66a7160..089026f 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Wymazywanie danych z telefonu bez ostrzeżenia, przez przywrócenie danych fabrycznych"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Ustaw globalny serwer proxy urządzenia"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Ustaw globalny serwer proxy urządzenia do wykorzystywania przy włączonych zasadach. Tylko pierwszy administrator urządzenia ustawia obowiązujący globalny serwer proxy."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Dom"</item> <item msgid="869923650527136615">"Komórka"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager służbowy"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Asystent"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"Wiadomość MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Niestandardowe"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Urodziny"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Rocznica"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Wydarzenie"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Inne"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Niestandardowy"</string> <string name="emailTypeHome" msgid="449227236140433919">"Domowy"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Służbowy"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Służbowy"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Inny"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Niestandardowy"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Niestandardowa"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Asystent"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Brat"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Dziecko"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Partner życiowy"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Ojciec"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Znajomy"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Kierownik"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Matka"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Rodzic"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Z polecenia"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Krewny"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Siostra"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Współmałżonek"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Niestandardowy"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Domowy"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Służbowy"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Potwierdź"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Wskazówka: dotknij dwukrotnie, aby powiększyć lub pomniejszyć."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Wypełnij ten formularz automatycznie"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Wytnij"</string> <string name="copy" msgid="2681946229533511987">"Kopiuj"</string> <string name="paste" msgid="5629880836805036433">"Wklej"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Schowek jest pusty"</string> <string name="copyUrl" msgid="2538211579596067402">"Kopiuj adres URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Zaznacz tekst"</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Zaznaczanie tekstu"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Wyślij"</string> <string name="ime_action_next" msgid="3138843904009813834">"Dalej"</string> <string name="ime_action_done" msgid="8971516117910934605">"Gotowe"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Wstecz"</string> <string name="ime_action_default" msgid="2840921885558045721">"Wykonaj"</string> <string name="dial_number_using" msgid="5789176425167573586">"Połącz"\n"z numerem <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Utwórz kontakt"\n"dla numeru <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 990d630..3f270a0 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Apagar os dados do telefone sem avisar, ao efectuar uma reposição de dados de fábrica"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Definir o proxy global do aparelho"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Definir o proxy global do aparelho a ser utilizado quando a política estiver activada. Só o primeiro administrador do aparelho define o proxy global efectivo."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Residência"</item> <item msgid="869923650527136615">"Móvel"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager do trabalho"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistente"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizado"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Data de nascimento"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversário"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Outro"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string> <string name="emailTypeHome" msgid="449227236140433919">"Residência"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Emprego"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Emprego"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Outro"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Personalizado"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizado"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistente"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Irmão"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Filho"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Companheiro(a)"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Pai"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Amigo"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Director"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mãe"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Pais"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Sócio"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Recomendado por"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Família"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Irmã"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Cônjuge"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizado"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Página inicial"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Emprego"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Sugestão: toque duas vezes para aumentar ou diminuir o zoom."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Preenchimento automático deste formulário"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Cortar"</string> <string name="copy" msgid="2681946229533511987">"Copiar"</string> <string name="paste" msgid="5629880836805036433">"Colar"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Nada para colar"</string> <string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Seleccionar texto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selecção de texto"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Enviar"</string> <string name="ime_action_next" msgid="3138843904009813834">"Seguinte"</string> <string name="ime_action_done" msgid="8971516117910934605">"Concluído"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Ant"</string> <string name="ime_action_default" msgid="2840921885558045721">"Executar"</string> <string name="dial_number_using" msgid="5789176425167573586">"Marcar número"\n"utilizando <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Criar contacto"\n"utilizando <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index ce106db..368132e 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Apaga os dados do telefone sem aviso, executando uma redefinição da configuração original"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Definir o proxy global do dispositivo"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Configura o proxy global do dispositivo para ser usado enquanto a política estiver ativada. Somente o primeiro administrador do dispositivo pode configurar um verdadeiro proxy global."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Residencial"</item> <item msgid="869923650527136615">"Celular"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Pager comercial"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistente"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Personalizado"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Aniversário"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Data comemorativa"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Evento"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Outros"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string> <string name="emailTypeHome" msgid="449227236140433919">"Residencial"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Comercial"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Comercial"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Outros"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Personalizado"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Personalizado"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistente"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Irmão"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Filho(a)"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Parceiro doméstico"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Pai"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Amigo(a)"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Gerente"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mãe"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Pai/Mãe"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Parceiro"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Indicado por"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Parente"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Irmã"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Cônjuge"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Personalizado"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Página inicial"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Comercial"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Confirmar"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Dica: toque duas vezes para aumentar e diminuir o zoom."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Preencher automaticamente este formulário"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Recortar"</string> <string name="copy" msgid="2681946229533511987">"Copiar"</string> <string name="paste" msgid="5629880836805036433">"Colar"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Nada para colar"</string> <string name="copyUrl" msgid="2538211579596067402">"Copiar URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Selecionar texto..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Seleção de texto"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Enviar"</string> <string name="ime_action_next" msgid="3138843904009813834">"Avançar"</string> <string name="ime_action_done" msgid="8971516117910934605">"Concluído"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Anter."</string> <string name="ime_action_default" msgid="2840921885558045721">"Executar"</string> <string name="dial_number_using" msgid="5789176425167573586">"Discar número"\n"usando <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Criar contato "\n"usando <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index bbd61bd..e8f7298 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -488,6 +488,10 @@ <!-- outdated translation 2314060933796396205 --> <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Restaurar ils parameters originals dal telefonin. Qua tras vegnan tut Vossas datas stizzadas senza dumonda da conferma."</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Definir il proxy global da l\'apparat"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Definir il proxy global da l\'apparat che duai vegnir utilisà sche la directiva è activada. Mo l\'emprim administratur dad apparats definescha il vair proxy global."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Privat"</item> <item msgid="869923650527136615">"Telefonin"</item> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 4babb3b..0ef23ee 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Уничтожить все данные на телефоне без предупреждения путем сброса настроек"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Глобальный прокси-сервер"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Настройте глобальный прокси-сервер устройства, который будет использоваться при активной политике. Глобальный прокси-сервер должен настроить первый администратор устройства."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Домашний"</item> <item msgid="869923650527136615">"Мобильный"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Раб. пейджер"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Секретарь"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Особый"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"День рождения"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Юбилей"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Мероприятие"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Другой"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Создать свой ярлык"</string> <string name="emailTypeHome" msgid="449227236140433919">"Личный"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Рабочий"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Работа"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Другое"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Создать свой ярлык"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Особый"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Секретарь"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Брат"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Ребенок"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"В гражданском браке"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Отец"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Друг"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Руководитель"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Мать"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Родитель"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Партнер"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Рекомендуют:"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Родственник"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Сестра"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Супруг(а)"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Особый"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Домашний"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Рабочий"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Подтвердите"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Совет: нажмите дважды, чтобы увеличить и уменьшить масштаб."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Заполнить форму автоматически"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Вырезать"</string> <string name="copy" msgid="2681946229533511987">"Копировать"</string> <string name="paste" msgid="5629880836805036433">"Вставить"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Текст для вставки отсутствует"</string> <string name="copyUrl" msgid="2538211579596067402">"Копировать URL"</string> <string name="selectTextMode" msgid="6738556348861347240">"Выбрать текст..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Выбор текста"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Отправить"</string> <string name="ime_action_next" msgid="3138843904009813834">"Далее"</string> <string name="ime_action_done" msgid="8971516117910934605">"Готово"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Пред."</string> <string name="ime_action_default" msgid="2840921885558045721">"Выполнить"</string> <string name="dial_number_using" msgid="5789176425167573586">"Набрать номер"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Создать контакт"\n"с номером <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 102a08d..8ac9273 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Ta bort data från telefonen utan förvarning genom att återställa standardinställningarna"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Ange global proxyserver"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Ange vilken global proxyserver som ska användas när policyn är aktiverad. Endast den första enhetsadministratören anger den faktiska globala proxyservern."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Hem"</item> <item msgid="869923650527136615">"Mobil"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsökare, arbetet"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Anpassad"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Födelsedag"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Högtidsdag"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Händelse"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Övrigt"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Anpassad"</string> <string name="emailTypeHome" msgid="449227236140433919">"Hem"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Arbete"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"Arbete"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Övrigt"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Anpassad"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Anpassad"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Bror"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Barn"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Sambo"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Pappa"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Vän"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Chef"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Mamma"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Förälder"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Rekommenderad av"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Släkting"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Syster"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Make/maka"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Anpassad"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Startsida"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbete"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Bekräfta"</string> <string name="double_tap_toast" msgid="1068216937244567247">"Tips! Dubbelklicka om du vill zooma in eller ut."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Autofyll formuläret"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Klipp ut"</string> <string name="copy" msgid="2681946229533511987">"Kopiera"</string> <string name="paste" msgid="5629880836805036433">"Klistra in"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Inget att klistra in"</string> <string name="copyUrl" msgid="2538211579596067402">"Kopiera webbadress"</string> <string name="selectTextMode" msgid="6738556348861347240">"Markera text..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Textmarkering"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Skicka"</string> <string name="ime_action_next" msgid="3138843904009813834">"Nästa"</string> <string name="ime_action_done" msgid="8971516117910934605">"Färdig"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Föreg."</string> <string name="ime_action_default" msgid="2840921885558045721">"Utför"</string> <string name="dial_number_using" msgid="5789176425167573586">"Slå nummer "\n"med <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"Skapa kontakt"\n"med <xliff:g id="NUMBER">%s</xliff:g>"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index a6bfbf6..90dd16d 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"Fabrika verilerine sıfırlama işlemi gerçekleştirerek telefondaki verileri uyarıda bulunmadan silin"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Cihaz genelinde geçerli proxy\'i ayarla"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"Politika etkin olduğunda kullanılacak cihaz genelinde geçerli proxy\'yi ayarlayın. Etkin genel proxy\'yi yalnızca ilk cihaz yöneticisi ayarlar."</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Ev"</item> <item msgid="869923650527136615">"Mobil"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"İş Yeri Çağrı Cihazı"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Yardımcı"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"Özel"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Doğum günü"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Yıldönümü"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"Etkinlik"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"Diğer"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"Özel"</string> <string name="emailTypeHome" msgid="449227236140433919">"Ev"</string> <string name="emailTypeWork" msgid="3548058059601149973">"İş"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"İş"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Diğer"</string> <string name="orgTypeCustom" msgid="225523415372088322">"Özel"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"Özel"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"Yardımcı"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"Erkek Kardeş"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Çocuk"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Hayat Arkadaşı"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"Baba"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"Arkadaş"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"Yönetici"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"Anne"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"Ebeveyn"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"Hayat Arkadaşı"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Öneren"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Akraba"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Kız Kardeş"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Eş"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Özel"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Ev"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"İş"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"Onayla"</string> <string name="double_tap_toast" msgid="1068216937244567247">"İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez hafifçe vurun."</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"Bu formu otomatik doldur"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"Kes"</string> <string name="copy" msgid="2681946229533511987">"Kopyala"</string> <string name="paste" msgid="5629880836805036433">"Yapıştır"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"Yapştrlck bir şy yok"</string> <string name="copyUrl" msgid="2538211579596067402">"URL\'yi kopyala"</string> <string name="selectTextMode" msgid="6738556348861347240">"Metin seç..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"Metin seçimi"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"Gönder"</string> <string name="ime_action_next" msgid="3138843904009813834">"İleri"</string> <string name="ime_action_done" msgid="8971516117910934605">"Bitti"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"Önceki"</string> <string name="ime_action_default" msgid="2840921885558045721">"Çalıştır"</string> <string name="dial_number_using" msgid="5789176425167573586">"Numarayı çevir:"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>"\n" ile kişi oluştur"</string> diff --git a/core/res/res/values-xlarge/styles.xml b/core/res/res/values-xlarge/styles.xml index 4692656..316861e 100644 --- a/core/res/res/values-xlarge/styles.xml +++ b/core/res/res/values-xlarge/styles.xml @@ -30,9 +30,9 @@ </style> <style name="TextAppearance.StatusBar.EventContent"> <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textSize">16sp</item> </style> <style name="TextAppearance.StatusBar.EventContent.Title"> - <item name="android:textSize">18sp</item> <item name="android:textStyle">bold</item> </style> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 4fd5161..9dc64a4 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"恢复出厂设置时,将擦除手机上的数据而不发送警告"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"设置设备全局代理"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"请设置在启用政策的情况下要使用的设备全局代理。只有第一设备管理员才可设置有效的全局代理。"</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"住宅"</item> <item msgid="869923650527136615">"手机"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"单位寻呼机"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"助理"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"彩信"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"自定义"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"生日"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"周年纪念"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"活动"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"其他"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"自定义"</string> <string name="emailTypeHome" msgid="449227236140433919">"家用"</string> <string name="emailTypeWork" msgid="3548058059601149973">"单位"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"公司"</string> <string name="orgTypeOther" msgid="3951781131570124082">"其他"</string> <string name="orgTypeCustom" msgid="225523415372088322">"自定义"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"自定义"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"助理"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"兄弟"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"子女"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"同居伴侣"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"父亲"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"朋友"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"经理"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"母亲"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"父母"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"合作伙伴"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"介绍人"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"亲属"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"姐妹"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"配偶"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"自定义"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"住宅"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"单位"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"确认"</string> <string name="double_tap_toast" msgid="1068216937244567247">"提示:点按两次可放大和缩小。"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"自动填充此表单"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"剪切"</string> <string name="copy" msgid="2681946229533511987">"复制"</string> <string name="paste" msgid="5629880836805036433">"粘贴"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"剪贴板无内容"</string> <string name="copyUrl" msgid="2538211579596067402">"复制网址"</string> <string name="selectTextMode" msgid="6738556348861347240">"选择文字..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"文字选择"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"发送"</string> <string name="ime_action_next" msgid="3138843904009813834">"下一步"</string> <string name="ime_action_done" msgid="8971516117910934605">"完成"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"上一页"</string> <string name="ime_action_default" msgid="2840921885558045721">"执行"</string> <string name="dial_number_using" msgid="5789176425167573586">"拨打电话"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="4947405226788104538">"创建电话号码为"\n"<xliff:g id="NUMBER">%s</xliff:g> 的联系人"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 6d5c4d4..37f9d58 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -482,6 +482,10 @@ <string name="policydesc_wipeData" product="default" msgid="7669895333814222586">"執行重設為原廠設定時,系統會直接清除手機資料而不提出警告"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"設定裝置全域 Proxy"</string> <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"設定政策啟用時所要使用的裝置全域 Proxy,只有第一個裝置管理員所設定的全域 Proxy 具有效力。"</string> + <!-- no translation found for policylab_expirePassword (2314569545488269564) --> + <skip /> + <!-- no translation found for policydesc_expirePassword (7276906351852798814) --> + <skip /> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"住家電話"</item> <item msgid="869923650527136615">"行動電話"</item> @@ -546,11 +550,10 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"公司呼叫器"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"助理"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <!-- no translation found for eventTypeCustom (7837586198458073404) --> - <skip /> + <string name="eventTypeCustom" msgid="7837586198458073404">"自訂"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"生日"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"週年紀念日"</string> - <!-- outdated translation 5834288791948564594 --> <string name="eventTypeOther" msgid="7388178939010143077">"活動"</string> + <string name="eventTypeOther" msgid="7388178939010143077">"其他"</string> <string name="emailTypeCustom" msgid="8525960257804213846">"自訂"</string> <string name="emailTypeHome" msgid="449227236140433919">"住家"</string> <string name="emailTypeWork" msgid="3548058059601149973">"公司"</string> @@ -577,36 +580,21 @@ <string name="orgTypeWork" msgid="29268870505363872">"公司"</string> <string name="orgTypeOther" msgid="3951781131570124082">"其他"</string> <string name="orgTypeCustom" msgid="225523415372088322">"自訂"</string> - <!-- no translation found for relationTypeCustom (3542403679827297300) --> - <skip /> - <!-- no translation found for relationTypeAssistant (6274334825195379076) --> - <skip /> - <!-- no translation found for relationTypeBrother (8757913506784067713) --> - <skip /> - <!-- no translation found for relationTypeChild (1890746277276881626) --> - <skip /> - <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) --> - <skip /> - <!-- no translation found for relationTypeFather (5228034687082050725) --> - <skip /> - <!-- no translation found for relationTypeFriend (7313106762483391262) --> - <skip /> - <!-- no translation found for relationTypeManager (6365677861610137895) --> - <skip /> - <!-- no translation found for relationTypeMother (4578571352962758304) --> - <skip /> - <!-- no translation found for relationTypeParent (4755635567562925226) --> - <skip /> - <!-- no translation found for relationTypePartner (7266490285120262781) --> - <skip /> - <!-- no translation found for relationTypeReferredBy (101573059844135524) --> - <skip /> - <!-- no translation found for relationTypeRelative (1799819930085610271) --> - <skip /> - <!-- no translation found for relationTypeSister (1735983554479076481) --> - <skip /> - <!-- no translation found for relationTypeSpouse (394136939428698117) --> - <skip /> + <string name="relationTypeCustom" msgid="3542403679827297300">"自訂"</string> + <string name="relationTypeAssistant" msgid="6274334825195379076">"助理"</string> + <string name="relationTypeBrother" msgid="8757913506784067713">"兄弟"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"子女"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"同居人"</string> + <string name="relationTypeFather" msgid="5228034687082050725">"父親"</string> + <string name="relationTypeFriend" msgid="7313106762483391262">"好友"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"經理"</string> + <string name="relationTypeMother" msgid="4578571352962758304">"母親"</string> + <string name="relationTypeParent" msgid="4755635567562925226">"父母"</string> + <string name="relationTypePartner" msgid="7266490285120262781">"夥伴"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"介紹人"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"親戚"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"姊妹"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"配偶"</string> <string name="sipAddressTypeCustom" msgid="2473580593111590945">"自訂"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"住家"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"公司"</string> @@ -674,8 +662,7 @@ <string name="save_password_label" msgid="6860261758665825069">"確認"</string> <string name="double_tap_toast" msgid="1068216937244567247">"提示:輕按兩下可放大縮小。"</string> <!-- outdated translation 8940110866775097494 --> <string name="autofill_this_form" msgid="1272247532604569872">"自動填寫此表單"</string> - <!-- no translation found for autofill_address_name_separator (2504700673286691795) --> - <skip /> + <string name="autofill_address_name_separator" msgid="2504700673286691795">" "</string> <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) --> <skip /> <!-- no translation found for autofill_address_summary_separator (7483307893170324129) --> @@ -804,8 +791,7 @@ <string name="cut" msgid="3092569408438626261">"剪下"</string> <string name="copy" msgid="2681946229533511987">"複製"</string> <string name="paste" msgid="5629880836805036433">"貼上"</string> - <!-- no translation found for pasteDisabled (7259254654641456570) --> - <skip /> + <string name="pasteDisabled" msgid="7259254654641456570">"沒有可貼上的內容"</string> <string name="copyUrl" msgid="2538211579596067402">"複製網址"</string> <string name="selectTextMode" msgid="6738556348861347240">"選取文字..."</string> <string name="textSelectionCABTitle" msgid="5236850394370820357">"選取文字"</string> @@ -951,8 +937,7 @@ <string name="ime_action_send" msgid="2316166556349314424">"傳送"</string> <string name="ime_action_next" msgid="3138843904009813834">"下一頁"</string> <string name="ime_action_done" msgid="8971516117910934605">"完成"</string> - <!-- no translation found for ime_action_previous (1443550039250105948) --> - <skip /> + <string name="ime_action_previous" msgid="1443550039250105948">"上一步"</string> <string name="ime_action_default" msgid="2840921885558045721">"執行"</string> <string name="dial_number_using" msgid="5789176425167573586">"使用 <xliff:g id="NUMBER">%s</xliff:g>"\n"撥號"</string> <string name="create_contact_using" msgid="4947405226788104538">"建立手機號碼為 <xliff:g id="NUMBER">%s</xliff:g>"\n"的聯絡人"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 0b61202..9d54a80 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -49,7 +49,6 @@ window is floating. --> <attr name="backgroundDimEnabled" format="boolean" /> - <!-- =========== --> <!-- Text styles --> <!-- =========== --> @@ -142,6 +141,8 @@ <attr name="editTextColor" format="reference|color" /> <!-- EditText background drawable. --> <attr name="editTextBackground" format="reference" /> + <!-- EditText background drawable for multiline EditText. --> + <attr name="editTextMultilineBackground" format="reference" /> <!-- A styled string, specifying the style to be used for showing inline candidate text when composing with an input method. The @@ -2508,7 +2509,8 @@ <attr name="textLineHeight" /> <!-- Indicates that a non-editable text can be selected. --> <attr name="textIsSelectable" /> - + <!-- A specific background drawable used by multi-line EditText only. --> + <attr name="multilineBackground" format="reference"/> </declare-styleable> <!-- An <code>input-extras</code> is a container for extra data to supply to an input method. Contains @@ -2937,6 +2939,14 @@ <attr name="bottom" format="dimension" /> </declare-styleable> + <declare-styleable name="LayerDrawable"> + <attr name="opacity"> + <enum name="opaque" value="-1" /> + <enum name="transparent" value="-2" /> + <enum name="translucent" value="-3" /> + </attr> + </declare-styleable> + <declare-styleable name="LayerDrawableItem"> <attr name="left" /> <attr name="top" /> @@ -3851,6 +3861,8 @@ <!-- Base attributes available to Preference. --> <declare-styleable name="Preference"> + <!-- The optional icon for the preference --> + <attr name="icon" /> <!-- The key to store the Preference value. --> <attr name="key" format="string" /> <!-- The title for the Preference in a PreferenceActivity screen. --> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index ad4e7a2..aa33aa3 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1377,6 +1377,7 @@ <public type="attr" name="animationResolution" /> <public type="attr" name="state_accelerated" /> <public type="attr" name="baseline" /> + <public type="attr" name="opacity" /> <public type="anim" name="animator_fade_in" /> <public type="anim" name="animator_fade_out" /> @@ -1447,4 +1448,7 @@ <public type="style" name="Theme.Holo.Light.DialogWhenLarge" /> <public type="string" name="selectTextMode" /> + + <public type="style" name="Theme.Holo.Wallpaper" /> + <public type="style" name="Theme.Holo.Wallpaper.NoTitleBar" /> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 64cd00a..c8a5de8 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1806,7 +1806,7 @@ <!-- Do not translate. WebView User Agent string --> <string name="web_user_agent" translatable="false">Mozilla/5.0 (Linux; U; <xliff:g id="x">Android %s</xliff:g>) - AppleWebKit/534.11 (KHTML, like Gecko) Version/4.0 <xliff:g id="mobile">%s</xliff:g>Safari/534.11</string> + AppleWebKit/534.12 (KHTML, like Gecko) Version/4.0 <xliff:g id="mobile">%s</xliff:g>Safari/534.12</string> <!-- Do not translate. WebView User Agent targeted content --> <string name="web_user_agent_target_content" translatable="false">"Mobile "</string> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index b2db9b4..dc67f45 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -422,6 +422,7 @@ <item name="android:focusableInTouchMode">true</item> <item name="android:clickable">true</item> <item name="android:background">?android:attr/editTextBackground</item> + <item name="android:multilineBackground">?android:attr/editTextMultilineBackground</item> <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item> <item name="android:textColor">?android:attr/editTextColor</item> <item name="android:gravity">center_vertical</item> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 88e755f..a409c24 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -72,6 +72,7 @@ <item name="editTextColor">?android:attr/textColorPrimaryInverse</item> <item name="editTextBackground">@android:drawable/edit_text</item> + <item name="editTextMultilineBackground">@android:drawable/edit_text</item> <item name="candidatesTextStyleSpans">@android:string/candidates_style</item> @@ -366,7 +367,7 @@ </style> <!-- Default theme for windows that want to have the user's selected - wallpaper appear behind them. --> + wallpaper appear behind them. --> <style name="Theme.Wallpaper"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:colorBackgroundCacheHint">@null</item> @@ -685,6 +686,7 @@ <item name="editTextColor">?android:attr/textColorPrimary</item> <item name="editTextBackground">@android:drawable/edit_text_holo_dark</item> + <item name="editTextMultilineBackground">@android:drawable/edit_text_multiline_holo_dark</item> <item name="candidatesTextStyleSpans">@android:string/candidates_style</item> @@ -917,10 +919,11 @@ <item name="textAppearanceSearchResultSubtitle">@android:style/TextAppearance.Holo.Light.SearchResult.Subtitle</item> <item name="textAppearanceButton">@android:style/TextAppearance.Holo.Light.Widget.Button</item> - + <item name="editTextColor">?android:attr/textColorPrimary</item> <item name="editTextBackground">@android:drawable/edit_text_holo_light</item> - + <item name="editTextMultilineBackground">@android:drawable/edit_text_multiline_holo_light</item> + <item name="candidatesTextStyleSpans">@android:string/candidates_style</item> <item name="textCheckMark">@android:drawable/indicator_check_mark_light</item> @@ -1235,4 +1238,17 @@ <item name="windowContentOverlay">@null</item> </style> + <!-- Default holographic (dark) for windows that want to have the user's selected + wallpaper appear behind them. --> + <style name="Theme.Holo.Wallpaper"> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:colorBackgroundCacheHint">@null</item> + <item name="android:windowShowWallpaper">true</item> + </style> + + <!-- Variant of the holographic (dark) theme with no title bar --> + <style name="Theme.Holo.Wallpaper.NoTitleBar"> + <item name="android:windowNoTitle">true</item> + </style> + </resources> diff --git a/core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java b/core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java index f019599..43cf06a 100644 --- a/core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java +++ b/core/tests/coretests/src/android/bluetooth/BluetoothStressTest.java @@ -110,6 +110,21 @@ public class BluetoothStressTest extends InstrumentationTestCase { mTestUtils.disable(adapter); } + public void testAcceptPair() { + int iterations = BluetoothTestRunner.sPairIterations; + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + BluetoothDevice device = adapter.getRemoteDevice(BluetoothTestRunner.sPairAddress); + mTestUtils.enable(adapter); + + for (int i = 0; i < iterations; i++) { + mTestUtils.writeOutput("acceptPair iteration " + (i + 1) + " of " + iterations); + mTestUtils.acceptPair(adapter, device, BluetoothTestRunner.sPairPasskey, + BluetoothTestRunner.sPairPin); + mTestUtils.unpair(adapter, device); + } + mTestUtils.disable(adapter); + } + public void testConnectA2dp() { int iterations = BluetoothTestRunner.sConnectA2dpIterations; if (iterations == 0) { diff --git a/core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java b/core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java index 328891c..29dee34 100644 --- a/core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java +++ b/core/tests/coretests/src/android/bluetooth/BluetoothTestUtils.java @@ -137,7 +137,6 @@ public class BluetoothTestUtils extends Assert { @Override public void onReceive(Context context, Intent intent) { - Log.i("BT", intent.toString()); if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(intent.getAction())) { setFiredFlag(DISCOVERY_STARTED_FLAG); } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction())) { @@ -203,7 +202,7 @@ public class BluetoothTestUtils extends Assert { if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(intent.getAction())) { int varient = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, -1); assertNotSame(-1, varient); - switch(varient) { + switch (varient) { case BluetoothDevice.PAIRING_VARIANT_PIN: mDevice.setPin(mPin); break; @@ -252,7 +251,7 @@ public class BluetoothTestUtils extends Assert { mDevice = device; mProfile = profile; - switch(mProfile) { + switch (mProfile) { case BluetoothProfile.A2DP: mConnectionAction = BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED; break; @@ -384,11 +383,14 @@ public class BluetoothTestUtils extends Assert { mask = 0; // Don't check for received intents since we might have missed them. break; case BluetoothAdapter.STATE_OFF: - case BluetoothAdapter.STATE_TURNING_OFF: assertFalse(adapter.isEnabled()); start = System.currentTimeMillis(); assertTrue(adapter.enable()); break; + case BluetoothAdapter.STATE_TURNING_OFF: + start = System.currentTimeMillis(); + assertTrue(adapter.enable()); + break; default: removeReceiver(receiver); fail(String.format("enable() invalid state: state=%d", state)); @@ -410,7 +412,6 @@ public class BluetoothTestUtils extends Assert { return; } } else { - assertFalse(adapter.isEnabled()); assertEquals(BluetoothAdapter.STATE_TURNING_ON, state); } sleep(POLL_TIME); @@ -437,7 +438,6 @@ public class BluetoothTestUtils extends Assert { case BluetoothAdapter.STATE_TURNING_ON: assertFalse(adapter.isEnabled()); start = System.currentTimeMillis(); - assertTrue(adapter.disable()); break; case BluetoothAdapter.STATE_ON: assertTrue(adapter.isEnabled()); @@ -470,7 +470,6 @@ public class BluetoothTestUtils extends Assert { return; } } else { - assertFalse(adapter.isEnabled()); assertEquals(BluetoothAdapter.STATE_TURNING_OFF, state); } sleep(POLL_TIME); @@ -629,11 +628,22 @@ public class BluetoothTestUtils extends Assert { } public void pair(BluetoothAdapter adapter, BluetoothDevice device, int passkey, byte[] pin) { + pairOrAcceptPair(adapter, device, passkey, pin, true); + } + + public void acceptPair(BluetoothAdapter adapter, BluetoothDevice device, int passkey, + byte[] pin) { + pairOrAcceptPair(adapter, device, passkey, pin, false); + } + + private void pairOrAcceptPair(BluetoothAdapter adapter, BluetoothDevice device, int passkey, + byte[] pin, boolean pair) { int mask = PairReceiver.STATE_BONDING_FLAG | PairReceiver.STATE_BONDED_FLAG; long start = -1; + String methodName = pair ? "pair()" : "acceptPair()"; if (!adapter.isEnabled()) { - fail("pair() bluetooth not enabled"); + fail(methodName + " bluetooth not enabled"); } PairReceiver receiver = getPairReceiver(device, passkey, pin, mask); @@ -643,7 +653,9 @@ public class BluetoothTestUtils extends Assert { case BluetoothDevice.BOND_NONE: assertFalse(adapter.getBondedDevices().contains(device)); start = System.currentTimeMillis(); - assertTrue(device.createBond()); + if (pair) { + assertTrue(device.createBond()); + } break; case BluetoothDevice.BOND_BONDING: mask = 0; // Don't check for received intents since we might have missed them. @@ -653,7 +665,8 @@ public class BluetoothTestUtils extends Assert { return; default: removeReceiver(receiver); - fail(String.format("pair() invalid state: device=%s, state=%d", device, state)); + fail(String.format("%s invalid state: device=%s, state=%d", methodName, device, + state)); } long s = System.currentTimeMillis(); @@ -664,10 +677,10 @@ public class BluetoothTestUtils extends Assert { if ((receiver.getFiredFlags() & mask) == mask) { long finish = receiver.getCompletedTime(); if (start != -1 && finish != -1) { - writeOutput(String.format("pair() completed in %d ms: device=%s", + writeOutput(String.format("%s completed in %d ms: device=%s", methodName, (finish - start), device)); } else { - writeOutput(String.format("pair() completed: device=%s", device)); + writeOutput(String.format("%s completed: device=%s", methodName, device)); } removeReceiver(receiver); return; @@ -678,9 +691,9 @@ public class BluetoothTestUtils extends Assert { int firedFlags = receiver.getFiredFlags(); removeReceiver(receiver); - fail(String.format("pair() timeout: device=%s, state=%d (expected %d), " - + "flags=0x%x (expected 0x%x)", device, state, BluetoothDevice.BOND_BONDED, - firedFlags, mask)); + fail(String.format("%s timeout: device=%s, state=%d (expected %d), " + + "flags=0x%x (expected 0x%x)", methodName, device, state, + BluetoothDevice.BOND_BONDED, firedFlags, mask)); } public void unpair(BluetoothAdapter adapter, BluetoothDevice device) { @@ -788,7 +801,7 @@ public class BluetoothTestUtils extends Assert { long finish = receiver.getCompletedTime(); if (start != -1 && finish != -1) { writeOutput(String.format("connectProfile() completed in %d ms: " - +"device=%s, profile=%d", (finish - start), device, profile)); + + "device=%s, profile=%d", (finish - start), device, profile)); } else { writeOutput(String.format("connectProfile() completed: device=%s, " + "profile=%d", device, profile)); @@ -857,7 +870,7 @@ public class BluetoothTestUtils extends Assert { long finish = receiver.getCompletedTime(); if (start != -1 && finish != -1) { writeOutput(String.format("disconnectProfile() completed in %d ms: " - +"device=%s, profile=%d", (finish - start), device, profile)); + + "device=%s, profile=%d", (finish - start), device, profile)); } else { writeOutput(String.format("disconnectProfile() completed: device=%s, " + "profile=%d", device, profile)); @@ -934,14 +947,12 @@ public class BluetoothTestUtils extends Assert { long s = System.currentTimeMillis(); switch (profile) { case BluetoothProfile.A2DP: - while (mA2dp != null - && System.currentTimeMillis() - s < CONNECT_PROXY_TIMEOUT) { + while (mA2dp != null && System.currentTimeMillis() - s < CONNECT_PROXY_TIMEOUT) { sleep(POLL_TIME); } return mA2dp; case BluetoothProfile.HEADSET: - while (mHeadset != null - && System.currentTimeMillis() - s < CONNECT_PROXY_TIMEOUT) { + while (mHeadset != null && System.currentTimeMillis() - s < CONNECT_PROXY_TIMEOUT) { sleep(POLL_TIME); } return mHeadset; diff --git a/docs/html/guide/topics/manifest/manifest-element.jd b/docs/html/guide/topics/manifest/manifest-element.jd index a35c5a1..7f21e6b 100644 --- a/docs/html/guide/topics/manifest/manifest-element.jd +++ b/docs/html/guide/topics/manifest/manifest-element.jd @@ -159,6 +159,9 @@ multiple SD cards can be used with the same device.</li> storage. However, the system will not allow the user to move the application to external storage if this attribute is set to {@code internalOnly}, which is the default setting.</p> +<p>Read <a href="{@docRoot}guide/appendix/install-location.html">App Install Location</a> for +more information about using this attribute (including how to maintain backward compatibility).</p> + <p>Introduced in: API Level 8.</p> @@ -173,7 +176,7 @@ this attribute is set to {@code internalOnly}, which is the default setting.</p> <p> <dt>see also:</dt> -<dd><a href="{@docRoot}guide/appendix/install-location.html">App Install Location</a><br/> +<dd> <code><a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code></dd> </dl> diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd index 45f4a66..b5b30f6 100644 --- a/docs/html/guide/topics/manifest/uses-feature-element.jd +++ b/docs/html/guide/topics/manifest/uses-feature-element.jd @@ -472,11 +472,11 @@ If you are developing in Eclipse with ADT, right-click the project and select Package</strong>. Select a destination filename and path and click <strong>OK</strong>. </li> <li>Next, locate the <code>aapt</code> tool, if it is not already in your PATH. -If you are using SDK Tools r7 or earlier, you can find <code>aapt</code> in the -<code><<em>SDK</em>>/platforms/android-<<em>platform</em>>/tools/</code> directory. +If you are using SDK Tools r8 or higher, you can find <code>aapt</code> in the +<code><<em>SDK</em>>/platform-tools/</code> directory. <p class="note"><strong>Note:</strong> You must use the version of -<code>aapt</code> that is provided for the latest platform release available. If -you do not have the latest platform release, download it using the <a +<code>aapt</code> that is provided for the latest Platform-Tools component available. If +you do not have the latest Platform-Tools component, download it using the <a href="{@docRoot}sdk/adding-components.html">Android SDK and AVD Manager</a>. </p></li> <li>Run <code>aapt</code> using this syntax: </li> @@ -522,6 +522,14 @@ in a separate <code><uses-feature></code> element. </p> <th>Comments</th> </tr> <tr> + <td>Audio</td> + <td><code>android.hardware.audio.low_latency</td> + <td>The application uses a low-latency audio pipeline on the device and +is sensitive to delays or lag in sound input or output.</td> +<td> +</td> + </tr> + <tr> <td>Bluetooth</td> <td><code>android.hardware.bluetooth</td> <td>The application uses Bluetooth radio features in the device.</td> @@ -529,7 +537,7 @@ in a separate <code><uses-feature></code> element. </p> </td> </tr> <tr> - <td rowspan="3">Camera</td> + <td rowspan="4">Camera</td> <td><code>android.hardware.camera</code></td> <td>The application uses the device's camera. If the device supports multiple cameras, the application uses the camera that facing @@ -539,7 +547,7 @@ in a separate <code><uses-feature></code> element. </p> <tr> <td><code>android.hardware.camera.autofocus</code></td> <td>Subfeature. The application uses the device camera's autofocus capability.</td> - <td rowspan="2">If declared with the <code>"android:required="true"</code> + <td rowspan="3">If declared with the <code>"android:required="true"</code> attribute, these subfeatures implicitly declare the <code>android.hardware.camera</code> parent feature. </td> </tr> @@ -547,6 +555,10 @@ attribute, these subfeatures implicitly declare the <td><code>android.hardware.camera.flash</code></td> <td>Subfeature. The application uses the device camera's flash.</td> </tr> +<tr> + <td><code>android.hardware.camera.front</code></td> + <td>Subfeature. The application uses a front-facing camera on the device.</td> +</tr> <tr> <td rowspan="3">Location</td> @@ -568,21 +580,43 @@ attribute, these subfeatures implicitly declare the <td>Subfeature. The application uses precise location coordinates obtained from a Global Positioning System receiver on the device. </td> </tr> - <tr> - <td rowspan="4">Sensors</td> + <td>Microphone</td> + <td><code>android.hardware.microphone</code></td> + <td>The application uses a microphone on the device. + </td> + <td></td> +</tr> +<tr> + <td>Near Field Communications</td> + <td><code>android.hardware.nfc</td> + <td>The application uses NFC radio features in the device.</td> + <td></td> +</tr> +<tr> + <td rowspan="6">Sensors</td> <td><code>android.hardware.sensor.accelerometer</code></td> <td>The application uses motion readings from an accelerometer on the device.</td> <td></td> </tr> <tr> + <td><code>android.hardware.sensor.barometer</code></td> + <td>The application uses the device's barometer.</td> + <td></td> +</tr> +<tr> <td><code>android.hardware.sensor.compass</code></td> <td>The application uses directional readings from a magnetometer (compass) on the device.</td> <td></td> </tr> <tr> + <td><code>android.hardware.sensor.gyroscope</code></td> + <td>The application uses the device's gyroscope sensor.</td> + <td></td> +</tr> +<tr> <td><code>android.hardware.sensor.light</code></td> <td>The application uses the device's light sensor.</td> <td></td> @@ -593,12 +627,20 @@ the device.</td> <td></td> </tr> <tr> - <td>Microphone</td> - <td><code>android.hardware.microphone</code></td> - <td>The application uses a microphone on the device. + <td rowspan="2">SIP/VOIP</td> + <td><code>android.hardware.sip</code></td> + <td>The application uses SIP service on the device. </td> <td></td> </tr> +<tr> + <td><code>android.hardware.sip.voip</code></td> + <td>Subfeature. The application uses SIP-based VOIP service on the device. + </td> + <td>If declared with the <code>"android:required="true"</code> attribute, this +subfeature implicitly declares the <code>android.hardware.sip</code> +parent feature.</td> +</tr> <tr> <td rowspan="3">Telephony</td> @@ -622,14 +664,14 @@ device.</td> </tr> <tr> - <td rowspan="3">Touchscreen</td> + <td rowspan="4">Touchscreen</td> <td><code>android.hardware.touchscreen</code></td> <td>The application uses touchscreen capabilities on the device.</td> <td></td> </tr> <tr> <td><code>android.hardware.touchscreen.multitouch</code></td> - <td>The application uses basic two-point multitouch capabilities on the device + <td>Subfeature. The application uses basic two-point multitouch capabilities on the device screen.</td> <td>If declared with the <code>"android:required="true"</code> attribute, this subfeature implicitly declares the <code>android.hardware.touchscreen</code> @@ -640,10 +682,16 @@ parent feature. </td> <td>Subfeature. The application uses advanced multipoint multitouch capabilities on the device screen, such as for tracking two or more points fully independently.</td> - <td>If declared with the <code>"android:required="true"</code> attribute, this + <td rowspan="2">If declared with the <code>"android:required="true"</code> attribute, this subfeature implicitly declares the <code>android.hardware.touchscreen.multitouch</code> parent feature. </td> </tr> +<tr> + <td><code>android.hardware.touchscreen.multitouch.jazzhand</code></td> + <td>Subfeature. The application uses advanced multipoint multitouch +capabilities on the device screen, for tracking up to five points fully +independently.</td> +</tr> <tr> <td>Wifi</td> diff --git a/docs/html/guide/topics/resources/menu-resource.jd b/docs/html/guide/topics/resources/menu-resource.jd index cde72bd..7bcd78a 100644 --- a/docs/html/guide/topics/resources/menu-resource.jd +++ b/docs/html/guide/topics/resources/menu-resource.jd @@ -36,22 +36,23 @@ In XML: <code>@[<em>package</em>:]menu.<em>filename</em></code> <?xml version="1.0" encoding="utf-8"?> <<a href="#menu-element">menu</a> xmlns:android="http://schemas.android.com/apk/res/android"> <<a href="#item-element">item</a> android:id="@[+][<em>package</em>:]id/<em>resource_name</em>" - android:menuCategory=["container" | "system" | "secondary" | "alternative"] - android:orderInCategory="<em>integer</em>" android:title="<em>string</em>" android:titleCondensed="<em>string</em>" android:icon="@[package:]drawable/<em>drawable_resource_name</em>" + android:showAsAction=["ifRoom" | "never" | "withText" | "always"] android:alphabeticShortcut="<em>string</em>" android:numericShortcut="<em>string</em>" android:checkable=["true" | "false"] android:visible=["visible" | "invisible" | "gone"] - android:enabled=["enabled" | "disabled"] /> + android:enabled=["enabled" | "disabled"] + android:menuCategory=["container" | "system" | "secondary" | "alternative"] + android:orderInCategory="<em>integer</em>" /> <<a href="#group-element">group</a> android:id="@[+][<em>package</em>:]id/<em>resource name</em>" - android:menuCategory=["container" | "system" | "secondary" | "alternative"] - android:orderInCategory="<em>integer</em>" android:checkableBehavior=["none" | "all" | "single"] android:visible=["visible" | "invisible" | "gone"] - android:enabled=["enabled" | "disabled"] > + android:enabled=["enabled" | "disabled"] + android:menuCategory=["container" | "system" | "secondary" | "alternative"] + android:orderInCategory="<em>integer</em>" > <<a href="#item-element">item</a> /> </group> <<a href="#item-element">item</a> > @@ -77,91 +78,120 @@ In XML: <code>@[<em>package</em>:]menu.<em>filename</em></code> <code>"http://schemas.android.com/apk/res/android"</code>. </dl> </dd> - <dt id="group-element"><code><group></code></dt> - <dd>A menu group (to create a collection of items that share traits, such as whether they are -visible, enabled, or checkable). Contains one or more <code><item></code> elements. Must be a -child of a <code><menu></code> element. + + <dt id="item-element"><code><item></code></dt> + <dd>A menu item. May contain a <code><menu></code> element (for a Sub + Menu). Must be a child of a <code><menu></code> or <code><group></code> element. <p class="caps">attributes:</p> <dl class="atn-list"> <dt><code>android:id</code></dt> <dd><em>Resource ID</em>. A unique resource ID. To create a new resource ID for this item, use the form: -<code>"@+id/<em>name</em>"</code>. The plus symbol indicates that this should be created as a new ID.</dd> +<code>"@+id/<em>name</em>"</code>. The plus symbol indicates that this should be created as a new +ID.</dd> + <dt><code>android:title</code></dt> + <dd><em>String</em>. The menu title.</dd> + <dt><code>android:titleCondensed</code></dt> + <dd><em>String</em>. A condensed title, for situations in which the normal title is +too long.</dd> + <dt><code>android:icon</code></dt> + <dd><em>Drawable resource</em>. An image to be used as the menu item icon.</dd> + + <dt><code>android:showAsAction</code></dt> + <dd><em>Keyword</em>. When and how this item should appear as an action item in the Action +Bar. A menu item can appear as an action item only when the activity includes an {@link +android.app.ActionBar} (introduced in API Level HONEYCOMB). Valid values: + <table> + <tr><th>Value</th><th>Description</th></tr> + <tr><td><code>ifRoom</code></td><td>Only place this item in the Action Bar if +there is room for it.</td></tr> + <tr><td><code>withText</code></td><td>Also include the title text (defined +by {@code android:title}) with the action item. You can include this value along with one +of the others as a flag set, by separating them with a pipe {@code |}.</td></tr> + <tr><td><code>never</code></td><td>Never place this item in the Action Bar.</td></tr> + <tr><td><code>always</code></td><td>Always place this item in the Action Bar. +Avoid using this unless it's critical that the item always appear in the action +bar. Setting multiple items to always appear as action items can result in them overlapping +with other UI in the action bar.</td></tr> + </table> + <p>See <a href="{@docRoot}guide/topics/ui/actionbar.html">Using the Action Bar</a> for +more information.</p> + <p>Introduced in API Level HONEYCOMB.</p> + </dd> + + <dt><code>android:alphabeticShortcut</code></dt> + <dd><em>Char</em>. A character for the alphabetic shortcut key.</dd> + <dt><code>android:numericShortcut</code></dt> + <dd><em>Integer</em>. A number for the numeric shortcut key.</dd> + <dt><code>android:checkable</code></dt> + <dd><em>Boolean</em>. "true" if the item is checkable.</dd> + <dt><code>android:checked</code></dt> + <dd><em>Boolean</em>. "true" if the item is checked by default.</dd> + <dt><code>android:visible</code></dt> + <dd><em>Boolean</em>. "true" if the item is visible by default.</dd> + <dt><code>android:enabled</code></dt> + <dd><em>Boolean</em>. "true" if the item is enabled by default.</dd> <dt><code>android:menuCategory</code></dt> <dd><em>Keyword</em>. Value corresponding to {@link android.view.Menu} {@code CATEGORY_*} - constants, which define the group's priority. Valid values: + constants, which define the item's priority. Valid values: <table> <tr><th>Value</th><th>Description</th></tr> - <tr><td><code>container</code></td><td>For groups that are part of a + <tr><td><code>container</code></td><td>For items that are part of a container.</td></tr> - <tr><td><code>system</code></td><td>For groups that are provided by the + <tr><td><code>system</code></td><td>For items that are provided by the system.</td></tr> - <tr><td><code>secondary</code></td><td>For groups that are user-supplied secondary + <tr><td><code>secondary</code></td><td>For items that are user-supplied secondary (infrequently used) options.</td></tr> - <tr><td><code>alternative</code></td><td>For groups that are alternative actions + <tr><td><code>alternative</code></td><td>For items that are alternative actions on the data that is currently displayed.</td></tr> </table> </dd> <dt><code>android:orderInCategory</code></dt> - <dd><em>Integer</em>. The default order of the items within the category.</dd> + <dd><em>Integer</em>. The order of "importance" of the item, within a group.</dd> + </dl> + </dd> + + <dt id="group-element"><code><group></code></dt> + <dd>A menu group (to create a collection of items that share traits, such as whether they are +visible, enabled, or checkable). Contains one or more <code><item></code> elements. Must be a +child of a <code><menu></code> element. + <p class="caps">attributes:</p> + <dl class="atn-list"> + <dt><code>android:id</code></dt> + <dd><em>Resource ID</em>. A unique resource ID. To create a new resource ID for this item, +use the form: +<code>"@+id/<em>name</em>"</code>. The plus symbol indicates that this should be created as a new +ID.</dd> <dt><code>android:checkableBehavior</code></dt> <dd><em>Keyword</em>. The type of checkable behavior for the group. Valid values: <table> <tr><th>Value</th><th>Description</th></tr> <tr><td><code>none</code></td><td>Not checkable</td></tr> <tr><td><code>all</code></td><td>All items can be checked (use checkboxes)</td></tr> - <tr><td><code>single</code></td><td>Only one item can be checked (use radio buttons)</td></tr> + <tr><td><code>single</code></td><td>Only one item can be checked (use radio +buttons)</td></tr> </table> </dd> <dt><code>android:visible</code></dt> <dd><em>Boolean</em>. "true" if the group is visible.</dd> <dt><code>android:enabled</code></dt> <dd><em>Boolean</em>. "true" if the group is enabled.</dd> - </dl> - </dd> - <dt id="item-element"><code><item></code></dt> - <dd>A menu item. May contain a <code><menu></code> element (for a Sub - Menu). Must be a child of a <code><menu></code> or <code><group></code> element. - <p class="caps">attributes:</p> - <dl class="atn-list"> - <dt><code>android:id</code></dt> - <dd><em>Resource ID</em>. A unique resource ID. To create a new resource ID for this item, use the form: -<code>"@+id/<em>name</em>"</code>. The plus symbol indicates that this should be created as a new ID.</dd> <dt><code>android:menuCategory</code></dt> <dd><em>Keyword</em>. Value corresponding to {@link android.view.Menu} {@code CATEGORY_*} - constants, which define the item's priority. Valid values: + constants, which define the group's priority. Valid values: <table> <tr><th>Value</th><th>Description</th></tr> - <tr><td><code>container</code></td><td>For items that are part of a + <tr><td><code>container</code></td><td>For groups that are part of a container.</td></tr> - <tr><td><code>system</code></td><td>For items that are provided by the + <tr><td><code>system</code></td><td>For groups that are provided by the system.</td></tr> - <tr><td><code>secondary</code></td><td>For items that are user-supplied secondary + <tr><td><code>secondary</code></td><td>For groups that are user-supplied secondary (infrequently used) options.</td></tr> - <tr><td><code>alternative</code></td><td>For items that are alternative actions + <tr><td><code>alternative</code></td><td>For groups that are alternative actions on the data that is currently displayed.</td></tr> </table> </dd> <dt><code>android:orderInCategory</code></dt> - <dd><em>Integer</em>. The order of "importance" of the item, within a group.</dd> - <dt><code>android:title</code></dt> - <dd><em>String</em>. The menu title.</dd> - <dt><code>android:titleCondensed</code></dt> - <dd><em>String</em>. A condensed title, for situations in which the normal title is -too long.</dd> - <dt><code>android:icon</code></dt> - <dd><em>Drawable resource</em>. An image to be used as the menu item icon.</dd> - <dt><code>android:alphabeticShortcut</code></dt> - <dd><em>Char</em>. A character for the alphabetic shortcut key.</dd> - <dt><code>android:numericShortcut</code></dt> - <dd><em>Integer</em>. A number for the numeric shortcut key.</dd> - <dt><code>android:checkable</code></dt> - <dd><em>Boolean</em>. "true" if the item is checkable.</dd> - <dt><code>android:checked</code></dt> - <dd><em>Boolean</em>. "true" if the item is checked by default.</dd> - <dt><code>android:visible</code></dt> - <dd><em>Boolean</em>. "true" if the item is visible by default.</dd> - <dt><code>android:enabled</code></dt> - <dd><em>Boolean</em>. "true" if the item is enabled by default.</dd> + <dd><em>Integer</em>. The default order of the items within the category.</dd> </dl> </dd> </dl> @@ -174,7 +204,8 @@ too long.</dd> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item1" android:title="@string/item1" - android:icon="@drawable/group_item1_icon" /> + android:icon="@drawable/group_item1_icon" + android:showAsAction="ifRoom|withText"/> <group android:id="@+id/group"> <item android:id="@+id/group_item1" android:title="@string/group_item1" @@ -184,7 +215,8 @@ too long.</dd> android:icon="@drawable/group_item2_icon" /> </group> <item android:id="@+id/submenu" - android:title="@string/submenu_title" > + android:title="@string/submenu_title" + android:showAsAction="ifRoom|withText" > <menu> <item android:id="@+id/submenu_item1" android:title="@string/submenu_item1" /> @@ -201,6 +233,8 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; } </pre> +<p class="note"><strong>Note:</strong> The {@code android:showAsAction} attribute is +available only on Android X.X (API Level HONEYCOMB) and greater.</p> </dd> <!-- end example --> diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index b6cce7e..09c041f 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -26,6 +26,7 @@ import android.graphics.ColorFilter; import android.graphics.PixelFormat; import android.graphics.Rect; import android.util.AttributeSet; +import android.util.Slog; import android.view.View; import java.io.IOException; @@ -49,6 +50,7 @@ import java.io.IOException; public class LayerDrawable extends Drawable implements Drawable.Callback { LayerState mLayerState; + private int mOpacityOverride = PixelFormat.UNKNOWN; private int[] mPaddingL; private int[] mPaddingT; private int[] mPaddingR; @@ -113,6 +115,13 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { int type; + TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.LayerDrawable); + + mOpacityOverride = a.getInt(com.android.internal.R.styleable.LayerDrawable_opacity, + PixelFormat.UNKNOWN); + + a.recycle(); + final int innerDepth = parser.getDepth() + 1; int depth; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT @@ -125,7 +134,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { continue; } - TypedArray a = r.obtainAttributes(attrs, + a = r.obtainAttributes(attrs, com.android.internal.R.styleable.LayerDrawableItem); int left = a.getDimensionPixelOffset( @@ -391,9 +400,28 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { array[i].mDrawable.setColorFilter(cf); } } + + /** + * Sets the opacity of this drawable directly, instead of collecting the states from + * the layers + * + * @param opacity The opacity to use, or {@link PixelFormat#UNKNOWN PixelFormat.UNKNOWN} + * for the default behavior + * + * @see PixelFormat#UNKNOWN + * @see PixelFormat#TRANSLUCENT + * @see PixelFormat#TRANSPARENT + * @see PixelFormat#OPAQUE + */ + public void setOpacity(int opacity) { + mOpacityOverride = opacity; + } @Override public int getOpacity() { + if (mOpacityOverride != PixelFormat.UNKNOWN) { + return mOpacityOverride; + } return mLayerState.getOpacity(); } diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java index 9dc291b..0de53f2 100644 --- a/graphics/java/android/renderscript/Allocation.java +++ b/graphics/java/android/renderscript/Allocation.java @@ -352,7 +352,7 @@ public class Allocation extends BaseObj { if (bc == Bitmap.Config.RGB_565) { return Element.RGB_565(rs); } - throw new RSInvalidStateException("Bad bitmap type."); + throw new RSInvalidStateException("Bad bitmap type: " + bc); } static private Type typeFromBitmap(RenderScript rs, Bitmap b) { diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index df03e13..dcf86e3 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -389,6 +389,10 @@ public class RenderScript { synchronized void nScriptSetVarV(int id, int slot, byte[] val) { rsnScriptSetVarV(mContext, id, slot, val); } + native void rsnScriptSetVarObj(int con, int id, int slot, int val); + synchronized void nScriptSetVarObj(int id, int slot, int val) { + rsnScriptSetVarObj(mContext, id, slot, val); + } native void rsnScriptCBegin(int con); synchronized void nScriptCBegin() { @@ -398,9 +402,9 @@ public class RenderScript { synchronized void nScriptCSetScript(byte[] script, int offset, int length) { rsnScriptCSetScript(mContext, script, offset, length); } - native int rsnScriptCCreate(int con); - synchronized int nScriptCCreate() { - return rsnScriptCCreate(mContext); + native int rsnScriptCCreate(int con, String val); + synchronized int nScriptCCreate(String val) { + return rsnScriptCCreate(mContext, val); } native void rsnSamplerBegin(int con); @@ -810,6 +814,3 @@ public class RenderScript { return 0; } } - - - diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java index 7d7dd6d..ea616c6 100644 --- a/graphics/java/android/renderscript/Script.java +++ b/graphics/java/android/renderscript/Script.java @@ -88,6 +88,10 @@ public class Script extends BaseObj { mRS.nScriptSetVarI(getID(), index, v ? 1 : 0); } + public void setVar(int index, BaseObj o) { + mRS.nScriptSetVarObj(getID(), index, (o == null) ? 0 : o.getID()); + } + public void setVar(int index, FieldPacker v) { mRS.nScriptSetVarV(getID(), index, v.getData()); } diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java index 44fc5fd..64ed75b 100644 --- a/graphics/java/android/renderscript/ScriptC.java +++ b/graphics/java/android/renderscript/ScriptC.java @@ -75,7 +75,7 @@ public class ScriptC extends Script { rs.nScriptCBegin(); rs.nScriptCSetScript(pgm, 0, pgmLength); - return rs.nScriptCCreate(); + Log.v(TAG, "Create script for resource = " + resources.getResourceName(resourceID)); + return rs.nScriptCCreate(resources.getResourceName(resourceID)); } } - diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index dd84848..1cc4386 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -829,6 +829,13 @@ nScriptSetVarI(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slo } static void +nScriptSetVarObj(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jint val) +{ + LOG_API("nScriptSetVarObj, con(%p), s(%p), slot(%i), val(%i)", con, (void *)script, slot, val); + rsScriptSetVarObj(con, (RsScript)script, slot, (RsObjectBase)val); +} + +static void nScriptSetVarJ(JNIEnv *_env, jobject _this, RsContext con, jint script, jint slot, jlong val) { LOG_API("nScriptSetVarJ, con(%p), s(%p), slot(%i), val(%lli)", con, (void *)script, slot, val); @@ -947,10 +954,11 @@ exit: } static jint -nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con) +nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring resName) { LOG_API("nScriptCCreate, con(%p)", con); - return (jint)rsScriptCCreate(con); + const char* resNameUTF = _env->GetStringUTFChars(resName, NULL); + return (jint)rsScriptCCreate(con, resNameUTF); } // --------------------------------------------------------------------------- @@ -1335,10 +1343,11 @@ static JNINativeMethod methods[] = { {"rsnScriptSetVarF", "(IIIF)V", (void*)nScriptSetVarF }, {"rsnScriptSetVarD", "(IIID)V", (void*)nScriptSetVarD }, {"rsnScriptSetVarV", "(III[B)V", (void*)nScriptSetVarV }, +{"rsnScriptSetVarObj", "(IIII)V", (void*)nScriptSetVarObj }, {"rsnScriptCBegin", "(I)V", (void*)nScriptCBegin }, {"rsnScriptCSetScript", "(I[BII)V", (void*)nScriptCSetScript }, -{"rsnScriptCCreate", "(I)I", (void*)nScriptCCreate }, +{"rsnScriptCCreate", "(ILjava/lang/String;)I", (void*)nScriptCCreate }, {"rsnProgramStoreBegin", "(III)V", (void*)nProgramStoreBegin }, {"rsnProgramStoreDepthFunc", "(II)V", (void*)nProgramStoreDepthFunc }, diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index cce2400..1e29d82 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -156,6 +156,7 @@ public: MODE_NORMAL = 0, MODE_RINGTONE, MODE_IN_CALL, + MODE_IN_COMMUNICATION, NUM_MODES // not a valid entry, denotes end-of-list }; diff --git a/include/media/EffectApi.h b/include/media/EffectApi.h index 16fb43c..b97c22e 100644 --- a/include/media/EffectApi.h +++ b/include/media/EffectApi.h @@ -602,9 +602,9 @@ enum audio_device_e { // Audio mode enum audio_mode_e { - AUDIO_MODE_NORMAL, // phone idle - AUDIO_MODE_RINGTONE, // phone ringing - AUDIO_MODE_IN_CALL // phone call connected + AUDIO_MODE_NORMAL, // device idle + AUDIO_MODE_RINGTONE, // device ringing + AUDIO_MODE_IN_CALL // audio call connected (VoIP or telephony) }; // Values for "accessMode" field of buffer_config_t: diff --git a/include/media/IMediaPlayer.h b/include/media/IMediaPlayer.h index 3d77278..bba7ed7 100644 --- a/include/media/IMediaPlayer.h +++ b/include/media/IMediaPlayer.h @@ -34,7 +34,6 @@ public: virtual void disconnect() = 0; - virtual status_t setVideoISurface(const sp<ISurface>& surface) = 0; virtual status_t setVideoSurface(const sp<Surface>& surface) = 0; virtual status_t prepareAsync() = 0; virtual status_t start() = 0; diff --git a/include/media/IOMX.h b/include/media/IOMX.h index fa775e7..cb36bbb 100644 --- a/include/media/IOMX.h +++ b/include/media/IOMX.h @@ -120,30 +120,6 @@ public: node_id node, const char *parameter_name, OMX_INDEXTYPE *index) = 0; - - virtual sp<IOMXRenderer> createRenderer( - const sp<ISurface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t encodedWidth, size_t encodedHeight, - size_t displayWidth, size_t displayHeight) = 0; - - // Note: These methods are _not_ virtual, it exists as a wrapper around - // the virtual "createRenderer" method above facilitating extraction - // of the ISurface from a regular Surface or a java Surface object. - sp<IOMXRenderer> createRenderer( - const sp<Surface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t encodedWidth, size_t encodedHeight, - size_t displayWidth, size_t displayHeight); - - sp<IOMXRenderer> createRendererFromJavaSurface( - JNIEnv *env, jobject javaSurface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t encodedWidth, size_t encodedHeight, - size_t displayWidth, size_t displayHeight); }; struct omx_message { @@ -190,13 +166,6 @@ public: virtual void onMessage(const omx_message &msg) = 0; }; -class IOMXRenderer : public IInterface { -public: - DECLARE_META_INTERFACE(OMXRenderer); - - virtual void render(IOMX::buffer_id buffer) = 0; -}; - //////////////////////////////////////////////////////////////////////////////// class BnOMX : public BnInterface<IOMX> { @@ -213,13 +182,6 @@ public: uint32_t flags = 0); }; -class BnOMXRenderer : public BnInterface<IOMXRenderer> { -public: - virtual status_t onTransact( - uint32_t code, const Parcel &data, Parcel *reply, - uint32_t flags = 0); -}; - } // namespace android #endif // ANDROID_IOMX_H_ diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index 2d55a55..672931e 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -106,7 +106,6 @@ public: const KeyedVector<String8, String8> *headers = NULL) = 0; virtual status_t setDataSource(int fd, int64_t offset, int64_t length) = 0; - virtual status_t setVideoISurface(const sp<ISurface>& surface) = 0; virtual status_t setVideoSurface(const sp<Surface>& surface) = 0; virtual status_t prepare() = 0; virtual status_t prepareAsync() = 0; diff --git a/include/media/stagefright/HardwareAPI.h b/include/media/stagefright/HardwareAPI.h index 4fd281b..17908b4 100644 --- a/include/media/stagefright/HardwareAPI.h +++ b/include/media/stagefright/HardwareAPI.h @@ -19,8 +19,6 @@ #define HARDWARE_API_H_ #include <media/stagefright/OMXPluginBase.h> -#include <media/stagefright/VideoRenderer.h> -#include <surfaceflinger/ISurface.h> #include <ui/android_native_buffer.h> #include <utils/RefBase.h> @@ -91,13 +89,6 @@ struct UseAndroidNativeBufferParams { } // namespace android -extern android::VideoRenderer *createRenderer( - const android::sp<android::ISurface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t displayWidth, size_t displayHeight, - size_t decodedWidth, size_t decodedHeight); - extern android::OMXPluginBase *createOMXPlugin(); #endif // HARDWARE_API_H_ diff --git a/include/media/stagefright/VideoRenderer.h b/include/media/stagefright/VideoRenderer.h deleted file mode 100644 index f80b277..0000000 --- a/include/media/stagefright/VideoRenderer.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2009 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. - */ - -#ifndef VIDEO_RENDERER_H_ - -#define VIDEO_RENDERER_H_ - -#include <sys/types.h> - -namespace android { - -class VideoRenderer { -public: - virtual ~VideoRenderer() {} - - virtual void render( - const void *data, size_t size, void *platformPrivate) = 0; - -protected: - VideoRenderer() {} - - VideoRenderer(const VideoRenderer &); - VideoRenderer &operator=(const VideoRenderer &); -}; - -} // namespace android - -#endif // VIDEO_RENDERER_H_ diff --git a/include/ui/FramebufferNativeWindow.h b/include/ui/FramebufferNativeWindow.h index c913355..2cd0911 100644 --- a/include/ui/FramebufferNativeWindow.h +++ b/include/ui/FramebufferNativeWindow.h @@ -29,6 +29,7 @@ #include <ui/egl/android_natives.h> +#define NUM_FRAME_BUFFERS 2 extern "C" EGLNativeWindowType android_createDisplaySurface(void); @@ -72,7 +73,7 @@ private: framebuffer_device_t* fbDev; alloc_device_t* grDev; - sp<NativeBuffer> buffers[2]; + sp<NativeBuffer> buffers[NUM_FRAME_BUFFERS]; sp<NativeBuffer> front; mutable Mutex mutex; diff --git a/libs/rs/java/Balls/src/com/android/balls/BallsRS.java b/libs/rs/java/Balls/src/com/android/balls/BallsRS.java index 359f334..76c23b7 100644 --- a/libs/rs/java/Balls/src/com/android/balls/BallsRS.java +++ b/libs/rs/java/Balls/src/com/android/balls/BallsRS.java @@ -33,8 +33,6 @@ public class BallsRS { private ProgramFragment mPFLines; private ProgramFragment mPFPoints; private ProgramVertex mPV; - private ProgramRaster mPR; - private ProgramStore mPS; private ScriptField_Point mPoints; private ScriptField_Point mArcs; private ScriptField_VpConsts mVpConsts; @@ -48,12 +46,6 @@ public class BallsRS { mVpConsts.set(i, 0, true); } - private void createProgramRaster() { - ProgramRaster.Builder b = new ProgramRaster.Builder(mRS); - mPR = b.create(); - mScript.set_gPR(mPR); - } - private void createProgramVertex() { updateProjectionMatrices(); @@ -71,7 +63,7 @@ public class BallsRS { sb.addInput(mPoints.getElement()); ProgramVertex pvs = sb.create(); pvs.bindConstants(mVpConsts.getAllocation(), 0); - mScript.set_gPV(pvs); + mRS.contextBindProgramVertex(pvs); } private Allocation loadTexture(int id) { @@ -125,10 +117,8 @@ public class BallsRS { mScript.set_gPFLines(mPFLines); mScript.set_gPFPoints(mPFPoints); createProgramVertex(); - createProgramRaster(); - mPS = ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS); - mScript.set_gPS(mPS); + mRS.contextBindProgramStore(ProgramStore.BLEND_ADD_DEPTH_NO_DEPTH(mRS)); mPhysicsScript.set_gMinPos(new Float2(5, 5)); mPhysicsScript.set_gMaxPos(new Float2(width - 5, height - 5)); diff --git a/libs/rs/java/Balls/src/com/android/balls/balls.rs b/libs/rs/java/Balls/src/com/android/balls/balls.rs index bbd03cf..3edbe2d 100644 --- a/libs/rs/java/Balls/src/com/android/balls/balls.rs +++ b/libs/rs/java/Balls/src/com/android/balls/balls.rs @@ -4,13 +4,11 @@ #include "balls.rsh" -#pragma stateFragment(parent) +#pragma stateVertex(parent) +#pragma stateStore(parent) rs_program_fragment gPFPoints; rs_program_fragment gPFLines; -rs_program_vertex gPV; -rs_program_raster gPR; -rs_program_store gPS; rs_mesh partMesh; rs_mesh arcMesh; @@ -95,9 +93,6 @@ int root() { frame++; rsgBindProgramFragment(gPFLines); - rsgBindProgramVertex(gPV); - rsgBindProgramRaster(gPR); - rsgBindProgramStore(gPS); rsgDrawMesh(arcMesh, 0, 0, arcIdx); rsgBindProgramFragment(gPFPoints); rsgDrawMesh(partMesh); diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index ac9abe0..1b584c8 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -280,6 +280,12 @@ ScriptSetVarI { param int value } +ScriptSetVarObj { + param RsScript s + param uint32_t slot + param RsObjectBase value + } + ScriptSetVarJ { param RsScript s param uint32_t slot @@ -314,6 +320,7 @@ ScriptCSetText { } ScriptCCreate { + param const char * resName ret RsScript } diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 18bf9fa..143c4dc 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -262,21 +262,27 @@ void Context::deinitEGL() { } } +Context::PushState::PushState(Context *con) { + mRsc = con; + mFragment.set(con->getProgramFragment()); + mVertex.set(con->getProgramVertex()); + mStore.set(con->getProgramStore()); + mRaster.set(con->getProgramRaster()); +} + +Context::PushState::~PushState() { + mRsc->setProgramFragment(mFragment.get()); + mRsc->setProgramVertex(mVertex.get()); + mRsc->setProgramStore(mStore.get()); + mRsc->setProgramRaster(mRaster.get()); + mRsc->setFont(mFont.get()); +} + uint32_t Context::runScript(Script *s) { - ObjectBaseRef<ProgramFragment> frag(mFragment); - ObjectBaseRef<ProgramVertex> vtx(mVertex); - ObjectBaseRef<ProgramStore> store(mFragmentStore); - ObjectBaseRef<ProgramRaster> raster(mRaster); - ObjectBaseRef<Font> font(mFont); + PushState(this); uint32_t ret = s->run(this); - - mFragment.set(frag); - mVertex.set(vtx); - mFragmentStore.set(store); - mRaster.set(raster); - mFont.set(font); return ret; } @@ -441,13 +447,13 @@ void * Context::threadProc(void *vrsc) { rsc->mScriptC.init(rsc); if (rsc->mIsGraphicsContext) { rsc->mStateRaster.init(rsc); - rsc->setRaster(NULL); + rsc->setProgramRaster(NULL); rsc->mStateVertex.init(rsc); - rsc->setVertex(NULL); + rsc->setProgramVertex(NULL); rsc->mStateFragment.init(rsc); - rsc->setFragment(NULL); + rsc->setProgramFragment(NULL); rsc->mStateFragmentStore.init(rsc); - rsc->setFragmentStore(NULL); + rsc->setProgramStore(NULL); rsc->mStateFont.init(rsc); rsc->setFont(NULL); rsc->mStateVertexArray.init(rsc); @@ -753,7 +759,7 @@ void Context::setRootScript(Script *s) { mRootScript.set(s); } -void Context::setFragmentStore(ProgramStore *pfs) { +void Context::setProgramStore(ProgramStore *pfs) { rsAssert(mIsGraphicsContext); if (pfs == NULL) { mFragmentStore.set(mStateFragmentStore.mDefault); @@ -762,7 +768,7 @@ void Context::setFragmentStore(ProgramStore *pfs) { } } -void Context::setFragment(ProgramFragment *pf) { +void Context::setProgramFragment(ProgramFragment *pf) { rsAssert(mIsGraphicsContext); if (pf == NULL) { mFragment.set(mStateFragment.mDefault); @@ -771,7 +777,7 @@ void Context::setFragment(ProgramFragment *pf) { } } -void Context::setRaster(ProgramRaster *pr) { +void Context::setProgramRaster(ProgramRaster *pr) { rsAssert(mIsGraphicsContext); if (pr == NULL) { mRaster.set(mStateRaster.mDefault); @@ -780,7 +786,7 @@ void Context::setRaster(ProgramRaster *pr) { } } -void Context::setVertex(ProgramVertex *pv) { +void Context::setProgramVertex(ProgramVertex *pv) { rsAssert(mIsGraphicsContext); if (pv == NULL) { mVertex.set(mStateVertex.mDefault); @@ -951,22 +957,22 @@ void rsi_ContextBindSampler(Context *rsc, uint32_t slot, RsSampler vs) { void rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs) { ProgramStore *pfs = static_cast<ProgramStore *>(vpfs); - rsc->setFragmentStore(pfs); + rsc->setProgramStore(pfs); } void rsi_ContextBindProgramFragment(Context *rsc, RsProgramFragment vpf) { ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); - rsc->setFragment(pf); + rsc->setProgramFragment(pf); } void rsi_ContextBindProgramRaster(Context *rsc, RsProgramRaster vpr) { ProgramRaster *pr = static_cast<ProgramRaster *>(vpr); - rsc->setRaster(pr); + rsc->setProgramRaster(pr); } void rsi_ContextBindProgramVertex(Context *rsc, RsProgramVertex vpv) { ProgramVertex *pv = static_cast<ProgramVertex *>(vpv); - rsc->setVertex(pv); + rsc->setProgramVertex(pv); } void rsi_ContextBindFont(Context *rsc, RsFont vfont) { diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 6945342..c377c73 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -80,6 +80,21 @@ public: Context * mContext; Script * mScript; }; + + class PushState { + public: + PushState(Context *); + ~PushState(); + + private: + ObjectBaseRef<ProgramFragment> mFragment; + ObjectBaseRef<ProgramVertex> mVertex; + ObjectBaseRef<ProgramStore> mStore; + ObjectBaseRef<ProgramRaster> mRaster; + ObjectBaseRef<Font> mFont; + Context *mRsc; + }; + ScriptTLSStruct *mTlsStruct; RsSurfaceConfig mUserSurfaceConfig; @@ -101,18 +116,18 @@ public: void swapBuffers(); void setRootScript(Script *); - void setRaster(ProgramRaster *); - void setVertex(ProgramVertex *); - void setFragment(ProgramFragment *); - void setFragmentStore(ProgramStore *); + void setProgramRaster(ProgramRaster *); + void setProgramVertex(ProgramVertex *); + void setProgramFragment(ProgramFragment *); + void setProgramStore(ProgramStore *); void setFont(Font *); void updateSurface(void *sur); - const ProgramFragment * getFragment() {return mFragment.get();} - const ProgramStore * getFragmentStore() {return mFragmentStore.get();} - const ProgramRaster * getRaster() {return mRaster.get();} - const ProgramVertex * getVertex() {return mVertex.get();} + ProgramFragment * getProgramFragment() {return mFragment.get();} + ProgramStore * getProgramStore() {return mFragmentStore.get();} + ProgramRaster * getProgramRaster() {return mRaster.get();} + ProgramVertex * getProgramVertex() {return mVertex.get();} Font * getFont() {return mFont.get();} bool setupCheck(); diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp index 96e350d..e4d77b2 100644 --- a/libs/rs/rsFont.cpp +++ b/libs/rs/rsFont.cpp @@ -613,18 +613,12 @@ void FontState::checkInit() { } void FontState::issueDrawCommand() { + Context::PushState ps(mRSC); - ObjectBaseRef<const ProgramVertex> tmpV(mRSC->getVertex()); - mRSC->setVertex(mRSC->getDefaultProgramVertex()); - - ObjectBaseRef<const ProgramRaster> tmpR(mRSC->getRaster()); - mRSC->setRaster(mRSC->getDefaultProgramRaster()); - - ObjectBaseRef<const ProgramFragment> tmpF(mRSC->getFragment()); - mRSC->setFragment(mFontShaderF.get()); - - ObjectBaseRef<const ProgramStore> tmpPS(mRSC->getFragmentStore()); - mRSC->setFragmentStore(mFontProgramStore.get()); + mRSC->setProgramVertex(mRSC->getDefaultProgramVertex()); + mRSC->setProgramRaster(mRSC->getDefaultProgramRaster()); + mRSC->setProgramFragment(mFontShaderF.get()); + mRSC->setProgramStore(mFontProgramStore.get()); if (mConstantsDirty) { mFontShaderFConstant->data(mRSC, &mConstants, sizeof(mConstants)); @@ -632,10 +626,6 @@ void FontState::issueDrawCommand() { } if (!mRSC->setupCheck()) { - mRSC->setVertex((ProgramVertex *)tmpV.get()); - mRSC->setRaster((ProgramRaster *)tmpR.get()); - mRSC->setFragment((ProgramFragment *)tmpF.get()); - mRSC->setFragmentStore((ProgramStore *)tmpPS.get()); return; } @@ -651,12 +641,6 @@ void FontState::issueDrawCommand() { mIndexBuffer->uploadCheck(mRSC); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->getBufferObjectID()); glDrawElements(GL_TRIANGLES, mCurrentQuadIndex * 6, GL_UNSIGNED_SHORT, (uint16_t *)(0)); - - // Reset the state - mRSC->setVertex((ProgramVertex *)tmpV.get()); - mRSC->setRaster((ProgramRaster *)tmpR.get()); - mRSC->setFragment((ProgramFragment *)tmpF.get()); - mRSC->setFragmentStore((ProgramStore *)tmpPS.get()); } void FontState::appendMeshQuad(float x1, float y1, float z1, diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp index 4ffdbfd..efdc626 100644 --- a/libs/rs/rsScript.cpp +++ b/libs/rs/rsScript.cpp @@ -67,6 +67,22 @@ void Script::setVar(uint32_t slot, const void *val, uint32_t len) { } } +void Script::setVarObj(uint32_t slot, ObjectBase *val) { + ObjectBase **destPtr = ((ObjectBase ***)mEnviroment.mFieldAddress)[slot]; + + if (destPtr) { + if (val != NULL) { + val->incSysRef(); + } + if (*destPtr) { + (*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); + } +} + namespace android { namespace renderscript { @@ -103,6 +119,12 @@ void rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value) { s->setVar(slot, &value, sizeof(value)); } +void rsi_ScriptSetVarObj(Context *rsc, RsScript vs, uint32_t slot, RsObjectBase value) { + Script *s = static_cast<Script *>(vs); + ObjectBase *o = static_cast<ObjectBase *>(value); + s->setVarObj(slot, o); +} + void rsi_ScriptSetVarJ(Context *rsc, RsScript vs, uint32_t slot, long long value) { Script *s = static_cast<Script *>(vs); s->setVar(slot, &value, sizeof(value)); diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h index 9b6d8a9..bad095b 100644 --- a/libs/rs/rsScript.h +++ b/libs/rs/rsScript.h @@ -61,6 +61,7 @@ public: void initSlots(); void setSlot(uint32_t slot, Allocation *a); void setVar(uint32_t slot, const void *val, uint32_t len); + void setVarObj(uint32_t slot, ObjectBase *val); virtual void runForEach(Context *rsc, const Allocation * ain, diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index 033f316..6587b51 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -65,12 +65,11 @@ void ScriptC::setupScript(Context *rsc) { void **dest = ((void ***)mEnviroment.mFieldAddress)[ct]; if (rsc->props.mLogScripts) { - LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=%p", rsc, ct, dest, ptr, mSlots[ct]->getType()); - - //const uint32_t *p32 = (const uint32_t *)ptr; - //for (uint32_t ct2=0; ct2 < mSlots[ct]->getType()->getDimX(); ct2++) { - //LOGE(" %i = 0x%08x ", ct2, p32[ct2]); - //} + if (mSlots[ct].get() != NULL) { + LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=%p", rsc, ct, dest, ptr, mSlots[ct]->getType()); + } else { + LOGV("%p ScriptC::setupScript slot=%i dst=%p src=%p type=null", rsc, ct, dest, ptr); + } } if (dest) { @@ -105,16 +104,16 @@ Script * ScriptC::setTLS(Script *sc) { void ScriptC::setupGLState(Context *rsc) { if (mEnviroment.mFragmentStore.get()) { - rsc->setFragmentStore(mEnviroment.mFragmentStore.get()); + rsc->setProgramStore(mEnviroment.mFragmentStore.get()); } if (mEnviroment.mFragment.get()) { - rsc->setFragment(mEnviroment.mFragment.get()); + rsc->setProgramFragment(mEnviroment.mFragment.get()); } if (mEnviroment.mVertex.get()) { - rsc->setVertex(mEnviroment.mVertex.get()); + rsc->setProgramVertex(mEnviroment.mVertex.get()); } if (mEnviroment.mRaster.get()) { - rsc->setRaster(mEnviroment.mRaster.get()); + rsc->setProgramRaster(mEnviroment.mRaster.get()); } } @@ -233,6 +232,7 @@ void ScriptC::runForEach(Context *rsc, const RsScriptCall *sc) { MTLaunchStruct mtls; memset(&mtls, 0, sizeof(mtls)); + Context::PushState ps(rsc); if (ain) { mtls.dimX = ain->getType()->getDimX(); @@ -396,15 +396,25 @@ static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name) { extern const char rs_runtime_lib_bc[]; extern unsigned rs_runtime_lib_bc_size; -void ScriptCState::runCompiler(Context *rsc, ScriptC *s) { +void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName) { { - StopWatch compileTimer("RenderScript compile time"); s->mBccScript = bccCreateScript(); s->mEnviroment.mIsThreadable = true; - bccScriptBitcode(s->mBccScript, s->mEnviroment.mScriptText, s->mEnviroment.mScriptTextLength); - //bccLinkBitcode(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size); bccRegisterSymbolCallback(s->mBccScript, symbolLookup, s); - bccCompileScript(s->mBccScript); + // bccReadBC() reads in the BitCode, if no cache file corresponding to + // the resName is found. Otherwise, bccReadBC() returns a negative value + // and the "else" branch will be taken. + if (bccReadBC(s->mBccScript, + s->mEnviroment.mScriptText, + s->mEnviroment.mScriptTextLength, + resName) >= 0) { + //bccLinkBC(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size); + bccCompileBC(s->mBccScript); + } else { + // bccReadBC returns a neagative value: Didn't read any script, + // So, use cached binary instead + bccLoadBinary(s->mBccScript); + } bccGetScriptLabel(s->mBccScript, "root", (BCCvoid**) &s->mProgram.mRoot); bccGetScriptLabel(s->mBccScript, "init", (BCCvoid**) &s->mProgram.mInit); } @@ -518,14 +528,15 @@ void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len) { ss->mScript->mEnviroment.mScriptTextLength = len; } -RsScript rsi_ScriptCCreate(Context * rsc) { +RsScript rsi_ScriptCCreate(Context * rsc, const char *resName) +{ ScriptCState *ss = &rsc->mScriptC; ObjectBaseRef<ScriptC> s(ss->mScript); ss->mScript.clear(); s->incUserRef(); - ss->runCompiler(rsc, s.get()); + ss->runCompiler(rsc, s.get(), resName); ss->clear(rsc); return s.get(); } diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h index 7ca33ac..4f0dff3 100644 --- a/libs/rs/rsScriptC.h +++ b/libs/rs/rsScriptC.h @@ -81,7 +81,7 @@ public: void init(Context *rsc); void clear(Context *rsc); - void runCompiler(Context *rsc, ScriptC *s); + void runCompiler(Context *rsc, ScriptC *s, const char *resName); struct SymbolTable_t { const char * mName; @@ -98,6 +98,3 @@ public: } } #endif - - - diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp index ef1475c..0f84e4b 100644 --- a/libs/rs/rsScriptC_LibGL.cpp +++ b/libs/rs/rsScriptC_LibGL.cpp @@ -92,17 +92,17 @@ static void SC_bindProgramRaster(RsProgramRaster pv) { static void SC_vpLoadProjectionMatrix(const rsc_Matrix *m) { GET_TLS(); - rsc->getVertex()->setProjectionMatrix(rsc, m); + rsc->getProgramVertex()->setProjectionMatrix(rsc, m); } static void SC_vpLoadModelMatrix(const rsc_Matrix *m) { GET_TLS(); - rsc->getVertex()->setModelviewMatrix(rsc, m); + rsc->getProgramVertex()->setModelviewMatrix(rsc, m); } static void SC_vpLoadTextureMatrix(const rsc_Matrix *m) { GET_TLS(); - rsc->getVertex()->setTextureMatrix(rsc, m); + rsc->getProgramVertex()->setTextureMatrix(rsc, m); } static void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a) { @@ -114,7 +114,7 @@ static void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, static void SC_vpGetProjectionMatrix(rsc_Matrix *m) { GET_TLS(); - rsc->getVertex()->getProjectionMatrix(rsc, m); + rsc->getProgramVertex()->getProjectionMatrix(rsc, m); } ////////////////////////////////////////////////////////////////////////////// @@ -165,8 +165,8 @@ static void SC_drawQuad(float x1, float y1, float z1, static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h) { GET_TLS(); - ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex()); - rsc->setVertex(rsc->getDefaultProgramVertex()); + ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex()); + rsc->setProgramVertex(rsc->getDefaultProgramVertex()); //rsc->setupCheck(); //GLint crop[4] = {0, h, w, -h}; @@ -177,7 +177,7 @@ static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h x+w, sh - y, z, x+w, sh - (y+h), z, x, sh - (y+h), z); - rsc->setVertex((ProgramVertex *)tmp.get()); + rsc->setProgramVertex((ProgramVertex *)tmp.get()); } /* static void SC_drawSprite(float x, float y, float z, float w, float h) @@ -271,7 +271,7 @@ static void SC_meshComputeBoundingBox(RsMesh vsm, static void SC_color(float r, float g, float b, float a) { GET_TLS(); - ProgramFragment *pf = (ProgramFragment *)rsc->getFragment(); + ProgramFragment *pf = (ProgramFragment *)rsc->getProgramFragment(); pf->setConstantColor(rsc, r, g, b, a); } diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp index a36d555..04a0195 100644 --- a/libs/ui/FramebufferNativeWindow.cpp +++ b/libs/ui/FramebufferNativeWindow.cpp @@ -83,6 +83,7 @@ FramebufferNativeWindow::FramebufferNativeWindow() if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) { int stride; int err; + int i; err = framebuffer_open(module, &fbDev); LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err)); @@ -96,27 +97,33 @@ FramebufferNativeWindow::FramebufferNativeWindow() mUpdateOnDemand = (fbDev->setUpdateRect != 0); // initialize the buffer FIFO - mNumBuffers = 2; - mNumFreeBuffers = 2; + mNumBuffers = NUM_FRAME_BUFFERS; + mNumFreeBuffers = NUM_FRAME_BUFFERS; mBufferHead = mNumBuffers-1; - buffers[0] = new NativeBuffer( - fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB); - buffers[1] = new NativeBuffer( - fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB); - - err = grDev->alloc(grDev, - fbDev->width, fbDev->height, fbDev->format, - GRALLOC_USAGE_HW_FB, &buffers[0]->handle, &buffers[0]->stride); - - LOGE_IF(err, "fb buffer 0 allocation failed w=%d, h=%d, err=%s", - fbDev->width, fbDev->height, strerror(-err)); - - err = grDev->alloc(grDev, - fbDev->width, fbDev->height, fbDev->format, - GRALLOC_USAGE_HW_FB, &buffers[1]->handle, &buffers[1]->stride); - LOGE_IF(err, "fb buffer 1 allocation failed w=%d, h=%d, err=%s", - fbDev->width, fbDev->height, strerror(-err)); + for (i = 0; i < mNumBuffers; i++) + { + buffers[i] = new NativeBuffer( + fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB); + } + + for (i = 0; i < mNumBuffers; i++) + { + err = grDev->alloc(grDev, + fbDev->width, fbDev->height, fbDev->format, + GRALLOC_USAGE_HW_FB, &buffers[i]->handle, &buffers[i]->stride); + + LOGE_IF(err, "fb buffer %d allocation failed w=%d, h=%d, err=%s", + i, fbDev->width, fbDev->height, strerror(-err)); + + if (err) + { + mNumBuffers = i; + mNumFreeBuffers = i; + mBufferHead = mNumBuffers-1; + break; + } + } const_cast<uint32_t&>(ANativeWindow::flags) = fbDev->flags; const_cast<float&>(ANativeWindow::xdpi) = fbDev->xdpi; diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index b84a2c2..def88ae 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -984,7 +984,7 @@ public class AudioManager { * application when it places a phone call, as it will cause signals from the radio layer * to feed the platform mixer. * - * @param mode the requested audio mode (NORMAL, RINGTONE, or IN_CALL). + * @param mode the requested audio mode (NORMAL, RINGTONE, IN_CALL or IN_COMMUNICATION). * Informs the HAL about the current audio state so that * it can route the audio appropriately. */ @@ -1000,7 +1000,7 @@ public class AudioManager { /** * Returns the current audio mode. * - * @return the current audio mode (NORMAL, RINGTONE, or IN_CALL). + * @return the current audio mode (NORMAL, RINGTONE, IN_CALL or IN_COMMUNICATION). * Returns the current current audio state from the HAL. */ public int getMode() { @@ -1034,9 +1034,14 @@ public class AudioManager { */ public static final int MODE_RINGTONE = AudioSystem.MODE_RINGTONE; /** - * In call audio mode. A call is established. + * In call audio mode. A telephony call is established. */ public static final int MODE_IN_CALL = AudioSystem.MODE_IN_CALL; + /** + * @hide + * In communication audio mode. An audio/video chat or VoIP call is established. + */ + public static final int MODE_IN_COMMUNICATION = AudioSystem.MODE_IN_COMMUNICATION; /* Routing bits for setRouting/getRouting API */ /** diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 3bee906..cfcc2ba 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -718,7 +718,7 @@ public class AudioService extends IAudioService.Stub { return; } - if (mode < AudioSystem.MODE_CURRENT || mode > AudioSystem.MODE_IN_CALL) { + if (mode < AudioSystem.MODE_CURRENT || mode >= AudioSystem.NUM_MODES) { return; } @@ -2305,6 +2305,7 @@ public class AudioService extends IAudioService.Stub { // add modify the phone app to take advantage of the new API synchronized(mRingingLock) { if (mIsRinging || (getMode() == AudioSystem.MODE_IN_CALL) || + (getMode() == AudioSystem.MODE_IN_COMMUNICATION) || (getMode() == AudioSystem.MODE_RINGTONE) ) { return; } diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 5442791..1fd03dc 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -106,7 +106,8 @@ public class AudioSystem public static final int MODE_NORMAL = 0; public static final int MODE_RINGTONE = 1; public static final int MODE_IN_CALL = 2; - public static final int NUM_MODES = 3; + public static final int MODE_IN_COMMUNICATION = 3; + public static final int NUM_MODES = 4; /* Routing bits for setRouting/getRouting API */ diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 2bea84f..39c4a28 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -149,12 +149,10 @@ public class MediaRecorder * {@link #DEFAULT} otherwise. */ public static final int VOICE_RECOGNITION = 6; - /** - * @hide - * Microphone audio source tuned for voice communications such as VoIP. It - * will for instance take advantage of echo cancellation or automatic gain control - * if available. It otherwise behaves like {@link #DEFAULT} if no voice processing - * is available. + /** Microphone audio source tuned for voice communications such as VoIP. It + * will for instance take advantage of echo cancellation or automatic gain control + * if available. It otherwise behaves like {@link #DEFAULT} if no voice processing + * is applied. */ public static final int VOICE_COMMUNICATION = 7; } diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 7f4960f..69b872b 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -434,24 +434,23 @@ public class MediaScanner } } - mMimeType = null; + mMimeType = mimeType; mFileType = 0; mFileSize = fileSize; // try mimeType first, if it is specified if (mimeType != null) { mFileType = MediaFile.getFileTypeForMimeType(mimeType); - if (mFileType != 0) { - mMimeType = mimeType; - } } // if mimeType was not specified, compute file type based on file extension. - if (mMimeType == null) { + if (mFileType == 0) { MediaFile.MediaFileType mediaFileType = MediaFile.getFileType(path); if (mediaFileType != null) { mFileType = mediaFileType.fileType; - mMimeType = mediaFileType.mimeType; + if (mMimeType == null) { + mMimeType = mediaFileType.mimeType; + } } } diff --git a/media/java/android/media/MtpDatabase.java b/media/java/android/media/MtpDatabase.java index 42d068f..e48e9e8 100644 --- a/media/java/android/media/MtpDatabase.java +++ b/media/java/android/media/MtpDatabase.java @@ -164,7 +164,7 @@ public class MtpDatabase { } } - private void endSendObject(String path, int handle, int format, boolean succeeded) { + private void endSendObject(String path, int handle, int format, long actualSize, boolean succeeded) { if (succeeded) { // handle abstract playlists separately // they do not exist in the file system so don't use the media scanner here @@ -184,6 +184,7 @@ public class MtpDatabase { ContentValues values = new ContentValues(1); values.put(Audio.Playlists.DATA, path); values.put(Audio.Playlists.NAME, name); + values.put(Files.FileColumns.FORMAT, format); values.put(MediaColumns.MEDIA_SCANNER_NEW_OBJECT_ID, handle); try { Uri uri = mMediaProvider.insert(Audio.Playlists.EXTERNAL_CONTENT_URI, values); @@ -191,6 +192,18 @@ public class MtpDatabase { Log.e(TAG, "RemoteException in endSendObject", e); } } else { + if (actualSize >= 0) { + // update size if necessary + ContentValues values = new ContentValues(); + values.put(Files.FileColumns.SIZE, actualSize); + try { + String[] whereArgs = new String[] { Integer.toString(handle) }; + mMediaProvider.update(mObjectsUri, values, ID_WHERE, whereArgs); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException in mMediaProvider.update", e); + } + } + mMediaScanner.scanMtpFile(path, mVolumeName, handle, format); } } else { diff --git a/media/java/android/media/videoeditor/AudioTrack.java b/media/java/android/media/videoeditor/AudioTrack.java index d02709e..32ff553 100755 --- a/media/java/android/media/videoeditor/AudioTrack.java +++ b/media/java/android/media/videoeditor/AudioTrack.java @@ -102,7 +102,7 @@ public class AudioTrack { // Ducking is enabled by default
mDuckingThreshold = 0;
mDuckedTrackVolume = 0;
- mIsDuckingEnabled = true;
+ mIsDuckingEnabled = false;
// The audio waveform file is generated later
mAudioWaveformFilename = null;
@@ -369,14 +369,15 @@ public class AudioTrack { /**
* Enable ducking by specifying the required parameters
*
- * @param threshold Ducking will be activated when the relative energy in
+ * @param threshold Ducking will be activated when the energy in
* the media items audio signal goes above this value. The valid
- * range of values is 0 to 100.
+ * range of values is 0db to 90dB. 0dB is equivalent to disabling
+ * ducking.
* @param duckedTrackVolume The relative volume of the audio track when ducking
* is active. The valid range of values is 0 to 100.
*/
public void enableDucking(int threshold, int duckedTrackVolume) {
- if (threshold < 0 || threshold > 100) {
+ if (threshold < 0 || threshold > 90) {
throw new IllegalArgumentException("Invalid threshold value: " + threshold);
}
diff --git a/media/java/android/media/videoeditor/Effect.java b/media/java/android/media/videoeditor/Effect.java index ef0aeb1..8fd0d27 100755 --- a/media/java/android/media/videoeditor/Effect.java +++ b/media/java/android/media/videoeditor/Effect.java @@ -76,7 +76,7 @@ public abstract class Effect { /**
* Set the duration of the effect. If a preview or export is in progress,
- * then this change is effective for next preview or export session. s
+ * then this change is effective for next preview or export session.
*
* @param durationMs of the effect in milliseconds
*/
@@ -85,9 +85,10 @@ public abstract class Effect { throw new IllegalArgumentException("Duration is too large");
}
+ final long oldDurationMs = mDurationMs;
mDurationMs = durationMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
}
/**
@@ -111,9 +112,10 @@ public abstract class Effect { throw new IllegalArgumentException("Start time is too large");
}
+ final long oldStartTimeMs = mStartTimeMs;
mStartTimeMs = startTimeMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs, mStartTimeMs, mDurationMs);
}
/**
@@ -134,10 +136,13 @@ public abstract class Effect { throw new IllegalArgumentException("Invalid start time or duration");
}
+ final long oldStartTimeMs = mStartTimeMs;
+ final long oldDurationMs = mDurationMs;
+
mStartTimeMs = startTimeMs;
mDurationMs = durationMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
}
/**
diff --git a/media/java/android/media/videoeditor/MediaImageItem.java b/media/java/android/media/videoeditor/MediaImageItem.java index a4b0770..fa8d61b 100755 --- a/media/java/android/media/videoeditor/MediaImageItem.java +++ b/media/java/android/media/videoeditor/MediaImageItem.java @@ -242,15 +242,49 @@ public class MediaImageItem extends MediaItem { */
@Override
void invalidateTransitions(long startTimeMs, long durationMs) {
- // Check if the effect overlaps with the beginning and end transitions
+ // Check if the item overlaps with the beginning and end transitions
if (mBeginTransition != null) {
- if (startTimeMs < mBeginTransition.getDuration()) {
+ if (isOverlapping(startTimeMs, durationMs, 0, mBeginTransition.getDuration())) {
mBeginTransition.invalidate();
}
}
if (mEndTransition != null) {
- if (startTimeMs + durationMs > mDurationMs - mEndTransition.getDuration()) {
+ final long transitionDurationMs = mEndTransition.getDuration();
+ if (isOverlapping(startTimeMs, durationMs,
+ getDuration() - transitionDurationMs, transitionDurationMs)) {
+ mEndTransition.invalidate();
+ }
+ }
+ }
+
+ /*
+ * {@inheritDoc}
+ */
+ @Override
+ void invalidateTransitions(long oldStartTimeMs, long oldDurationMs, long newStartTimeMs,
+ long newDurationMs) {
+ // Check if the item overlaps with the beginning and end transitions
+ if (mBeginTransition != null) {
+ final long transitionDurationMs = mBeginTransition.getDuration();
+ // If the start time has changed and if the old or the new item
+ // overlaps with the begin transition, invalidate the transition.
+ if (oldStartTimeMs != newStartTimeMs &&
+ (isOverlapping(oldStartTimeMs, oldDurationMs, 0, transitionDurationMs) ||
+ isOverlapping(newStartTimeMs, newDurationMs, 0, transitionDurationMs))) {
+ mBeginTransition.invalidate();
+ }
+ }
+
+ if (mEndTransition != null) {
+ final long transitionDurationMs = mEndTransition.getDuration();
+ // If the start time + duration has changed and if the old or the new
+ // item overlaps the end transition, invalidate the transition/
+ if (oldStartTimeMs + oldDurationMs != newStartTimeMs + newDurationMs &&
+ (isOverlapping(oldStartTimeMs, oldDurationMs,
+ mDurationMs - transitionDurationMs, transitionDurationMs) ||
+ isOverlapping(newStartTimeMs, newDurationMs,
+ mDurationMs - transitionDurationMs, transitionDurationMs))) {
mEndTransition.invalidate();
}
}
diff --git a/media/java/android/media/videoeditor/MediaItem.java b/media/java/android/media/videoeditor/MediaItem.java index 12f6084..20fd6c9 100755 --- a/media/java/android/media/videoeditor/MediaItem.java +++ b/media/java/android/media/videoeditor/MediaItem.java @@ -455,6 +455,40 @@ public abstract class MediaItem { abstract void invalidateTransitions(long startTimeMs, long durationMs);
/**
+ * Invalidate the start and end transitions if necessary. This method is
+ * typically called when the start time and/or duration of an overlay or
+ * effect is changing.
+ *
+ * @param oldStartTimeMs The old start time of the effect or overlay
+ * @param oldDurationMs The old duration of the effect or overlay
+ * @param newStartTimeMs The new start time of the effect or overlay
+ * @param newDurationMs The new duration of the effect or overlay
+ */
+ abstract void invalidateTransitions(long oldStartTimeMs, long oldDurationMs,
+ long newStartTimeMs, long newDurationMs);
+
+ /**
+ * Check if two items overlap in time
+ *
+ * @param startTimeMs1 Item 1 start time
+ * @param durationMs1 Item 1 duration
+ * @param startTimeMs2 Item 2 start time
+ * @param durationMs2 Item 2 end time
+ *
+ * @return true if the two items overlap
+ */
+ protected boolean isOverlapping(long startTimeMs1, long durationMs1,
+ long startTimeMs2, long durationMs2) {
+ if (startTimeMs1 + durationMs1 <= startTimeMs2) {
+ return false;
+ } else if (startTimeMs1 >= startTimeMs2 + durationMs2) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Adjust the duration transitions.
*/
protected void adjustTransitions() {
diff --git a/media/java/android/media/videoeditor/MediaVideoItem.java b/media/java/android/media/videoeditor/MediaVideoItem.java index 745b00a..cb835b5 100755 --- a/media/java/android/media/videoeditor/MediaVideoItem.java +++ b/media/java/android/media/videoeditor/MediaVideoItem.java @@ -218,15 +218,52 @@ public class MediaVideoItem extends MediaItem { */
@Override
void invalidateTransitions(long startTimeMs, long durationMs) {
- // Check if the effect overlaps with the beginning and end transitions
+ // Check if the item overlaps with the beginning and end transitions
if (mBeginTransition != null) {
- if (startTimeMs < mBeginTransition.getDuration()) {
+ if (isOverlapping(startTimeMs, durationMs,
+ mBeginBoundaryTimeMs, mBeginTransition.getDuration())) {
mBeginTransition.invalidate();
}
}
if (mEndTransition != null) {
- if (startTimeMs + durationMs > mEndBoundaryTimeMs - mEndTransition.getDuration()) {
+ final long transitionDurationMs = mEndTransition.getDuration();
+ if (isOverlapping(startTimeMs, durationMs,
+ mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs)) {
+ mEndTransition.invalidate();
+ }
+ }
+ }
+
+ /*
+ * {@inheritDoc}
+ */
+ @Override
+ void invalidateTransitions(long oldStartTimeMs, long oldDurationMs, long newStartTimeMs,
+ long newDurationMs) {
+ // Check if the item overlaps with the beginning and end transitions
+ if (mBeginTransition != null) {
+ final long transitionDurationMs = mBeginTransition.getDuration();
+ // If the start time has changed and if the old or the new item
+ // overlaps with the begin transition, invalidate the transition.
+ if (oldStartTimeMs != newStartTimeMs &&
+ (isOverlapping(oldStartTimeMs, oldDurationMs,
+ mBeginBoundaryTimeMs, transitionDurationMs) ||
+ isOverlapping(newStartTimeMs, newDurationMs,
+ mBeginBoundaryTimeMs, transitionDurationMs))) {
+ mBeginTransition.invalidate();
+ }
+ }
+
+ if (mEndTransition != null) {
+ final long transitionDurationMs = mEndTransition.getDuration();
+ // If the start time + duration has changed and if the old or the new
+ // item overlaps the end transition, invalidate the transition/
+ if (oldStartTimeMs + oldDurationMs != newStartTimeMs + newDurationMs &&
+ (isOverlapping(oldStartTimeMs, oldDurationMs,
+ mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs) ||
+ isOverlapping(newStartTimeMs, newDurationMs,
+ mEndBoundaryTimeMs - transitionDurationMs, transitionDurationMs))) {
mEndTransition.invalidate();
}
}
diff --git a/media/java/android/media/videoeditor/Overlay.java b/media/java/android/media/videoeditor/Overlay.java index e43f229..0174ba8 100755 --- a/media/java/android/media/videoeditor/Overlay.java +++ b/media/java/android/media/videoeditor/Overlay.java @@ -96,9 +96,10 @@ public abstract class Overlay { throw new IllegalArgumentException("Duration is too large");
}
+ final long oldDurationMs = mDurationMs;
mDurationMs = durationMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(mStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
}
/**
@@ -120,9 +121,10 @@ public abstract class Overlay { throw new IllegalArgumentException("Start time is too large");
}
+ final long oldStartTimeMs = mStartTimeMs;
mStartTimeMs = startTimeMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(oldStartTimeMs, mDurationMs, mStartTimeMs, mDurationMs);
}
/**
@@ -136,10 +138,13 @@ public abstract class Overlay { throw new IllegalArgumentException("Invalid start time or duration");
}
+ final long oldStartTimeMs = mStartTimeMs;
+ final long oldDurationMs = mDurationMs;
+
mStartTimeMs = startTimeMs;
mDurationMs = durationMs;
- mMediaItem.invalidateTransitions(mStartTimeMs, mDurationMs);
+ mMediaItem.invalidateTransitions(oldStartTimeMs, oldDurationMs, mStartTimeMs, mDurationMs);
}
/**
diff --git a/media/java/android/media/videoeditor/WaveformData.java b/media/java/android/media/videoeditor/WaveformData.java index b53bd7d..5791046 100644 --- a/media/java/android/media/videoeditor/WaveformData.java +++ b/media/java/android/media/videoeditor/WaveformData.java @@ -16,6 +16,8 @@ package android.media.videoeditor; +import java.io.IOException; + /** * Class which describes the waveform data of an audio track. The gain values * represent the average gain for an audio frame. For audio codecs which do @@ -33,7 +35,7 @@ public class WaveformData { * This constructor shall not be used */ @SuppressWarnings("unused") - private WaveformData() { + private WaveformData() throws IOException { mFrameDurationMs = 0; mFramesCount = 0; mGains = null; diff --git a/media/jni/android_media_MtpDatabase.cpp b/media/jni/android_media_MtpDatabase.cpp index 5377af6..4525d1f 100644 --- a/media/jni/android_media_MtpDatabase.cpp +++ b/media/jni/android_media_MtpDatabase.cpp @@ -99,6 +99,7 @@ public: virtual void endSendObject(const char* path, MtpObjectHandle handle, MtpObjectFormat format, + int64_t actualSize, bool succeeded); virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID, @@ -235,11 +236,11 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, } void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, - MtpObjectFormat format, bool succeeded) { + MtpObjectFormat format, int64_t actualSize, bool succeeded) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jstring pathStr = env->NewStringUTF(path); env->CallVoidMethod(mDatabase, method_endSendObject, pathStr, - (jint)handle, (jint)format, (jboolean)succeeded); + (jint)handle, (jint)format, (jlong)actualSize, (jboolean)succeeded); if (pathStr) env->DeleteLocalRef(pathStr); @@ -1076,7 +1077,7 @@ int register_android_media_MtpDatabase(JNIEnv *env) LOGE("Can't find beginSendObject"); return -1; } - method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIZ)V"); + method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIJZ)V"); if (method_endSendObject == NULL) { LOGE("Can't find endSendObject"); return -1; diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp index 1a46715..c287c0a 100644 --- a/media/libmedia/IMediaPlayer.cpp +++ b/media/libmedia/IMediaPlayer.cpp @@ -29,7 +29,6 @@ namespace android { enum { DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, SET_VIDEO_SURFACE, - SET_VIDEO_ISURFACE, PREPARE_ASYNC, START, STOP, @@ -65,15 +64,6 @@ public: remote()->transact(DISCONNECT, data, &reply); } - status_t setVideoISurface(const sp<ISurface>& surface) - { - Parcel data, reply; - data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor()); - data.writeStrongBinder(surface->asBinder()); - remote()->transact(SET_VIDEO_ISURFACE, data, &reply); - return reply.readInt32(); - } - status_t setVideoSurface(const sp<Surface>& surface) { Parcel data, reply; @@ -245,12 +235,6 @@ status_t BnMediaPlayer::onTransact( disconnect(); return NO_ERROR; } break; - case SET_VIDEO_ISURFACE: { - CHECK_INTERFACE(IMediaPlayer, data, reply); - sp<ISurface> surface = interface_cast<ISurface>(data.readStrongBinder()); - reply->writeInt32(setVideoISurface(surface)); - return NO_ERROR; - } break; case SET_VIDEO_SURFACE: { CHECK_INTERFACE(IMediaPlayer, data, reply); sp<Surface> surface = Surface::readFromParcel(data); diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp index f975217..9ce6738 100644 --- a/media/libmedia/IOMX.cpp +++ b/media/libmedia/IOMX.cpp @@ -31,48 +31,9 @@ enum { FILL_BUFFER, EMPTY_BUFFER, GET_EXTENSION_INDEX, - CREATE_RENDERER, OBSERVER_ON_MSG, - RENDERER_RENDER, }; -sp<IOMXRenderer> IOMX::createRenderer( - const sp<Surface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t encodedWidth, size_t encodedHeight, - size_t displayWidth, size_t displayHeight) { - return createRenderer( - surface->getISurface(), - componentName, colorFormat, encodedWidth, encodedHeight, - displayWidth, displayHeight); -} - -sp<IOMXRenderer> IOMX::createRendererFromJavaSurface( - JNIEnv *env, jobject javaSurface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t encodedWidth, size_t encodedHeight, - size_t displayWidth, size_t displayHeight) { - jclass surfaceClass = env->FindClass("android/view/Surface"); - if (surfaceClass == NULL) { - LOGE("Can't find android/view/Surface"); - return NULL; - } - - jfieldID surfaceID = env->GetFieldID(surfaceClass, ANDROID_VIEW_SURFACE_JNI_ID, "I"); - if (surfaceID == NULL) { - LOGE("Can't find Surface.mSurface"); - return NULL; - } - - sp<Surface> surface = (Surface *)env->GetIntField(javaSurface, surfaceID); - - return createRenderer( - surface, componentName, colorFormat, encodedWidth, - encodedHeight, displayWidth, displayHeight); -} - class BpOMX : public BpInterface<IOMX> { public: BpOMX(const sp<IBinder> &impl) @@ -395,28 +356,6 @@ public: return err; } - - virtual sp<IOMXRenderer> createRenderer( - const sp<ISurface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t encodedWidth, size_t encodedHeight, - size_t displayWidth, size_t displayHeight) { - Parcel data, reply; - data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); - - data.writeStrongBinder(surface->asBinder()); - data.writeCString(componentName); - data.writeInt32(colorFormat); - data.writeInt32(encodedWidth); - data.writeInt32(encodedHeight); - data.writeInt32(displayWidth); - data.writeInt32(displayHeight); - - remote()->transact(CREATE_RENDERER, data, &reply); - - return interface_cast<IOMXRenderer>(reply.readStrongBinder()); - } }; IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX"); @@ -767,33 +706,6 @@ status_t BnOMX::onTransact( return OK; } - case CREATE_RENDERER: - { - CHECK_INTERFACE(IOMX, data, reply); - - sp<ISurface> isurface = - interface_cast<ISurface>(data.readStrongBinder()); - - const char *componentName = data.readCString(); - - OMX_COLOR_FORMATTYPE colorFormat = - static_cast<OMX_COLOR_FORMATTYPE>(data.readInt32()); - - size_t encodedWidth = (size_t)data.readInt32(); - size_t encodedHeight = (size_t)data.readInt32(); - size_t displayWidth = (size_t)data.readInt32(); - size_t displayHeight = (size_t)data.readInt32(); - - sp<IOMXRenderer> renderer = - createRenderer(isurface, componentName, colorFormat, - encodedWidth, encodedHeight, - displayWidth, displayHeight); - - reply->writeStrongBinder(renderer->asBinder()); - - return OK; - } - default: return BBinder::onTransact(code, data, reply, flags); } @@ -839,44 +751,4 @@ status_t BnOMXObserver::onTransact( } } -//////////////////////////////////////////////////////////////////////////////// - -class BpOMXRenderer : public BpInterface<IOMXRenderer> { -public: - BpOMXRenderer(const sp<IBinder> &impl) - : BpInterface<IOMXRenderer>(impl) { - } - - virtual void render(IOMX::buffer_id buffer) { - Parcel data, reply; - data.writeInterfaceToken(IOMXRenderer::getInterfaceDescriptor()); - data.writeIntPtr((intptr_t)buffer); - - // NOTE: Do NOT make this a ONE_WAY call, it must be synchronous - // so that the caller knows when to recycle the buffer. - remote()->transact(RENDERER_RENDER, data, &reply); - } -}; - -IMPLEMENT_META_INTERFACE(OMXRenderer, "android.hardware.IOMXRenderer"); - -status_t BnOMXRenderer::onTransact( - uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { - switch (code) { - case RENDERER_RENDER: - { - CHECK_INTERFACE(IOMXRenderer, data, reply); - - IOMX::buffer_id buffer = (void*)data.readIntPtr(); - - render(buffer); - - return NO_ERROR; - } - - default: - return BBinder::onTransact(code, data, reply, flags); - } -} - } // namespace android diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 34e41a1..54b292c 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -198,13 +198,6 @@ status_t MediaPlayer::setVideoSurface(const sp<Surface>& surface) Mutex::Autolock _l(mLock); if (mPlayer == 0) return NO_INIT; - status_t err = mPlayer->setVideoISurface( - surface == NULL ? NULL : surface->getISurface()); - - if (err != OK) { - return err; - } - return mPlayer->setVideoSurface(surface); } diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index e84c2dc..00e510b 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -864,14 +864,6 @@ status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64 return mStatus; } -status_t MediaPlayerService::Client::setVideoISurface(const sp<ISurface>& surface) -{ - LOGV("[%d] setVideoISurface(%p)", mConnId, surface.get()); - sp<MediaPlayerBase> p = getPlayer(); - if (p == 0) return UNKNOWN_ERROR; - return p->setVideoISurface(surface); -} - status_t MediaPlayerService::Client::setVideoSurface(const sp<Surface>& surface) { LOGV("[%d] setVideoSurface(%p)", mConnId, surface.get()); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index e197cde..184324c 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -206,7 +206,6 @@ private: // IMediaPlayer interface virtual void disconnect(); - virtual status_t setVideoISurface(const sp<ISurface>& surface); virtual status_t setVideoSurface(const sp<Surface>& surface); virtual status_t prepareAsync(); virtual status_t start(); diff --git a/media/libmediaplayerservice/MidiFile.h b/media/libmediaplayerservice/MidiFile.h index 06e4b70..aa8f3f0 100644 --- a/media/libmediaplayerservice/MidiFile.h +++ b/media/libmediaplayerservice/MidiFile.h @@ -35,7 +35,6 @@ public: const char* path, const KeyedVector<String8, String8> *headers); virtual status_t setDataSource(int fd, int64_t offset, int64_t length); - virtual status_t setVideoISurface(const sp<ISurface>& surface) { return UNKNOWN_ERROR; } virtual status_t setVideoSurface(const sp<Surface>& surface) { return UNKNOWN_ERROR; } virtual status_t prepare(); virtual status_t prepareAsync(); diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp index e0957f6..58ef99b 100644 --- a/media/libmediaplayerservice/StagefrightPlayer.cpp +++ b/media/libmediaplayerservice/StagefrightPlayer.cpp @@ -44,13 +44,6 @@ status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length return mPlayer->setDataSource(dup(fd), offset, length); } -status_t StagefrightPlayer::setVideoISurface(const sp<ISurface> &surface) { - LOGV("setVideoISurface"); - - mPlayer->setISurface(surface); - return OK; -} - status_t StagefrightPlayer::setVideoSurface(const sp<Surface> &surface) { LOGV("setVideoSurface"); diff --git a/media/libmediaplayerservice/StagefrightPlayer.h b/media/libmediaplayerservice/StagefrightPlayer.h index 3899447..c4a2588 100644 --- a/media/libmediaplayerservice/StagefrightPlayer.h +++ b/media/libmediaplayerservice/StagefrightPlayer.h @@ -35,7 +35,6 @@ public: const char *url, const KeyedVector<String8, String8> *headers); virtual status_t setDataSource(int fd, int64_t offset, int64_t length); - virtual status_t setVideoISurface(const sp<ISurface> &surface); virtual status_t setVideoSurface(const sp<Surface> &surface); virtual status_t prepare(); virtual status_t prepareAsync(); diff --git a/media/libmediaplayerservice/TestPlayerStub.h b/media/libmediaplayerservice/TestPlayerStub.h index 5eaf592..6abd8e3 100644 --- a/media/libmediaplayerservice/TestPlayerStub.h +++ b/media/libmediaplayerservice/TestPlayerStub.h @@ -75,9 +75,6 @@ class TestPlayerStub : public MediaPlayerInterface { // All the methods below wrap the mPlayer instance. - virtual status_t setVideoISurface(const android::sp<android::ISurface>& s) { - return mPlayer->setVideoISurface(s); - } virtual status_t setVideoSurface(const android::sp<android::Surface>& s) { return mPlayer->setVideoSurface(s); } diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 41f5f30..538e7bf 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -79,39 +79,18 @@ private: AwesomeEvent &operator=(const AwesomeEvent &); }; -struct AwesomeRemoteRenderer : public AwesomeRenderer { - AwesomeRemoteRenderer(const sp<IOMXRenderer> &target) - : mTarget(target) { - } - - virtual void render(MediaBuffer *buffer) { - void *id; - if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) { - mTarget->render((IOMX::buffer_id)id); - } - } - -private: - sp<IOMXRenderer> mTarget; - - AwesomeRemoteRenderer(const AwesomeRemoteRenderer &); - AwesomeRemoteRenderer &operator=(const AwesomeRemoteRenderer &); -}; - struct AwesomeLocalRenderer : public AwesomeRenderer { AwesomeLocalRenderer( - bool previewOnly, - const char *componentName, OMX_COLOR_FORMATTYPE colorFormat, - const sp<ISurface> &isurface, const sp<Surface> &surface, size_t displayWidth, size_t displayHeight, - size_t decodedWidth, size_t decodedHeight) - : mTarget(NULL), - mLibHandle(NULL) { - init(previewOnly, componentName, - colorFormat, isurface, surface, displayWidth, - displayHeight, decodedWidth, decodedHeight); + size_t decodedWidth, size_t decodedHeight, + int32_t rotationDegrees) + : mTarget(NULL) { + init(colorFormat, surface, + displayWidth, displayHeight, + decodedWidth, decodedHeight, + rotationDegrees); } virtual void render(MediaBuffer *buffer) { @@ -127,78 +106,39 @@ protected: virtual ~AwesomeLocalRenderer() { delete mTarget; mTarget = NULL; - - if (mLibHandle) { - dlclose(mLibHandle); - mLibHandle = NULL; - } } private: - VideoRenderer *mTarget; - void *mLibHandle; + SoftwareRenderer *mTarget; void init( - bool previewOnly, - const char *componentName, OMX_COLOR_FORMATTYPE colorFormat, - const sp<ISurface> &isurface, const sp<Surface> &surface, size_t displayWidth, size_t displayHeight, - size_t decodedWidth, size_t decodedHeight); + size_t decodedWidth, size_t decodedHeight, + int32_t rotationDegrees); AwesomeLocalRenderer(const AwesomeLocalRenderer &); AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; }; void AwesomeLocalRenderer::init( - bool previewOnly, - const char *componentName, OMX_COLOR_FORMATTYPE colorFormat, - const sp<ISurface> &isurface, const sp<Surface> &surface, size_t displayWidth, size_t displayHeight, - size_t decodedWidth, size_t decodedHeight) { - if (!previewOnly) { - // We will stick to the vanilla software-color-converting renderer - // for "previewOnly" mode, to avoid unneccessarily switching overlays - // more often than necessary. - - mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW); - - if (mLibHandle) { - typedef VideoRenderer *(*CreateRendererFunc)( - const sp<ISurface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t displayWidth, size_t displayHeight, - size_t decodedWidth, size_t decodedHeight); - - CreateRendererFunc func = - (CreateRendererFunc)dlsym( - mLibHandle, - "_Z14createRendererRKN7android2spINS_8ISurfaceEEEPKc20" - "OMX_COLOR_FORMATTYPEjjjj"); - - if (func) { - mTarget = - (*func)(isurface, componentName, colorFormat, - displayWidth, displayHeight, - decodedWidth, decodedHeight); - } - } - } - - if (mTarget == NULL) { - mTarget = new SoftwareRenderer( - colorFormat, surface, displayWidth, displayHeight, - decodedWidth, decodedHeight); - } + size_t decodedWidth, size_t decodedHeight, + int32_t rotationDegrees) { + mTarget = new SoftwareRenderer( + colorFormat, surface, displayWidth, displayHeight, + decodedWidth, decodedHeight, rotationDegrees); } struct AwesomeNativeWindowRenderer : public AwesomeRenderer { - AwesomeNativeWindowRenderer(const sp<ANativeWindow> &nativeWindow) + AwesomeNativeWindowRenderer( + const sp<ANativeWindow> &nativeWindow, + int32_t rotationDegrees) : mNativeWindow(nativeWindow) { + applyRotation(rotationDegrees); } virtual void render(MediaBuffer *buffer) { @@ -220,6 +160,22 @@ protected: private: sp<ANativeWindow> mNativeWindow; + void applyRotation(int32_t rotationDegrees) { + uint32_t transform; + switch (rotationDegrees) { + case 0: transform = 0; break; + case 90: transform = HAL_TRANSFORM_ROT_90; break; + case 180: transform = HAL_TRANSFORM_ROT_180; break; + case 270: transform = HAL_TRANSFORM_ROT_270; break; + default: transform = 0; break; + } + + if (transform) { + CHECK_EQ(0, native_window_set_buffers_transform( + mNativeWindow.get(), transform)); + } + } + AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &); AwesomeNativeWindowRenderer &operator=( const AwesomeNativeWindowRenderer &); @@ -863,58 +819,65 @@ void AwesomePlayer::notifyVideoSize_l() { CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); - notifyListener_l(MEDIA_SET_VIDEO_SIZE, decodedWidth, decodedHeight); + int32_t rotationDegrees; + if (!mVideoTrack->getFormat()->findInt32( + kKeyRotation, &rotationDegrees)) { + rotationDegrees = 0; + } + + if (rotationDegrees == 90 || rotationDegrees == 270) { + notifyListener_l( + MEDIA_SET_VIDEO_SIZE, decodedHeight, decodedWidth); + } else { + notifyListener_l( + MEDIA_SET_VIDEO_SIZE, decodedWidth, decodedHeight); + } } void AwesomePlayer::initRenderer_l() { - if (mSurface != NULL || mISurface != NULL) { - sp<MetaData> meta = mVideoSource->getFormat(); + if (mSurface == NULL) { + return; + } - int32_t format; - const char *component; - int32_t decodedWidth, decodedHeight; - CHECK(meta->findInt32(kKeyColorFormat, &format)); - CHECK(meta->findCString(kKeyDecoderComponent, &component)); - CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); - CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); + sp<MetaData> meta = mVideoSource->getFormat(); - mVideoRenderer.clear(); + int32_t format; + const char *component; + int32_t decodedWidth, decodedHeight; + CHECK(meta->findInt32(kKeyColorFormat, &format)); + CHECK(meta->findCString(kKeyDecoderComponent, &component)); + CHECK(meta->findInt32(kKeyWidth, &decodedWidth)); + CHECK(meta->findInt32(kKeyHeight, &decodedHeight)); - // Must ensure that mVideoRenderer's destructor is actually executed - // before creating a new one. - IPCThreadState::self()->flushCommands(); + int32_t rotationDegrees; + if (!mVideoTrack->getFormat()->findInt32( + kKeyRotation, &rotationDegrees)) { + rotationDegrees = 0; + } - if (mSurface != NULL) { - if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) { - // Hardware decoders avoid the CPU color conversion by decoding - // directly to ANativeBuffers, so we must use a renderer that - // just pushes those buffers to the ANativeWindow. - mVideoRenderer = new AwesomeNativeWindowRenderer(mSurface); - } else { - // Other decoders are instantiated locally and as a consequence - // allocate their buffers in local address space. This renderer - // then performs a color conversion and copy to get the data - // into the ANativeBuffer. - mVideoRenderer = new AwesomeLocalRenderer( - false, // previewOnly - component, - (OMX_COLOR_FORMATTYPE)format, - mISurface, - mSurface, - mVideoWidth, mVideoHeight, - decodedWidth, decodedHeight); - } - } else { - // Our OMX codecs allocate buffers on the media_server side - // therefore they require a remote IOMXRenderer that knows how - // to display them. - mVideoRenderer = new AwesomeRemoteRenderer( - mClient.interface()->createRenderer( - mISurface, component, - (OMX_COLOR_FORMATTYPE)format, - decodedWidth, decodedHeight, - mVideoWidth, mVideoHeight)); - } + mVideoRenderer.clear(); + + // Must ensure that mVideoRenderer's destructor is actually executed + // before creating a new one. + IPCThreadState::self()->flushCommands(); + + if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) { + // Hardware decoders avoid the CPU color conversion by decoding + // directly to ANativeBuffers, so we must use a renderer that + // just pushes those buffers to the ANativeWindow. + mVideoRenderer = + new AwesomeNativeWindowRenderer(mSurface, rotationDegrees); + } else { + // Other decoders are instantiated locally and as a consequence + // allocate their buffers in local address space. This renderer + // then performs a color conversion and copy to get the data + // into the ANativeBuffer. + mVideoRenderer = new AwesomeLocalRenderer( + (OMX_COLOR_FORMATTYPE)format, + mSurface, + mVideoWidth, mVideoHeight, + decodedWidth, decodedHeight, + rotationDegrees); } } @@ -958,12 +921,6 @@ bool AwesomePlayer::isPlaying() const { return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN); } -void AwesomePlayer::setISurface(const sp<ISurface> &isurface) { - Mutex::Autolock autoLock(mLock); - - mISurface = isurface; -} - void AwesomePlayer::setSurface(const sp<Surface> &surface) { Mutex::Autolock autoLock(mLock); @@ -1897,18 +1854,16 @@ status_t AwesomePlayer::resume() { mFlags = state->mFlags & (AUTO_LOOPING | LOOPING | AT_EOS); - if (state->mLastVideoFrame && (mSurface != NULL || mISurface != NULL)) { + if (state->mLastVideoFrame && mSurface != NULL) { mVideoRenderer = new AwesomeLocalRenderer( - true, // previewOnly - "", (OMX_COLOR_FORMATTYPE)state->mColorFormat, - mISurface, mSurface, state->mVideoWidth, state->mVideoHeight, state->mDecodedWidth, - state->mDecodedHeight); + state->mDecodedHeight, + 0); mVideoRendererIsPreview = true; diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 2e94a12..bb929fd 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -27,11 +27,11 @@ #include <stdlib.h> #include <string.h> +#include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/DataSource.h> #include "include/ESDS.h" #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaBufferGroup.h> -#include <media/stagefright/MediaDebug.h> #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> @@ -766,55 +766,11 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) { case FOURCC('t', 'k', 'h', 'd'): { - if (chunk_data_size < 4) { - return ERROR_MALFORMED; - } - - uint8_t version; - if (mDataSource->readAt(data_offset, &version, 1) < 1) { - return ERROR_IO; - } - - uint64_t ctime, mtime, duration; - int32_t id; - uint32_t width, height; - - if (version == 1) { - if (chunk_data_size != 36 + 60) { - return ERROR_MALFORMED; - } - - uint8_t buffer[36 + 60]; - if (mDataSource->readAt( - data_offset, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer)) { - return ERROR_IO; - } - - ctime = U64_AT(&buffer[4]); - mtime = U64_AT(&buffer[12]); - id = U32_AT(&buffer[20]); - duration = U64_AT(&buffer[28]); - width = U32_AT(&buffer[88]); - height = U32_AT(&buffer[92]); - } else if (version == 0) { - if (chunk_data_size != 24 + 60) { - return ERROR_MALFORMED; - } - - uint8_t buffer[24 + 60]; - if (mDataSource->readAt( - data_offset, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer)) { - return ERROR_IO; - } - ctime = U32_AT(&buffer[4]); - mtime = U32_AT(&buffer[8]); - id = U32_AT(&buffer[12]); - duration = U32_AT(&buffer[20]); - width = U32_AT(&buffer[76]); - height = U32_AT(&buffer[80]); + status_t err; + if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) { + return err; } - mLastTrack->meta->setInt32(kKeyTrackID, id); *offset += chunk_size; break; } @@ -1275,6 +1231,93 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) { return OK; } +status_t MPEG4Extractor::parseTrackHeader( + off_t data_offset, off_t data_size) { + if (data_size < 4) { + return ERROR_MALFORMED; + } + + uint8_t version; + if (mDataSource->readAt(data_offset, &version, 1) < 1) { + return ERROR_IO; + } + + size_t dynSize = (version == 1) ? 36 : 24; + + uint8_t buffer[36 + 60]; + + if (data_size != (off_t)dynSize + 60) { + return ERROR_MALFORMED; + } + + if (mDataSource->readAt( + data_offset, buffer, data_size) < (ssize_t)data_size) { + return ERROR_IO; + } + + uint64_t ctime, mtime, duration; + int32_t id; + + if (version == 1) { + ctime = U64_AT(&buffer[4]); + mtime = U64_AT(&buffer[12]); + id = U32_AT(&buffer[20]); + duration = U64_AT(&buffer[28]); + } else { + CHECK_EQ((unsigned)version, 0u); + + ctime = U32_AT(&buffer[4]); + mtime = U32_AT(&buffer[8]); + id = U32_AT(&buffer[12]); + duration = U32_AT(&buffer[20]); + } + + mLastTrack->meta->setInt32(kKeyTrackID, id); + + size_t matrixOffset = dynSize + 16; + int32_t a00 = U32_AT(&buffer[matrixOffset]); + int32_t a01 = U32_AT(&buffer[matrixOffset + 4]); + int32_t dx = U32_AT(&buffer[matrixOffset + 8]); + int32_t a10 = U32_AT(&buffer[matrixOffset + 12]); + int32_t a11 = U32_AT(&buffer[matrixOffset + 16]); + int32_t dy = U32_AT(&buffer[matrixOffset + 20]); + +#if 0 + LOGI("x' = %.2f * x + %.2f * y + %.2f", + a00 / 65536.0f, a01 / 65536.0f, dx / 65536.0f); + LOGI("y' = %.2f * x + %.2f * y + %.2f", + a10 / 65536.0f, a11 / 65536.0f, dy / 65536.0f); +#endif + + uint32_t rotationDegrees; + + static const int32_t kFixedOne = 0x10000; + if (a00 == kFixedOne && a01 == 0 && a10 == 0 && a11 == kFixedOne) { + // Identity, no rotation + rotationDegrees = 0; + } else if (a00 == 0 && a01 == kFixedOne && a10 == -kFixedOne && a11 == 0) { + rotationDegrees = 90; + } else if (a00 == 0 && a01 == -kFixedOne && a10 == kFixedOne && a11 == 0) { + rotationDegrees = 270; + } else if (a00 == -kFixedOne && a01 == 0 && a10 == 0 && a11 == -kFixedOne) { + rotationDegrees = 180; + } else { + LOGW("We only support 0,90,180,270 degree rotation matrices"); + rotationDegrees = 0; + } + + if (rotationDegrees != 0) { + mLastTrack->meta->setInt32(kKeyRotation, rotationDegrees); + } + +#if 0 + uint32_t width = U32_AT(&buffer[dynSize + 52]); + uint32_t height = U32_AT(&buffer[dynSize + 56]); +#endif + + return OK; +} + status_t MPEG4Extractor::parseMetaData(off_t offset, size_t size) { if (size < 4) { return ERROR_MALFORMED; @@ -1588,7 +1631,7 @@ MPEG4Source::MPEG4Source( const uint8_t *ptr = (const uint8_t *)data; CHECK(size >= 7); - CHECK_EQ(ptr[0], 1); // configurationVersion == 1 + CHECK_EQ((unsigned)ptr[0], 1u); // configurationVersion == 1 // The number of bytes used to encode the length of a NAL unit. mNALLengthSize = 1 + (ptr[4] & 3); @@ -1736,7 +1779,7 @@ status_t MPEG4Source::read( } uint32_t sampleTime; - CHECK_EQ(OK, mSampleTable->getMetaDataForSample( + CHECK_EQ((status_t)OK, mSampleTable->getMetaDataForSample( sampleIndex, NULL, NULL, &sampleTime)); if (mode == ReadOptions::SEEK_CLOSEST) { @@ -1783,7 +1826,7 @@ status_t MPEG4Source::read( err = mGroup->acquire_buffer(&mBuffer); if (err != OK) { - CHECK_EQ(mBuffer, NULL); + CHECK(mBuffer == NULL); return err; } } diff --git a/media/libstagefright/colorconversion/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp index 662a84a..3d507ca 100644 --- a/media/libstagefright/colorconversion/SoftwareRenderer.cpp +++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp @@ -35,7 +35,8 @@ SoftwareRenderer::SoftwareRenderer( OMX_COLOR_FORMATTYPE colorFormat, const sp<Surface> &surface, size_t displayWidth, size_t displayHeight, - size_t decodedWidth, size_t decodedHeight) + size_t decodedWidth, size_t decodedHeight, + int32_t rotationDegrees) : mColorFormat(colorFormat), mConverter(NULL), mYUVMode(None), @@ -95,6 +96,20 @@ SoftwareRenderer::SoftwareRenderer( CHECK_EQ(0, native_window_set_buffers_geometry( mSurface.get(), mDecodedWidth, mDecodedHeight, halFormat)); + + uint32_t transform; + switch (rotationDegrees) { + case 0: transform = 0; break; + case 90: transform = HAL_TRANSFORM_ROT_90; break; + case 180: transform = HAL_TRANSFORM_ROT_180; break; + case 270: transform = HAL_TRANSFORM_ROT_270; break; + default: transform = 0; break; + } + + if (transform) { + CHECK_EQ(0, native_window_set_buffers_transform( + mSurface.get(), transform)); + } } SoftwareRenderer::~SoftwareRenderer() { diff --git a/media/libstagefright/httplive/LiveSource.cpp b/media/libstagefright/httplive/LiveSource.cpp index 39e3e75..f9d27eb 100644 --- a/media/libstagefright/httplive/LiveSource.cpp +++ b/media/libstagefright/httplive/LiveSource.cpp @@ -278,7 +278,19 @@ bool LiveSource::switchToNext() { } if (mLastFetchTimeUs < 0) { - mPlaylistIndex = 0; + if (isSeekable()) { + mPlaylistIndex = 0; + } else { + // This is live streamed content, the first seqnum in the + // various bandwidth' streams may be slightly off, so don't + // start at the very first entry. + // With a segment duration of 6-10secs, this really only + // delays playback up to 30secs compared to real time. + mPlaylistIndex = 3; + if (mPlaylistIndex >= mPlaylist->size()) { + mPlaylistIndex = mPlaylist->size() - 1; + } + } } else { if (nextSequenceNumber < mFirstItemSequenceNumber || nextSequenceNumber diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 302a1ba..4e63b7a 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -79,7 +79,6 @@ struct AwesomePlayer { bool isPlaying() const; - void setISurface(const sp<ISurface> &isurface); void setSurface(const sp<Surface> &surface); void setAudioSink(const sp<MediaPlayerBase::AudioSink> &audioSink); status_t setLooping(bool shouldLoop); @@ -130,7 +129,6 @@ private: bool mQueueStarted; wp<MediaPlayerBase> mListener; - sp<ISurface> mISurface; sp<Surface> mSurface; sp<MediaPlayerBase::AudioSink> mAudioSink; diff --git a/media/libstagefright/include/MPEG4Extractor.h b/media/libstagefright/include/MPEG4Extractor.h index 4e31059..bc2e4dc 100644 --- a/media/libstagefright/include/MPEG4Extractor.h +++ b/media/libstagefright/include/MPEG4Extractor.h @@ -88,6 +88,8 @@ private: bool mIsDrm; status_t parseDrmSINF(off_t *offset, off_t data_offset); + status_t parseTrackHeader(off_t data_offset, off_t data_size); + MPEG4Extractor(const MPEG4Extractor &); MPEG4Extractor &operator=(const MPEG4Extractor &); }; diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h index 5a6c96f9..5fed98a 100644 --- a/media/libstagefright/include/OMX.h +++ b/media/libstagefright/include/OMX.h @@ -97,13 +97,6 @@ public: const char *parameter_name, OMX_INDEXTYPE *index); - virtual sp<IOMXRenderer> createRenderer( - const sp<ISurface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t encodedWidth, size_t encodedHeight, - size_t displayWidth, size_t displayHeight); - virtual void binderDied(const wp<IBinder> &the_late_who); OMX_ERRORTYPE OnEvent( diff --git a/media/libstagefright/include/SoftwareRenderer.h b/media/libstagefright/include/SoftwareRenderer.h index 8d58056..9cafc68 100644 --- a/media/libstagefright/include/SoftwareRenderer.h +++ b/media/libstagefright/include/SoftwareRenderer.h @@ -19,25 +19,24 @@ #define SOFTWARE_RENDERER_H_ #include <media/stagefright/ColorConverter.h> -#include <media/stagefright/VideoRenderer.h> #include <utils/RefBase.h> namespace android { class Surface; -class MemoryHeapBase; -class SoftwareRenderer : public VideoRenderer { +class SoftwareRenderer { public: SoftwareRenderer( OMX_COLOR_FORMATTYPE colorFormat, const sp<Surface> &surface, size_t displayWidth, size_t displayHeight, - size_t decodedWidth, size_t decodedHeight); + size_t decodedWidth, size_t decodedHeight, + int32_t rotationDegrees); - virtual ~SoftwareRenderer(); + ~SoftwareRenderer(); - virtual void render( + void render( const void *data, size_t size, void *platformPrivate); private: diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index f9f638f..4e9920b 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -24,14 +24,11 @@ #include <sys/resource.h> #include "../include/OMX.h" -#include "OMXRenderer.h" #include "../include/OMXNodeInstance.h" -#include "../include/SoftwareRenderer.h" #include <binder/IMemory.h> #include <media/stagefright/MediaDebug.h> -#include <media/stagefright/VideoRenderer.h> #include <utils/threads.h> #include "OMXMaster.h" @@ -442,110 +439,4 @@ void OMX::invalidateNodeID_l(node_id node) { mNodeIDToInstance.removeItem(node); } -//////////////////////////////////////////////////////////////////////////////// - -struct SharedVideoRenderer : public VideoRenderer { - SharedVideoRenderer(void *libHandle, VideoRenderer *obj) - : mLibHandle(libHandle), - mObj(obj) { - } - - virtual ~SharedVideoRenderer() { - delete mObj; - mObj = NULL; - - dlclose(mLibHandle); - mLibHandle = NULL; - } - - virtual void render( - const void *data, size_t size, void *platformPrivate) { - return mObj->render(data, size, platformPrivate); - } - -private: - void *mLibHandle; - VideoRenderer *mObj; - - SharedVideoRenderer(const SharedVideoRenderer &); - SharedVideoRenderer &operator=(const SharedVideoRenderer &); -}; - -sp<IOMXRenderer> OMX::createRenderer( - const sp<ISurface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t encodedWidth, size_t encodedHeight, - size_t displayWidth, size_t displayHeight) { - Mutex::Autolock autoLock(mLock); - - VideoRenderer *impl = NULL; - - void *libHandle = dlopen("libstagefrighthw.so", RTLD_NOW); - - if (libHandle) { - typedef VideoRenderer *(*CreateRendererFunc)( - const sp<ISurface> &surface, - const char *componentName, - OMX_COLOR_FORMATTYPE colorFormat, - size_t displayWidth, size_t displayHeight, - size_t decodedWidth, size_t decodedHeight); - - CreateRendererFunc func = - (CreateRendererFunc)dlsym( - libHandle, - "_Z14createRendererRKN7android2spINS_8ISurfaceEEEPKc20" - "OMX_COLOR_FORMATTYPEjjjj"); - - if (func) { - impl = (*func)(surface, componentName, colorFormat, - displayWidth, displayHeight, encodedWidth, encodedHeight); - - if (impl) { - impl = new SharedVideoRenderer(libHandle, impl); - libHandle = NULL; - } - } - - if (libHandle) { - dlclose(libHandle); - libHandle = NULL; - } - } - - if (!impl) { -#if 0 - LOGW("Using software renderer."); - impl = new SoftwareRenderer( - colorFormat, - surface, - displayWidth, displayHeight, - encodedWidth, encodedHeight); -#else - CHECK(!"Should not be here."); - return NULL; -#endif - } - - return new OMXRenderer(impl); -} - -OMXRenderer::OMXRenderer(VideoRenderer *impl) - : mImpl(impl) { -} - -OMXRenderer::~OMXRenderer() { - delete mImpl; - mImpl = NULL; -} - -void OMXRenderer::render(IOMX::buffer_id buffer) { - OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; - - mImpl->render( - header->pBuffer + header->nOffset, - header->nFilledLen, - header->pPlatformPrivate); -} - } // namespace android diff --git a/media/libstagefright/omx/OMXRenderer.h b/media/libstagefright/omx/OMXRenderer.h deleted file mode 100644 index 4d194ce..0000000 --- a/media/libstagefright/omx/OMXRenderer.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2009 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. - */ - -#ifndef OMX_RENDERER_H_ - -#define OMX_RENDERER_H_ - -#include <media/IOMX.h> - -namespace android { - -class VideoRenderer; - -class OMXRenderer : public BnOMXRenderer { -public: - // Assumes ownership of "impl". - OMXRenderer(VideoRenderer *impl); - virtual ~OMXRenderer(); - - virtual void render(IOMX::buffer_id buffer); - -private: - VideoRenderer *mImpl; - - OMXRenderer(const OMXRenderer &); - OMXRenderer &operator=(const OMXRenderer &); -}; - -} // namespace android - -#endif // OMX_RENDERER_H_ diff --git a/media/mtp/MtpDatabase.h b/media/mtp/MtpDatabase.h index fafd221..900b517 100644 --- a/media/mtp/MtpDatabase.h +++ b/media/mtp/MtpDatabase.h @@ -42,6 +42,7 @@ public: virtual void endSendObject(const char* path, MtpObjectHandle handle, MtpObjectFormat format, + int64_t size, bool succeeded) = 0; virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID, diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index 6cf70ec..ca13636 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -624,6 +624,7 @@ MtpResponseCode MtpServer::doSendObjectInfo() { mData.getString(modified); // date modified // keywords follow + LOGD("name: %s format: %04X\n", (const char *)name, format); time_t modifiedTime; if (!parseDateTime(modified, modifiedTime)) modifiedTime = 0; @@ -663,6 +664,7 @@ MtpResponseCode MtpServer::doSendObject() { MtpResponseCode result = MTP_RESPONSE_OK; mode_t mask; int ret; + uint64_t actualSize = -1; if (mSendObjectHandle == kInvalidObjectHandle) { LOGE("Expected SendObjectInfo before SendObject"); @@ -692,6 +694,7 @@ MtpResponseCode MtpServer::doSendObject() { mfr.offset = 0; mfr.length = mSendObjectFileSize; + LOGD("receiving %s\n", (const char *)mSendObjectFilePath); // transfer the file ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr); close(mfr.fd); @@ -704,11 +707,18 @@ MtpResponseCode MtpServer::doSendObject() { result = MTP_RESPONSE_TRANSACTION_CANCELLED; else result = MTP_RESPONSE_GENERAL_ERROR; + } else if (mSendObjectFileSize == 0xFFFFFFFF) { + // actual size is likely > 4 gig so stat the file to compute actual length + struct stat s; + if (lstat(mSendObjectFilePath, &s) == 0) { + actualSize = s.st_size; + LOGD("actualSize: %lld\n", actualSize); + } } done: mDatabase->endSendObject(mSendObjectFilePath, mSendObjectHandle, mSendObjectFormat, - result == MTP_RESPONSE_OK); + actualSize, result == MTP_RESPONSE_OK); mSendObjectHandle = kInvalidObjectHandle; mSendObjectFormat = 0; return result; diff --git a/media/tests/players/invoke_mock_media_player.cpp b/media/tests/players/invoke_mock_media_player.cpp index 53308be..1e3731e 100644 --- a/media/tests/players/invoke_mock_media_player.cpp +++ b/media/tests/players/invoke_mock_media_player.cpp @@ -68,7 +68,6 @@ class Player: public MediaPlayerBase } virtual status_t setDataSource(int fd, int64_t offset, int64_t length) {return OK;} - virtual status_t setVideoISurface(const sp<ISurface>& surface) {return OK;} virtual status_t setVideoSurface(const sp<Surface>& surface) {return OK;} virtual status_t prepare() {return OK;} virtual status_t prepareAsync() {return OK;} diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index b98071e..fa63edb 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -16,6 +16,7 @@ package com.android.providers.settings; +import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; @@ -27,6 +28,7 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.io.OutputStream; import java.util.Arrays; import java.util.zip.CRC32; @@ -352,10 +354,11 @@ public class SettingsBackupAgent extends BackupAgentHelper { } private byte[] getWifiSupplicant(String filename) { + BufferedReader br = null; try { File file = new File(filename); if (file.exists()) { - BufferedReader br = new BufferedReader(new FileReader(file)); + br = new BufferedReader(new FileReader(file)); StringBuffer relevantLines = new StringBuffer(); boolean started = false; String line; @@ -378,6 +381,13 @@ public class SettingsBackupAgent extends BackupAgentHelper { } catch (IOException ioe) { Log.w(TAG, "Couldn't backup " + filename); return EMPTY_DATA; + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) { + } + } } } @@ -390,9 +400,10 @@ public class SettingsBackupAgent extends BackupAgentHelper { if (supplicantFile.exists()) supplicantFile.delete(); copyWifiSupplicantTemplate(); - FileOutputStream fos = new FileOutputStream(filename, true); - fos.write("\n".getBytes()); - fos.write(bytes); + OutputStream os = new BufferedOutputStream(new FileOutputStream(filename, true)); + os.write("\n".getBytes()); + os.write(bytes); + os.close(); } catch (IOException ioe) { Log.w(TAG, "Couldn't restore " + filename); } diff --git a/packages/SystemUI/assets/fonts/AndroidClock.ttf b/packages/SystemUI/assets/fonts/AndroidClock.ttf Binary files differnew file mode 100644 index 0000000..3945183 --- /dev/null +++ b/packages/SystemUI/assets/fonts/AndroidClock.ttf diff --git a/packages/SystemUI/assets/fonts/AndroidClock2.ttf b/packages/SystemUI/assets/fonts/AndroidClock2.ttf Binary files differnew file mode 100644 index 0000000..fa0221e --- /dev/null +++ b/packages/SystemUI/assets/fonts/AndroidClock2.ttf diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png b/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png Binary files differnew file mode 100644 index 0000000..17fd52e --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_notification_open.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png Binary files differnew file mode 100644 index 0000000..c888c21 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_shadow.9.png diff --git a/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png b/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png Binary files differnew file mode 100644 index 0000000..6e13ebe --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/bg_scrim_notification.png diff --git a/packages/SystemUI/res/drawable-nodpi/panel_notification.png b/packages/SystemUI/res/drawable-nodpi/panel_notification.png Binary files differnew file mode 100644 index 0000000..eca47d7 --- /dev/null +++ b/packages/SystemUI/res/drawable-nodpi/panel_notification.png diff --git a/packages/SystemUI/res/drawable/status_bar_item_background.xml b/packages/SystemUI/res/drawable/status_bar_item_background.xml new file mode 100644 index 0000000..9da92a7 --- /dev/null +++ b/packages/SystemUI/res/drawable/status_bar_item_background.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2006 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. +--> + +<layer-list + xmlns:android="http://schemas.android.com/apk/res/android" + android:opacity="translucent" + > + <item + android:drawable="@drawable/notification_item_background_color" + android:left="16dp" + /> +</layer-list> + diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index a6e5c89..d4a6136 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -25,20 +25,10 @@ android:id="@+id/bar_contents" android:layout_width="match_parent" android:layout_height="match_parent" - android:animateLayoutChanges="true" + android:animateLayoutChanges="false" > - <FrameLayout - android:id="@+id/ticker" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_alignParentRight="true" - android:layout_toRightOf="@+id/systemInfo" - android:paddingLeft="6dip" - android:gravity="center_vertical" - android:animateLayoutChanges="true" - /> - + <!-- notification icons & panel access --> <LinearLayout android:id="@+id/notificationArea" android:layout_width="wrap_content" @@ -67,73 +57,89 @@ android:layout_width="wrap_content" android:layout_height="match_parent" > - <com.android.systemui.statusbar.policy.Clock - style="@*android:style/TextAppearance.StatusBar.Icon" + <com.android.systemui.statusbar.tablet.HoloClock android:id="@+id/clock" - android:layout_width="64dip" - android:layout_height="48dip" - android:singleLine="true" - android:gravity="center" - android:textSize="16sp" - android:textStyle="bold" - android:padding="2dip" - /> - <ImageView - android:id="@+id/battery" - android:layout_height="wrap_content" android:layout_width="wrap_content" - android:layout_gravity="center_vertical" - /> - <ImageView - android:id="@+id/network" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_gravity="center_vertical" - android:src="@drawable/ic_sysbar_wifi_mini" - /> + android:layout_height="match_parent" + > + <TextView android:id="@+id/time_bg" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:singleLine="true" + android:textSize="72dip" + android:textColor="#1f1f1f" /> + <TextView android:id="@+id/time_fg" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:singleLine="true" + android:textSize="72dip" + android:textColor="#2e2e2e" /> + </com.android.systemui.statusbar.tablet.HoloClock> + + <LinearLayout + android:layout_width="48dip" + android:layout_height="match_parent" + android:orientation="horizontal" + > + <ImageView + android:id="@+id/battery" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_gravity="center_vertical" + /> + <ImageView + android:id="@+id/network" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_gravity="center_vertical" + android:src="@drawable/ic_sysbar_wifi_mini" + /> + </LinearLayout> </LinearLayout> </LinearLayout> + <!-- navigation controls --> <LinearLayout android:id="@+id/navigationArea" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:orientation="horizontal" - android:animateLayoutChanges="true" + android:animateLayoutChanges="false" > <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" - android:layout_width="wrap_content" + android:layout_width="96dip" android:layout_height="match_parent" - android:paddingLeft="15dip" - android:paddingRight="15dip" + android:paddingLeft="18dip" + android:paddingRight="18dip" android:src="@drawable/ic_sysbar_back" android:background="@drawable/ic_sysbar_icon_bg" systemui:keyCode="4" /> <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" - android:layout_width="wrap_content" + android:layout_width="96dip" android:layout_height="match_parent" - android:paddingLeft="15dip" - android:paddingRight="15dip" + android:paddingLeft="18dip" + android:paddingRight="18dip" android:src="@drawable/ic_sysbar_home" android:background="@drawable/ic_sysbar_icon_bg" systemui:keyCode="3" /> <ImageButton android:id="@+id/recent_apps" - android:layout_width="wrap_content" + android:layout_width="96dip" android:layout_height="match_parent" android:src="@drawable/ic_sysbar_recent" android:background="@drawable/ic_sysbar_icon_bg" - android:paddingLeft="15dip" - android:paddingRight="15dip" + android:paddingLeft="18dip" + android:clickable="true" + android:paddingRight="18dip" /> <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu" - android:layout_width="wrap_content" + android:layout_width="96dip" android:layout_height="match_parent" - android:paddingLeft="15dip" - android:paddingRight="15dip" + android:paddingLeft="18dip" + android:paddingRight="18dip" android:src="@drawable/ic_sysbar_menu" android:background="@drawable/ic_sysbar_icon_bg" systemui:keyCode="82" @@ -141,11 +147,11 @@ /> <com.android.systemui.statusbar.tablet.ShirtPocket android:id="@+id/pocket" - android:layout_width="71dip" + android:layout_width="96dip" android:layout_height="match_parent" android:background="@drawable/ic_sysbar_icon_bg" - android:paddingLeft="15dip" - android:paddingRight="15dip" + android:paddingLeft="18dip" + android:paddingRight="18dip" android:animateLayoutChanges="true" android:clickable="true" android:descendantFocusability="blocksDescendants" @@ -170,18 +176,76 @@ android:visibility="invisible" /> </LinearLayout> - </RelativeLayout> - <!-- It's curtains for you. --> - <ImageView - android:id="@+id/lights_out" - android:src="@drawable/ic_sysbar_lightsout" - android:gravity="center" - android:background="#FF000000" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:visibility="invisible" - android:clickable="true" - /> -</com.android.systemui.statusbar.tablet.TabletStatusBarView> + <!-- lights out mode: "shadow" views --> + <ImageView + android:id="@+id/notification_shadow" + android:layout_width="176dip" + android:layout_height="match_parent" + android:paddingRight="48dip" + android:layout_alignParentRight="true" + android:layout_alignParentBottom="true" + android:src="@drawable/ic_sysbar_shadow" + android:visibility="gone" + android:scaleType="fitXY" + /> + <ImageView + android:id="@+id/back_shadow" + android:layout_width="96dip" + android:layout_height="match_parent" + android:paddingLeft="18dip" + android:paddingRight="18dip" + android:layout_alignParentLeft="true" + android:layout_alignParentBottom="true" + android:src="@drawable/ic_sysbar_shadow" + android:visibility="gone" + /> + <ImageView + android:id="@+id/home_shadow" + android:layout_width="96dip" + android:layout_height="match_parent" + android:paddingLeft="18dip" + android:paddingRight="18dip" + android:layout_toRightOf="@id/back_shadow" + android:layout_alignParentBottom="true" + android:src="@drawable/ic_sysbar_shadow" + android:visibility="gone" + /> + <ImageView + android:id="@+id/recent_shadow" + android:layout_width="96dip" + android:layout_height="match_parent" + android:paddingLeft="18dip" + android:paddingRight="18dip" + android:layout_toRightOf="@id/home_shadow" + android:layout_alignParentBottom="true" + android:src="@drawable/ic_sysbar_shadow" + android:visibility="gone" + /> + <ImageView + android:id="@+id/menu_shadow" + android:layout_width="96dip" + android:layout_height="match_parent" + android:paddingLeft="18dip" + android:paddingRight="18dip" + android:layout_toRightOf="@id/recent_shadow" + android:layout_alignParentBottom="true" + android:src="@drawable/ic_sysbar_shadow" + android:visibility="gone" + /> + + <!-- ticker: transient incoming notification information --> + <FrameLayout + android:id="@+id/ticker" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_alignParentRight="true" + android:layout_toRightOf="@+id/systemInfo" + android:paddingLeft="6dip" + android:gravity="center_vertical" + android:animateLayoutChanges="true" + /> + + </RelativeLayout> +</com.android.systemui.statusbar.tablet.TabletStatusBarView> diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml b/packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml index 049a1cc..b6679a5 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_latest_event.xml @@ -1,36 +1,35 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="65sp" - android:orientation="vertical" - android:background="@android:drawable/status_bar_item_background" + android:layout_height="65dp" + android:background="@drawable/status_bar_item_background" > <ImageButton android:id="@+id/veto" - android:layout_width="wrap_content" + android:layout_width="48dp" android:layout_height="match_parent" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:src="@drawable/status_bar_veto" android:scaleType="center" - android:background="@null" - android:paddingLeft="16dip" - android:paddingRight="16dip" + android:background="#ff000000" /> <com.android.systemui.statusbar.LatestItemView android:id="@+id/content" + android:layout_width="wrap_content" + android:layout_height="64sp" android:layout_alignParentTop="true" + android:layout_alignParentLeft="true" android:layout_toLeftOf="@id/veto" - android:layout_width="match_parent" - android:layout_height="64sp" + android:layout_marginLeft="16dp" android:focusable="true" android:clickable="true" - android:paddingRight="6sp" /> <View android:layout_width="match_parent" - android:layout_height="1sp" + android:layout_height="1dp" + android:layout_marginLeft="16dp" android:layout_alignParentBottom="true" android:background="@android:drawable/divider_horizontal_dark" /> diff --git a/packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml b/packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml index 884a473..b23cc7b 100644 --- a/packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml +++ b/packages/SystemUI/res/layout-xlarge/sysbar_panel_notifications.xml @@ -21,118 +21,149 @@ <!-- android:background="@drawable/status_bar_closed_default_background" --> <com.android.systemui.statusbar.tablet.NotificationPanel xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:background="@*android:drawable/dialog_full_holo_dark" - android:orientation="vertical" + android:layout_height="match_parent" + android:layout_width="540dp" android:animateLayoutChanges="true" + android:background="@drawable/bg_scrim_notification" + android:paddingBottom="32dp" > - <com.android.systemui.statusbar.policy.Clock - android:id="@+id/clock" + <com.android.systemui.statusbar.tablet.NotificationTitleArea + android:id="@+id/title_area" android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_alignParentTop="true" - android:gravity="right" - /> + android:layout_width="384dp" + android:layout_above="@+id/content_frame" + android:layout_marginLeft="24dp" + android:paddingBottom="16dp" + android:orientation="vertical" + android:animateLayoutChanges="true" + android:layout_alignParentRight="true" + > - <com.android.systemui.statusbar.policy.DateView - android:id="@+id/date" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_below="@id/clock" - android:gravity="right" - /> + <com.android.systemui.statusbar.tablet.HoloClock + android:id="@+id/clock" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:layout_alignParentTop="true" + android:layout_marginRight="40dip" + android:layout_marginBottom="4dip" + > + <TextView android:id="@+id/time_bg" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="right" + android:singleLine="true" + android:textSize="90dip" + android:textColor="#999999" /> + <TextView android:id="@+id/time_fg" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="right" + android:singleLine="true" + android:textSize="90dip" + android:textColor="#666666" /> + </com.android.systemui.statusbar.tablet.HoloClock> - <ImageView - android:id="@+id/settings_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@id/date" - android:layout_alignParentRight="true" - android:paddingRight="10dp" - android:src="@drawable/ic_sysbar_quicksettings" - android:baseline="17dp" - /> + <com.android.systemui.statusbar.policy.DateView + android:id="@+id/date" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:layout_below="@id/clock" + android:layout_marginRight="48dp" + android:gravity="right" + /> - <ImageView - android:id="@+id/notification_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignBaseline="@id/settings_button" - android:layout_alignParentRight="true" - android:paddingRight="10dp" - android:visibility="invisible" - android:src="@drawable/status_bar_veto" - android:baseline="17dp" - /> + <ImageView + android:id="@+id/battery" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_alignParentLeft="true" + android:layout_below="@id/date" + android:layout_marginTop="16dp" + android:layout_marginLeft="48dp" + android:src="@drawable/ic_sysbar_battery_mini" + android:baseline="17dp" + /> - <ImageView - android:id="@+id/battery" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_alignParentLeft="true" - android:layout_alignBaseline="@id/settings_button" - android:src="@drawable/ic_sysbar_battery_mini" - android:baseline="17dp" - /> + <TextView + android:id="@+id/battery_text" + android:layout_width="48dp" + android:layout_height="wrap_content" + android:layout_toRightOf="@id/battery" + android:layout_alignBaseline="@id/battery" + android:singleLine="true" + android:text="@string/system_panel_settings_button" + /> - <TextView - android:id="@+id/battery_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_toRightOf="@id/battery" - android:layout_alignBaseline="@id/settings_button" - android:singleLine="true" - android:text="@string/system_panel_settings_button" - /> + <ImageView + android:id="@+id/network" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_toRightOf="@id/battery_text" + android:layout_alignBaseline="@id/battery" + android:src="@drawable/ic_sysbar_wifi_mini" + android:baseline="21dp" + /> - <ImageView - android:id="@+id/network" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_toRightOf="@id/battery_text" - android:layout_alignBaseline="@id/settings_button" - android:src="@drawable/ic_sysbar_wifi_mini" - android:baseline="21dp" - /> + <TextView + android:id="@+id/network_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toRightOf="@id/network" + android:layout_alignBaseline="@id/battery" + android:singleLine="true" + android:text="@string/system_panel_settings_button" + /> - <TextView - android:id="@+id/network_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_toRightOf="@id/network" - android:layout_alignBaseline="@id/settings_button" - android:singleLine="true" - android:text="@string/system_panel_settings_button" - /> + <ImageView + android:id="@+id/settings_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_alignBaseline="@id/battery" + android:paddingRight="16dp" + android:src="@drawable/ic_notification_open" + android:baseline="17dp" + /> - <FrameLayout - android:id="@+id/settings_frame" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_below="@id/settings_button" - /> + <ImageView + android:id="@+id/notification_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_alignBaseline="@id/battery" + android:paddingRight="16dp" + android:visibility="invisible" + android:src="@drawable/status_bar_veto" + android:baseline="17dp" + /> + </com.android.systemui.statusbar.tablet.NotificationTitleArea> - <ScrollView - android:id="@+id/notificationScroller" + <FrameLayout + android:id="@+id/content_frame" android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_below="@id/settings_button" + android:layout_width="408dp" + android:layout_alignParentBottom="true" + android:layout_alignParentRight="true" > - <LinearLayout - android:id="@+id/content" - android:layout_width="match_parent" + <ScrollView + android:id="@+id/notificationScroller" android:layout_height="wrap_content" - android:gravity="center_horizontal|bottom" - android:animateLayoutChanges="true" - android:animationCache="false" - android:orientation="vertical" - android:background="@drawable/status_bar_background" - android:clickable="true" - android:focusable="true" - android:descendantFocusability="afterDescendants" + android:layout_width="match_parent" > - </LinearLayout> - </ScrollView> + <LinearLayout + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal|bottom" + android:animateLayoutChanges="true" + android:animationCache="false" + android:orientation="vertical" + android:clickable="true" + android:focusable="true" + android:descendantFocusability="afterDescendants" + > + </LinearLayout> + </ScrollView> + </FrameLayout> </com.android.systemui.statusbar.tablet.NotificationPanel> diff --git a/packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml b/packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml index c6ddfed..a800afb 100644 --- a/packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml +++ b/packages/SystemUI/res/layout-xlarge/sysbar_panel_settings.xml @@ -19,6 +19,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="200dip" + android:background="#ff000000" > </com.android.systemui.statusbar.tablet.SettingsPanel> diff --git a/packages/SystemUI/res/values-cs-xlarge/strings.xml b/packages/SystemUI/res/values-cs-xlarge/strings.xml index 33a3a08..a0301bb 100644 --- a/packages/SystemUI/res/values-cs-xlarge/strings.xml +++ b/packages/SystemUI/res/values-cs-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Baterie: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"žádné připojení k internetu"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: připojeno"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: připojování"</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mob. data: připojeno"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 828fae8..4e7f5cf 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazat"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-da-xlarge/strings.xml b/packages/SystemUI/res/values-da-xlarge/strings.xml index 3d99be3..d75b5a5 100644 --- a/packages/SystemUI/res/values-da-xlarge/strings.xml +++ b/packages/SystemUI/res/values-da-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batteri: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"ingen forbindelse"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi forbundet"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: forbinder..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobildata tilsluttet"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 74def1c..aad6d71 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-de-xlarge/strings.xml b/packages/SystemUI/res/values-de-xlarge/strings.xml index 0717429..eb402da 100644 --- a/packages/SystemUI/res/values-de-xlarge/strings.xml +++ b/packages/SystemUI/res/values-de-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Akku: <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"Keine Verbindung"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"WLAN: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"WLAN: verbunden"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"WLAN: verbindet..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobile Daten: aktiv"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index e033982..1674c22 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Löschen"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-el-xlarge/strings.xml b/packages/SystemUI/res/values-el-xlarge/strings.xml index 9c29e8b..63e59aa 100644 --- a/packages/SystemUI/res/values-el-xlarge/strings.xml +++ b/packages/SystemUI/res/values-el-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Μπαταρία: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"χωρίς σύνδ. σε Διαδ."</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: συνδέθηκε"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: σύνδεση..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Δεδ. κιν.: συνδέθηκε"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index ddcfc2c..bb7fab1 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Εκκαθάριση"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml b/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml new file mode 100644 index 0000000..b4f8f27 --- /dev/null +++ b/packages/SystemUI/res/values-es-rUS-xlarge/strings.xml @@ -0,0 +1,31 @@ +<?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"> + <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> + <skip /> + <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"no hay conexión a Internet"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> + <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: conectado"</string> + <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: conectando…"</string> + <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Datos para cel: conectado"</string> + <string name="system_panel_signal_meter_data_connecting" msgid="7183001278053801143">"Datos para cel: conectando"</string> +</resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index aff9f4ca..c18de7d 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> @@ -35,8 +35,7 @@ <!-- no translation found for invalid_charger (4549105996740522523) --> <skip /> <string name="battery_low_why" msgid="7279169609518386372">"Uso de la batería"</string> - <!-- no translation found for system_panel_settings_button (7832600575390861653) --> - <skip /> + <string name="system_panel_settings_button" msgid="7832600575390861653">"Configuración"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string> <!-- no translation found for recent_tasks_empty (1905484479067697884) --> <skip /> diff --git a/packages/SystemUI/res/values-es-xlarge/strings.xml b/packages/SystemUI/res/values-es-xlarge/strings.xml index e7214b6..2045aa8 100644 --- a/packages/SystemUI/res/values-es-xlarge/strings.xml +++ b/packages/SystemUI/res/values-es-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batería: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"sin conexión"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"WiFi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"WiFi: conectado"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"WiFi: conectando..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Datos móviles: conectados"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 0b6af34..84b7e32 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-fr-xlarge/strings.xml b/packages/SystemUI/res/values-fr-xlarge/strings.xml index 8566a96..36c6f77 100644 --- a/packages/SystemUI/res/values-fr-xlarge/strings.xml +++ b/packages/SystemUI/res/values-fr-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batterie : <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"Internet indisponible"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi : <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi : connecté"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi : connexion..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Données mobiles connectées"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 0e2a765..914e98e 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-it-xlarge/strings.xml b/packages/SystemUI/res/values-it-xlarge/strings.xml index 62ce9f2..512dfa4 100644 --- a/packages/SystemUI/res/values-it-xlarge/strings.xml +++ b/packages/SystemUI/res/values-it-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batteria: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"no conness. Internet"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: connesso"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: connessione…"</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Dati cell.: connesso"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index c45bb4c..849be2e 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Cancella"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-ja-xlarge/strings.xml b/packages/SystemUI/res/values-ja-xlarge/strings.xml index 72e6025..01dacb3 100644 --- a/packages/SystemUI/res/values-ja-xlarge/strings.xml +++ b/packages/SystemUI/res/values-ja-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"電池: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"インターネット接続なし"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: 接続されました"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: 接続中..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"データ通信: 接続されました"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index f6a8e5f..f787541 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"通知を消去"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-ko-xlarge/strings.xml b/packages/SystemUI/res/values-ko-xlarge/strings.xml index 8aa38e1..a26940a 100644 --- a/packages/SystemUI/res/values-ko-xlarge/strings.xml +++ b/packages/SystemUI/res/values-ko-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"배터리: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"인터넷에 연결되지 않음"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: 연결됨"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: 연결 중…"</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"모바일 데이터: 연결됨"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 1189194..ff82d99 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"지우기"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-nb-xlarge/strings.xml b/packages/SystemUI/res/values-nb-xlarge/strings.xml index 8d59b43..9a95faf 100644 --- a/packages/SystemUI/res/values-nb-xlarge/strings.xml +++ b/packages/SystemUI/res/values-nb-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batteri: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"ingen Int.-tilkobl."</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: tilkoblet"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: kobler til"</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mob.data: tilkoblet"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index b5f4676..aefd2ec 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Fjern"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-nl-xlarge/strings.xml b/packages/SystemUI/res/values-nl-xlarge/strings.xml index 750f20f..8ab6234 100644 --- a/packages/SystemUI/res/values-nl-xlarge/strings.xml +++ b/packages/SystemUI/res/values-nl-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Accu: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"geen internet"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: verbonden"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: verbinden…"</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobiel: verbonden"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index ec8fcfb..e7fd55b 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wissen"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-pl-xlarge/strings.xml b/packages/SystemUI/res/values-pl-xlarge/strings.xml index d816068..a11754b 100644 --- a/packages/SystemUI/res/values-pl-xlarge/strings.xml +++ b/packages/SystemUI/res/values-pl-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Bateria: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"brak połączenia internetowego"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: połączono"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: łączenie…"</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Sieć komórkowa: połączono"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 7034a6d..108ef13 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wyczyść"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml b/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml index 4aa75b8..9f20932 100644 --- a/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Bateria: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"Sem ligação à internet"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: ligado"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: a ligar…"</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Dados móveis: ligado"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 80028a2..1f38ed7 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-pt-xlarge/strings.xml b/packages/SystemUI/res/values-pt-xlarge/strings.xml index 811dae8..481263f 100644 --- a/packages/SystemUI/res/values-pt-xlarge/strings.xml +++ b/packages/SystemUI/res/values-pt-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Bateria: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"Sem conex. à intern."</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: conectado"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: conectando…"</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Dados móv: conectado"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 006379c..83bde68 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml index 646d7f5..8a5014e 100644 --- a/packages/SystemUI/res/values-rm/strings.xml +++ b/packages/SystemUI/res/values-rm/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Stizzar"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-ru-xlarge/strings.xml b/packages/SystemUI/res/values-ru-xlarge/strings.xml index f602b34..7514d4b 100644 --- a/packages/SystemUI/res/values-ru-xlarge/strings.xml +++ b/packages/SystemUI/res/values-ru-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Батарея: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"связь отсутствует"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: подключено"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: подключение..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Моб. данные: подключено"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index d598ff3..f701fe3 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очистить"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-sv-xlarge/strings.xml b/packages/SystemUI/res/values-sv-xlarge/strings.xml index 20d7081..ccc30ec 100644 --- a/packages/SystemUI/res/values-sv-xlarge/strings.xml +++ b/packages/SystemUI/res/values-sv-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Batteri: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"ingen Internetanslutn."</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi: ansluten"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi: ansluter..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobildata: ansluten"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 6ecdfa8..4f9cfd0 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ta bort"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-tr-xlarge/strings.xml b/packages/SystemUI/res/values-tr-xlarge/strings.xml index 7782627..008006d 100644 --- a/packages/SystemUI/res/values-tr-xlarge/strings.xml +++ b/packages/SystemUI/res/values-tr-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"Pil: <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"internet bağlantısı yok"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Kablosuz: <xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Kablosuz: bağlı"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Kablosuz: bağlanıyor..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"Mobil veri: bağlı"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 059a4f1..cef5539 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Temizle"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml index 1c3624b..68b0fac 100644 --- a/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"电池:<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"无互联网连接"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi:<xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-Fi:已连接"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi:正在连接..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"移动数据:已连接"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 9c1f71f..9ed98c9 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml index 720c043..bc41d11 100644 --- a/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW-xlarge/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for status_bar_clear_all_button (4722520806446512408) --> <skip /> - <string name="system_panel_battery_meter_format" msgid="5960820602924445469">"電池:<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="system_panel_signal_meter_disconnected" msgid="2123001074951934237">"沒有網際網路連線"</string> - <string name="system_panel_signal_meter_wifi_ssid_format" msgid="5953412790748091921">"Wi-Fi:<xliff:g id="SSID">%s</xliff:g>"</string> + <!-- no translation found for system_panel_signal_meter_wifi_ssid_format (6261810256542749384) --> + <skip /> <string name="system_panel_signal_meter_wifi_nossid" msgid="160846667119240422">"Wi-F:已連線"</string> <string name="system_panel_signal_meter_wifi_connecting" msgid="4087640898624652649">"Wi-Fi:連線中..."</string> <string name="system_panel_signal_meter_data_connected" msgid="2171100321540926054">"行動數據:已連線"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 11051be..4dc323b 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for app_label (4489004083283879149) --> + <!-- no translation found for app_label (7164937344850004466) --> <skip /> <string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string> <!-- no translation found for status_bar_do_not_disturb_button (5812628897510997853) --> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index a0def6b..fd2cf99 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -18,4 +18,5 @@ --> <resources> <drawable name="notification_number_text_color">#ffffffff</drawable> + <drawable name="notification_item_background_color">#ff000000</drawable> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java new file mode 100644 index 0000000..3b76434 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HoloClock.java @@ -0,0 +1,169 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.tablet; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.AssetManager; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.format.DateFormat; +import android.text.style.CharacterStyle; +import android.text.style.ForegroundColorSpan; +import android.text.style.RelativeSizeSpan; +import android.text.style.RelativeSizeSpan; +import android.text.style.StyleSpan; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.TimeZone; + +import com.android.systemui.R; + +public class HoloClock extends FrameLayout { + private boolean mAttached; + private Calendar mCalendar; + private String mClockFormatString; + private SimpleDateFormat mClockFormat; + + private static Typeface sBackgroundType, sForegroundType; + private TextView mBgText, mFgText; + + public HoloClock(Context context) { + this(context, null); + } + + public HoloClock(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public HoloClock(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + if (sBackgroundType == null) { + AssetManager assets = getContext().getAssets(); + + sBackgroundType = Typeface.createFromAsset(assets, + "fonts/AndroidClock.ttf"); + sForegroundType = Typeface.createFromAsset(assets, + "fonts/AndroidClock2.ttf"); + } + mBgText = (TextView) findViewById(R.id.time_bg); + if (mBgText != null) { + mBgText.setTypeface(sBackgroundType); + } + mFgText = (TextView) findViewById(R.id.time_fg); + if (mFgText != null) { + mFgText.setTypeface(sForegroundType); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + if (!mAttached) { + mAttached = true; + IntentFilter filter = new IntentFilter(); + + filter.addAction(Intent.ACTION_TIME_TICK); + filter.addAction(Intent.ACTION_TIME_CHANGED); + filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); + filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + + getContext().registerReceiver(mIntentReceiver, filter, null, getHandler()); + } + + // NOTE: It's safe to do these after registering the receiver since the receiver always runs + // in the main thread, therefore the receiver can't run before this method returns. + + // The time zone may have changed while the receiver wasn't registered, so update the Time + mCalendar = Calendar.getInstance(TimeZone.getDefault()); + + // Make sure we update to the current time + updateClock(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mAttached) { + getContext().unregisterReceiver(mIntentReceiver); + mAttached = false; + } + } + + private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) { + String tz = intent.getStringExtra("time-zone"); + mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz)); + if (mClockFormat != null) { + mClockFormat.setTimeZone(mCalendar.getTimeZone()); + } + } + updateClock(); + } + }; + + final void updateClock() { + mCalendar.setTimeInMillis(System.currentTimeMillis()); + CharSequence txt = getTimeText(); + mBgText.setText(txt); + mFgText.setText(txt); + } + + private final CharSequence getTimeText() { + Context context = getContext(); + int res = DateFormat.is24HourFormat(context) + ? com.android.internal.R.string.twenty_four_hour_time_format + : com.android.internal.R.string.twelve_hour_time_format; + + SimpleDateFormat sdf; + String format = context.getString(res); + if (!format.equals(mClockFormatString)) { + // we don't want AM/PM showing up in our statusbar, even in 12h mode + format = format.replaceAll("a", "").trim(); + mClockFormat = sdf = new SimpleDateFormat(format); + mClockFormatString = format; + } else { + sdf = mClockFormat; + } + String result = sdf.format(mCalendar.getTime()); + return result; + } +} + 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 ce81fdc..80cb5b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java @@ -22,6 +22,7 @@ import android.util.Slog; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; +import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; @@ -31,10 +32,11 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, View.OnClickListener { static final String TAG = "NotificationPanel"; + View mTitleArea; View mSettingsButton; View mNotificationButton; View mNotificationScroller; - FrameLayout mSettingsFrame; + FrameLayout mContentFrame; View mSettingsPanel; public NotificationPanel(Context context, AttributeSet attrs) { @@ -49,13 +51,15 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, public void onFinishInflate() { super.onFinishInflate(); + mTitleArea = findViewById(R.id.title_area); + mSettingsButton = (ImageView)findViewById(R.id.settings_button); mSettingsButton.setOnClickListener(this); mNotificationButton = (ImageView)findViewById(R.id.notification_button); mNotificationButton.setOnClickListener(this); mNotificationScroller = findViewById(R.id.notificationScroller); - mSettingsFrame = (FrameLayout)findViewById(R.id.settings_frame); + mContentFrame = (FrameLayout)findViewById(R.id.content_frame); } @Override @@ -91,22 +95,24 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, } public boolean isInContentArea(int x, int y) { - final int l = getPaddingLeft(); - final int r = getWidth() - getPaddingRight(); - final int t = getPaddingTop(); - final int b = getHeight() - getPaddingBottom(); + final int l = mContentFrame.getLeft(); + final int r = mContentFrame.getRight(); + final int t = mTitleArea.getTop(); + final int b = mContentFrame.getBottom(); return x >= l && x < r && y >= t && y < b; } void removeSettingsPanel() { if (mSettingsPanel != null) { - mSettingsFrame.removeViewAt(0); + mContentFrame.removeView(mSettingsPanel); mSettingsPanel = null; } } void addSettingsPanel() { - mSettingsPanel = View.inflate(getContext(), R.layout.sysbar_panel_settings, mSettingsFrame); + LayoutInflater infl = LayoutInflater.from(getContext()); + mSettingsPanel = infl.inflate(R.layout.sysbar_panel_settings, mContentFrame, false); + mContentFrame.addView(mSettingsPanel); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java new file mode 100644 index 0000000..d4413db --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationTitleArea.java @@ -0,0 +1,95 @@ +/* + * 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. + */ + +package com.android.systemui.statusbar.tablet; + +import android.content.Context; +import android.graphics.BitmapFactory; +import android.graphics.Bitmap; +import android.graphics.Paint; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.util.Slog; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.view.View; +import android.widget.FrameLayout; + +import com.android.systemui.R; + +public class NotificationTitleArea extends RelativeLayout { + static final String TAG = "NotificationTitleArea"; + + View mSettingsButton; + View mNotificationButton; + View mNotificationScroller; + FrameLayout mSettingsFrame; + View mSettingsPanel; + + // for drawing the background + Bitmap mTexture; + Paint mPaint; + int mTextureWidth; + int mTextureHeight; + + + public NotificationTitleArea(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public NotificationTitleArea(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + // for drawing the background + mTexture = BitmapFactory.decodeResource(getResources(), R.drawable.panel_notification); + mTextureWidth = mTexture.getWidth(); + mTextureHeight = mTexture.getHeight(); + + mPaint = new Paint(); + mPaint.setDither(false); + } + + public void onFinishInflate() { + super.onFinishInflate(); + setWillNotDraw(false); + } + + @Override + public void onDraw(Canvas canvas) { + final Bitmap texture = mTexture; + final Paint paint = mPaint; + + final int width = getWidth(); + final int height = getHeight(); + + final int textureWidth = mTextureWidth; + final int textureHeight = mTextureHeight; + + int x = 0; + int y; + + while (x < width) { + y = 0; + while (y < height) { + canvas.drawBitmap(texture, x, y, paint); + y += textureHeight; + } + x += textureWidth; + } + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java new file mode 100644 index 0000000..5eafdc1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/PanelBackgroundView.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.Slog; +import android.view.View; +import android.graphics.BitmapFactory; +import android.graphics.Bitmap; +import android.graphics.Paint; +import android.graphics.Canvas; + +public class PanelBackgroundView extends View { + private Bitmap mTexture; + private Paint mPaint; + private int mTextureWidth; + private int mTextureHeight; + + public PanelBackgroundView(Context context, AttributeSet attrs) { + super(context, attrs); + /* + mTexture = BitmapFactory.decodeResource(getResources(), + com.android.internal.R.drawable.status_bar_background); + mTextureWidth = mTexture.getWidth(); + mTextureHeight = mTexture.getHeight(); + + mPaint = new Paint(); + mPaint.setDither(false); + */ + } + + @Override + public void onDraw(Canvas canvas) { + /* + final Bitmap texture = mTexture; + final Paint paint = mPaint; + + final int width = getWidth(); + final int height = getHeight(); + + final int textureWidth = mTextureWidth; + final int textureHeight = mTextureHeight; + + int x = 0; + int y; + + while (x < width) { + y = 0; + while (y < height) { + canvas.drawBitmap(texture, x, y, paint); + y += textureHeight; + } + x += textureWidth; + } + */ + } +} 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 983215e..7c97ac7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -31,6 +31,8 @@ import android.content.Intent; import android.content.res.Resources; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; import android.os.Handler; import android.os.IBinder; import android.os.Message; @@ -75,12 +77,15 @@ public class TabletStatusBar extends StatusBar { public static final int MSG_CLOSE_NOTIFICATION_PEEK = 1003; public static final int MSG_OPEN_RECENTS_PANEL = 1020; public static final int MSG_CLOSE_RECENTS_PANEL = 1021; - public static final int MSG_LIGHTS_ON = 1030; - public static final int MSG_LIGHTS_OUT = 1031; + public static final int MSG_HIDE_SHADOWS = 1030; + public static final int MSG_SHOW_SHADOWS = 1031; + public static final int MSG_RESTORE_SHADOWS = 1032; private static final int MAX_IMAGE_LEVEL = 10000; private static final boolean USE_2D_RECENTS = true; + public static final int LIGHTS_ON_DELAY = 5000; + int mIconSize; H mHandler = new H(); @@ -93,6 +98,9 @@ public class TabletStatusBar extends StatusBar { View mNotificationTrigger; NotificationIconArea mNotificationIconArea; View mNavigationArea; + + View mBackButton; + View mHomeButton; View mMenuButton; View mRecentButton; @@ -113,7 +121,10 @@ public class TabletStatusBar extends StatusBar { NetworkController mNetworkController; View mBarContents; - View mCurtains; + + // lights out support + View mBackShadow, mHomeShadow, mRecentShadow, mMenuShadow, mNotificationShadow; + ShadowController mShadowController; NotificationIconArea.IconLayout mIconLayout; @@ -153,8 +164,8 @@ public class TabletStatusBar extends StatusBar { mStatusBarView.setIgnoreChildren(0, mNotificationTrigger, mNotificationPanel); WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - 512, // ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM @@ -245,14 +256,21 @@ public class TabletStatusBar extends StatusBar { sb.setHandler(mHandler); mBarContents = sb.findViewById(R.id.bar_contents); - mCurtains = sb.findViewById(R.id.lights_out); - mRecentButton = sb.findViewById(R.id.recent_apps); - mRecentButton.setOnClickListener(mOnClickListener); + // "shadows" of the status bar features, for lights-out mode + mBackShadow = sb.findViewById(R.id.back_shadow); + mHomeShadow = sb.findViewById(R.id.home_shadow); + mRecentShadow = sb.findViewById(R.id.recent_shadow); + mMenuShadow = sb.findViewById(R.id.menu_shadow); + mNotificationShadow = sb.findViewById(R.id.notification_shadow); + + mShadowController = new ShadowController(false); - SetLightsOnListener on = new SetLightsOnListener(true); - mCurtains.setOnClickListener(on); - mCurtains.setOnLongClickListener(on); + mBackShadow.setOnTouchListener(mShadowController.makeTouchListener()); + mHomeShadow.setOnTouchListener(mShadowController.makeTouchListener()); + mRecentShadow.setOnTouchListener(mShadowController.makeTouchListener()); + mMenuShadow.setOnTouchListener(mShadowController.makeTouchListener()); + mNotificationShadow.setOnTouchListener(mShadowController.makeTouchListener()); // the whole right-hand side of the bar mNotificationArea = sb.findViewById(R.id.notificationArea); @@ -282,10 +300,15 @@ public class TabletStatusBar extends StatusBar { // The navigation buttons mNavigationArea = sb.findViewById(R.id.navigationArea); + mBackButton = mNavigationArea.findViewById(R.id.back); + mHomeButton = mNavigationArea.findViewById(R.id.home); mMenuButton = mNavigationArea.findViewById(R.id.menu); + mRecentButton = mNavigationArea.findViewById(R.id.recent_apps); + Slog.d(TAG, "rec=" + mRecentButton + ", listener=" + mOnClickListener); + mRecentButton.setOnClickListener(mOnClickListener); // The bar contents buttons - mInputMethodButton = (InputMethodButton) mBarContents.findViewById(R.id.imeButton); + mInputMethodButton = (InputMethodButton) sb.findViewById(R.id.imeButton); // set the initial view visibility setAreThereNotifications(); @@ -362,6 +385,8 @@ public class TabletStatusBar extends StatusBar { mNotificationPeekWindow.setVisibility(View.GONE); mNotificationPanel.setVisibility(View.VISIBLE); + + // XXX: need to synchronize with shadows here mNotificationArea.setVisibility(View.GONE); } break; @@ -369,6 +394,8 @@ public class TabletStatusBar extends StatusBar { if (DEBUG) Slog.d(TAG, "closing notifications panel"); if (mNotificationPanel.getVisibility() == View.VISIBLE) { mNotificationPanel.setVisibility(View.GONE); + + // XXX: need to synchronize with shadows here mNotificationArea.setVisibility(View.VISIBLE); } break; @@ -380,14 +407,18 @@ public class TabletStatusBar extends StatusBar { if (DEBUG) Slog.d(TAG, "closing recents panel"); if (mRecentsPanel != null) mRecentsPanel.setVisibility(View.GONE); break; - case MSG_LIGHTS_ON: - setViewVisibility(mCurtains, View.GONE, R.anim.lights_out_out); - setViewVisibility(mBarContents, View.VISIBLE, R.anim.status_bar_in); + case MSG_HIDE_SHADOWS: + if (DEBUG) Slog.d(TAG, "hiding shadows (lights on)"); + mShadowController.hideAllShadows(); break; - case MSG_LIGHTS_OUT: + case MSG_SHOW_SHADOWS: + if (DEBUG) Slog.d(TAG, "showing shadows (lights out)"); animateCollapse(); - setViewVisibility(mCurtains, View.VISIBLE, R.anim.lights_out_in); - setViewVisibility(mBarContents, View.GONE, R.anim.status_bar_out); + mShadowController.showAllShadows(); + break; + case MSG_RESTORE_SHADOWS: + if (DEBUG) Slog.d(TAG, "quickly re-showing shadows if appropriate"); + mShadowController.refresh(); break; } } @@ -434,7 +465,7 @@ public class TabletStatusBar extends StatusBar { Slog.d(TAG, "Top activity is " + (immersive?"immersive":"not immersive")); } catch (RemoteException ex) { } - if (immersive) { + if (false && immersive) { // TODO: immersive mode popups for tablet } else if (notification.notification.fullScreenIntent != null) { // not immersive & a full-screen alert should be shown @@ -605,16 +636,16 @@ public class TabletStatusBar extends StatusBar { // called by StatusBar @Override public void setLightsOn(boolean on) { - mHandler.removeMessages(MSG_LIGHTS_OUT); - mHandler.removeMessages(MSG_LIGHTS_ON); - mHandler.sendEmptyMessage(on ? MSG_LIGHTS_ON : MSG_LIGHTS_OUT); + mHandler.removeMessages(MSG_SHOW_SHADOWS); + mHandler.removeMessages(MSG_HIDE_SHADOWS); + mHandler.sendEmptyMessage(on ? MSG_HIDE_SHADOWS : MSG_SHOW_SHADOWS); } public void setMenuKeyVisible(boolean visible) { if (DEBUG) { Slog.d(TAG, (visible?"showing":"hiding") + " the MENU button"); } - mMenuButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); + mMenuButton.setVisibility(visible ? View.VISIBLE : View.GONE); } public void setIMEButtonVisible(boolean visible) { @@ -664,7 +695,7 @@ public class TabletStatusBar extends StatusBar { }; public void onClickNotificationTrigger() { - if (DEBUG) Slog.d(TAG, "clicked notification icons"); + if (DEBUG) Slog.d(TAG, "clicked notification icons; disabled=" + mDisabled); if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { if (!mNotificationsOn) { mNotificationsOn = true; @@ -681,7 +712,7 @@ public class TabletStatusBar extends StatusBar { } public void onClickRecentButton() { - if (DEBUG) Slog.d(TAG, "clicked recent apps"); + if (DEBUG) Slog.d(TAG, "clicked recent apps; disabled=" + mDisabled); if (mRecentsPanel == null) { Intent intent = new Intent(); intent.setClass(mContext, RecentApplicationsActivity.class); @@ -939,6 +970,13 @@ public class TabletStatusBar extends StatusBar { } } + void workAroundBadLayerDrawableOpacity(View v) { + LayerDrawable d = (LayerDrawable)v.getBackground(); + v.setBackgroundDrawable(null); + d.setOpacity(PixelFormat.TRANSLUCENT); + v.setBackgroundDrawable(d); + } + private boolean inflateViews(NotificationData.Entry entry, ViewGroup parent) { StatusBarNotification sbn = entry.notification; RemoteViews remoteViews = sbn.notification.contentView; @@ -950,6 +988,7 @@ public class TabletStatusBar extends StatusBar { LayoutInflater inflater = (LayoutInflater)mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE); View row = inflater.inflate(R.layout.status_bar_latest_event, parent, false); + workAroundBadLayerDrawableOpacity(row); View vetoButton = row.findViewById(R.id.veto); if (entry.notification.isClearable()) { final String _pkg = sbn.pkg; @@ -1006,23 +1045,108 @@ public class TabletStatusBar extends StatusBar { return true; } - public class SetLightsOnListener implements View.OnLongClickListener, - View.OnClickListener { - private boolean mOn; + public class ShadowController { + boolean mShowShadows; + View mTouchTarget; - SetLightsOnListener(boolean on) { - mOn = on; + ShadowController(boolean showShadows) { + mShowShadows = showShadows; + mTouchTarget = null; } - public void onClick(View v) { - setLightsOn(mOn); + public boolean getShadowState() { + return mShowShadows; + } + + public View.OnTouchListener makeTouchListener() { + return new View.OnTouchListener() { + public boolean onTouch(View v, MotionEvent ev) { + final int action = ev.getAction(); + + if (DEBUG) Slog.d(TAG, "ShadowController: v=" + v + ", ev=" + ev); + + // currently redirecting events? + if (mTouchTarget == null) { + if (v == mBackShadow) { + mTouchTarget = mBackButton; + } else if (v == mHomeShadow) { + mTouchTarget = mHomeButton; + } else if (v == mMenuShadow) { + mTouchTarget = mMenuButton; + } else if (v == mRecentShadow) { + mTouchTarget = mRecentButton; + } else if (v == mNotificationShadow) { + mTouchTarget = mNotificationArea; + } + } + + if (mTouchTarget != null && mTouchTarget.getVisibility() != View.GONE) { + boolean last = false; + switch (action) { + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + mHandler.removeMessages(MSG_RESTORE_SHADOWS); + if (mShowShadows) { + mHandler.sendEmptyMessageDelayed(MSG_RESTORE_SHADOWS, + v == mNotificationShadow ? 5000 : 500); + } + last = true; + break; + case MotionEvent.ACTION_DOWN: + mHandler.removeMessages(MSG_RESTORE_SHADOWS); + setShadowForButton(mTouchTarget, false); + break; + } + mTouchTarget.dispatchTouchEvent(ev); + if (last) mTouchTarget = null; + return true; + } + + return false; + } + }; } - public boolean onLongClick(View v) { - setLightsOn(mOn); - return true; + public void refresh() { + setShadowForButton(mBackButton, mShowShadows); + setShadowForButton(mHomeButton, mShowShadows); + setShadowForButton(mRecentButton, mShowShadows); + setShadowForButton(mMenuButton, mShowShadows); + setShadowForButton(mNotificationArea, mShowShadows); } + public void showAllShadows() { + mShowShadows = true; + refresh(); + } + + public void hideAllShadows() { + mShowShadows = false; + refresh(); + } + + // Use View.INVISIBLE for things hidden due to shadowing, and View.GONE for things that are + // disabled (and should not be shadowed or re-shown) + public void setShadowForButton(View button, boolean shade) { + View shadow = null; + if (button == mBackButton) { + shadow = mBackShadow; + } else if (button == mHomeButton) { + shadow = mHomeShadow; + } else if (button == mMenuButton) { + shadow = mMenuShadow; + } else if (button == mRecentButton) { + shadow = mRecentShadow; + } else if (button == mNotificationArea) { + shadow = mNotificationShadow; + } + if (shadow != null) { + if (button.getVisibility() != View.GONE) { + shadow.setVisibility(shade ? View.VISIBLE : View.INVISIBLE); + button.setVisibility(shade ? View.INVISIBLE : View.VISIBLE); + } + } + } } public class TouchOutsideListener implements View.OnTouchListener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java index bd8266a..823b793 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.tablet; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; +import android.util.Slog; import android.view.View; import android.view.MotionEvent; import android.widget.FrameLayout; @@ -40,6 +41,9 @@ public class TabletStatusBarView extends FrameLayout { public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { + if (TabletStatusBar.DEBUG) { + Slog.d(TabletStatusBar.TAG, "TabletStatusBarView intercepting touch event: " + ev); + } mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL); mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL); mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL); @@ -48,6 +52,9 @@ public class TabletStatusBarView extends FrameLayout { for (int i=0; i < mPanels.length; i++) { if (mPanels[i] != null && mPanels[i].getVisibility() == View.VISIBLE) { if (eventInside(mIgnoreChildren[i], ev)) { + if (TabletStatusBar.DEBUG) { + Slog.d(TabletStatusBar.TAG, "TabletStatusBarView eating event for view: " + mIgnoreChildren[i]); + } return true; } } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index bb39c8f..18815f5 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -1832,7 +1832,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); - ActionMode mode = getCallback().onWindowStartingActionMode(wrappedCallback); + ActionMode mode = null; + try { + mode = getCallback().onWindowStartingActionMode(wrappedCallback); + } catch (AbstractMethodError ame) { + // Older apps might not implement this callback method. + } if (mode != null) { mActionMode = mode; } else { @@ -1877,7 +1882,11 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } if (mActionMode != null) { - getCallback().onActionModeStarted(mActionMode); + try { + getCallback().onActionModeStarted(mActionMode); + } catch (AbstractMethodError ame) { + // Older apps might not implement this callback method. + } } return mActionMode; } @@ -2094,7 +2103,11 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (mActionModeView != null) { mActionModeView.removeAllViews(); } - getCallback().onActionModeFinished(mActionMode); + try { + getCallback().onActionModeFinished(mActionMode); + } catch (AbstractMethodError ame) { + // Older apps might not implement this callback method. + } mActionMode = null; } } diff --git a/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java b/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java index 5518e11..486e7aa 100644 --- a/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java +++ b/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java @@ -130,9 +130,10 @@ public class SimUnlockScreen extends LinearLayout implements KeyguardScreen, Vie /** {@inheritDoc} */ public void cleanUp() { - // hide the dialog. + // dismiss the dialog. if (mSimUnlockProgressDialog != null) { - mSimUnlockProgressDialog.hide(); + mSimUnlockProgressDialog.dismiss(); + mSimUnlockProgressDialog = null; } mUpdateMonitor.removeCallback(this); } diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index cd9b07e..84dd022 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -5808,7 +5808,8 @@ uint32_t AudioFlinger::EffectModule::deviceAudioSystemToEffectApi(uint32_t devic const uint32_t AudioFlinger::EffectModule::sModeConvTable[] = { AUDIO_MODE_NORMAL, // AudioSystem::MODE_NORMAL AUDIO_MODE_RINGTONE, // AudioSystem::MODE_RINGTONE - AUDIO_MODE_IN_CALL // AudioSystem::MODE_IN_CALL + AUDIO_MODE_IN_CALL, // AudioSystem::MODE_IN_CALL + AUDIO_MODE_IN_CALL // AudioSystem::MODE_IN_COMMUNICATION, same conversion as for MODE_IN_CALL }; int AudioFlinger::EffectModule::modeAudioSystemToEffectApi(uint32_t mode) diff --git a/services/audioflinger/AudioPolicyManagerBase.cpp b/services/audioflinger/AudioPolicyManagerBase.cpp index b17584a..e3b5db1 100644 --- a/services/audioflinger/AudioPolicyManagerBase.cpp +++ b/services/audioflinger/AudioPolicyManagerBase.cpp @@ -246,7 +246,7 @@ void AudioPolicyManagerBase::setPhoneState(int state) // if leaving call state, handle special case of active streams // pertaining to sonification strategy see handleIncallSonification() - if (mPhoneState == AudioSystem::MODE_IN_CALL) { + if (isInCall()) { LOGV("setPhoneState() in call state management: new state is %d", state); for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) { handleIncallSonification(stream, false, true); @@ -259,16 +259,21 @@ void AudioPolicyManagerBase::setPhoneState(int state) bool force = false; // are we entering or starting a call - if ((oldState != AudioSystem::MODE_IN_CALL) && (state == AudioSystem::MODE_IN_CALL)) { + if (!isStateInCall(oldState) && isStateInCall(state)) { LOGV(" Entering call in setPhoneState()"); // force routing command to audio hardware when starting a call // even if no device change is needed force = true; - } else if ((oldState == AudioSystem::MODE_IN_CALL) && (state != AudioSystem::MODE_IN_CALL)) { + } else if (isStateInCall(oldState) && !isStateInCall(state)) { LOGV(" Exiting call in setPhoneState()"); // force routing command to audio hardware when exiting a call // even if no device change is needed force = true; + } else if (isStateInCall(state) && (state != oldState)) { + LOGV(" Switching between telephony and VoIP in setPhoneState()"); + // force routing command to audio hardware when switching between telephony and VoIP + // even if no device change is needed + force = true; } // check for device and output changes triggered by new phone state @@ -290,7 +295,7 @@ void AudioPolicyManagerBase::setPhoneState(int state) // force routing command to audio hardware when ending call // even if no device change is needed - if (oldState == AudioSystem::MODE_IN_CALL && newDevice == 0) { + if (isStateInCall(oldState) && newDevice == 0) { newDevice = hwOutputDesc->device(); } @@ -298,7 +303,7 @@ void AudioPolicyManagerBase::setPhoneState(int state) // immediately and delay the route change to avoid sending the ring tone // tail into the earpiece or headset. int delayMs = 0; - if (state == AudioSystem::MODE_IN_CALL && oldState == AudioSystem::MODE_RINGTONE) { + if (isStateInCall(state) && oldState == AudioSystem::MODE_RINGTONE) { // delay the device change command by twice the output latency to have some margin // and be sure that audio buffers not yet affected by the mute are out when // we actually apply the route change @@ -311,7 +316,7 @@ void AudioPolicyManagerBase::setPhoneState(int state) // if entering in call state, handle special case of active streams // pertaining to sonification strategy see handleIncallSonification() - if (state == AudioSystem::MODE_IN_CALL) { + if (isStateInCall(state)) { LOGV("setPhoneState() in call state management: new state is %d", state); // unmute the ringing tone after a sufficient delay if it was muted before // setting output device above @@ -586,7 +591,7 @@ status_t AudioPolicyManagerBase::startOutput(audio_io_handle_t output, setOutputDevice(output, getNewDevice(output)); // handle special case for sonification while in call - if (mPhoneState == AudioSystem::MODE_IN_CALL) { + if (isInCall()) { handleIncallSonification(stream, true, false); } @@ -611,7 +616,7 @@ status_t AudioPolicyManagerBase::stopOutput(audio_io_handle_t output, routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream); // handle special case for sonification while in call - if (mPhoneState == AudioSystem::MODE_IN_CALL) { + if (isInCall()) { handleIncallSonification(stream, false, false); } @@ -1478,7 +1483,7 @@ uint32_t AudioPolicyManagerBase::getNewDevice(audio_io_handle_t output, bool fro // use device for strategy media // 4: the strategy DTMF is active on the hardware output: // use device for strategy DTMF - if (mPhoneState == AudioSystem::MODE_IN_CALL || + if (isInCall() || outputDesc->isUsedByStrategy(STRATEGY_PHONE)) { device = getDeviceForStrategy(STRATEGY_PHONE, fromCache); } else if (outputDesc->isUsedByStrategy(STRATEGY_SONIFICATION)) { @@ -1533,7 +1538,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy, switch (strategy) { case STRATEGY_DTMF: - if (mPhoneState != AudioSystem::MODE_IN_CALL) { + if (!isInCall()) { // when off call, DTMF strategy follows the same rules as MEDIA strategy device = getDeviceForStrategy(STRATEGY_MEDIA, false); break; @@ -1546,7 +1551,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy, // of priority switch (mForceUse[AudioSystem::FOR_COMMUNICATION]) { case AudioSystem::FORCE_BT_SCO: - if (mPhoneState != AudioSystem::MODE_IN_CALL || strategy != STRATEGY_DTMF) { + if (!isInCall() || strategy != STRATEGY_DTMF) { device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT; if (device) break; } @@ -1566,7 +1571,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy, if (device) break; #ifdef WITH_A2DP // when not in a phone call, phone strategy should route STREAM_VOICE_CALL to A2DP - if (mPhoneState != AudioSystem::MODE_IN_CALL) { + if (!isInCall()) { device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP; if (device) break; device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES; @@ -1580,14 +1585,14 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy, break; case AudioSystem::FORCE_SPEAKER: - if (mPhoneState != AudioSystem::MODE_IN_CALL || strategy != STRATEGY_DTMF) { + if (!isInCall() || strategy != STRATEGY_DTMF) { device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT; if (device) break; } #ifdef WITH_A2DP // when not in a phone call, phone strategy should route STREAM_VOICE_CALL to // A2DP speaker when forcing to speaker output - if (mPhoneState != AudioSystem::MODE_IN_CALL) { + if (!isInCall()) { device = mAvailableOutputDevices & AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER; if (device) break; } @@ -1604,7 +1609,7 @@ uint32_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy, // If incall, just select the STRATEGY_PHONE device: The rest of the behavior is handled by // handleIncallSonification(). - if (mPhoneState == AudioSystem::MODE_IN_CALL) { + if (isInCall()) { device = getDeviceForStrategy(STRATEGY_PHONE, false); break; } @@ -1971,6 +1976,16 @@ void AudioPolicyManagerBase::handleIncallSonification(int stream, bool starting, } } +bool AudioPolicyManagerBase::isInCall() +{ + return isStateInCall(mPhoneState); +} + +bool AudioPolicyManagerBase::isStateInCall(int state) { + return ((state == AudioSystem::MODE_IN_CALL) || + (state == AudioSystem::MODE_IN_COMMUNICATION)); +} + bool AudioPolicyManagerBase::needsDirectOuput(AudioSystem::stream_type stream, uint32_t samplingRate, uint32_t format, diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 6a86076..bebd013 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -2399,15 +2399,45 @@ class BackupManagerService extends IBackupManager.Stub { } // Hand off a restore session - public IRestoreSession beginRestoreSession(String transport) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "beginRestoreSession"); + public IRestoreSession beginRestoreSession(String packageName, String transport) { + if (DEBUG) Slog.v(TAG, "beginRestoreSession: pkg=" + packageName + + " transport=" + transport); + + boolean needPermission = true; + if (transport == null) { + transport = mCurrentTransport; + + if (packageName != null) { + PackageInfo app = null; + try { + app = mPackageManager.getPackageInfo(packageName, 0); + } catch (NameNotFoundException nnf) { + Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName); + throw new IllegalArgumentException("Package " + packageName + " not found"); + } + + if (app.applicationInfo.uid == Binder.getCallingUid()) { + // So: using the current active transport, and the caller has asked + // that its own package will be restored. In this narrow use case + // we do not require the caller to hold the permission. + needPermission = false; + } + } + } + + if (needPermission) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, + "beginRestoreSession"); + } else { + if (DEBUG) Slog.d(TAG, "restoring self on current transport; no permission needed"); + } synchronized(this) { if (mActiveRestoreSession != null) { Slog.d(TAG, "Restore session requested but one already active"); return null; } - mActiveRestoreSession = new ActiveRestoreSession(transport); + mActiveRestoreSession = new ActiveRestoreSession(packageName, transport); } return mActiveRestoreSession; } @@ -2427,10 +2457,12 @@ class BackupManagerService extends IBackupManager.Stub { class ActiveRestoreSession extends IRestoreSession.Stub { private static final String TAG = "RestoreSession"; + private String mPackageName; private IBackupTransport mRestoreTransport = null; RestoreSet[] mRestoreSets = null; - ActiveRestoreSession(String transport) { + ActiveRestoreSession(String packageName, String transport) { + mPackageName = packageName; mRestoreTransport = getTransport(transport); } @@ -2466,11 +2498,16 @@ class BackupManagerService extends IBackupManager.Stub { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "performRestore"); - if (DEBUG) Slog.d(TAG, "performRestore token=" + Long.toHexString(token) + if (DEBUG) Slog.d(TAG, "restoreAll token=" + Long.toHexString(token) + " observer=" + observer); if (mRestoreTransport == null || mRestoreSets == null) { - Slog.e(TAG, "Ignoring performRestore() with no restore set"); + Slog.e(TAG, "Ignoring restoreAll() with no restore set"); + return -1; + } + + if (mPackageName != null) { + Slog.e(TAG, "Ignoring restoreAll() on single-package session"); return -1; } @@ -2495,6 +2532,14 @@ class BackupManagerService extends IBackupManager.Stub { public synchronized int restorePackage(String packageName, IRestoreObserver observer) { if (DEBUG) Slog.v(TAG, "restorePackage pkg=" + packageName + " obs=" + observer); + if (mPackageName != null) { + if (! mPackageName.equals(packageName)) { + Slog.e(TAG, "Ignoring attempt to restore pkg=" + packageName + + " on session for package " + mPackageName); + return -1; + } + } + PackageInfo app = null; try { app = mPackageManager.getPackageInfo(packageName, 0); @@ -2529,6 +2574,7 @@ class BackupManagerService extends IBackupManager.Stub { // the app has never been backed up from this device -- there's nothing // to do but return failure. if (token == 0) { + if (DEBUG) Slog.w(TAG, "No data available for this package; not restoring"); return -1; } @@ -2543,9 +2589,6 @@ class BackupManagerService extends IBackupManager.Stub { } public synchronized void endRestoreSession() { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, - "endRestoreSession"); - if (DEBUG) Slog.d(TAG, "endRestoreSession"); synchronized (this) { diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index 4f8862c..84bc100 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -555,6 +555,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } + public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi) { + synchronized (mMethodMap) { + if (imi == null && mCurMethodId != null) { + imi = mMethodMap.get(mCurMethodId); + } + return mSettings.getEnabledInputMethodSubtypeListLocked(imi); + } + } + public void addClient(IInputMethodClient client, IInputContext inputContext, int uid, int pid) { synchronized (mMethodMap) { @@ -1607,7 +1616,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub synchronized (mMethodMap) { final List<Pair<InputMethodInfo, ArrayList<String>>> immis = - mSettings.getEnabledInputMethodAndSubtypeListLocked(); + mSettings.getEnabledInputMethodAndSubtypeHashCodeListLocked(); ArrayList<Integer> subtypeIds = new ArrayList<Integer>(); if (immis == null || immis.size() == 0) { @@ -2026,11 +2035,36 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } public List<Pair<InputMethodInfo, ArrayList<String>>> - getEnabledInputMethodAndSubtypeListLocked() { - return createEnabledInputMethodAndSubtypeListLocked( + getEnabledInputMethodAndSubtypeHashCodeListLocked() { + return createEnabledInputMethodAndSubtypeHashCodeListLocked( getEnabledInputMethodsAndSubtypeListLocked()); } + public List<InputMethodSubtype> getEnabledInputMethodSubtypeListLocked( + InputMethodInfo imi) { + List<Pair<String, ArrayList<String>>> imsList = + getEnabledInputMethodsAndSubtypeListLocked(); + ArrayList<InputMethodSubtype> enabledSubtypes = + new ArrayList<InputMethodSubtype>(); + if (imi != null) { + for (Pair<String, ArrayList<String>> imsPair : imsList) { + InputMethodInfo info = mMethodMap.get(imsPair.first); + if (info != null && info.getId().equals(imi.getId())) { + ArrayList<InputMethodSubtype> subtypes = info.getSubtypes(); + for (InputMethodSubtype ims: subtypes) { + for (String s: imsPair.second) { + if (String.valueOf(ims.hashCode()).equals(s)) { + enabledSubtypes.add(ims); + } + } + } + break; + } + } + } + return enabledSubtypes; + } + // At the initial boot, the settings for input methods are not set, // so we need to enable IME in that case. public void enableAllIMEsIfThereIsNoEnabledIME() { @@ -2128,7 +2162,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } private List<Pair<InputMethodInfo, ArrayList<String>>> - createEnabledInputMethodAndSubtypeListLocked( + createEnabledInputMethodAndSubtypeHashCodeListLocked( List<Pair<String, ArrayList<String>>> imsList) { final ArrayList<Pair<InputMethodInfo, ArrayList<String>>> res = new ArrayList<Pair<InputMethodInfo, ArrayList<String>>>(); diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index cd58284..a0a1974 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -7327,16 +7327,22 @@ class PackageManagerService extends IPackageManager.Stub { pw.println(" "); pw.println("Package warning messages:"); File fname = getSettingsProblemFile(); - FileInputStream in; + FileInputStream in = null; try { in = new FileInputStream(fname); int avail = in.available(); byte[] data = new byte[avail]; in.read(data); pw.print(new String(data)); - in.close(); } catch (FileNotFoundException e) { } catch (IOException e) { + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + } + } } } } diff --git a/services/java/com/android/server/ProcessStats.java b/services/java/com/android/server/ProcessStats.java index 43dbcc0..1a12a84 100644 --- a/services/java/com/android/server/ProcessStats.java +++ b/services/java/com/android/server/ProcessStats.java @@ -799,8 +799,9 @@ public class ProcessStats { } private String readFile(String file, char endChar) { + FileInputStream is = null; try { - FileInputStream is = new FileInputStream(file); + is = new FileInputStream(file); int len = is.read(mBuffer); is.close(); @@ -815,6 +816,13 @@ public class ProcessStats { } } catch (java.io.FileNotFoundException e) { } catch (java.io.IOException e) { + } finally { + if (is != null) { + try { + is.close(); + } catch (java.io.IOException e) { + } + } } return null; } @@ -841,4 +849,3 @@ public class ProcessStats { } } } - diff --git a/services/java/com/android/server/WiredAccessoryObserver.java b/services/java/com/android/server/WiredAccessoryObserver.java index 4a85aff..0529080 100644 --- a/services/java/com/android/server/WiredAccessoryObserver.java +++ b/services/java/com/android/server/WiredAccessoryObserver.java @@ -86,33 +86,40 @@ class WiredAccessoryObserver extends UEventObserver { if (LOG) Slog.v(TAG, "Headset UEVENT: " + event.toString()); try { - if ((event.get("SWITCH_NAME")).equals("usb_audio")) { - if (Integer.parseInt(event.get("SWITCH_STATE")) == 1) { - switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC| - BIT_USB_HEADSET_DGTL)) | - (Integer.parseInt(event.get("SWITCH_STATE")) << 2)); - } else if (Integer.parseInt(event.get("SWITCH_STATE")) == 2) { - switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC| - BIT_USB_HEADSET_ANLG)) | - (Integer.parseInt(event.get("SWITCH_STATE")) << 3)); - } - else switchState = (mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC)); - } - else if ((event.get("SWITCH_NAME")).equals("hdmi")) { - switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC| - BIT_USB_HEADSET_DGTL|BIT_USB_HEADSET_ANLG)) | - (Integer.parseInt(event.get("SWITCH_STATE")) << 4)); - } - else { - switchState = ((mHeadsetState & (BIT_USB_HEADSET_ANLG|BIT_USB_HEADSET_DGTL)) | - (Integer.parseInt(event.get("SWITCH_STATE")))); - } - update(event.get("SWITCH_NAME"), switchState); + String name = event.get("SWITCH_NAME"); + int state = Integer.parseInt(event.get("SWITCH_STATE")); + updateState(name, state); } catch (NumberFormatException e) { Slog.e(TAG, "Could not parse switch state from event " + event); } } + private synchronized final void updateState(String name, int state) + { + if (name.equals("usb_audio")) { + if (state == 1) { + switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC| + BIT_USB_HEADSET_DGTL|BIT_HDMI_AUDIO)) | + (state << 2)); + } else if (state == 2) { + switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC| + BIT_USB_HEADSET_ANLG|BIT_HDMI_AUDIO)) | + (state << 3)); + } else switchState = (mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC|BIT_HDMI_AUDIO)); + } + else if (name.equals("hdmi")) { + switchState = ((mHeadsetState & (BIT_HEADSET|BIT_HEADSET_NO_MIC| + BIT_USB_HEADSET_DGTL|BIT_USB_HEADSET_ANLG)) | + (state << 4)); + } + else { + switchState = ((mHeadsetState & (BIT_HDMI_AUDIO|BIT_USB_HEADSET_ANLG| + BIT_USB_HEADSET_DGTL)) | + state); + } + update(name, switchState); + } + private synchronized final void init() { char[] buffer = new char[1024]; @@ -132,13 +139,15 @@ class WiredAccessoryObserver extends UEventObserver { file.close(); newName = new String(buffer, 0, len).trim(); + if (newState > 0) { + updateState(newName, newState); + } + } catch (FileNotFoundException e) { Slog.w(TAG, "This kernel does not have wired headset support"); } catch (Exception e) { Slog.e(TAG, "" , e); } - - update(newName, newState); } } diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 35a2c19..290f2c1 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -438,9 +438,9 @@ public class ServiceState implements Parcelable { + " " + (mCssIndicator ? "CSS supported" : "CSS not supported") + " " + mNetworkId + " " + mSystemId - + "RoamInd: " + mCdmaRoamingIndicator - + "DefRoamInd: " + mCdmaDefaultRoamingIndicator - + "EmergOnly: " + mIsEmergencyOnly); + + " RoamInd=" + mCdmaRoamingIndicator + + " DefRoamInd=" + mCdmaDefaultRoamingIndicator + + " EmergOnly=" + mIsEmergencyOnly); } public void setStateOutOfService() { diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java index d74a547..5b49305 100644 --- a/telephony/java/com/android/internal/telephony/CallManager.java +++ b/telephony/java/com/android/internal/telephony/CallManager.java @@ -380,12 +380,17 @@ public final class CallManager { break; case OFFHOOK: Phone fgPhone = getFgPhone(); - // Enable IN_CALL mode while foreground call is in DIALING, - // ALERTING, ACTIVE and DISCONNECTING state and not from sipPhone + // While foreground call is in DIALING, + // ALERTING, ACTIVE and DISCONNECTING state if (getActiveFgCallState() != Call.State.IDLE - && getActiveFgCallState() != Call.State.DISCONNECTED - && !(fgPhone instanceof SipPhone)) { - mode = AudioManager.MODE_IN_CALL; + && getActiveFgCallState() != Call.State.DISCONNECTED) { + if (fgPhone instanceof SipPhone) { + // enable IN_COMMUNICATION audio mode for sipPhone + mode = AudioManager.MODE_IN_COMMUNICATION; + } else { + // enable IN_CALL audio mode for telephony + mode = AudioManager.MODE_IN_CALL; + } } break; } diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java index 35d5564..a77e73e 100644 --- a/telephony/java/com/android/internal/telephony/RIL.java +++ b/telephony/java/com/android/internal/telephony/RIL.java @@ -141,6 +141,7 @@ class RILRequest { this.mNext = sPool; sPool = this; sPoolSize++; + mResult = null; } } } diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java index b9d5673..099bc30 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java @@ -934,13 +934,13 @@ public class CDMAPhone extends PhoneBase { switch(action) { case CANCEL_ECM_TIMER: removeCallbacks(mExitEcmRunnable); - mEcmTimerResetRegistrants.notifyResult(new Boolean(true)); + mEcmTimerResetRegistrants.notifyResult(Boolean.TRUE); break; case RESTART_ECM_TIMER: long delayInMillis = SystemProperties.getLong( TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE); postDelayed(mExitEcmRunnable, delayInMillis); - mEcmTimerResetRegistrants.notifyResult(new Boolean(false)); + mEcmTimerResetRegistrants.notifyResult(Boolean.FALSE); break; default: Log.e(LOG_TAG, "handleTimerInEmergencyCallbackMode, unsupported action " + action); diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java index 7c652c5..d7ff0c5 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java @@ -240,8 +240,8 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { mCdmaPhone.mRuimRecords.getRecordsLoaded())) { reason += " - radioState= " + mPhone.mCM.getRadioState() + " - RUIM not loaded"; } - if (mPhone.getState() != Phone.State.IDLE && - mCdmaPhone.mSST.isConcurrentVoiceAndData()) { + if (!(mCdmaPhone.mSST.isConcurrentVoiceAndData() || + mPhone.getState() == Phone.State.IDLE)) { reason += " - concurrentVoiceAndData not allowed and state= " + mPhone.getState(); } if (roaming) reason += " - Roaming"; diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index 2aca9ad..70328f7 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -106,7 +106,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { * It is a subset of allApns and has the same format */ private ArrayList<ApnSetting> mWaitingApns = null; - + private int mWaitingApnsPermanentFailureCountDown = 0; private ApnSetting mPreferredApn = null; /* Currently active APN */ @@ -328,8 +328,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { reason += " - PhoneState= " + mPhone.getState(); } if (!mMasterDataEnabled) reason += " - mMasterDataEnabled= false"; - if (mPhone.getServiceState().getRoaming() && getDataOnRoamingEnabled()) { - reason += " - Roaming"; + if (mPhone.getServiceState().getRoaming() && !getDataOnRoamingEnabled()) { + reason += " - Roaming and data roaming not enabled"; } if (mIsPsRestricted) reason += " - mIsPsRestricted= true"; if (!desiredPowerState) reason += " - desiredPowerState= false"; @@ -361,6 +361,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { if (mState == State.IDLE) { mWaitingApns = buildWaitingApns(mRequestedApnType); + mWaitingApnsPermanentFailureCountDown = mWaitingApns.size(); if (mWaitingApns.isEmpty()) { if (DBG) log("No APN found"); notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN); @@ -996,6 +997,9 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } if (ar.exception == null) { + if(DBG) { + log(String.format("onDataSetupComplete: success apn=%s", mWaitingApns.get(0).apn)); + } // TODO: We should clear LinkProperties/Capabilities when torn down or disconnected mLinkProperties = getLinkProperties(mPendingDataConnection); mLinkCapabilities = getLinkCapabilities(mPendingDataConnection); @@ -1037,30 +1041,42 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } else { GsmDataConnection.FailCause cause; cause = (GsmDataConnection.FailCause) (ar.result); - if(DBG) log("PDP setup failed " + cause); - // Log this failure to the Event Logs. + if (DBG) { + String apnString; + try { + apnString = mWaitingApns.get(0).apn; + } catch (Exception e) { + apnString = "<unknown>"; + } + log(String.format("onDataSetupComplete: error apn=%s cause=%s", apnString, cause)); + } if (cause.isEventLoggable()) { + // Log this failure to the Event Logs. GsmCellLocation loc = ((GsmCellLocation)mPhone.getCellLocation()); EventLog.writeEvent(EventLogTags.PDP_SETUP_FAIL, cause.ordinal(), loc != null ? loc.getCid() : -1, TelephonyManager.getDefault().getNetworkType()); } - // Do not retry on permanent failure - // TODO: We should not fail permanently if more Apns to try! - if (cause.isPermanentFail()) { - notifyNoData(cause); - notifyDataConnection(Phone.REASON_APN_FAILED); - onEnableApn(apnTypeToId(mRequestedApnType), DISABLED); - return; - } - + // Count permanent failures and remove the APN we just tried + mWaitingApnsPermanentFailureCountDown -= cause.isPermanentFail() ? 1 : 0; mWaitingApns.remove(0); + if (DBG) log(String.format("onDataSetupComplete: mWaitingApns.size=%d" + + " mWaitingApnsPermanenatFailureCountDown=%d", + mWaitingApns.size(), mWaitingApnsPermanentFailureCountDown)); + + // See if there are more APN's to try if (mWaitingApns.isEmpty()) { - // No more to try, start delayed retry - startDelayedRetry(cause, reason); + if (mWaitingApnsPermanentFailureCountDown == 0) { + if (DBG) log("onDataSetupComplete: Permanent failures stop retrying"); + notifyNoData(cause); + notifyDataConnection(Phone.REASON_APN_FAILED); + } else { + if (DBG) log("onDataSetupComplete: Not all permanent failures, retry"); + startDelayedRetry(cause, reason); + } } else { - // we still have more apns to try + if (DBG) log("onDataSetupComplete: Try next APN"); setState(State.SCANNING); // Wait a bit before trying the next APN, so that // we're not tying up the RIL command channel diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java b/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java index afd4d0c..db9e35a 100755 --- a/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java +++ b/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java @@ -101,12 +101,12 @@ abstract class SipPhoneBase extends PhoneBase { } protected void startRingbackTone() { - AsyncResult result = new AsyncResult(null, new Boolean(true), null); + AsyncResult result = new AsyncResult(null, Boolean.TRUE, null); mRingbackRegistrants.notifyRegistrants(result); } protected void stopRingbackTone() { - AsyncResult result = new AsyncResult(null, new Boolean(false), null); + AsyncResult result = new AsyncResult(null, Boolean.FALSE, null); mRingbackRegistrants.notifyRegistrants(result); } diff --git a/test-runner/src/android/test/InstrumentationTestRunner.java b/test-runner/src/android/test/InstrumentationTestRunner.java index 3ac74f7..5ce3efc 100644 --- a/test-runner/src/android/test/InstrumentationTestRunner.java +++ b/test-runner/src/android/test/InstrumentationTestRunner.java @@ -785,7 +785,7 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu mIncludeDetailedStats = false; try { // Look for TimedTest annotation on both test class and test method - if (testMethod.isAnnotationPresent(TimedTest.class)) { + if (testMethod != null && testMethod.isAnnotationPresent(TimedTest.class)) { mIsTimedTest = true; mIncludeDetailedStats = testMethod.getAnnotation( TimedTest.class).includeDetailedStats(); diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java index c62f4de..d545018 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java @@ -80,9 +80,6 @@ public class FileFilter { "fast/regex/test1.html", // Causes DumpRenderTree to hang with V8 "fast/regex/slow.html", // Causes DumpRenderTree to hang with V8 "http/tests/xmlhttprequest/simple-cross-origin-progress-events.html", // runs webcore into bad state, http://b/2929261 - "ietestcenter/Javascript/15.4.4.15-3-14.html", // hangs the layout tests, http://b/2889595 - "ietestcenter/Javascript/15.4.4.15-3-29.html", // hangs the layout tests, http://b/2889596 - "ietestcenter/Javascript/15.4.4.15-3-8.html", // hangs the layout tests, http://b/2889598 }; static void fillIgnoreResultList() { |