diff options
Diffstat (limited to 'core')
224 files changed, 2405 insertions, 717 deletions
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index bcb35d5..03a7e34 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -781,7 +781,7 @@ public class AccountManager { * {@link android.Manifest.permission#USE_CREDENTIALS}. * * @param account The account to fetch an auth token for - * @param authTokenType The auth token type, see {#link getAuthToken} + * @param authTokenType The auth token type, see {@link #getAuthToken getAuthToken()} * @param notifyAuthFailure If true, display a notification and return null * if authentication fails; if false, prompt and wait for the user to * re-enter correct credentials before returning @@ -1853,7 +1853,7 @@ public class AccountManager { * <p> * The most common case is to call this with one account type, e.g.: * <p> - * <pre> newChooseAccountsIntent(null, null, new String[]{"com.google"}, false, null, + * <pre> newChooseAccountIntent(null, null, new String[]{"com.google"}, false, null, * null, null, null);</pre> * @param selectedAccount if specified, indicates that the {@link Account} is the currently * selected one, according to the caller's definition of selected. diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java index 2337790..3602fc4 100644 --- a/core/java/android/app/ActionBar.java +++ b/core/java/android/app/ActionBar.java @@ -132,6 +132,12 @@ public abstract class ActionBar { public static final int DISPLAY_SHOW_CUSTOM = 0x10; /** + * Allow the title to wrap onto multiple lines if space is available + * @hide pending API approval + */ + public static final int DISPLAY_TITLE_MULTIPLE_LINES = 0x20; + + /** * Set the action bar into custom navigation mode, supplying a view * for custom navigation. * @@ -680,6 +686,15 @@ public abstract class ActionBar { public Context getThemedContext() { return null; } /** + * Returns true if the Title field has been truncated during layout for lack + * of available space. + * + * @return true if the Title field has been truncated + * @hide pending API approval + */ + public boolean isTitleTruncated() { return false; } + + /** * Listener interface for ActionBar navigation events. */ public interface OnNavigationListener { diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 67d3930..61b2067 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -1701,6 +1701,21 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case GET_INTENT_FOR_INTENT_SENDER_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + IIntentSender r = IIntentSender.Stub.asInterface( + data.readStrongBinder()); + Intent intent = getIntentForIntentSender(r); + reply.writeNoException(); + if (intent != null) { + reply.writeInt(1); + intent.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); + } else { + reply.writeInt(0); + } + return true; + } + case UPDATE_PERSISTENT_CONFIGURATION_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); Configuration config = Configuration.CREATOR.createFromParcel(data); @@ -3977,6 +3992,20 @@ class ActivityManagerProxy implements IActivityManager return res; } + public Intent getIntentForIntentSender(IIntentSender sender) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(sender.asBinder()); + mRemote.transact(GET_INTENT_FOR_INTENT_SENDER_TRANSACTION, data, reply, 0); + reply.readException(); + Intent res = reply.readInt() != 0 + ? Intent.CREATOR.createFromParcel(reply) : null; + data.recycle(); + reply.recycle(); + return res; + } + public void updatePersistentConfiguration(Configuration values) throws RemoteException { Parcel data = Parcel.obtain(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 456d757..d880817 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4421,12 +4421,14 @@ public final class ActivityThread { new ArrayList<IActivityManager.ContentProviderHolder>(); for (ProviderInfo cpi : providers) { - StringBuilder buf = new StringBuilder(128); - buf.append("Pub "); - buf.append(cpi.authority); - buf.append(": "); - buf.append(cpi.name); - Log.i(TAG, buf.toString()); + if (DEBUG_PROVIDER) { + StringBuilder buf = new StringBuilder(128); + buf.append("Pub "); + buf.append(cpi.authority); + buf.append(": "); + buf.append(cpi.name); + Log.i(TAG, buf.toString()); + } IActivityManager.ContentProviderHolder cph = installProvider(context, null, cpi, false /*noisy*/, true /*noReleaseNeeded*/, true /*stable*/); if (cph != null) { diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 95b6bed..f895ccc 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -168,7 +168,7 @@ class ReceiverRestrictedContext extends ContextWrapper { * context object for Activity and other application components. */ class ContextImpl extends Context { - private final static String TAG = "ApplicationContext"; + private final static String TAG = "ContextImpl"; private final static boolean DEBUG = false; private static final HashMap<String, SharedPreferencesImpl> sSharedPrefs = @@ -1715,7 +1715,7 @@ class ContextImpl extends Context { private void warnIfCallingFromSystemProcess() { if (Process.myUid() == Process.SYSTEM_UID) { Slog.w(TAG, "Calling a method in the system process without a qualified user: " - + Debug.getCallers(3)); + + Debug.getCallers(5)); } } diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 34fe215..422d0bc 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -1023,7 +1023,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene } /** - * Call {@link Activity#startActivity(Intent)} on the fragment's + * Call {@link Activity#startActivity(Intent)} from the fragment's * containing Activity. * * @param intent The intent to start. @@ -1033,7 +1033,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene } /** - * Call {@link Activity#startActivity(Intent, Bundle)} on the fragment's + * Call {@link Activity#startActivity(Intent, Bundle)} from the fragment's * containing Activity. * * @param intent The intent to start. @@ -1055,7 +1055,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene } /** - * Call {@link Activity#startActivityForResult(Intent, int)} on the fragment's + * Call {@link Activity#startActivityForResult(Intent, int)} from the fragment's * containing Activity. */ public void startActivityForResult(Intent intent, int requestCode) { @@ -1063,7 +1063,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene } /** - * Call {@link Activity#startActivityForResult(Intent, int, Bundle)} on the fragment's + * Call {@link Activity#startActivityForResult(Intent, int, Bundle)} from the fragment's * containing Activity. */ public void startActivityForResult(Intent intent, int requestCode, Bundle options) { diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 8fc1c86..8af17a4 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -341,6 +341,8 @@ public interface IActivityManager extends IInterface { public boolean isIntentSenderAnActivity(IIntentSender sender) throws RemoteException; + public Intent getIntentForIntentSender(IIntentSender sender) throws RemoteException; + public void updatePersistentConfiguration(Configuration values) throws RemoteException; public long[] getProcessPss(int[] pids) throws RemoteException; @@ -621,4 +623,5 @@ public interface IActivityManager extends IInterface { int REQUEST_BUG_REPORT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+157; int INPUT_DISPATCHING_TIMED_OUT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+158; int CLEAR_PENDING_BACKUP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+159; + int GET_INTENT_FOR_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+160; } diff --git a/core/java/android/app/MediaRouteButton.java b/core/java/android/app/MediaRouteButton.java index 3ecafc3..a1a147a 100644 --- a/core/java/android/app/MediaRouteButton.java +++ b/core/java/android/app/MediaRouteButton.java @@ -217,7 +217,8 @@ public class MediaRouteButton extends View { void updateRemoteIndicator() { final RouteInfo selected = mRouter.getSelectedRoute(mRouteTypes); final boolean isRemote = selected != mRouter.getSystemAudioRoute(); - final boolean isConnecting = selected.getStatusCode() == RouteInfo.STATUS_CONNECTING; + final boolean isConnecting = selected != null && + selected.getStatusCode() == RouteInfo.STATUS_CONNECTING; boolean needsRefresh = false; if (mRemoteActive != isRemote) { diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 2c92d09..3f8e16c 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -322,7 +322,7 @@ public class Notification implements Parcelable /** * Bit to be bitwise-ored into the {@link #flags} field that should be * set if the notification should be canceled when it is clicked by the - * user. On tablets, the + * user. */ public static final int FLAG_AUTO_CANCEL = 0x00000010; @@ -388,8 +388,8 @@ public class Notification implements Parcelable * Priority is an indication of how much of the user's valuable attention should be consumed by * this notification. Low-priority notifications may be hidden from the user in certain * situations, while the user might be interrupted for a higher-priority notification. The - * system will make a determination about how to interpret notification priority as described in - * MUMBLE MUMBLE. + * system will make a determination about how to interpret this priority when presenting + * the notification. */ public int priority; @@ -846,7 +846,9 @@ public class Notification implements Parcelable } // TODO(dsandler): defaults take precedence over local values, so reorder the branches below sb.append(" vibrate="); - if (this.vibrate != null) { + if ((this.defaults & DEFAULT_VIBRATE) != 0) { + sb.append("default"); + } else if (this.vibrate != null) { int N = this.vibrate.length-1; sb.append("["); for (int i=0; i<N; i++) { @@ -857,16 +859,14 @@ public class Notification implements Parcelable sb.append(this.vibrate[N]); } sb.append("]"); - } else if ((this.defaults & DEFAULT_VIBRATE) != 0) { - sb.append("default"); } else { sb.append("null"); } sb.append(" sound="); - if (this.sound != null) { - sb.append(this.sound.toString()); - } else if ((this.defaults & DEFAULT_SOUND) != 0) { + if ((this.defaults & DEFAULT_SOUND) != 0) { sb.append("default"); + } else if (this.sound != null) { + sb.append(this.sound.toString()); } else { sb.append("null"); } diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index d36d99d..5c75aff 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -790,6 +790,20 @@ public final class PendingIntent implements Parcelable { } /** + * @hide + * Return the Intent of this PendingIntent. + */ + public Intent getIntent() { + try { + return ActivityManagerNative.getDefault() + .getIntentForIntentSender(mTarget); + } catch (RemoteException e) { + // Should never happen. + return null; + } + } + + /** * Comparison operator on two PendingIntent objects, such that true * is returned then they both represent the same operation from the * same package. This allows you to use {@link #getActivity}, diff --git a/core/java/android/app/Presentation.java b/core/java/android/app/Presentation.java index 16a0c57..bb45abb4 100644 --- a/core/java/android/app/Presentation.java +++ b/core/java/android/app/Presentation.java @@ -281,7 +281,7 @@ public class Presentation extends Dialog { private boolean isConfigurationStillValid() { DisplayMetrics dm = new DisplayMetrics(); mDisplay.getMetrics(dm); - return dm.equals(getResources().getDisplayMetrics()); + return dm.equalsPhysical(getResources().getDisplayMetrics()); } private static Context createPresentationContext( diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index 43a163d..6382cee 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -858,6 +858,9 @@ public class SearchManager */ public Intent getAssistIntent(Context context, int userHandle) { try { + if (mService == null) { + return null; + } ComponentName comp = mService.getAssistIntent(userHandle); if (comp == null) { return null; diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java index 02cf3aa..4fbca73 100644 --- a/core/java/android/app/Service.java +++ b/core/java/android/app/Service.java @@ -666,7 +666,9 @@ public abstract class Service extends ContextWrapper implements ComponentCallbac /** * Print the Service's state into the given stream. This gets invoked if - * you run "adb shell dumpsys activity service <yourservicename>". + * you run "adb shell dumpsys activity service <yourservicename>" + * (note that for this command to work, the service must be running, and + * you must specify a fully-qualified service name). * This is distinct from "dumpsys <servicename>", which only works for * named system services and which invokes the {@link IBinder#dump} method * on the {@link IBinder} interface registered with ServiceManager. diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java index cb61a71..fa3bf4d 100644 --- a/core/java/android/appwidget/AppWidgetHost.java +++ b/core/java/android/appwidget/AppWidgetHost.java @@ -60,6 +60,7 @@ public class AppWidgetHost { public void updateAppWidget(int appWidgetId, RemoteViews views) { if (isLocalBinder() && views != null) { views = views.clone(); + views.setUser(mUser); } Message msg = mHandler.obtainMessage(HANDLE_UPDATE); msg.arg1 = appWidgetId; @@ -123,6 +124,8 @@ public class AppWidgetHost { Callbacks mCallbacks = new Callbacks(); final HashMap<Integer,AppWidgetHostView> mViews = new HashMap<Integer, AppWidgetHostView>(); private OnClickHandler mOnClickHandler; + // Optionally set by lockscreen + private UserHandle mUser; public AppWidgetHost(Context context, int hostId) { this(context, hostId, null, context.getMainLooper()); @@ -137,9 +140,15 @@ public class AppWidgetHost { mOnClickHandler = handler; mHandler = new UpdateHandler(looper); mDisplayMetrics = context.getResources().getDisplayMetrics(); + mUser = Process.myUserHandle(); bindService(); } + /** @hide */ + public void setUserId(int userId) { + mUser = new UserHandle(userId); + } + private static void bindService() { synchronized (sServiceLock) { if (sService == null) { @@ -154,6 +163,15 @@ public class AppWidgetHost { * becomes visible, i.e. from onStart() in your Activity. */ public void startListening() { + startListeningAsUser(UserHandle.myUserId()); + } + + /** + * Start receiving onAppWidgetChanged calls for your AppWidgets. Call this when your activity + * becomes visible, i.e. from onStart() in your Activity. + * @hide + */ + public void startListeningAsUser(int userId) { int[] updatedIds; ArrayList<RemoteViews> updatedViews = new ArrayList<RemoteViews>(); @@ -161,7 +179,8 @@ public class AppWidgetHost { if (mPackageName == null) { mPackageName = mContext.getPackageName(); } - updatedIds = sService.startListening(mCallbacks, mPackageName, mHostId, updatedViews); + updatedIds = sService.startListeningAsUser( + mCallbacks, mPackageName, mHostId, updatedViews, userId); } catch (RemoteException e) { throw new RuntimeException("system server dead?", e); @@ -169,6 +188,9 @@ public class AppWidgetHost { final int N = updatedIds.length; for (int i=0; i<N; i++) { + if (updatedViews.get(i) != null) { + updatedViews.get(i).setUser(new UserHandle(userId)); + } updateAppWidgetView(updatedIds[i], updatedViews.get(i)); } } @@ -179,11 +201,27 @@ public class AppWidgetHost { */ public void stopListening() { try { - sService.stopListening(mHostId); + sService.stopListeningAsUser(mHostId, UserHandle.myUserId()); + } + catch (RemoteException e) { + throw new RuntimeException("system server dead?", e); + } + } + + /** + * Stop receiving onAppWidgetChanged calls for your AppWidgets. Call this when your activity is + * no longer visible, i.e. from onStop() in your Activity. + * @hide + */ + public void stopListeningAsUser(int userId) { + try { + sService.stopListeningAsUser(mHostId, userId); } catch (RemoteException e) { throw new RuntimeException("system server dead?", e); } + // Also clear the views + clearViews(); } /** @@ -224,6 +262,22 @@ public class AppWidgetHost { } } + /** + * Gets a list of all the appWidgetIds that are bound to the current host + * + * @hide + */ + public int[] getAppWidgetIds() { + try { + if (sService == null) { + bindService(); + } + return sService.getAppWidgetIdsForHost(mHostId); + } catch (RemoteException e) { + throw new RuntimeException("system server dead?", e); + } + } + private static void checkCallerIsSystem() { int uid = Process.myUid(); if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) { @@ -308,6 +362,7 @@ public class AppWidgetHost { public final AppWidgetHostView createView(Context context, int appWidgetId, AppWidgetProviderInfo appWidget) { AppWidgetHostView view = onCreateView(context, appWidgetId, appWidget); + view.setUserId(mUser.getIdentifier()); view.setOnClickHandler(mOnClickHandler); view.setAppWidget(appWidgetId, appWidget); synchronized (mViews) { @@ -316,6 +371,9 @@ public class AppWidgetHost { RemoteViews views; try { views = sService.getAppWidgetViews(appWidgetId); + if (views != null) { + views.setUser(mUser); + } } catch (RemoteException e) { throw new RuntimeException("system server dead?", e); } diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 52771ee..700bba8 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -31,7 +31,9 @@ import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; +import android.os.Process; import android.os.SystemClock; +import android.os.UserHandle; import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; @@ -85,6 +87,7 @@ public class AppWidgetHostView extends FrameLayout { Bitmap mOld; Paint mOldPaint = new Paint(); private OnClickHandler mOnClickHandler; + private UserHandle mUser; /** * Create a host view. Uses default fade animations. @@ -112,12 +115,17 @@ public class AppWidgetHostView extends FrameLayout { public AppWidgetHostView(Context context, int animationIn, int animationOut) { super(context); mContext = context; - + mUser = Process.myUserHandle(); // We want to segregate the view ids within AppWidgets to prevent // problems when those ids collide with view ids in the AppWidgetHost. setIsRootNamespace(true); } + /** @hide */ + public void setUserId(int userId) { + mUser = new UserHandle(userId); + } + /** * Pass the given handler to RemoteViews when updating this widget. Unless this * is done immediatly after construction, a call to {@link #updateAppWidget(RemoteViews)} @@ -465,7 +473,8 @@ public class AppWidgetHostView extends FrameLayout { try { // Return if cloned successfully, otherwise default - return mContext.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); + return mContext.createPackageContextAsUser(packageName, Context.CONTEXT_RESTRICTED, + mUser); } catch (NameNotFoundException e) { Log.e(TAG, "Package name " + packageName + " not found"); return mContext; @@ -539,8 +548,8 @@ public class AppWidgetHostView extends FrameLayout { try { if (mInfo != null) { - Context theirContext = mContext.createPackageContext( - mInfo.provider.getPackageName(), Context.CONTEXT_RESTRICTED); + Context theirContext = mContext.createPackageContextAsUser( + mInfo.provider.getPackageName(), Context.CONTEXT_RESTRICTED, mUser); mRemoteContext = theirContext; LayoutInflater inflater = (LayoutInflater) theirContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index 285bc0c..6b1c3e2 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -23,6 +23,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.util.DisplayMetrics; import android.util.TypedValue; import android.widget.RemoteViews; @@ -544,8 +545,19 @@ public class AppWidgetManager { * Return a list of the AppWidget providers that are currently installed. */ public List<AppWidgetProviderInfo> getInstalledProviders() { + return getInstalledProviders(AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN); + } + + /** + * Return a list of the AppWidget providers that are currently installed. + * + * @param categoryFilter Will only return providers which register as any of the specified + * specified categories. See {@link AppWidgetProviderInfo#widgetCategory}. + * @hide + */ + public List<AppWidgetProviderInfo> getInstalledProviders(int categoryFilter) { try { - List<AppWidgetProviderInfo> providers = sService.getInstalledProviders(); + List<AppWidgetProviderInfo> providers = sService.getInstalledProviders(categoryFilter); for (AppWidgetProviderInfo info : providers) { // Converting complex to dp. info.minWidth = @@ -738,11 +750,14 @@ public class AppWidgetManager { * @param intent The intent of the service which will be providing the data to the * RemoteViewsAdapter. * @param connection The callback interface to be notified when a connection is made or lost. + * @param userHandle The user to bind to. * @hide */ - public void bindRemoteViewsService(int appWidgetId, Intent intent, IBinder connection) { + public void bindRemoteViewsService(int appWidgetId, Intent intent, IBinder connection, + UserHandle userHandle) { try { - sService.bindRemoteViewsService(appWidgetId, intent, connection); + sService.bindRemoteViewsService(appWidgetId, intent, connection, + userHandle.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("system server dead?", e); @@ -758,11 +773,12 @@ public class AppWidgetManager { * @param appWidgetId The AppWidget instance for which to bind the RemoteViewsService. * @param intent The intent of the service which will be providing the data to the * RemoteViewsAdapter. + * @param userHandle The user to unbind from. * @hide */ - public void unbindRemoteViewsService(int appWidgetId, Intent intent) { + public void unbindRemoteViewsService(int appWidgetId, Intent intent, UserHandle userHandle) { try { - sService.unbindRemoteViewsService(appWidgetId, intent); + sService.unbindRemoteViewsService(appWidgetId, intent, userHandle.getIdentifier()); } catch (RemoteException e) { throw new RuntimeException("system server dead?", e); diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index f817fb4..6367e16 100755 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -1212,7 +1212,7 @@ public final class BluetoothAdapter { final private IBluetoothManagerCallback mManagerCallback = new IBluetoothManagerCallback.Stub() { public void onBluetoothServiceUp(IBluetooth bluetoothService) { - if (DBG) Log.d(TAG, "onBluetoothServiceUp: " + bluetoothService); + if (VDBG) Log.d(TAG, "onBluetoothServiceUp: " + bluetoothService); synchronized (mManagerCallback) { mService = bluetoothService; for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){ @@ -1228,7 +1228,7 @@ public final class BluetoothAdapter { } public void onBluetoothServiceDown() { - if (DBG) Log.d(TAG, "onBluetoothServiceDown: " + mService); + if (VDBG) Log.d(TAG, "onBluetoothServiceDown: " + mService); synchronized (mManagerCallback) { mService = null; for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){ diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java index 26bde19..8029a1a 100644 --- a/core/java/android/bluetooth/BluetoothSocket.java +++ b/core/java/android/bluetooth/BluetoothSocket.java @@ -300,7 +300,6 @@ public final class BluetoothSocket implements Closeable { if (mDevice == null) throw new IOException("Connect is called on null device"); try { - // TODO(BT) derive flag from auth and encrypt if (mSocketState == SocketState.CLOSED) throw new IOException("socket closed"); IBluetooth bluetoothProxy = BluetoothAdapter.getDefaultAdapter().getBluetoothService(null); if (bluetoothProxy == null) throw new IOException("Bluetooth is off"); @@ -349,7 +348,6 @@ public final class BluetoothSocket implements Closeable { mUuid, mPort, getSecurityFlags()); } catch (RemoteException e) { Log.e(TAG, Log.getStackTraceString(new Throwable())); - // TODO(BT) right error code? return -1; } @@ -388,8 +386,13 @@ public final class BluetoothSocket implements Closeable { /*package*/ BluetoothSocket accept(int timeout) throws IOException { BluetoothSocket acceptedSocket; if (mSocketState != SocketState.LISTENING) throw new IOException("bt socket is not in listen state"); - // TODO(BT) wait on an incoming connection + if(timeout > 0) { + Log.d(TAG, "accept() set timeout (ms):" + timeout); + mSocket.setSoTimeout(timeout); + } String RemoteAddr = waitSocketSignal(mSocketIS); + if(timeout > 0) + mSocket.setSoTimeout(0); synchronized(this) { if (mSocketState != SocketState.LISTENING) @@ -397,8 +400,6 @@ public final class BluetoothSocket implements Closeable { acceptedSocket = acceptSocket(RemoteAddr); //quick drop the reference of the file handle } - // TODO(BT) rfcomm socket only supports one connection, return this? - // return this; return acceptedSocket; } @@ -428,7 +429,7 @@ public final class BluetoothSocket implements Closeable { @Override public void close() throws IOException { - Log.d(TAG, "close() in, this: " + this + ", channel: " + mPort + ", state: " + mSocketState); + if (VDBG) Log.d(TAG, "close() in, this: " + this + ", channel: " + mPort + ", state: " + mSocketState); if(mSocketState == SocketState.CLOSED) return; else @@ -451,7 +452,6 @@ public final class BluetoothSocket implements Closeable { mPfd.detachFd(); } } - // TODO(BT) unbind proxy, } /*package */ void removeChannel() { @@ -471,6 +471,8 @@ public final class BluetoothSocket implements Closeable { ByteBuffer bb = ByteBuffer.wrap(sig); bb.order(ByteOrder.nativeOrder()); int size = bb.getShort(); + if(size != SOCK_SIGNAL_SIZE) + throw new IOException("Connection failure, wrong signal size: " + size); byte [] addr = new byte[6]; bb.get(addr); int channel = bb.getInt(); @@ -487,7 +489,7 @@ public final class BluetoothSocket implements Closeable { while(left > 0) { int ret = is.read(b, b.length - left, left); if(ret <= 0) - throw new IOException("read failed, socket might closed, read ret: " + ret); + throw new IOException("read failed, socket might closed or timeout, read ret: " + ret); left -= ret; if(left != 0) Log.w(TAG, "readAll() looping, read partial size: " + (b.length - left) + diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index cf0603e..72b0a8b 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2231,7 +2231,7 @@ public class Intent implements Parcelable, Cloneable { /** * Broadcast Action: An outgoing call is about to be placed. * - * <p>The Intent will have the following extra value: + * <p>The Intent will have the following extra value:</p> * <ul> * <li><em>{@link android.content.Intent#EXTRA_PHONE_NUMBER}</em> - * the phone number originally intended to be dialed.</li> @@ -2255,6 +2255,10 @@ public class Intent implements Parcelable, Cloneable { * <p>Emergency calls cannot be intercepted using this mechanism, and * other calls cannot be modified to call emergency numbers using this * mechanism. + * <p>Some apps (such as VoIP apps) may want to redirect the outgoing + * call to use their own service instead. Those apps should first prevent + * the call from being placed by setting resultData to <code>null</code> + * and then start their own app to make the call. * <p>You must hold the * {@link android.Manifest.permission#PROCESS_OUTGOING_CALLS} * permission to receive this Intent.</p> diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java index 977b461..e4b4b97 100644 --- a/core/java/android/content/SyncManager.java +++ b/core/java/android/content/SyncManager.java @@ -58,6 +58,7 @@ import android.util.Pair; import android.util.Slog; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; import com.google.android.collect.Lists; import com.google.android.collect.Maps; @@ -155,7 +156,7 @@ public class SyncManager { private SyncStorageEngine mSyncStorageEngine; - // @GuardedBy("mSyncQueue") + @GuardedBy("mSyncQueue") private final SyncQueue mSyncQueue; protected final ArrayList<ActiveSyncContext> mActiveSyncContexts = Lists.newArrayList(); diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java index 10e7bff..1ecab09 100644 --- a/core/java/android/content/SyncStorageEngine.java +++ b/core/java/android/content/SyncStorageEngine.java @@ -16,6 +16,7 @@ package android.content; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; @@ -63,6 +64,7 @@ import java.util.List; public class SyncStorageEngine extends Handler { private static final String TAG = "SyncManager"; + private static final boolean DEBUG = false; private static final boolean DEBUG_FILE = false; private static final String XML_ATTR_NEXT_AUTHORITY_ID = "nextAuthorityId"; @@ -74,7 +76,7 @@ public class SyncStorageEngine extends Handler { private static final long DEFAULT_POLL_FREQUENCY_SECONDS = 60 * 60 * 24; // One day - // @VisibleForTesting + @VisibleForTesting static final long MILLIS_IN_4WEEKS = 1000L * 60 * 60 * 24 * 7 * 4; /** Enum value for a sync start event. */ @@ -442,7 +444,7 @@ public class SyncStorageEngine extends Handler { mChangeListeners.finishBroadcast(); } - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "reportChange " + which + " to: " + reports); } @@ -483,13 +485,17 @@ public class SyncStorageEngine extends Handler { public void setSyncAutomatically(Account account, int userId, String providerName, boolean sync) { - Log.d(TAG, "setSyncAutomatically: " + /* account + */" provider " + providerName - + ", user " + userId + " -> " + sync); + if (DEBUG) { + Log.d(TAG, "setSyncAutomatically: " + /* account + */" provider " + providerName + + ", user " + userId + " -> " + sync); + } synchronized (mAuthorities) { AuthorityInfo authority = getOrCreateAuthorityLocked(account, userId, providerName, -1, false); if (authority.enabled == sync) { - Log.d(TAG, "setSyncAutomatically: already set to " + sync + ", doing nothing"); + if (DEBUG) { + Log.d(TAG, "setSyncAutomatically: already set to " + sync + ", doing nothing"); + } return; } authority.enabled = sync; @@ -531,13 +537,17 @@ public class SyncStorageEngine extends Handler { } else if (syncable < -1) { syncable = -1; } - Log.d(TAG, "setIsSyncable: " + account + ", provider " + providerName - + ", user " + userId + " -> " + syncable); + if (DEBUG) { + Log.d(TAG, "setIsSyncable: " + account + ", provider " + providerName + + ", user " + userId + " -> " + syncable); + } synchronized (mAuthorities) { AuthorityInfo authority = getOrCreateAuthorityLocked(account, userId, providerName, -1, false); if (authority.syncable == syncable) { - Log.d(TAG, "setIsSyncable: already set to " + syncable + ", doing nothing"); + if (DEBUG) { + Log.d(TAG, "setIsSyncable: already set to " + syncable + ", doing nothing"); + } return; } authority.syncable = syncable; @@ -563,7 +573,7 @@ public class SyncStorageEngine extends Handler { public void setBackoff(Account account, int userId, String providerName, long nextSyncTime, long nextDelay) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "setBackoff: " + account + ", provider " + providerName + ", user " + userId + " -> nextSyncTime " + nextSyncTime + ", nextDelay " + nextDelay); @@ -614,7 +624,7 @@ public class SyncStorageEngine extends Handler { for (AuthorityInfo authorityInfo : accountInfo.authorities.values()) { if (authorityInfo.backoffTime != NOT_IN_BACKOFF_MODE || authorityInfo.backoffDelay != NOT_IN_BACKOFF_MODE) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "clearAllBackoffs:" + " authority:" + authorityInfo.authority + " account:" + accountInfo.accountAndUser.account.name @@ -640,7 +650,7 @@ public class SyncStorageEngine extends Handler { public void setDelayUntilTime(Account account, int userId, String providerName, long delayUntil) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "setDelayUntil: " + account + ", provider " + providerName + ", user " + userId + " -> delayUntil " + delayUntil); } @@ -676,7 +686,7 @@ public class SyncStorageEngine extends Handler { if (extras == null) { extras = new Bundle(); } - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "addOrRemovePeriodicSync: " + account + ", user " + userId + ", provider " + providerName + " -> period " + period + ", extras " + extras); @@ -832,7 +842,7 @@ public class SyncStorageEngine extends Handler { public PendingOperation insertIntoPending(PendingOperation op) { synchronized (mAuthorities) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "insertIntoPending: account=" + op.account + " user=" + op.userId + " auth=" + op.authority @@ -864,7 +874,7 @@ public class SyncStorageEngine extends Handler { public boolean deleteFromPending(PendingOperation op) { boolean res = false; synchronized (mAuthorities) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "deleteFromPending: account=" + op.account + " user=" + op.userId + " auth=" + op.authority @@ -883,7 +893,7 @@ public class SyncStorageEngine extends Handler { AuthorityInfo authority = getAuthorityLocked(op.account, op.userId, op.authority, "deleteFromPending"); if (authority != null) { - if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "removing - " + authority); + if (DEBUG) Log.v(TAG, "removing - " + authority); final int N = mPendingOperations.size(); boolean morePending = false; for (int i=0; i<N; i++) { @@ -897,7 +907,7 @@ public class SyncStorageEngine extends Handler { } if (!morePending) { - if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "no more pending!"); + if (DEBUG) Log.v(TAG, "no more pending!"); SyncStatusInfo status = getOrCreateSyncStatusLocked(authority.ident); status.pending = false; } @@ -937,7 +947,7 @@ public class SyncStorageEngine extends Handler { */ public void doDatabaseCleanup(Account[] accounts, int userId) { synchronized (mAuthorities) { - if (Log.isLoggable(TAG, Log.VERBOSE)) Log.w(TAG, "Updating for new accounts..."); + if (DEBUG) Log.v(TAG, "Updating for new accounts..."); SparseArray<AuthorityInfo> removing = new SparseArray<AuthorityInfo>(); Iterator<AccountInfo> accIt = mAccounts.values().iterator(); while (accIt.hasNext()) { @@ -945,8 +955,8 @@ public class SyncStorageEngine extends Handler { if (!ArrayUtils.contains(accounts, acc.accountAndUser.account) && acc.accountAndUser.userId == userId) { // This account no longer exists... - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.w(TAG, "Account removed: " + acc.accountAndUser); + if (DEBUG) { + Log.v(TAG, "Account removed: " + acc.accountAndUser); } for (AuthorityInfo auth : acc.authorities.values()) { removing.put(auth.ident, auth); @@ -992,7 +1002,7 @@ public class SyncStorageEngine extends Handler { public SyncInfo addActiveSync(SyncManager.ActiveSyncContext activeSyncContext) { final SyncInfo syncInfo; synchronized (mAuthorities) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "setActiveSync: account=" + activeSyncContext.mSyncOperation.account + " auth=" + activeSyncContext.mSyncOperation.authority @@ -1020,7 +1030,7 @@ public class SyncStorageEngine extends Handler { */ public void removeActiveSync(SyncInfo syncInfo, int userId) { synchronized (mAuthorities) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "removeActiveSync: account=" + syncInfo.account + " user=" + userId + " auth=" + syncInfo.authority); @@ -1045,7 +1055,7 @@ public class SyncStorageEngine extends Handler { long now, int source, boolean initialization) { long id; synchronized (mAuthorities) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "insertStartSyncEvent: account=" + accountName + "user=" + userId + " auth=" + authorityName + " source=" + source); } @@ -1067,7 +1077,7 @@ public class SyncStorageEngine extends Handler { mSyncHistory.remove(mSyncHistory.size()-1); } id = item.historyId; - if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "returning historyId " + id); + if (DEBUG) Log.v(TAG, "returning historyId " + id); } reportChange(ContentResolver.SYNC_OBSERVER_TYPE_STATUS); @@ -1095,7 +1105,7 @@ public class SyncStorageEngine extends Handler { public void stopSyncEvent(long historyId, long elapsedTime, String resultMessage, long downstreamActivity, long upstreamActivity) { synchronized (mAuthorities) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "stopSyncEvent: historyId=" + historyId); } SyncHistoryItem item = null; @@ -1357,7 +1367,7 @@ public class SyncStorageEngine extends Handler { AccountInfo accountInfo = mAccounts.get(au); if (accountInfo == null) { if (tag != null) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, tag + ": unknown account " + au); } } @@ -1366,7 +1376,7 @@ public class SyncStorageEngine extends Handler { AuthorityInfo authority = accountInfo.authorities.get(authorityName); if (authority == null) { if (tag != null) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, tag + ": unknown authority " + authorityName); } } @@ -1391,7 +1401,7 @@ public class SyncStorageEngine extends Handler { mNextAuthorityId++; doWrite = true; } - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.v(TAG, "created a new AuthorityInfo for " + accountName + ", user " + userId + ", provider " + authorityName); diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index b0ae5da..b9e432c 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -378,6 +378,7 @@ interface IPackageManager { VerifierDeviceIdentity getVerifierDeviceIdentity(); boolean isFirstBoot(); + boolean isOnlyCoreApps(); void setPermissionEnforced(String permission, boolean enforced); boolean isPermissionEnforced(String permission); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 8ba1988..2c31ea0 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -45,7 +45,7 @@ public abstract class PackageManager { /** * This exception is thrown when a given package, application, or component - * name can not be found. + * name cannot be found. */ public static class NameNotFoundException extends AndroidException { public NameNotFoundException() { @@ -259,7 +259,7 @@ public abstract class PackageManager { * user has explicitly disabled the application, regardless of what it has * specified in its manifest. Because this is due to the user's request, * they may re-enable it if desired through the appropriate system UI. This - * option currently <strong>can not</strong> be used with + * option currently <strong>cannot</strong> be used with * {@link #setComponentEnabledSetting(ComponentName, int, int)}. */ public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; @@ -1210,9 +1210,9 @@ public abstract class PackageManager { * package. If flag GET_UNINSTALLED_PACKAGES is set and if the * package is not found in the list of installed applications, the * package information is retrieved from the list of uninstalled - * applications(which includes installed applications as well as - * applications with data directory ie applications which had been - * deleted with DONT_DELTE_DATA flag set). + * applications (which includes installed applications as well as + * applications with data directory i.e. applications which had been + * deleted with {@code DONT_DELETE_DATA} flag set). * @see #GET_ACTIVITIES * @see #GET_GIDS * @see #GET_CONFIGURATIONS @@ -1253,7 +1253,7 @@ public abstract class PackageManager { * null if neither are found. * * <p>Throws {@link NameNotFoundException} if a package with the given - * name can not be found on the system. + * name cannot be found on the system. * * @param packageName The name of the package to inspect. * @@ -1268,7 +1268,7 @@ public abstract class PackageManager { * assigned to a package. * * <p>Throws {@link NameNotFoundException} if a package with the given - * name can not be found on the system. + * name cannot be found on the system. * * @param packageName The full name (i.e. com.google.apps.contacts) of the * desired package. @@ -1283,7 +1283,7 @@ public abstract class PackageManager { * Retrieve all of the information we know about a particular permission. * * <p>Throws {@link NameNotFoundException} if a permission with the given - * name can not be found on the system. + * name cannot be found on the system. * * @param name The fully qualified name (i.e. com.google.permission.LOGIN) * of the permission you are interested in. @@ -1319,7 +1319,7 @@ public abstract class PackageManager { * permissions. * * <p>Throws {@link NameNotFoundException} if a permission group with the given - * name can not be found on the system. + * name cannot be found on the system. * * @param name The fully qualified name (i.e. com.google.permission_group.APPS) * of the permission you are interested in. @@ -1348,7 +1348,7 @@ public abstract class PackageManager { * package/application. * * <p>Throws {@link NameNotFoundException} if an application with the given - * package name can not be found on the system. + * package name cannot be found on the system. * * @param packageName The full name (i.e. com.google.apps.contacts) of an * application. @@ -1364,7 +1364,7 @@ public abstract class PackageManager { * list of uninstalled applications(which includes * installed applications as well as applications * with data directory ie applications which had been - * deleted with DONT_DELTE_DATA flag set). + * deleted with {@code DONT_DELETE_DATA} flag set). * * @see #GET_META_DATA * @see #GET_SHARED_LIBRARY_FILES @@ -1378,7 +1378,7 @@ public abstract class PackageManager { * class. * * <p>Throws {@link NameNotFoundException} if an activity with the given - * class name can not be found on the system. + * class name cannot be found on the system. * * @param component The full component name (i.e. * com.google.apps.contacts/com.google.apps.contacts.ContactsList) of an Activity @@ -1401,7 +1401,7 @@ public abstract class PackageManager { * class. * * <p>Throws {@link NameNotFoundException} if a receiver with the given - * class name can not be found on the system. + * class name cannot be found on the system. * * @param component The full component name (i.e. * com.google.apps.calendar/com.google.apps.calendar.CalendarAlarm) of a Receiver @@ -1424,7 +1424,7 @@ public abstract class PackageManager { * class. * * <p>Throws {@link NameNotFoundException} if a service with the given - * class name can not be found on the system. + * class name cannot be found on the system. * * @param component The full component name (i.e. * com.google.apps.media/com.google.apps.media.BackgroundPlayback) of a Service @@ -1446,7 +1446,7 @@ public abstract class PackageManager { * provider class. * * <p>Throws {@link NameNotFoundException} if a provider with the given - * class name can not be found on the system. + * class name cannot be found on the system. * * @param component The full component name (i.e. * com.google.providers.media/com.google.providers.media.MediaProvider) of a @@ -1483,7 +1483,7 @@ public abstract class PackageManager { * installed on the device. In the unlikely case of there being no * installed packages, an empty list is returned. * If flag GET_UNINSTALLED_PACKAGES is set, a list of all - * applications including those deleted with DONT_DELETE_DATA + * applications including those deleted with {@code DONT_DELETE_DATA} * (partially installed apps with data directory) will be returned. * * @see #GET_ACTIVITIES @@ -1521,7 +1521,7 @@ public abstract class PackageManager { * installed on the device. In the unlikely case of there being no * installed packages, an empty list is returned. * If flag GET_UNINSTALLED_PACKAGES is set, a list of all - * applications including those deleted with DONT_DELETE_DATA + * applications including those deleted with {@code DONT_DELETE_DATA} * (partially installed apps with data directory) will be returned. * * @see #GET_ACTIVITIES @@ -1726,7 +1726,7 @@ public abstract class PackageManager { /** * Return a List of all application packages that are installed on the * device. If flag GET_UNINSTALLED_PACKAGES has been set, a list of all - * applications including those deleted with DONT_DELETE_DATA(partially + * applications including those deleted with {@code DONT_DELETE_DATA} (partially * installed apps with data directory) will be returned. * * @param flags Additional option flags. Use any combination of @@ -1737,7 +1737,7 @@ public abstract class PackageManager { * is installed on the device. In the unlikely case of there being * no installed applications, an empty list is returned. * If flag GET_UNINSTALLED_PACKAGES is set, a list of all - * applications including those deleted with DONT_DELETE_DATA + * applications including those deleted with {@code DONT_DELETE_DATA} * (partially installed apps with data directory) will be returned. * * @see #GET_META_DATA @@ -2043,7 +2043,7 @@ public abstract class PackageManager { * instrumentation class. * * <p>Throws {@link NameNotFoundException} if instrumentation with the - * given class name can not be found on the system. + * given class name cannot be found on the system. * * @param className The full name (i.e. * com.google.apps.contacts.InstrumentList) of an @@ -2080,8 +2080,8 @@ public abstract class PackageManager { * icon. * * @param packageName The name of the package that this icon is coming from. - * Can not be null. - * @param resid The resource identifier of the desired image. Can not be 0. + * Cannot be null. + * @param resid The resource identifier of the desired image. Cannot be 0. * @param appInfo Overall information about <var>packageName</var>. This * may be null, in which case the application information will be retrieved * for you if needed; if you already have this information around, it can @@ -2097,7 +2097,7 @@ public abstract class PackageManager { * Retrieve the icon associated with an activity. Given the full name of * an activity, retrieves the information about it and calls * {@link ComponentInfo#loadIcon ComponentInfo.loadIcon()} to return its icon. - * If the activity can not be found, NameNotFoundException is thrown. + * If the activity cannot be found, NameNotFoundException is thrown. * * @param activityName Name of the activity whose icon is to be retrieved. * @@ -2116,7 +2116,7 @@ public abstract class PackageManager { * set, this simply returns the result of * getActivityIcon(intent.getClassName()). Otherwise it resolves the intent's * component and returns the icon associated with the resolved component. - * If intent.getClassName() can not be found or the Intent can not be resolved + * If intent.getClassName() cannot be found or the Intent cannot be resolved * to a component, NameNotFoundException is thrown. * * @param intent The intent for which you would like to retrieve an icon. @@ -2155,7 +2155,7 @@ public abstract class PackageManager { /** * Retrieve the icon associated with an application. Given the name of the * application's package, retrieves the information about it and calls - * getApplicationIcon() to return its icon. If the application can not be + * getApplicationIcon() to return its icon. If the application cannot be * found, NameNotFoundException is thrown. * * @param packageName Name of the package whose application icon is to be @@ -2175,7 +2175,7 @@ public abstract class PackageManager { * Retrieve the logo associated with an activity. Given the full name of * an activity, retrieves the information about it and calls * {@link ComponentInfo#loadLogo ComponentInfo.loadLogo()} to return its logo. - * If the activity can not be found, NameNotFoundException is thrown. + * If the activity cannot be found, NameNotFoundException is thrown. * * @param activityName Name of the activity whose logo is to be retrieved. * @@ -2195,7 +2195,7 @@ public abstract class PackageManager { * set, this simply returns the result of * getActivityLogo(intent.getClassName()). Otherwise it resolves the intent's * component and returns the logo associated with the resolved component. - * If intent.getClassName() can not be found or the Intent can not be resolved + * If intent.getClassName() cannot be found or the Intent cannot be resolved * to a component, NameNotFoundException is thrown. * * @param intent The intent for which you would like to retrieve a logo. @@ -2227,7 +2227,7 @@ public abstract class PackageManager { /** * Retrieve the logo associated with an application. Given the name of the * application's package, retrieves the information about it and calls - * getApplicationLogo() to return its logo. If the application can not be + * getApplicationLogo() to return its logo. If the application cannot be * found, NameNotFoundException is thrown. * * @param packageName Name of the package whose application logo is to be @@ -2251,8 +2251,8 @@ public abstract class PackageManager { * labels and other text. * * @param packageName The name of the package that this text is coming from. - * Can not be null. - * @param resid The resource identifier of the desired text. Can not be 0. + * Cannot be null. + * @param resid The resource identifier of the desired text. Cannot be 0. * @param appInfo Overall information about <var>packageName</var>. This * may be null, in which case the application information will be retrieved * for you if needed; if you already have this information around, it can @@ -2269,8 +2269,8 @@ public abstract class PackageManager { * retrieve XML meta data. * * @param packageName The name of the package that this xml is coming from. - * Can not be null. - * @param resid The resource identifier of the desired xml. Can not be 0. + * Cannot be null. + * @param resid The resource identifier of the desired xml. Cannot be 0. * @param appInfo Overall information about <var>packageName</var>. This * may be null, in which case the application information will be retrieved * for you if needed; if you already have this information around, it can @@ -2288,7 +2288,7 @@ public abstract class PackageManager { * * @return Returns the label associated with this application, or null if * it could not be found for any reason. - * @param info The application to get the label of + * @param info The application to get the label of. */ public abstract CharSequence getApplicationLabel(ApplicationInfo info); @@ -2296,7 +2296,7 @@ public abstract class PackageManager { * Retrieve the resources associated with an activity. Given the full * name of an activity, retrieves the information about it and calls * getResources() to return its application's resources. If the activity - * can not be found, NameNotFoundException is thrown. + * cannot be found, NameNotFoundException is thrown. * * @param activityName Name of the activity whose resources are to be * retrieved. @@ -2327,7 +2327,7 @@ public abstract class PackageManager { * Retrieve the resources associated with an application. Given the full * package name of an application, retrieves the information about it and * calls getResources() to return its application's resources. If the - * appPackageName can not be found, NameNotFoundException is thrown. + * appPackageName cannot be found, NameNotFoundException is thrown. * * @param appPackageName Package name of the application whose resources * are to be retrieved. @@ -2496,7 +2496,7 @@ public abstract class PackageManager { * {@link PackageManager#VERIFICATION_REJECT}. * * @param id pending package identifier as passed via the - * {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra + * {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra. * @param verificationCode either {@link PackageManager#VERIFICATION_ALLOW} * or {@link PackageManager#VERIFICATION_REJECT}. * @throws SecurityException if the caller does not have the @@ -2517,7 +2517,7 @@ public abstract class PackageManager { * will have no effect. * * @param id pending package identifier as passed via the - * {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra + * {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra. * @param verificationCodeAtTimeout either * {@link PackageManager#VERIFICATION_ALLOW} or * {@link PackageManager#VERIFICATION_REJECT}. If @@ -2701,16 +2701,16 @@ public abstract class PackageManager { /** * @deprecated This function no longer does anything; it was an old - * approach to managing preferred activities, which has been superceeded - * (and conflicts with) the modern activity-based preferences. + * approach to managing preferred activities, which has been superseded + * by (and conflicts with) the modern activity-based preferences. */ @Deprecated public abstract void addPackageToPreferred(String packageName); /** * @deprecated This function no longer does anything; it was an old - * approach to managing preferred activities, which has been superceeded - * (and conflicts with) the modern activity-based preferences. + * approach to managing preferred activities, which has been superseded + * by (and conflicts with) the modern activity-based preferences. */ @Deprecated public abstract void removePackageFromPreferred(String packageName); @@ -2749,7 +2749,7 @@ public abstract class PackageManager { /** * @deprecated This is a protected API that should not have been available * to third party applications. It is the platform's responsibility for - * assigning preferred activities and this can not be directly modified. + * assigning preferred activities and this cannot be directly modified. * * Add a new preferred activity mapping to the system. This will be used * to automatically select the given activity component when @@ -2783,7 +2783,7 @@ public abstract class PackageManager { /** * @deprecated This is a protected API that should not have been available * to third party applications. It is the platform's responsibility for - * assigning preferred activities and this can not be directly modified. + * assigning preferred activities and this cannot be directly modified. * * Replaces an existing preferred activity mapping to the system, and if that were not present * adds a new preferred activity. This will be used diff --git a/core/java/android/content/pm/RegisteredServicesCache.java b/core/java/android/content/pm/RegisteredServicesCache.java index 6def4a1..aaa0917 100644 --- a/core/java/android/content/pm/RegisteredServicesCache.java +++ b/core/java/android/content/pm/RegisteredServicesCache.java @@ -34,6 +34,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.Xml; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.FastXmlSerializer; import com.google.android.collect.Lists; import com.google.android.collect.Maps; @@ -68,6 +69,7 @@ import java.util.Map; */ public abstract class RegisteredServicesCache<V> { private static final String TAG = "PackageManager"; + private static final boolean DEBUG = false; public final Context mContext; private final String mInterfaceName; @@ -77,15 +79,15 @@ public abstract class RegisteredServicesCache<V> { private final Object mServicesLock = new Object(); - // @GuardedBy("mServicesLock") + @GuardedBy("mServicesLock") private boolean mPersistentServicesFileDidNotExist; - // @GuardedBy("mServicesLock") + @GuardedBy("mServicesLock") private final SparseArray<UserServices<V>> mUserServices = new SparseArray<UserServices<V>>(); private static class UserServices<V> { - // @GuardedBy("mServicesLock") + @GuardedBy("mServicesLock") public final Map<V, Integer> persistentServices = Maps.newHashMap(); - // @GuardedBy("mServicesLock") + @GuardedBy("mServicesLock") public Map<V, ServiceInfo<V>> services = null; } @@ -194,7 +196,7 @@ public abstract class RegisteredServicesCache<V> { } private void notifyListener(final V type, final int userId, final boolean removed) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { Log.d(TAG, "notifyListener: " + type + " is " + (removed ? "removed" : "added")); } RegisteredServicesCacheListener<V> listener; @@ -290,7 +292,9 @@ public abstract class RegisteredServicesCache<V> { * given {@link UserHandle}. */ private void generateServicesMap(int userId) { - Slog.d(TAG, "generateServicesMap() for " + userId); + if (DEBUG) { + Slog.d(TAG, "generateServicesMap() for " + userId); + } final PackageManager pm = mContext.getPackageManager(); final ArrayList<ServiceInfo<V>> serviceInfos = new ArrayList<ServiceInfo<V>>(); @@ -321,6 +325,7 @@ public abstract class RegisteredServicesCache<V> { } StringBuilder changes = new StringBuilder(); + boolean changed = false; for (ServiceInfo<V> info : serviceInfos) { // four cases: // - doesn't exist yet @@ -333,33 +338,41 @@ public abstract class RegisteredServicesCache<V> { // - add, notify user that it was added Integer previousUid = user.persistentServices.get(info.type); if (previousUid == null) { - changes.append(" New service added: ").append(info).append("\n"); + if (DEBUG) { + changes.append(" New service added: ").append(info).append("\n"); + } + changed = true; user.services.put(info.type, info); user.persistentServices.put(info.type, info.uid); if (!(mPersistentServicesFileDidNotExist && firstScan)) { notifyListener(info.type, userId, false /* removed */); } } else if (previousUid == info.uid) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { changes.append(" Existing service (nop): ").append(info).append("\n"); } user.services.put(info.type, info); } else if (inSystemImage(info.uid) || !containsTypeAndUid(serviceInfos, info.type, previousUid)) { - if (inSystemImage(info.uid)) { - changes.append(" System service replacing existing: ").append(info) - .append("\n"); - } else { - changes.append(" Existing service replacing a removed service: ") - .append(info).append("\n"); + if (DEBUG) { + if (inSystemImage(info.uid)) { + changes.append(" System service replacing existing: ").append(info) + .append("\n"); + } else { + changes.append(" Existing service replacing a removed service: ") + .append(info).append("\n"); + } } + changed = true; user.services.put(info.type, info); user.persistentServices.put(info.type, info.uid); notifyListener(info.type, userId, false /* removed */); } else { // ignore - changes.append(" Existing service with new uid ignored: ").append(info) - .append("\n"); + if (DEBUG) { + changes.append(" Existing service with new uid ignored: ").append(info) + .append("\n"); + } } } @@ -370,22 +383,25 @@ public abstract class RegisteredServicesCache<V> { } } for (V v1 : toBeRemoved) { + if (DEBUG) { + changes.append(" Service removed: ").append(v1).append("\n"); + } + changed = true; user.persistentServices.remove(v1); - changes.append(" Service removed: ").append(v1).append("\n"); notifyListener(v1, userId, true /* removed */); } - if (changes.length() > 0) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + if (DEBUG) { + if (changes.length() > 0) { Log.d(TAG, "generateServicesMap(" + mInterfaceName + "): " + serviceInfos.size() + " services:\n" + changes); - } - writePersistentServicesLocked(); - } else { - if (Log.isLoggable(TAG, Log.VERBOSE)) { + } else { Log.d(TAG, "generateServicesMap(" + mInterfaceName + "): " + serviceInfos.size() + " services unchanged"); } } + if (changed) { + writePersistentServicesLocked(); + } } } diff --git a/core/java/android/hardware/SensorEvent.java b/core/java/android/hardware/SensorEvent.java index 51a17c1..6166d2c 100644 --- a/core/java/android/hardware/SensorEvent.java +++ b/core/java/android/hardware/SensorEvent.java @@ -334,8 +334,8 @@ public class SensorEvent { * </p> * * <p> - * values[2]: Roll, rotation around y-axis (-90 to 90), with positive values - * when the x-axis moves <b>toward</b> the z-axis. + * values[2]: Roll, rotation around the x-axis (-90 to 90) + * increasing as the device moves clockwise. * </p> * </ul> * diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index b8ad818..08fba29 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -572,7 +572,10 @@ public abstract class SensorManager { * are received faster. The value must be one of * {@link #SENSOR_DELAY_NORMAL}, {@link #SENSOR_DELAY_UI}, * {@link #SENSOR_DELAY_GAME}, or {@link #SENSOR_DELAY_FASTEST} - * or, the desired delay between events in microsecond. + * or, the desired delay between events in microseconds. + * Specifying the delay in microseconds only works from Android + * 2.3 (API level 9) onwards. For earlier releases, you must use + * one of the {@code SENSOR_DELAY_*} constants. * * @return <code>true</code> if the sensor is supported and successfully * enabled. @@ -604,7 +607,10 @@ public abstract class SensorManager { * are received faster. The value must be one of * {@link #SENSOR_DELAY_NORMAL}, {@link #SENSOR_DELAY_UI}, * {@link #SENSOR_DELAY_GAME}, or {@link #SENSOR_DELAY_FASTEST}. - * or, the desired delay between events in microsecond. + * or, the desired delay between events in microseconds. + * Specifying the delay in microseconds only works from Android + * 2.3 (API level 9) onwards. For earlier releases, you must use + * one of the {@code SENSOR_DELAY_*} constants. * * @param handler * The {@link android.os.Handler Handler} the diff --git a/core/java/android/hardware/display/WifiDisplay.java b/core/java/android/hardware/display/WifiDisplay.java index 0138b1c..2fd52b8 100644 --- a/core/java/android/hardware/display/WifiDisplay.java +++ b/core/java/android/hardware/display/WifiDisplay.java @@ -107,6 +107,15 @@ public final class WifiDisplay implements Parcelable { && Objects.equal(mDeviceAlias, other.mDeviceAlias); } + /** + * Returns true if the other display is not null and has the same address as this one. + * Can be used to perform identity comparisons on displays ignoring properties + * that might change during a connection such as the name or alias. + */ + public boolean hasSameAddress(WifiDisplay other) { + return other != null && mDeviceAddress.equals(other.mDeviceAddress); + } + @Override public int hashCode() { // The address on its own should be sufficiently unique for hashing purposes. diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index f07002e..6f1cc94 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -930,11 +930,13 @@ public class InputMethodService extends AbstractInputMethodService { */ public void onConfigureWindow(Window win, boolean isFullscreen, boolean isCandidatesOnly) { - if (isFullscreen) { - mWindow.getWindow().setLayout(MATCH_PARENT, MATCH_PARENT); - } else { - mWindow.getWindow().setLayout(MATCH_PARENT, WRAP_CONTENT); + final int currentHeight = mWindow.getWindow().getAttributes().height; + final int newHeight = isFullscreen ? MATCH_PARENT : WRAP_CONTENT; + if (mIsInputViewShown && currentHeight != newHeight) { + Log.w(TAG, "Window size has been changed. This may cause jankiness of resizing window: " + + currentHeight + " -> " + newHeight); } + mWindow.getWindow().setLayout(MATCH_PARENT, newHeight); } /** @@ -997,10 +999,11 @@ public class InputMethodService extends AbstractInputMethodService { } void updateExtractFrameVisibility() { - int vis; + final int vis; if (isFullscreenMode()) { vis = mExtractViewHidden ? View.INVISIBLE : View.VISIBLE; - mExtractFrame.setVisibility(View.VISIBLE); + // "vis" should be applied for the extract frame as well in the fullscreen mode. + mExtractFrame.setVisibility(vis); } else { vis = View.VISIBLE; mExtractFrame.setVisibility(View.GONE); diff --git a/core/java/android/net/DhcpStateMachine.java b/core/java/android/net/DhcpStateMachine.java index 874e80a..8dc900e 100644 --- a/core/java/android/net/DhcpStateMachine.java +++ b/core/java/android/net/DhcpStateMachine.java @@ -351,6 +351,8 @@ public class DhcpStateMachine extends StateMachine { DhcpInfoInternal dhcpInfoInternal = new DhcpInfoInternal(); if (dhcpAction == DhcpAction.START) { + /* Stop any existing DHCP daemon before starting new */ + NetworkUtils.stopDhcp(mInterfaceName); if (DBG) Log.d(TAG, "DHCP request on " + mInterfaceName); success = NetworkUtils.runDhcp(mInterfaceName, dhcpInfoInternal); mDhcpInfo = dhcpInfoInternal; diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index 446bbf0..c757605 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -21,6 +21,7 @@ import android.os.Parcelable; import android.os.SystemClock; import android.util.SparseBooleanArray; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.Objects; @@ -190,14 +191,14 @@ public class NetworkStats implements Parcelable { return clone; } - // @VisibleForTesting + @VisibleForTesting public NetworkStats addIfaceValues( String iface, long rxBytes, long rxPackets, long txBytes, long txPackets) { return addValues( iface, UID_ALL, SET_DEFAULT, TAG_NONE, rxBytes, rxPackets, txBytes, txPackets, 0L); } - // @VisibleForTesting + @VisibleForTesting public NetworkStats addValues(String iface, int uid, int set, int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations) { return addValues(new Entry( @@ -269,7 +270,7 @@ public class NetworkStats implements Parcelable { return size; } - // @VisibleForTesting + @VisibleForTesting public int internalSize() { return iface.length; } @@ -335,7 +336,7 @@ public class NetworkStats implements Parcelable { * Find first stats index that matches the requested parameters, starting * search around the hinted index as an optimization. */ - // @VisibleForTesting + @VisibleForTesting public int findIndexHinted(String iface, int uid, int set, int tag, int hintIndex) { for (int offset = 0; offset < size; offset++) { final int halfOffset = offset / 2; diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index d8e53d5..d3839ad 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -33,6 +33,7 @@ import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Objects; /** @@ -63,7 +64,7 @@ public class NetworkTemplate implements Parcelable { private static boolean sForceAllNetworkTypes = false; - // @VisibleForTesting + @VisibleForTesting public static void forceAllNetworkTypes() { sForceAllNetworkTypes = true; } diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 54f2fe3..9821824 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -18,6 +18,8 @@ package android.os; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Formatter; import java.util.List; import java.util.Map; @@ -1127,8 +1129,10 @@ public abstract class BatteryStats implements Parcelable { if (totalTimeMillis != 0) { sb.append(linePrefix); formatTimeMs(sb, totalTimeMillis); - if (name != null) sb.append(name); - sb.append(' '); + if (name != null) { + sb.append(name); + sb.append(' '); + } sb.append('('); sb.append(count); sb.append(" times)"); @@ -1440,8 +1444,21 @@ public abstract class BatteryStats implements Parcelable { } } + static final class TimerEntry { + final String mName; + final int mId; + final BatteryStats.Timer mTimer; + final long mTime; + TimerEntry(String name, int id, BatteryStats.Timer timer, long time) { + mName = name; + mId = id; + mTimer = timer; + mTime = time; + } + } + @SuppressWarnings("unused") - public final void dumpLocked(PrintWriter pw, String prefix, int which, int reqUid) { + public final void dumpLocked(PrintWriter pw, String prefix, final int which, int reqUid) { final long rawUptime = SystemClock.uptimeMillis() * 1000; final long rawRealtime = SystemClock.elapsedRealtime() * 1000; final long batteryUptime = getBatteryUptime(rawUptime); @@ -1516,19 +1533,43 @@ public abstract class BatteryStats implements Parcelable { long txTotal = 0; long fullWakeLockTimeTotalMicros = 0; long partialWakeLockTimeTotalMicros = 0; - + + final Comparator<TimerEntry> timerComparator = new Comparator<TimerEntry>() { + @Override + public int compare(TimerEntry lhs, TimerEntry rhs) { + long lhsTime = lhs.mTime; + long rhsTime = rhs.mTime; + if (lhsTime < rhsTime) { + return 1; + } + if (lhsTime > rhsTime) { + return -1; + } + return 0; + } + }; + if (reqUid < 0) { Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats(); if (kernelWakelocks.size() > 0) { + final ArrayList<TimerEntry> timers = new ArrayList<TimerEntry>(); for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) { - + BatteryStats.Timer timer = ent.getValue(); + long totalTimeMillis = computeWakeLock(timer, batteryRealtime, which); + if (totalTimeMillis > 0) { + timers.add(new TimerEntry(ent.getKey(), 0, timer, totalTimeMillis)); + } + } + Collections.sort(timers, timerComparator); + for (int i=0; i<timers.size(); i++) { + TimerEntry timer = timers.get(i); String linePrefix = ": "; sb.setLength(0); sb.append(prefix); sb.append(" Kernel Wake lock "); - sb.append(ent.getKey()); - linePrefix = printWakeLock(sb, ent.getValue(), batteryRealtime, null, which, - linePrefix); + sb.append(timer.mName); + linePrefix = printWakeLock(sb, timer.mTimer, batteryRealtime, null, + which, linePrefix); if (!linePrefix.equals(": ")) { sb.append(" realtime"); // Only print out wake locks that were held @@ -1537,7 +1578,9 @@ public abstract class BatteryStats implements Parcelable { } } } - + + final ArrayList<TimerEntry> timers = new ArrayList<TimerEntry>(); + for (int iu = 0; iu < NU; iu++) { Uid u = uidStats.valueAt(iu); rxTotal += u.getTcpBytesReceived(which); @@ -1557,8 +1600,18 @@ public abstract class BatteryStats implements Parcelable { Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL); if (partialWakeTimer != null) { - partialWakeLockTimeTotalMicros += partialWakeTimer.getTotalTimeLocked( + long totalTimeMicros = partialWakeTimer.getTotalTimeLocked( batteryRealtime, which); + if (totalTimeMicros > 0) { + if (reqUid < 0) { + // Only show the ordered list of all wake + // locks if the caller is not asking for data + // about a specific uid. + timers.add(new TimerEntry(ent.getKey(), u.getUid(), + partialWakeTimer, totalTimeMicros)); + } + partialWakeLockTimeTotalMicros += totalTimeMicros; + } } } } @@ -1571,7 +1624,7 @@ public abstract class BatteryStats implements Parcelable { sb.append(prefix); sb.append(" Total full wakelock time: "); formatTimeMs(sb, (fullWakeLockTimeTotalMicros + 500) / 1000); - sb.append(", Total partial waklock time: "); formatTimeMs(sb, + sb.append(", Total partial wakelock time: "); formatTimeMs(sb, (partialWakeLockTimeTotalMicros + 500) / 1000); pw.println(sb.toString()); @@ -1676,9 +1729,26 @@ public abstract class BatteryStats implements Parcelable { pw.println(getDischargeAmountScreenOnSinceCharge()); pw.print(prefix); pw.print(" Amount discharged while screen off: "); pw.println(getDischargeAmountScreenOffSinceCharge()); - pw.println(" "); + pw.println(); + } + + if (timers.size() > 0) { + Collections.sort(timers, timerComparator); + pw.print(prefix); pw.println(" All partial wake locks:"); + for (int i=0; i<timers.size(); i++) { + TimerEntry timer = timers.get(i); + sb.setLength(0); + sb.append(" Wake lock #"); + sb.append(timer.mId); + sb.append(" "); + sb.append(timer.mName); + printWakeLock(sb, timer.mTimer, batteryRealtime, null, which, ": "); + sb.append(" realtime"); + pw.println(sb.toString()); + } + timers.clear(); + pw.println(); } - for (int iu=0; iu<NU; iu++) { final int uid = uidStats.keyAt(iu); diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 88529f8..1bada67 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -22,6 +22,8 @@ import android.os.storage.StorageVolume; import android.text.TextUtils; import android.util.Log; +import com.android.internal.annotations.GuardedBy; + import java.io.File; /** @@ -47,7 +49,7 @@ public class Environment { private static final Object sLock = new Object(); - // @GuardedBy("sLock") + @GuardedBy("sLock") private static volatile StorageVolume sPrimaryVolume; private static StorageVolume getPrimaryVolume() { diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 3e90dfc..ec660ee 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -15,6 +15,9 @@ */ package android.os; + +import dalvik.system.CloseGuard; + import java.io.Closeable; import java.io.File; import java.io.FileDescriptor; @@ -31,12 +34,16 @@ import java.net.Socket; */ public class ParcelFileDescriptor implements Parcelable, Closeable { private final FileDescriptor mFileDescriptor; - private boolean mClosed; - //this field is to create wrapper for ParcelFileDescriptor using another - //PartialFileDescriptor but avoid invoking close twice - //consider ParcelFileDescriptor A(fileDescriptor fd), ParcelFileDescriptor B(A) - //in this particular case fd.close might be invoked twice. - private final ParcelFileDescriptor mParcelDescriptor; + + /** + * Wrapped {@link ParcelFileDescriptor}, if any. Used to avoid + * double-closing {@link #mFileDescriptor}. + */ + private final ParcelFileDescriptor mWrapped; + + private volatile boolean mClosed; + + private final CloseGuard mGuard = CloseGuard.get(); /** * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied @@ -289,13 +296,15 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { if (mClosed) { throw new IllegalStateException("Already closed"); } - if (mParcelDescriptor != null) { - int fd = mParcelDescriptor.detachFd(); + if (mWrapped != null) { + int fd = mWrapped.detachFd(); mClosed = true; + mGuard.close(); return fd; } int fd = getFd(); mClosed = true; + mGuard.close(); Parcel.clearFileDescriptor(mFileDescriptor); return fd; } @@ -307,15 +316,16 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * @throws IOException * If an error occurs attempting to close this ParcelFileDescriptor. */ + @Override public void close() throws IOException { - synchronized (this) { - if (mClosed) return; - mClosed = true; - } - if (mParcelDescriptor != null) { + if (mClosed) return; + mClosed = true; + mGuard.close(); + + if (mWrapped != null) { // If this is a proxy to another file descriptor, just call through to its // close method. - mParcelDescriptor.close(); + mWrapped.close(); } else { Parcel.closeFileDescriptor(mFileDescriptor); } @@ -374,6 +384,9 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { @Override protected void finalize() throws Throwable { + if (mGuard != null) { + mGuard.warnIfOpen(); + } try { if (!mClosed) { close(); @@ -384,21 +397,22 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { } public ParcelFileDescriptor(ParcelFileDescriptor descriptor) { - super(); - mParcelDescriptor = descriptor; - mFileDescriptor = mParcelDescriptor.mFileDescriptor; + mWrapped = descriptor; + mFileDescriptor = mWrapped.mFileDescriptor; + mGuard.open("close"); } - /*package */ParcelFileDescriptor(FileDescriptor descriptor) { - super(); + /** {@hide} */ + public ParcelFileDescriptor(FileDescriptor descriptor) { if (descriptor == null) { throw new NullPointerException("descriptor must not be null"); } + mWrapped = null; mFileDescriptor = descriptor; - mParcelDescriptor = null; + mGuard.open("close"); } - /* Parcelable interface */ + @Override public int describeContents() { return Parcelable.CONTENTS_FILE_DESCRIPTOR; } @@ -408,6 +422,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * If {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set in flags, * the file descriptor will be closed after a copy is written to the Parcel. */ + @Override public void writeToParcel(Parcel out, int flags) { out.writeFileDescriptor(mFileDescriptor); if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { @@ -421,12 +436,14 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { public static final Parcelable.Creator<ParcelFileDescriptor> CREATOR = new Parcelable.Creator<ParcelFileDescriptor>() { + @Override public ParcelFileDescriptor createFromParcel(Parcel in) { return in.readFileDescriptor(); } + + @Override public ParcelFileDescriptor[] newArray(int size) { return new ParcelFileDescriptor[size]; } }; - } diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 4a01113..736762f 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -182,6 +182,8 @@ public final class PowerManager { * </p><p> * Since not all devices have proximity sensors, use {@link #isWakeLockLevelSupported} * to determine whether this wake lock level is supported. + * </p><p> + * Cannot be used with {@link #ACQUIRE_CAUSES_WAKEUP}. * </p> * * {@hide} diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java index ed51818..0ca9183 100644 --- a/core/java/android/os/Trace.java +++ b/core/java/android/os/Trace.java @@ -44,6 +44,7 @@ public final class Trace { public static final long TRACE_TAG_AUDIO = 1L << 8; public static final long TRACE_TAG_VIDEO = 1L << 9; public static final long TRACE_TAG_CAMERA = 1L << 10; + private static final long TRACE_TAG_NOT_READY = 1L << 63; public static final int TRACE_FLAGS_START_BIT = 1; public static final String[] TRACE_TAGS = { @@ -53,11 +54,8 @@ public final class Trace { public static final String PROPERTY_TRACE_TAG_ENABLEFLAGS = "debug.atrace.tags.enableflags"; - // This works as a "not ready" flag because TRACE_TAG_ALWAYS is always set. - private static final long TRACE_FLAGS_NOT_READY = 0; - // Must be volatile to avoid word tearing. - private static volatile long sEnabledTags = TRACE_FLAGS_NOT_READY; + private static volatile long sEnabledTags = TRACE_TAG_NOT_READY; private static native long nativeGetEnabledTags(); private static native void nativeTraceCounter(long tag, String name, int value); @@ -99,7 +97,7 @@ public final class Trace { */ private static long cacheEnabledTags() { long tags = nativeGetEnabledTags(); - if (tags == TRACE_FLAGS_NOT_READY) { + if (tags == TRACE_TAG_NOT_READY) { Log.w(TAG, "Unexpected value from nativeGetEnabledTags: " + tags); // keep going } @@ -115,7 +113,7 @@ public final class Trace { */ public static boolean isTagEnabled(long traceTag) { long tags = sEnabledTags; - if (tags == TRACE_FLAGS_NOT_READY) { + if (tags == TRACE_TAG_NOT_READY) { tags = cacheEnabledTags(); } return (tags & traceTag) != 0; diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index af6e88e9..0fa5799 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -106,16 +106,13 @@ public final class CalendarContract { * {@link Activity#RESULT_OK} or {@link Activity#RESULT_CANCELED} to * acknowledge whether the action was handled or not. * - * The custom app should have an intent-filter like the following + * The custom app should have an intent filter like the following: * <pre> - * {@code - * <intent-filter> - * <action android:name="android.provider.calendar.action.HANDLE_CUSTOM_EVENT" /> - * <category android:name="android.intent.category.DEFAULT" /> - * <data android:mimeType="vnd.android.cursor.item/event" /> - * </intent-filter> - * } - * </pre> + * <intent-filter> + * <action android:name="android.provider.calendar.action.HANDLE_CUSTOM_EVENT" /> + * <category android:name="android.intent.category.DEFAULT" /> + * <data android:mimeType="vnd.android.cursor.item/event" /> + * </intent-filter></pre> * <p> * Input: {@link Intent#getData} has the event URI. The extra * {@link #EXTRA_EVENT_BEGIN_TIME} has the start time of the instance. The @@ -123,7 +120,7 @@ public final class CalendarContract { * {@link EventsColumns#CUSTOM_APP_URI}. * <p> * Output: {@link Activity#RESULT_OK} if this was handled; otherwise - * {@link Activity#RESULT_CANCELED} + * {@link Activity#RESULT_CANCELED}. */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_HANDLE_CUSTOM_EVENT = diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 8f54a38..e3053be 100755 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -1359,7 +1359,7 @@ public final class ContactsContract { * status definitions. Automatically computed as the highest presence of all * constituent raw contacts. The provider may choose not to store this value * in persistent storage. The expectation is that presence status will be - * updated on a regular basic.</td> + * updated on a regular basis.</td> * </tr> * <tr> * <td>String</td> @@ -2326,7 +2326,7 @@ public final class ContactsContract { * parameters. The latter approach is preferable, especially when you can reuse the * URI: * <pre> - * Uri rawContactUri = RawContacts.URI.buildUpon() + * Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon() * .appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName) * .appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType) * .build(); @@ -4131,7 +4131,7 @@ public final class ContactsContract { * all IM rows. See {@link StatusUpdates} for individual status definitions. * The provider may choose not to store this value * in persistent storage. The expectation is that presence status will be - * updated on a regular basic. + * updated on a regular basis. * </td> * </tr> * <tr> diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b94f0b9..4dbc4b4 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -626,6 +626,21 @@ public final class Settings { public static final String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS"; + /** + * Activity Action: Show Daydream settings. + * <p> + * In some cases, a matching Activity may not exist, so ensure you + * safeguard against this. + * <p> + * Input: Nothing. + * <p> + * Output: Nothing. + * @see android.service.dreams.DreamService + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_DREAM_SETTINGS = "android.settings.DREAM_SETTINGS"; + // End of Intent actions for Settings /** @@ -4281,6 +4296,13 @@ public final class Settings { public static final String POWER_SOUNDS_ENABLED = "power_sounds_enabled"; /** + * URI for the "wireless charging started" sound. + * @hide + */ + public static final String WIRELESS_CHARGING_STARTED_SOUND = + "wireless_charging_started_sound"; + + /** * Whether we keep the device on while the device is plugged in. * Supported values are: * <ul> @@ -5315,6 +5337,12 @@ public final class Settings { public static final String DOCK_AUDIO_MEDIA_ENABLED = "dock_audio_media_enabled"; /** + * Persisted safe headphone volume management state by AudioService + * @hide + */ + public static final String AUDIO_SAFE_VOLUME_STATE = "audio_safe_volume_state"; + + /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. * diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java index 4a21374..46f2723 100644 --- a/core/java/android/server/search/SearchManagerService.java +++ b/core/java/android/server/search/SearchManagerService.java @@ -92,7 +92,7 @@ public class SearchManagerService extends ISearchManager.Stub { Searchables searchables = mSearchables.get(userId); if (searchables == null) { - Log.i(TAG, "Building list of searchable activities for userId=" + userId); + //Log.i(TAG, "Building list of searchable activities for userId=" + userId); searchables = new Searchables(mContext, userId); searchables.buildSearchableList(); mSearchables.append(userId, searchables); diff --git a/core/java/android/text/format/DateUtils.java b/core/java/android/text/format/DateUtils.java index 1060bd8..bcce61d 100644 --- a/core/java/android/text/format/DateUtils.java +++ b/core/java/android/text/format/DateUtils.java @@ -607,6 +607,30 @@ public class DateUtils } /** + * Return given duration in a human-friendly format. For example, "4 + * minutes" or "1 second". Returns only largest meaningful unit of time, + * from seconds up to hours. + * + * @hide + */ + public static CharSequence formatDuration(long millis) { + final Resources res = Resources.getSystem(); + if (millis >= HOUR_IN_MILLIS) { + final int hours = (int) ((millis + 1800000) / HOUR_IN_MILLIS); + return res.getQuantityString( + com.android.internal.R.plurals.duration_hours, hours, hours); + } else if (millis >= MINUTE_IN_MILLIS) { + final int minutes = (int) ((millis + 30000) / MINUTE_IN_MILLIS); + return res.getQuantityString( + com.android.internal.R.plurals.duration_minutes, minutes, minutes); + } else { + final int seconds = (int) ((millis + 500) / SECOND_IN_MILLIS); + return res.getQuantityString( + com.android.internal.R.plurals.duration_seconds, seconds, seconds); + } + } + + /** * Formats an elapsed time in the form "MM:SS" or "H:MM:SS" * for display on the call-in-progress screen. * @param elapsedSeconds the elapsed time in seconds. diff --git a/core/java/android/util/AttributeSet.java b/core/java/android/util/AttributeSet.java index 470526c..74942ba 100644 --- a/core/java/android/util/AttributeSet.java +++ b/core/java/android/util/AttributeSet.java @@ -151,7 +151,7 @@ public interface AttributeSet { * Return the value of 'attribute' as a resource identifier. * * <p>Note that this is different than {@link #getAttributeNameResource} - * in that it returns a the value contained in this attribute as a + * in that it returns the value contained in this attribute as a * resource identifier (i.e., a value originally of the form * "@package:type/resource"); the other method returns a resource * identifier that identifies the name of the attribute. @@ -230,7 +230,7 @@ public interface AttributeSet { * Return the value of attribute at 'index' as a resource identifier. * * <p>Note that this is different than {@link #getAttributeNameResource} - * in that it returns a the value contained in this attribute as a + * in that it returns the value contained in this attribute as a * resource identifier (i.e., a value originally of the form * "@package:type/resource"); the other method returns a resource * identifier that identifies the name of the attribute. diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index 85e4b9d..e856501 100644 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -232,19 +232,32 @@ public class DisplayMetrics { * @return True if the display metrics are equal. */ public boolean equals(DisplayMetrics other) { + return equalsPhysical(other) + && scaledDensity == other.scaledDensity + && noncompatScaledDensity == other.noncompatScaledDensity; + } + + /** + * Returns true if the physical aspects of the two display metrics + * are equal. This ignores the scaled density, which is a logical + * attribute based on the current desired font size. + * + * @param other The display metrics with which to compare. + * @return True if the display metrics are equal. + * @hide + */ + public boolean equalsPhysical(DisplayMetrics other) { return other != null && widthPixels == other.widthPixels && heightPixels == other.heightPixels && density == other.density && densityDpi == other.densityDpi - && scaledDensity == other.scaledDensity && xdpi == other.xdpi && ydpi == other.ydpi && noncompatWidthPixels == other.noncompatWidthPixels && noncompatHeightPixels == other.noncompatHeightPixels && noncompatDensity == other.noncompatDensity && noncompatDensityDpi == other.noncompatDensityDpi - && noncompatScaledDensity == other.noncompatScaledDensity && noncompatXdpi == other.noncompatXdpi && noncompatYdpi == other.noncompatYdpi; } diff --git a/core/java/android/util/IntProperty.java b/core/java/android/util/IntProperty.java index 459d6b2..17977ca 100644 --- a/core/java/android/util/IntProperty.java +++ b/core/java/android/util/IntProperty.java @@ -42,7 +42,7 @@ public abstract class IntProperty<T> extends Property<T, Integer> { @Override final public void set(T object, Integer value) { - set(object, value.intValue()); + setValue(object, value.intValue()); } }
\ No newline at end of file diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index f3841d5..305fd5c 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -285,6 +285,16 @@ public final class DisplayInfo implements Parcelable { getMetricsWithSize(outMetrics, cih, logicalWidth, logicalHeight); } + public int getNaturalWidth() { + return rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180 ? + logicalWidth : logicalHeight; + } + + public int getNaturalHeight() { + return rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180 ? + logicalHeight : logicalWidth; + } + private void getMetricsWithSize(DisplayMetrics outMetrics, CompatibilityInfoHolder cih, int width, int height) { outMetrics.densityDpi = outMetrics.noncompatDensityDpi = logicalDensityDpi; diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 1c613245..5b7a5af 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -1304,17 +1304,11 @@ public abstract class HardwareRenderer { } } - if ((status & DisplayList.STATUS_INVOKE) != 0) { - scheduleFunctors(attachInfo, true); - } - } - - private void scheduleFunctors(View.AttachInfo attachInfo, boolean delayed) { - mFunctorsRunnable.attachInfo = attachInfo; - if (!attachInfo.mHandler.hasCallbacks(mFunctorsRunnable)) { - // delay the functor callback by a few ms so it isn't polled constantly - attachInfo.mHandler.postDelayed(mFunctorsRunnable, - delayed ? FUNCTOR_PROCESS_DELAY : 0); + if ((status & DisplayList.STATUS_INVOKE) != 0 || + attachInfo.mHandler.hasCallbacks(mFunctorsRunnable)) { + attachInfo.mHandler.removeCallbacks(mFunctorsRunnable); + mFunctorsRunnable.attachInfo = attachInfo; + attachInfo.mHandler.postDelayed(mFunctorsRunnable, FUNCTOR_PROCESS_DELAY); } } @@ -1329,7 +1323,9 @@ public abstract class HardwareRenderer { boolean attachFunctor(View.AttachInfo attachInfo, int functor) { if (mCanvas != null) { mCanvas.attachFunctor(functor); - scheduleFunctors(attachInfo, false); + mFunctorsRunnable.attachInfo = attachInfo; + attachInfo.mHandler.removeCallbacks(mFunctorsRunnable); + attachInfo.mHandler.postDelayed(mFunctorsRunnable, 0); return true; } return false; diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 0fe2a8e..2b6cbcf 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -74,7 +74,7 @@ interface IWindowManager void setEventDispatching(boolean enabled); void addWindowToken(IBinder token, int type); void removeWindowToken(IBinder token); - void addAppToken(int addPos, IApplicationToken token, + void addAppToken(int addPos, int userId, IApplicationToken token, int groupId, int requestedOrientation, boolean fullscreen, boolean showWhenLocked); void setAppGroupId(IBinder token, int groupId); void setAppOrientation(IApplicationToken token, int requestedOrientation); diff --git a/core/java/android/view/ScaleGestureDetector.java b/core/java/android/view/ScaleGestureDetector.java index ee3f5d8..51c5c7b 100644 --- a/core/java/android/view/ScaleGestureDetector.java +++ b/core/java/android/view/ScaleGestureDetector.java @@ -259,6 +259,8 @@ public class ScaleGestureDetector { mInputEventConsistencyVerifier.onTouchEvent(event, 0); } + mCurrTime = event.getEventTime(); + final int action = event.getActionMasked(); final boolean streamComplete = action == MotionEvent.ACTION_UP || @@ -341,6 +343,7 @@ public class ScaleGestureDetector { mPrevSpanX = mCurrSpanX = spanX; mPrevSpanY = mCurrSpanY = spanY; mPrevSpan = mCurrSpan = span; + mPrevTime = mCurrTime; mInProgress = mListener.onScaleBegin(this); } @@ -359,6 +362,7 @@ public class ScaleGestureDetector { mPrevSpanX = mCurrSpanX; mPrevSpanY = mCurrSpanY; mPrevSpan = mCurrSpan; + mPrevTime = mCurrTime; } } diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 550a740..0a81a71 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -225,6 +225,9 @@ public class Surface implements Parcelable { // non compatibility mode. private Matrix mCompatibleMatrix; + private int mWidth; + private int mHeight; + private native void nativeCreate(SurfaceSession session, String name, int w, int h, int format, int flags) throws OutOfResourcesException; @@ -330,6 +333,8 @@ public class Surface implements Parcelable { checkHeadless(); mName = name; + mWidth = w; + mHeight = h; nativeCreate(session, name, w, h, format, flags); mCloseGuard.open("release"); @@ -538,7 +543,7 @@ public class Surface implements Parcelable { /** @hide */ public void setPosition(int x, int y) { - nativeSetPosition((float)x, (float)y); + nativeSetPosition(x, y); } /** @hide */ @@ -548,10 +553,22 @@ public class Surface implements Parcelable { /** @hide */ public void setSize(int w, int h) { + mWidth = w; + mHeight = h; nativeSetSize(w, h); } /** @hide */ + public int getWidth() { + return mWidth; + } + + /** @hide */ + public int getHeight() { + return mHeight; + } + + /** @hide */ public void hide() { nativeSetFlags(SURFACE_HIDDEN, SURFACE_HIDDEN); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index ef50353..cf61599 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -11856,8 +11856,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mCurrentAnimation = null; - resetRtlProperties(); - onRtlPropertiesChanged(LAYOUT_DIRECTION_DEFAULT); resetAccessibilityStateChanged(); } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 00723f3..dbbcde6 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3620,8 +3620,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager childHasTransientStateChanged(view, false); } - view.resetRtlProperties(); - onViewRemoved(view); needGlobalAttributesUpdate(false); @@ -5372,21 +5370,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @hide */ @Override - public void resetRtlProperties() { - super.resetRtlProperties(); - int count = getChildCount(); - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - if (child.isLayoutDirectionInherited()) { - child.resetRtlProperties(); - } - } - } - - /** - * @hide - */ - @Override public void resetResolvedLayoutDirection() { super.resetResolvedLayoutDirection(); diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java index d7c7f46..001d020 100644 --- a/core/java/android/view/VolumePanel.java +++ b/core/java/android/view/VolumePanel.java @@ -302,6 +302,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie lp.type = LayoutParams.TYPE_VOLUME_OVERLAY; lp.width = LayoutParams.WRAP_CONTENT; lp.height = LayoutParams.WRAP_CONTENT; + lp.privateFlags |= LayoutParams.PRIVATE_FLAG_FORCE_SHOW_NAV_BAR; window.setAttributes(lp); window.addFlags(LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 3b31ff6..6a67d8b 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -946,6 +946,13 @@ public interface WindowManager extends ViewManager { public static final int PRIVATE_FLAG_SHOW_FOR_ALL_USERS = 0x00000010; /** + * Special flag for the volume overlay: force the window manager out of "hide nav bar" + * mode while the window is on screen. + * + * {@hide} */ + public static final int PRIVATE_FLAG_FORCE_SHOW_NAV_BAR = 0x00000020; + + /** * Control flags that are private to the platform. * @hide */ diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java index 421a324..452ad1b 100644 --- a/core/java/android/widget/CompoundButton.java +++ b/core/java/android/widget/CompoundButton.java @@ -248,6 +248,15 @@ public abstract class CompoundButton extends Button implements Checkable { return padding; } + /** + * @hide + */ + @Override + public int getHorizontalOffsetForDrawables() { + final Drawable buttonDrawable = mButtonDrawable; + return (buttonDrawable != null) ? buttonDrawable.getIntrinsicWidth() : 0; + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index b1a44c5..30d022c 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -36,6 +36,8 @@ import android.graphics.drawable.Drawable; import android.inputmethodservice.ExtractEditText; import android.os.Bundle; import android.os.Handler; +import android.os.Message; +import android.os.Messenger; import android.os.SystemClock; import android.provider.Settings; import android.text.DynamicLayout; @@ -187,6 +189,8 @@ public class Editor { private TextView mTextView; + private final UserDictionaryListener mUserDictionaryListener = new UserDictionaryListener(); + Editor(TextView textView) { mTextView = textView; } @@ -291,6 +295,7 @@ public class Editor { mErrorWasChanged = true; if (mError == null) { + setErrorIcon(null); if (mErrorPopup != null) { if (mErrorPopup.isShowing()) { mErrorPopup.dismiss(); @@ -299,21 +304,24 @@ public class Editor { mErrorPopup = null; } - setErrorIcon(null); - } else if (mTextView.isFocused()) { - showError(); + } else { setErrorIcon(icon); + if (mTextView.isFocused()) { + showError(); + } } } private void setErrorIcon(Drawable icon) { - final Drawables dr = mTextView.mDrawables; - if (dr != null) { - mTextView.setCompoundDrawables(dr.mDrawableLeft, dr.mDrawableTop, icon, - dr.mDrawableBottom); - } else { - mTextView.setCompoundDrawables(null, null, icon, null); + Drawables dr = mTextView.mDrawables; + if (dr == null) { + mTextView.mDrawables = dr = new Drawables(); } + dr.setErrorDrawable(icon, mTextView); + + mTextView.resetResolvedDrawables(); + mTextView.invalidate(); + mTextView.requestLayout(); } private void hideError() { @@ -321,15 +329,13 @@ public class Editor { if (mErrorPopup.isShowing()) { mErrorPopup.dismiss(); } - - setErrorIcon(null); } mShowErrorAfterAttach = false; } /** - * Returns the Y offset to make the pointy top of the error point + * Returns the X offset to make the pointy top of the error point * at the middle of the error icon. */ private int getErrorX() { @@ -340,8 +346,23 @@ public class Editor { final float scale = mTextView.getResources().getDisplayMetrics().density; final Drawables dr = mTextView.mDrawables; - return mTextView.getWidth() - mErrorPopup.getWidth() - mTextView.getPaddingRight() - - (dr != null ? dr.mDrawableSizeRight : 0) / 2 + (int) (25 * scale + 0.5f); + + final int layoutDirection = mTextView.getLayoutDirection(); + int errorX; + int offset; + switch (layoutDirection) { + default: + case View.LAYOUT_DIRECTION_LTR: + offset = - (dr != null ? dr.mDrawableSizeRight : 0) / 2 + (int) (25 * scale + 0.5f); + errorX = mTextView.getWidth() - mErrorPopup.getWidth() - + mTextView.getPaddingRight() + offset; + break; + case View.LAYOUT_DIRECTION_RTL: + offset = (dr != null ? dr.mDrawableSizeLeft : 0) / 2 - (int) (25 * scale + 0.5f); + errorX = mTextView.getPaddingLeft() + offset; + break; + } + return errorX; } /** @@ -358,16 +379,27 @@ public class Editor { mTextView.getCompoundPaddingBottom() - compoundPaddingTop; final Drawables dr = mTextView.mDrawables; - int icontop = compoundPaddingTop + - (vspace - (dr != null ? dr.mDrawableHeightRight : 0)) / 2; + + final int layoutDirection = mTextView.getLayoutDirection(); + int height; + switch (layoutDirection) { + default: + case View.LAYOUT_DIRECTION_LTR: + height = (dr != null ? dr.mDrawableHeightRight : 0); + break; + case View.LAYOUT_DIRECTION_RTL: + height = (dr != null ? dr.mDrawableHeightLeft : 0); + break; + } + + int icontop = compoundPaddingTop + (vspace - height) / 2; /* * The "2" is the distance between the point and the top edge * of the background. */ final float scale = mTextView.getResources().getDisplayMetrics().density; - return icontop + (dr != null ? dr.mDrawableHeightRight : 0) - mTextView.getHeight() - - (int) (2 * scale + 0.5f); + return icontop + height - mTextView.getHeight() - (int) (2 * scale + 0.5f); } void createInputContentTypeIfNeeded() { @@ -2574,6 +2606,11 @@ public class Editor { Intent intent = new Intent(Settings.ACTION_USER_DICTIONARY_INSERT); intent.putExtra("word", originalText); intent.putExtra("locale", mTextView.getTextServicesLocale().toString()); + // Put a listener to replace the original text with a word which the user + // modified in a user dictionary dialog. + mUserDictionaryListener.waitForUserDictionaryAdded( + mTextView, originalText, spanStart, spanEnd); + intent.putExtra("listener", new Messenger(mUserDictionaryListener)); intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); mTextView.getContext().startActivity(intent); // There is no way to know if the word was indeed added. Re-check. @@ -3726,7 +3763,7 @@ public class Editor { super(v, width, height); mView = v; // Make sure the TextView has a background set as it will be used the first time it is - // shown and positionned. Initialized with below background, which should have + // shown and positioned. Initialized with below background, which should have // dimensions identical to the above version for this to work (and is more likely). mPopupInlineErrorBackgroundId = getResourceId(mPopupInlineErrorBackgroundId, com.android.internal.R.styleable.Theme_errorMessageBackground); @@ -3792,4 +3829,65 @@ public class Editor { boolean mContentChanged; int mChangedStart, mChangedEnd, mChangedDelta; } + + /** + * @hide + */ + public static class UserDictionaryListener extends Handler { + public TextView mTextView; + public String mOriginalWord; + public int mWordStart; + public int mWordEnd; + + public void waitForUserDictionaryAdded( + TextView tv, String originalWord, int spanStart, int spanEnd) { + mTextView = tv; + mOriginalWord = originalWord; + mWordStart = spanStart; + mWordEnd = spanEnd; + } + + @Override + public void handleMessage(Message msg) { + switch(msg.what) { + case 0: /* CODE_WORD_ADDED */ + case 2: /* CODE_ALREADY_PRESENT */ + if (!(msg.obj instanceof Bundle)) { + Log.w(TAG, "Illegal message. Abort handling onUserDictionaryAdded."); + return; + } + final Bundle bundle = (Bundle)msg.obj; + final String originalWord = bundle.getString("originalWord"); + final String addedWord = bundle.getString("word"); + onUserDictionaryAdded(originalWord, addedWord); + return; + default: + return; + } + } + + private void onUserDictionaryAdded(String originalWord, String addedWord) { + if (TextUtils.isEmpty(mOriginalWord) || TextUtils.isEmpty(addedWord)) { + return; + } + if (mWordStart < 0 || mWordEnd >= mTextView.length()) { + return; + } + if (!mOriginalWord.equals(originalWord)) { + return; + } + if (originalWord.equals(addedWord)) { + return; + } + final Editable editable = (Editable) mTextView.getText(); + final String currentWord = editable.toString().substring(mWordStart, mWordEnd); + if (!currentWord.equals(originalWord)) { + return; + } + mTextView.replaceText_internal(mWordStart, mWordEnd, addedWord); + // Move cursor at the end of the replaced word + final int newCursorPosition = mWordStart + addedWord.length(); + mTextView.setCursorPosition_internal(newCursorPosition, newCursorPosition); + } + } } diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index e52e84d..27fda24 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -369,10 +369,10 @@ public class RelativeLayout extends ViewGroup { int width = 0; int height = 0; - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); - int widthSize = MeasureSpec.getSize(widthMeasureSpec); - int heightSize = MeasureSpec.getSize(heightMeasureSpec); + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); + final int heightSize = MeasureSpec.getSize(heightMeasureSpec); // Record our dimensions if they are known; if (widthMode != MeasureSpec.UNSPECIFIED) { @@ -416,6 +416,42 @@ public class RelativeLayout extends ViewGroup { View[] views = mSortedHorizontalChildren; int count = views.length; + + // We need to know our size for doing the correct computation of positioning in RTL mode + if (isLayoutRtl() && (myWidth == -1 || isWrapContentWidth)) { + int w = getPaddingStart() + getPaddingEnd(); + final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + for (int i = 0; i < count; i++) { + View child = views[i]; + if (child.getVisibility() != GONE) { + LayoutParams params = (LayoutParams) child.getLayoutParams(); + // Would be similar to a call to measureChildHorizontal(child, params, -1, myHeight) + // but we cannot change for now the behavior of measureChildHorizontal() for + // taking care or a "-1" for "mywidth" so use here our own version of that code. + int childHeightMeasureSpec; + if (params.width == LayoutParams.MATCH_PARENT) { + childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.EXACTLY); + } else { + childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.AT_MOST); + } + child.measure(childWidthMeasureSpec, childHeightMeasureSpec); + + w += child.getMeasuredWidth(); + w += params.leftMargin + params.rightMargin; + } + } + if (myWidth == -1) { + // Easy case: "myWidth" was undefined before so use the width we have just computed + myWidth = w; + } else { + // "myWidth" was defined before, so take the min of it and the computed width if it + // is a non null one + if (w > 0) { + myWidth = Math.min(myWidth, w); + } + } + } + for (int i = 0; i < count; i++) { View child = views[i]; if (child.getVisibility() != GONE) { @@ -924,7 +960,7 @@ public class RelativeLayout extends ViewGroup { // Find the first non-GONE view up the chain while (v.getVisibility() == View.GONE) { - rules = ((LayoutParams) v.getLayoutParams()).getRules(); + rules = ((LayoutParams) v.getLayoutParams()).getRules(v.getLayoutDirection()); node = mGraph.mKeyNodes.get((rules[relation])); if (node == null) return null; v = node.view; @@ -975,7 +1011,7 @@ public class RelativeLayout extends ViewGroup { protected void onLayout(boolean changed, int l, int t, int r, int b) { // The layout has actually already been performed and the positions // cached. Apply the cached values to the children. - int count = getChildCount(); + final int count = getChildCount(); for (int i = 0; i < count; i++) { View child = getChildAt(i); diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java index e481702..aeee111 100644 --- a/core/java/android/widget/RemoteViewsAdapter.java +++ b/core/java/android/widget/RemoteViewsAdapter.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; + import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; @@ -29,9 +30,10 @@ import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.Process; import android.os.RemoteException; +import android.os.UserHandle; import android.util.Log; -import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.View.MeasureSpec; @@ -40,6 +42,7 @@ import android.widget.RemoteViews.OnClickHandler; import com.android.internal.widget.IRemoteViewsAdapterConnection; import com.android.internal.widget.IRemoteViewsFactory; +import com.android.internal.widget.LockPatternUtils; /** * An adapter to a RemoteViewsService which fetches and caches RemoteViews @@ -87,13 +90,15 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback private Handler mMainQueue; // We cache the FixedSizeRemoteViewsCaches across orientation. These are the related data - // structures; - private static final HashMap<Pair<Intent.FilterComparison, Integer>, FixedSizeRemoteViewsCache> - sCachedRemoteViewsCaches = new HashMap<Pair<Intent.FilterComparison, Integer>, + // structures; + private static final HashMap<RemoteViewsCacheKey, + FixedSizeRemoteViewsCache> sCachedRemoteViewsCaches + = new HashMap<RemoteViewsCacheKey, FixedSizeRemoteViewsCache>(); - private static final HashMap<Pair<Intent.FilterComparison, Integer>, Runnable> - sRemoteViewsCacheRemoveRunnables = new HashMap<Pair<Intent.FilterComparison, Integer>, - Runnable>(); + private static final HashMap<RemoteViewsCacheKey, Runnable> + sRemoteViewsCacheRemoveRunnables + = new HashMap<RemoteViewsCacheKey, Runnable>(); + private static HandlerThread sCacheRemovalThread; private static Handler sCacheRemovalQueue; @@ -106,6 +111,8 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback // construction (happens when we have a cached FixedSizeRemoteViewsCache). private boolean mDataReady = false; + int mUserId; + /** * An interface for the RemoteAdapter to notify other classes when adapters * are actually connected to/disconnected from their actual services. @@ -146,8 +153,16 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback public synchronized void bind(Context context, int appWidgetId, Intent intent) { if (!mIsConnecting) { try { + RemoteViewsAdapter adapter; final AppWidgetManager mgr = AppWidgetManager.getInstance(context); - mgr.bindRemoteViewsService(appWidgetId, intent, asBinder()); + if (Process.myUid() == Process.SYSTEM_UID + && (adapter = mAdapter.get()) != null) { + mgr.bindRemoteViewsService(appWidgetId, intent, asBinder(), + new UserHandle(adapter.mUserId)); + } else { + mgr.bindRemoteViewsService(appWidgetId, intent, asBinder(), + Process.myUserHandle()); + } mIsConnecting = true; } catch (Exception e) { Log.e("RemoteViewsAdapterServiceConnection", "bind(): " + e.getMessage()); @@ -159,8 +174,15 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback public synchronized void unbind(Context context, int appWidgetId, Intent intent) { try { + RemoteViewsAdapter adapter; final AppWidgetManager mgr = AppWidgetManager.getInstance(context); - mgr.unbindRemoteViewsService(appWidgetId, intent); + if (Process.myUid() == Process.SYSTEM_UID + && (adapter = mAdapter.get()) != null) { + mgr.unbindRemoteViewsService(appWidgetId, intent, + new UserHandle(adapter.mUserId)); + } else { + mgr.unbindRemoteViewsService(appWidgetId, intent, Process.myUserHandle()); + } mIsConnecting = false; } catch (Exception e) { Log.e("RemoteViewsAdapterServiceConnection", "unbind(): " + e.getMessage()); @@ -296,9 +318,13 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback */ private class RemoteViewsFrameLayoutRefSet { private HashMap<Integer, LinkedList<RemoteViewsFrameLayout>> mReferences; + private HashMap<RemoteViewsFrameLayout, LinkedList<RemoteViewsFrameLayout>> + mViewToLinkedList; public RemoteViewsFrameLayoutRefSet() { mReferences = new HashMap<Integer, LinkedList<RemoteViewsFrameLayout>>(); + mViewToLinkedList = + new HashMap<RemoteViewsFrameLayout, LinkedList<RemoteViewsFrameLayout>>(); } /** @@ -315,6 +341,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback refs = new LinkedList<RemoteViewsFrameLayout>(); mReferences.put(pos, refs); } + mViewToLinkedList.put(layout, refs); // Add the references to the list refs.add(layout); @@ -333,21 +360,34 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback final LinkedList<RemoteViewsFrameLayout> refs = mReferences.get(pos); for (final RemoteViewsFrameLayout ref : refs) { ref.onRemoteViewsLoaded(view, mRemoteViewsOnClickHandler); + if (mViewToLinkedList.containsKey(ref)) { + mViewToLinkedList.remove(ref); + } } refs.clear(); - // Remove this set from the original mapping mReferences.remove(pos); } } /** + * We need to remove views from this set if they have been recycled by the AdapterView. + */ + public void removeView(RemoteViewsFrameLayout rvfl) { + if (mViewToLinkedList.containsKey(rvfl)) { + mViewToLinkedList.get(rvfl).remove(rvfl); + mViewToLinkedList.remove(rvfl); + } + } + + /** * Removes all references to all RemoteViewsFrameLayouts returned by the adapter. */ public void clear() { // We currently just clear the references, and leave all the previous layouts returned // in their default state of the loading view. mReferences.clear(); + mViewToLinkedList.clear(); } } @@ -751,6 +791,33 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } } + static class RemoteViewsCacheKey { + final Intent.FilterComparison filter; + final int widgetId; + final int userId; + + RemoteViewsCacheKey(Intent.FilterComparison filter, int widgetId, int userId) { + this.filter = filter; + this.widgetId = widgetId; + this.userId = userId; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof RemoteViewsCacheKey)) { + return false; + } + RemoteViewsCacheKey other = (RemoteViewsCacheKey) o; + return other.filter.equals(filter) && other.widgetId == widgetId + && other.userId == userId; + } + + @Override + public int hashCode() { + return (filter == null ? 0 : filter.hashCode()) ^ (widgetId << 2) ^ (userId << 10); + } + } + public RemoteViewsAdapter(Context context, Intent intent, RemoteAdapterConnectionCallback callback) { mContext = context; mIntent = intent; @@ -761,6 +828,11 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } mRequestedViews = new RemoteViewsFrameLayoutRefSet(); + if (Process.myUid() == Process.SYSTEM_UID) { + mUserId = new LockPatternUtils(context).getCurrentUser(); + } else { + mUserId = UserHandle.myUserId(); + } // Strip the previously injected app widget id from service intent if (intent.hasExtra(RemoteViews.EXTRA_REMOTEADAPTER_APPWIDGET_ID)) { intent.removeExtra(RemoteViews.EXTRA_REMOTEADAPTER_APPWIDGET_ID); @@ -782,8 +854,8 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback mCallback = new WeakReference<RemoteAdapterConnectionCallback>(callback); mServiceConnection = new RemoteViewsAdapterServiceConnection(this); - Pair<Intent.FilterComparison, Integer> key = new Pair<Intent.FilterComparison, Integer> - (new Intent.FilterComparison(mIntent), mAppWidgetId); + RemoteViewsCacheKey key = new RemoteViewsCacheKey(new Intent.FilterComparison(mIntent), + mAppWidgetId, mUserId); synchronized(sCachedRemoteViewsCaches) { if (sCachedRemoteViewsCaches.containsKey(key)) { @@ -824,8 +896,8 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } public void saveRemoteViewsCache() { - final Pair<Intent.FilterComparison, Integer> key = new Pair<Intent.FilterComparison, - Integer> (new Intent.FilterComparison(mIntent), mAppWidgetId); + final RemoteViewsCacheKey key = new RemoteViewsCacheKey( + new Intent.FilterComparison(mIntent), mAppWidgetId, mUserId); synchronized(sCachedRemoteViewsCaches) { // If we already have a remove runnable posted for this key, remove it. @@ -947,6 +1019,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback long itemId = 0; try { remoteViews = factory.getViewAt(position); + remoteViews.setUser(new UserHandle(mUserId)); itemId = factory.getItemId(position); } catch (RemoteException e) { Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + e.getMessage()); @@ -1079,6 +1152,10 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback boolean isConnected = mServiceConnection.isConnected(); boolean hasNewItems = false; + if (convertView != null && convertView instanceof RemoteViewsFrameLayout) { + mRequestedViews.removeView((RemoteViewsFrameLayout) convertView); + } + if (!isInCache && !isConnected) { // Requesting bind service will trigger a super.notifyDataSetChanged(), which will // in turn trigger another request to getView() diff --git a/core/java/android/widget/ShareActionProvider.java b/core/java/android/widget/ShareActionProvider.java index 1ae77b3..02b7030 100644 --- a/core/java/android/widget/ShareActionProvider.java +++ b/core/java/android/widget/ShareActionProvider.java @@ -39,31 +39,26 @@ import com.android.internal.R; * <p> * Here is how to use the action provider with custom backing file in a {@link MenuItem}: * </p> - * <p> * <pre> - * <code> - * // In Activity#onCreateOptionsMenu - * public boolean onCreateOptionsMenu(Menu menu) { - * // Get the menu item. - * MenuItem menuItem = menu.findItem(R.id.my_menu_item); - * // Get the provider and hold onto it to set/change the share intent. - * mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider(); - * // Set history different from the default before getting the action - * // view since a call to {@link MenuItem#getActionView() MenuItem.getActionView()} calls - * // {@link ActionProvider#onCreateActionView()} which uses the backing file name. Omit this - * // line if using the default share history file is desired. - * mShareActionProvider.setShareHistoryFileName("custom_share_history.xml"); - * . . . - * } + * // In Activity#onCreateOptionsMenu + * public boolean onCreateOptionsMenu(Menu menu) { + * // Get the menu item. + * MenuItem menuItem = menu.findItem(R.id.my_menu_item); + * // Get the provider and hold onto it to set/change the share intent. + * mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider(); + * // Set history different from the default before getting the action + * // view since a call to {@link MenuItem#getActionView() MenuItem.getActionView()} calls + * // {@link ActionProvider#onCreateActionView()} which uses the backing file name. Omit this + * // line if using the default share history file is desired. + * mShareActionProvider.setShareHistoryFileName("custom_share_history.xml"); + * . . . + * } * - * // Somewhere in the application. - * public void doShare(Intent shareIntent) { - * // When you want to share set the share intent. - * mShareActionProvider.setShareIntent(shareIntent); - * } - * </pre> - * </code> - * </p> + * // Somewhere in the application. + * public void doShare(Intent shareIntent) { + * // When you want to share set the share intent. + * mShareActionProvider.setShareIntent(shareIntent); + * }</pre> * <p> * <strong>Note:</strong> While the sample snippet demonstrates how to use this provider * in the context of a menu item, the use of the provider is not limited to menu items. @@ -247,9 +242,9 @@ public class ShareActionProvider extends ActionProvider { * call {@link android.app.Activity#invalidateOptionsMenu()} to recreate the * action view. You should <strong>not</strong> call * {@link android.app.Activity#invalidateOptionsMenu()} from - * {@link android.app.Activity#onCreateOptionsMenu(Menu)}." - * <p> - * <code> + * {@link android.app.Activity#onCreateOptionsMenu(Menu)}. + * </p> + * <pre> * private void doShare(Intent intent) { * if (IMAGE.equals(intent.getMimeType())) { * mShareActionProvider.setHistoryFileName(SHARE_IMAGE_HISTORY_FILE_NAME); @@ -258,9 +253,7 @@ public class ShareActionProvider extends ActionProvider { * } * mShareActionProvider.setIntent(intent); * invalidateOptionsMenu(); - * } - * <code> - * + * }</pre> * @param shareHistoryFile The share history file name. */ public void setShareHistoryFileName(String shareHistoryFile) { @@ -271,16 +264,11 @@ public class ShareActionProvider extends ActionProvider { /** * Sets an intent with information about the share action. Here is a * sample for constructing a share intent: - * <p> * <pre> - * <code> - * Intent shareIntent = new Intent(Intent.ACTION_SEND); - * shareIntent.setType("image/*"); - * Uri uri = Uri.fromFile(new File(getFilesDir(), "foo.jpg")); - * shareIntent.putExtra(Intent.EXTRA_STREAM, uri.toString()); - * </pre> - * </code> - * </p> + * Intent shareIntent = new Intent(Intent.ACTION_SEND); + * shareIntent.setType("image/*"); + * Uri uri = Uri.fromFile(new File(getFilesDir(), "foo.jpg")); + * shareIntent.putExtra(Intent.EXTRA_STREAM, uri.toString());</pre> * * @param shareIntent The share intent. * diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 5d90400..7c1b959 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -142,6 +142,13 @@ import java.util.concurrent.locks.ReentrantLock; * view for editing. * * <p> + * To allow users to copy some or all of the TextView's value and paste it somewhere else, set the + * XML attribute {@link android.R.styleable#TextView_textIsSelectable + * android:textIsSelectable} to "true" or call + * {@link #setTextIsSelectable setTextIsSelectable(true)}. The {@code textIsSelectable} flag + * allows users to make selection gestures in the TextView, which in turn triggers the system's + * built-in copy/paste controls. + * <p> * <b>XML attributes</b> * <p> * See {@link android.R.styleable#TextView TextView Attributes}, @@ -284,15 +291,144 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private TextUtils.TruncateAt mEllipsize; static class Drawables { + final static int DRAWABLE_NONE = -1; + final static int DRAWABLE_RIGHT = 0; + final static int DRAWABLE_LEFT = 1; + final Rect mCompoundRect = new Rect(); + Drawable mDrawableTop, mDrawableBottom, mDrawableLeft, mDrawableRight, - mDrawableStart, mDrawableEnd; + mDrawableStart, mDrawableEnd, mDrawableError, mDrawableTemp; + int mDrawableSizeTop, mDrawableSizeBottom, mDrawableSizeLeft, mDrawableSizeRight, - mDrawableSizeStart, mDrawableSizeEnd; + mDrawableSizeStart, mDrawableSizeEnd, mDrawableSizeError, mDrawableSizeTemp; + int mDrawableWidthTop, mDrawableWidthBottom, mDrawableHeightLeft, mDrawableHeightRight, - mDrawableHeightStart, mDrawableHeightEnd; + mDrawableHeightStart, mDrawableHeightEnd, mDrawableHeightError, mDrawableHeightTemp; + int mDrawablePadding; + + int mDrawableSaved = DRAWABLE_NONE; + + public void resolveWithLayoutDirection(int layoutDirection) { + switch(layoutDirection) { + case LAYOUT_DIRECTION_RTL: + if (mDrawableStart != null) { + mDrawableRight = mDrawableStart; + + mDrawableSizeRight = mDrawableSizeStart; + mDrawableHeightRight = mDrawableHeightStart; + } + if (mDrawableEnd != null) { + mDrawableLeft = mDrawableEnd; + + mDrawableSizeLeft = mDrawableSizeEnd; + mDrawableHeightLeft = mDrawableHeightEnd; + } + break; + + case LAYOUT_DIRECTION_LTR: + default: + if (mDrawableStart != null) { + mDrawableLeft = mDrawableStart; + + mDrawableSizeLeft = mDrawableSizeStart; + mDrawableHeightLeft = mDrawableHeightStart; + } + if (mDrawableEnd != null) { + mDrawableRight = mDrawableEnd; + + mDrawableSizeRight = mDrawableSizeEnd; + mDrawableHeightRight = mDrawableHeightEnd; + } + break; + } + applyErrorDrawableIfNeeded(layoutDirection); + updateDrawablesLayoutDirection(layoutDirection); + } + + private void updateDrawablesLayoutDirection(int layoutDirection) { + if (mDrawableLeft != null) { + mDrawableLeft.setLayoutDirection(layoutDirection); + } + if (mDrawableRight != null) { + mDrawableRight.setLayoutDirection(layoutDirection); + } + if (mDrawableTop != null) { + mDrawableTop.setLayoutDirection(layoutDirection); + } + if (mDrawableBottom != null) { + mDrawableBottom.setLayoutDirection(layoutDirection); + } + } + + public void setErrorDrawable(Drawable dr, TextView tv) { + if (mDrawableError != dr && mDrawableError != null) { + mDrawableError.setCallback(null); + } + mDrawableError = dr; + + final Rect compoundRect = mCompoundRect; + int[] state = tv.getDrawableState(); + + if (mDrawableError != null) { + mDrawableError.setState(state); + mDrawableError.copyBounds(compoundRect); + mDrawableError.setCallback(tv); + mDrawableSizeError = compoundRect.width(); + mDrawableHeightError = compoundRect.height(); + } else { + mDrawableSizeError = mDrawableHeightError = 0; + } + } + + private void applyErrorDrawableIfNeeded(int layoutDirection) { + // first restore the initial state if needed + switch (mDrawableSaved) { + case DRAWABLE_LEFT: + mDrawableLeft = mDrawableTemp; + mDrawableSizeLeft = mDrawableSizeTemp; + mDrawableHeightLeft = mDrawableHeightTemp; + break; + case DRAWABLE_RIGHT: + mDrawableRight = mDrawableTemp; + mDrawableSizeRight = mDrawableSizeTemp; + mDrawableHeightRight = mDrawableHeightTemp; + break; + case DRAWABLE_NONE: + default: + } + // then, if needed, assign the Error drawable to the correct location + if (mDrawableError != null) { + switch(layoutDirection) { + case LAYOUT_DIRECTION_RTL: + mDrawableSaved = DRAWABLE_LEFT; + + mDrawableTemp = mDrawableLeft; + mDrawableSizeTemp = mDrawableSizeLeft; + mDrawableHeightTemp = mDrawableHeightLeft; + + mDrawableLeft = mDrawableError; + mDrawableSizeLeft = mDrawableSizeError; + mDrawableHeightLeft = mDrawableHeightError; + break; + case LAYOUT_DIRECTION_LTR: + default: + mDrawableSaved = DRAWABLE_RIGHT; + + mDrawableTemp = mDrawableRight; + mDrawableSizeTemp = mDrawableSizeRight; + mDrawableHeightTemp = mDrawableHeightRight; + + mDrawableRight = mDrawableError; + mDrawableSizeRight = mDrawableSizeError; + mDrawableHeightRight = mDrawableHeightError; + break; + } + } + } } + Drawables mDrawables; private CharWrapper mCharWrapper; @@ -4609,17 +4745,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** - * When a TextView is used to display a useful piece of information to the user (such as a - * contact's address), it should be made selectable, so that the user can select and copy this - * content. - * - * Use {@link #setTextIsSelectable(boolean)} or the - * {@link android.R.styleable#TextView_textIsSelectable} XML attribute to make this TextView - * selectable (text is not selectable by default). * - * Note that this method simply returns the state of this flag. Although this flag has to be set - * in order to select text in non-editable TextView, the content of an {@link EditText} can - * always be selected, independently of the value of this flag. + * Returns the state of the {@code textIsSelectable} flag (See + * {@link #setTextIsSelectable setTextIsSelectable()}). Although you have to set this flag + * to allow users to select and copy text in a non-editable TextView, the content of an + * {@link EditText} can always be selected, independently of the value of this flag. + * <p> * * @return True if the text displayed in this TextView can be selected by the user. * @@ -4630,16 +4761,28 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** - * Sets whether or not (default) the content of this view is selectable by the user. - * - * Note that this methods affect the {@link #setFocusable(boolean)}, - * {@link #setFocusableInTouchMode(boolean)} {@link #setClickable(boolean)} and - * {@link #setLongClickable(boolean)} states and you may want to restore these if they were - * customized. - * - * See {@link #isTextSelectable} for details. - * - * @param selectable Whether or not the content of this TextView should be selectable. + * Sets whether the content of this view is selectable by the user. The default is + * {@code false}, meaning that the content is not selectable. + * <p> + * When you use a TextView to display a useful piece of information to the user (such as a + * contact's address), make it selectable, so that the user can select and copy its + * content. You can also use set the XML attribute + * {@link android.R.styleable#TextView_textIsSelectable} to "true". + * <p> + * When you call this method to set the value of {@code textIsSelectable}, it sets + * the flags {@code focusable}, {@code focusableInTouchMode}, {@code clickable}, + * and {@code longClickable} to the same value. These flags correspond to the attributes + * {@link android.R.styleable#View_focusable android:focusable}, + * {@link android.R.styleable#View_focusableInTouchMode android:focusableInTouchMode}, + * {@link android.R.styleable#View_clickable android:clickable}, and + * {@link android.R.styleable#View_longClickable android:longClickable}. To restore any of these + * flags to a state you had set previously, call one or more of the following methods: + * {@link #setFocusable(boolean) setFocusable()}, + * {@link #setFocusableInTouchMode(boolean) setFocusableInTouchMode()}, + * {@link #setClickable(boolean) setClickable()} or + * {@link #setLongClickable(boolean) setLongClickable()}. + * + * @param selectable Whether the content of this TextView should be selectable. */ public void setTextIsSelectable(boolean selectable) { if (!selectable && mEditor == null) return; // false is default value with no edit data @@ -4734,6 +4877,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return highlight; } + /** + * @hide + */ + public int getHorizontalOffsetForDrawables() { + return 0; + } + @Override protected void onDraw(Canvas canvas) { restartMarqueeIfNeeded(); @@ -4751,6 +4901,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final int left = mLeft; final int bottom = mBottom; final int top = mTop; + final boolean isLayoutRtl = isLayoutRtl(); + final int offset = getHorizontalOffsetForDrawables(); + final int leftOffset = isLayoutRtl ? 0 : offset; + final int rightOffset = isLayoutRtl ? offset : 0 ; final Drawables dr = mDrawables; if (dr != null) { @@ -4766,7 +4920,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Make sure to update invalidateDrawable() when changing this code. if (dr.mDrawableLeft != null) { canvas.save(); - canvas.translate(scrollX + mPaddingLeft, + canvas.translate(scrollX + mPaddingLeft + leftOffset, scrollY + compoundPaddingTop + (vspace - dr.mDrawableHeightLeft) / 2); dr.mDrawableLeft.draw(canvas); @@ -4777,7 +4931,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Make sure to update invalidateDrawable() when changing this code. if (dr.mDrawableRight != null) { canvas.save(); - canvas.translate(scrollX + right - left - mPaddingRight - dr.mDrawableSizeRight, + canvas.translate(scrollX + right - left - mPaddingRight + - dr.mDrawableSizeRight - rightOffset, scrollY + compoundPaddingTop + (vspace - dr.mDrawableHeightRight) / 2); dr.mDrawableRight.draw(canvas); canvas.restore(); @@ -4862,8 +5017,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } canvas.translate(compoundPaddingLeft, extendedPaddingTop + voffsetText); - final boolean isLayoutRtl = isLayoutRtl(); - final int layoutDirection = getLayoutDirection(); final int absoluteGravity = Gravity.getAbsoluteGravity(mGravity, layoutDirection); if (mEllipsize == TextUtils.TruncateAt.MARQUEE && @@ -8229,9 +8382,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener TextDirectionHeuristic getTextDirectionHeuristic() { if (hasPasswordTransformationMethod()) { - // TODO: take care of the content direction to show the password text and dots justified - // to the left or to the right - return TextDirectionHeuristics.LOCALE; + // passwords fields should be LTR + return TextDirectionHeuristics.LTR; } // Always need to resolve layout direction first @@ -8264,63 +8416,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return; } mLastLayoutDirection = layoutDirection; - // No drawable to resolve - if (mDrawables == null) { - return; - } - // No relative drawable to resolve - if (mDrawables.mDrawableStart == null && mDrawables.mDrawableEnd == null) { - return; - } - Drawables dr = mDrawables; - switch(layoutDirection) { - case LAYOUT_DIRECTION_RTL: - if (dr.mDrawableStart != null) { - dr.mDrawableRight = dr.mDrawableStart; - - dr.mDrawableSizeRight = dr.mDrawableSizeStart; - dr.mDrawableHeightRight = dr.mDrawableHeightStart; - } - if (dr.mDrawableEnd != null) { - dr.mDrawableLeft = dr.mDrawableEnd; - - dr.mDrawableSizeLeft = dr.mDrawableSizeEnd; - dr.mDrawableHeightLeft = dr.mDrawableHeightEnd; - } - break; - - case LAYOUT_DIRECTION_LTR: - default: - if (dr.mDrawableStart != null) { - dr.mDrawableLeft = dr.mDrawableStart; - - dr.mDrawableSizeLeft = dr.mDrawableSizeStart; - dr.mDrawableHeightLeft = dr.mDrawableHeightStart; - } - if (dr.mDrawableEnd != null) { - dr.mDrawableRight = dr.mDrawableEnd; - - dr.mDrawableSizeRight = dr.mDrawableSizeEnd; - dr.mDrawableHeightRight = dr.mDrawableHeightEnd; - } - break; - } - updateDrawablesLayoutDirection(dr, layoutDirection); - } - - private void updateDrawablesLayoutDirection(Drawables dr, int layoutDirection) { - if (dr.mDrawableLeft != null) { - dr.mDrawableLeft.setLayoutDirection(layoutDirection); - } - if (dr.mDrawableRight != null) { - dr.mDrawableRight.setLayoutDirection(layoutDirection); - } - if (dr.mDrawableTop != null) { - dr.mDrawableTop.setLayoutDirection(layoutDirection); - } - if (dr.mDrawableBottom != null) { - dr.mDrawableBottom.setLayoutDirection(layoutDirection); + // Resolve drawables + if (mDrawables != null) { + mDrawables.resolveWithLayoutDirection(layoutDirection); } } @@ -8328,6 +8427,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @hide */ protected void resetResolvedDrawables() { + super.resetResolvedDrawables(); mLastLayoutDirection = -1; } diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index 485bd37..1d85126 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -374,8 +374,11 @@ public class Toast { // remove the old view if necessary handleHide(); mView = mNextView; - mWM = (WindowManager)mView.getContext().getApplicationContext() - .getSystemService(Context.WINDOW_SERVICE); + Context context = mView.getContext().getApplicationContext(); + if (context == null) { + context = mView.getContext(); + } + mWM = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); // We can resolve the Gravity here by using the Locale for getting // the layout direction final Configuration config = mView.getContext().getResources().getConfiguration(); diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java index 7c8196d..329b0df 100644 --- a/core/java/android/widget/VideoView.java +++ b/core/java/android/widget/VideoView.java @@ -54,7 +54,6 @@ public class VideoView extends SurfaceView implements MediaPlayerControl { // settable by the client private Uri mUri; private Map<String, String> mHeaders; - private int mDuration; // all possible internal states private static final int STATE_ERROR = -1; @@ -229,7 +228,6 @@ public class VideoView extends SurfaceView implements MediaPlayerControl { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mPreparedListener); mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); - mDuration = -1; mMediaPlayer.setOnCompletionListener(mCompletionListener); mMediaPlayer.setOnErrorListener(mErrorListener); mMediaPlayer.setOnInfoListener(mOnInfoListener); @@ -608,17 +606,12 @@ public class VideoView extends SurfaceView implements MediaPlayerControl { openVideo(); } - // cache duration as mDuration for faster access public int getDuration() { if (isInPlaybackState()) { - if (mDuration > 0) { - return mDuration; - } - mDuration = mMediaPlayer.getDuration(); - return mDuration; + return mMediaPlayer.getDuration(); } - mDuration = -1; - return mDuration; + + return -1; } public int getCurrentPosition() { diff --git a/core/java/com/android/internal/annotations/GuardedBy.java b/core/java/com/android/internal/annotations/GuardedBy.java new file mode 100644 index 0000000..fc61945 --- /dev/null +++ b/core/java/com/android/internal/annotations/GuardedBy.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation type used to mark a method or field that can only be accessed when + * holding the referenced lock. + */ +@Target({ ElementType.FIELD, ElementType.METHOD }) +@Retention(RetentionPolicy.CLASS) +public @interface GuardedBy { + String value(); +} diff --git a/core/java/com/android/internal/annotations/Immutable.java b/core/java/com/android/internal/annotations/Immutable.java new file mode 100644 index 0000000..b424275 --- /dev/null +++ b/core/java/com/android/internal/annotations/Immutable.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation type used to mark a class which is immutable. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.CLASS) +public @interface Immutable { +} diff --git a/core/java/com/android/internal/annotations/VisibleForTesting.java b/core/java/com/android/internal/annotations/VisibleForTesting.java new file mode 100644 index 0000000..bc3121c --- /dev/null +++ b/core/java/com/android/internal/annotations/VisibleForTesting.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.annotations; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Denotes that the class, method or field has its visibility relaxed so + * that unit tests can access it. + * <p/> + * The <code>visibility</code> argument can be used to specific what the original + * visibility should have been if it had not been made public or package-private for testing. + * The default is to consider the element private. + */ +@Retention(RetentionPolicy.SOURCE) +public @interface VisibleForTesting { + /** + * Intended visibility if the element had not been made public or package-private for + * testing. + */ + enum Visibility { + /** The element should be considered protected. */ + PROTECTED, + /** The element should be considered package-private. */ + PACKAGE, + /** The element should be considered private. */ + PRIVATE + } + + /** + * Intended visibility if the element had not been made public or package-private for testing. + * If not specified, one should assume the element originally intended to be private. + */ + Visibility visibility() default Visibility.PRIVATE; +} diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java index a95fe2b..6233522 100644 --- a/core/java/com/android/internal/app/ActionBarImpl.java +++ b/core/java/com/android/internal/app/ActionBarImpl.java @@ -810,6 +810,11 @@ public class ActionBarImpl extends ActionBar { return mThemedContext; } + @Override + public boolean isTitleTruncated() { + return mActionView != null && mActionView.isTitleTruncated(); + } + /** * @hide */ diff --git a/core/java/com/android/internal/app/MediaRouteChooserDialogFragment.java b/core/java/com/android/internal/app/MediaRouteChooserDialogFragment.java index 386f387..2bc80ff 100644 --- a/core/java/com/android/internal/app/MediaRouteChooserDialogFragment.java +++ b/core/java/com/android/internal/app/MediaRouteChooserDialogFragment.java @@ -136,13 +136,14 @@ public class MediaRouteChooserDialogFragment extends DialogFragment { if (mRouter == null) return; final RouteInfo selectedRoute = mRouter.getSelectedRoute(mRouteTypes); - mVolumeIcon.setImageResource( + mVolumeIcon.setImageResource(selectedRoute == null || selectedRoute.getPlaybackType() == RouteInfo.PLAYBACK_TYPE_LOCAL ? R.drawable.ic_audio_vol : R.drawable.ic_media_route_on_holo_dark); mIgnoreSliderVolumeChanges = true; - if (selectedRoute.getVolumeHandling() == RouteInfo.PLAYBACK_VOLUME_FIXED) { + if (selectedRoute == null || + selectedRoute.getVolumeHandling() == RouteInfo.PLAYBACK_VOLUME_FIXED) { // Disable the slider and show it at max volume. mVolumeSlider.setMax(1); mVolumeSlider.setProgress(1); @@ -160,7 +161,8 @@ public class MediaRouteChooserDialogFragment extends DialogFragment { if (mIgnoreSliderVolumeChanges) return; final RouteInfo selectedRoute = mRouter.getSelectedRoute(mRouteTypes); - if (selectedRoute.getVolumeHandling() == RouteInfo.PLAYBACK_VOLUME_VARIABLE) { + if (selectedRoute != null && + selectedRoute.getVolumeHandling() == RouteInfo.PLAYBACK_VOLUME_VARIABLE) { final int maxVolume = selectedRoute.getVolumeMax(); newValue = Math.max(0, Math.min(newValue, maxVolume)); selectedRoute.requestSetVolume(newValue); @@ -652,14 +654,19 @@ public class MediaRouteChooserDialogFragment extends DialogFragment { public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN && mVolumeSlider.isEnabled()) { - mRouter.getSelectedRoute(mRouteTypes).requestUpdateVolume(-1); - return true; + final RouteInfo selectedRoute = mRouter.getSelectedRoute(mRouteTypes); + if (selectedRoute != null) { + selectedRoute.requestUpdateVolume(-1); + return true; + } } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mVolumeSlider.isEnabled()) { - mRouter.getSelectedRoute(mRouteTypes).requestUpdateVolume(1); - return true; - } else { - return super.onKeyDown(keyCode, event); + final RouteInfo selectedRoute = mRouter.getSelectedRoute(mRouteTypes); + if (selectedRoute != null) { + mRouter.getSelectedRoute(mRouteTypes).requestUpdateVolume(1); + return true; + } } + return super.onKeyDown(keyCode, event); } public boolean onKeyUp(int keyCode, KeyEvent event) { diff --git a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl index cfb16fa..e685e63 100644 --- a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl +++ b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl @@ -32,12 +32,16 @@ interface IAppWidgetService { // int[] startListening(IAppWidgetHost host, String packageName, int hostId, out List<RemoteViews> updatedViews); + int[] startListeningAsUser(IAppWidgetHost host, String packageName, int hostId, + out List<RemoteViews> updatedViews, int userId); void stopListening(int hostId); + void stopListeningAsUser(int hostId, int userId); int allocateAppWidgetId(String packageName, int hostId); void deleteAppWidgetId(int appWidgetId); void deleteHost(int hostId); void deleteAllHosts(); RemoteViews getAppWidgetViews(int appWidgetId); + int[] getAppWidgetIdsForHost(int hostId); // // for AppWidgetManager @@ -48,15 +52,15 @@ interface IAppWidgetService { void partiallyUpdateAppWidgetIds(in int[] appWidgetIds, in RemoteViews views); void updateAppWidgetProvider(in ComponentName provider, in RemoteViews views); void notifyAppWidgetViewDataChanged(in int[] appWidgetIds, int viewId); - List<AppWidgetProviderInfo> getInstalledProviders(); + List<AppWidgetProviderInfo> getInstalledProviders(int categoryFilter); AppWidgetProviderInfo getAppWidgetInfo(int appWidgetId); boolean hasBindAppWidgetPermission(in String packageName); void setBindAppWidgetPermission(in String packageName, in boolean permission); void bindAppWidgetId(int appWidgetId, in ComponentName provider, in Bundle options); boolean bindAppWidgetIdIfAllowed( in String packageName, int appWidgetId, in ComponentName provider, in Bundle options); - void bindRemoteViewsService(int appWidgetId, in Intent intent, in IBinder connection); - void unbindRemoteViewsService(int appWidgetId, in Intent intent); + void bindRemoteViewsService(int appWidgetId, in Intent intent, in IBinder connection, int userId); + void unbindRemoteViewsService(int appWidgetId, in Intent intent, int userId); int[] getAppWidgetIds(in ComponentName provider); } diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java index c5e7d9d..1a4835b 100644 --- a/core/java/com/android/internal/content/PackageHelper.java +++ b/core/java/com/android/internal/content/PackageHelper.java @@ -51,7 +51,7 @@ public class PackageHelper { public static final int RECOMMEND_FAILED_INVALID_URI = -6; public static final int RECOMMEND_FAILED_VERSION_DOWNGRADE = -7; - private static final boolean localLOGV = true; + private static final boolean localLOGV = false; private static final String TAG = "PackageHelper"; // App installation location settings values public static final int APP_INSTALL_AUTO = 0; diff --git a/core/java/com/android/internal/net/NetworkStatsFactory.java b/core/java/com/android/internal/net/NetworkStatsFactory.java index 8b222f0..c517a68 100644 --- a/core/java/com/android/internal/net/NetworkStatsFactory.java +++ b/core/java/com/android/internal/net/NetworkStatsFactory.java @@ -25,6 +25,7 @@ import android.net.NetworkStats; import android.os.StrictMode; import android.os.SystemClock; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ProcFileReader; import java.io.File; @@ -53,7 +54,7 @@ public class NetworkStatsFactory { this(new File("/proc/")); } - // @VisibleForTesting + @VisibleForTesting public NetworkStatsFactory(File procRoot) { mStatsXtIfaceAll = new File(procRoot, "net/xt_qtaguid/iface_stat_all"); mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt"); diff --git a/core/java/com/android/internal/util/LocalLog.java b/core/java/com/android/internal/util/LocalLog.java new file mode 100644 index 0000000..f0e6171 --- /dev/null +++ b/core/java/com/android/internal/util/LocalLog.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.util; + +import java.io.PrintWriter; +import java.util.ArrayList; + +import android.util.Slog; + +/** + * Helper class for logging serious issues, which also keeps a small + * snapshot of the logged events that can be printed later, such as part + * of a system service's dumpsys output. + * @hide + */ +public class LocalLog { + private final String mTag; + private final int mMaxLines = 20; + private final ArrayList<String> mLines = new ArrayList<String>(mMaxLines); + + public LocalLog(String tag) { + mTag = tag; + } + + public void w(String msg) { + synchronized (mLines) { + Slog.w(mTag, msg); + if (mLines.size() >= mMaxLines) { + mLines.remove(0); + } + mLines.add(msg); + } + } + + public boolean dump(PrintWriter pw, String header, String prefix) { + synchronized (mLines) { + if (mLines.size() <= 0) { + return false; + } + if (header != null) { + pw.println(header); + } + for (int i=0; i<mLines.size(); i++) { + if (prefix != null) { + pw.print(prefix); + } + pw.println(mLines.get(i)); + } + return true; + } + } +} diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java index 28c6bc9..534e034 100644 --- a/core/java/com/android/internal/widget/ActionBarView.java +++ b/core/java/com/android/internal/widget/ActionBarView.java @@ -40,6 +40,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; +import android.text.Layout; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; @@ -49,7 +50,6 @@ import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; -import android.view.TouchDelegate; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; @@ -83,7 +83,8 @@ public class ActionBarView extends AbsActionBarView { ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_CUSTOM | - ActionBar.DISPLAY_SHOW_TITLE; + ActionBar.DISPLAY_SHOW_TITLE | + ActionBar.DISPLAY_TITLE_MULTIPLE_LINES; private static final int DEFAULT_CUSTOM_GRAVITY = Gravity.START | Gravity.CENTER_VERTICAL; @@ -100,6 +101,7 @@ public class ActionBarView extends AbsActionBarView { private TextView mTitleView; private TextView mSubtitleView; private View mTitleUpView; + private ViewGroup mUpGoerFive; private Spinner mSpinner; private LinearLayout mListNavLayout; @@ -120,6 +122,7 @@ public class ActionBarView extends AbsActionBarView { private boolean mIncludeTabs; private boolean mIsCollapsable; private boolean mIsCollapsed; + private boolean mWasHomeEnabled; // Was it enabled before action view expansion? private MenuBuilder mOptionsMenu; @@ -137,10 +140,6 @@ public class ActionBarView extends AbsActionBarView { Window.Callback mWindowCallback; - private final Rect mTempRect = new Rect(); - private int mMaxHomeSlop; - private static final int MAX_HOME_SLOP = 32; // dp - private final AdapterView.OnItemSelectedListener mNavItemSelectedListener = new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { @@ -219,14 +218,25 @@ public class ActionBarView extends AbsActionBarView { com.android.internal.R.styleable.ActionBar_homeLayout, com.android.internal.R.layout.action_bar_home); - mHomeLayout = (HomeView) inflater.inflate(homeResId, this, false); + mUpGoerFive = (ViewGroup) inflater.inflate( + com.android.internal.R.layout.action_bar_up_container, this, false); + mHomeLayout = (HomeView) inflater.inflate(homeResId, mUpGoerFive, false); - mExpandedHomeLayout = (HomeView) inflater.inflate(homeResId, this, false); + mExpandedHomeLayout = (HomeView) inflater.inflate(homeResId, mUpGoerFive, false); mExpandedHomeLayout.setUp(true); mExpandedHomeLayout.setOnClickListener(mExpandedActionViewUpListener); mExpandedHomeLayout.setContentDescription(getResources().getText( R.string.action_bar_up_description)); + // This needs to highlight/be focusable on its own. + // TODO: Clean up the handoff between expanded/normal. + final Drawable upBackground = mUpGoerFive.getBackground(); + if (upBackground != null) { + mExpandedHomeLayout.setBackground(upBackground.getConstantState().newDrawable()); + } + mExpandedHomeLayout.setEnabled(true); + mExpandedHomeLayout.setFocusable(true); + mTitleStyleRes = a.getResourceId(R.styleable.ActionBar_titleTextStyle, 0); mSubtitleStyleRes = a.getResourceId(R.styleable.ActionBar_subtitleTextStyle, 0); mProgressStyle = a.getResourceId(R.styleable.ActionBar_progressBarStyle, 0); @@ -250,16 +260,14 @@ public class ActionBarView extends AbsActionBarView { a.recycle(); mLogoNavItem = new ActionMenuItem(context, 0, android.R.id.home, 0, 0, mTitle); - mHomeLayout.setOnClickListener(mUpClickListener); - mHomeLayout.setClickable(true); - mHomeLayout.setFocusable(true); + + mUpGoerFive.setOnClickListener(mUpClickListener); + mUpGoerFive.setClickable(true); + mUpGoerFive.setFocusable(true); if (getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); } - - mMaxHomeSlop = - (int) (MAX_HOME_SLOP * context.getResources().getDisplayMetrics().density + 0.5f); } @Override @@ -269,8 +277,8 @@ public class ActionBarView extends AbsActionBarView { mTitleView = null; mSubtitleView = null; mTitleUpView = null; - if (mTitleLayout != null && mTitleLayout.getParent() == this) { - removeView(mTitleLayout); + if (mTitleLayout != null && mTitleLayout.getParent() == mUpGoerFive) { + mUpGoerFive.removeView(mTitleLayout); } mTitleLayout = null; if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0) { @@ -551,19 +559,34 @@ public class ActionBarView extends AbsActionBarView { } public void setHomeButtonEnabled(boolean enable) { - mHomeLayout.setEnabled(enable); - mHomeLayout.setFocusable(enable); + setHomeButtonEnabled(enable, true); + } + + private void setHomeButtonEnabled(boolean enable, boolean recordState) { + if (recordState) { + mWasHomeEnabled = enable; + } + + if (mExpandedActionView != null) { + // There's an action view currently showing and we want to keep the state + // configured for the action view at the moment. If we needed to record the + // new state for later we will have done so above. + return; + } + + mUpGoerFive.setEnabled(enable); + mUpGoerFive.setFocusable(enable); // Make sure the home button has an accurate content description for accessibility. if (!enable) { - mHomeLayout.setContentDescription(null); - mHomeLayout.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); + mUpGoerFive.setContentDescription(null); + mUpGoerFive.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); } else { - mHomeLayout.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_AUTO); + mUpGoerFive.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_AUTO); if ((mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0) { - mHomeLayout.setContentDescription(mContext.getResources().getText( + mUpGoerFive.setContentDescription(mContext.getResources().getText( R.string.action_bar_up_description)); } else { - mHomeLayout.setContentDescription(mContext.getResources().getText( + mUpGoerFive.setContentDescription(mContext.getResources().getText( R.string.action_bar_home_description)); } } @@ -600,7 +623,7 @@ public class ActionBarView extends AbsActionBarView { if ((options & ActionBar.DISPLAY_SHOW_TITLE) != 0) { initTitle(); } else { - removeView(mTitleLayout); + mUpGoerFive.removeView(mTitleLayout); } } @@ -608,8 +631,6 @@ public class ActionBarView extends AbsActionBarView { (ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME)) != 0) { final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0; mTitleUpView.setVisibility(!showHome ? (homeAsUp ? VISIBLE : INVISIBLE) : GONE); - mTitleLayout.setEnabled(!showHome && homeAsUp); - mTitleLayout.setClickable(!showHome && homeAsUp); } if ((flagsChanged & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) { @@ -620,6 +641,17 @@ public class ActionBarView extends AbsActionBarView { } } + if (mTitleLayout != null && + (flagsChanged & ActionBar.DISPLAY_TITLE_MULTIPLE_LINES) != 0) { + if ((options & ActionBar.DISPLAY_TITLE_MULTIPLE_LINES) != 0) { + mTitleView.setSingleLine(false); + mTitleView.setMaxLines(2); + } else { + mTitleView.setMaxLines(1); + mTitleView.setSingleLine(true); + } + } + requestLayout(); } else { invalidate(); @@ -753,7 +785,8 @@ public class ActionBarView extends AbsActionBarView { protected void onFinishInflate() { super.onFinishInflate(); - addView(mHomeLayout); + mUpGoerFive.addView(mHomeLayout, 0); + addView(mUpGoerFive); if (mCustomNavView != null && (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { final ViewParent parent = mCustomNavView.getParent(); @@ -775,8 +808,6 @@ public class ActionBarView extends AbsActionBarView { mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_subtitle); mTitleUpView = (View) mTitleLayout.findViewById(R.id.up); - mTitleLayout.setOnClickListener(mUpClickListener); - if (mTitleStyleRes != 0) { mTitleView.setTextAppearance(mContext, mTitleStyleRes); } @@ -796,11 +827,9 @@ public class ActionBarView extends AbsActionBarView { final boolean showHome = (mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0; final boolean showTitleUp = !showHome; mTitleUpView.setVisibility(showTitleUp ? (homeAsUp ? VISIBLE : INVISIBLE) : GONE); - mTitleLayout.setEnabled(homeAsUp && showTitleUp); - mTitleLayout.setClickable(homeAsUp && showTitleUp); } - addView(mTitleLayout); + mUpGoerFive.addView(mTitleLayout); if (mExpandedActionView != null || (TextUtils.isEmpty(mTitle) && TextUtils.isEmpty(mSubtitle))) { // Don't show while in expanded mode or with empty text @@ -820,6 +849,28 @@ public class ActionBarView extends AbsActionBarView { return mIsCollapsed; } + /** + * @return True if any characters in the title were truncated + */ + public boolean isTitleTruncated() { + if (mTitleView == null) { + return false; + } + + final Layout titleLayout = mTitleView.getLayout(); + if (titleLayout == null) { + return false; + } + + final int lineCount = titleLayout.getLineCount(); + for (int i = 0; i < lineCount; i++) { + if (titleLayout.getEllipsisCount(i) > 0) { + return true; + } + } + return false; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int childCount = getChildCount(); @@ -828,7 +879,16 @@ public class ActionBarView extends AbsActionBarView { for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (child.getVisibility() != GONE && - !(child == mMenuView && mMenuView.getChildCount() == 0)) { + !(child == mMenuView && mMenuView.getChildCount() == 0) && + child != mUpGoerFive) { + visibleChildren++; + } + } + + final int upChildCount = mUpGoerFive.getChildCount(); + for (int i = 0; i < upChildCount; i++) { + final View child = mUpGoerFive.getChildAt(i); + if (child.getVisibility() != GONE) { visibleChildren++; } } @@ -872,7 +932,8 @@ public class ActionBarView extends AbsActionBarView { HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout; - if (homeLayout.getVisibility() != GONE) { + int homeWidth = 0; + if (homeLayout.getVisibility() != GONE && homeLayout.getParent() == mUpGoerFive) { final ViewGroup.LayoutParams lp = homeLayout.getLayoutParams(); int homeWidthSpec; if (lp.width < 0) { @@ -880,10 +941,18 @@ public class ActionBarView extends AbsActionBarView { } else { homeWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY); } + + /* + * This is a little weird. + * We're only measuring the *home* affordance within the Up container here + * on purpose, because we want to give the available space to all other views before + * the title text. We'll remeasure the whole up container again later. + */ homeLayout.measure(homeWidthSpec, exactHeightSpec); - final int homeWidth = homeLayout.getMeasuredWidth() + homeLayout.getStartOffset(); - availableWidth = Math.max(0, availableWidth - homeWidth); - leftOfCenter = Math.max(0, availableWidth - homeWidth); + homeWidth = homeLayout.getMeasuredWidth(); + final int homeOffsetWidth = homeWidth + homeLayout.getStartOffset(); + availableWidth = Math.max(0, availableWidth - homeOffsetWidth); + leftOfCenter = Math.max(0, availableWidth - homeOffsetWidth); } if (mMenuView != null && mMenuView.getParent() == this) { @@ -985,9 +1054,13 @@ public class ActionBarView extends AbsActionBarView { availableWidth -= horizontalMargin + customView.getMeasuredWidth(); } - if (mExpandedActionView == null && showTitle) { - availableWidth = measureChildView(mTitleLayout, availableWidth, - MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY), 0); + /* + * Measure the whole up container now, allowing for the full home+title sections. + * (This will re-measure the home view.) + */ + availableWidth = measureChildView(mUpGoerFive, availableWidth + homeWidth, + MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY), 0); + if (mTitleLayout != null) { leftOfCenter = Math.max(0, leftOfCenter - mTitleLayout.getMeasuredWidth()); } @@ -1034,24 +1107,17 @@ public class ActionBarView extends AbsActionBarView { final int y = getPaddingTop(); HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout; - boolean needsTouchDelegate = false; - int homeSlop = mMaxHomeSlop; - int homeRight = 0; - if (homeLayout.getVisibility() != GONE) { - final int startOffset = homeLayout.getStartOffset(); - x += positionChild(homeLayout, - next(x, startOffset, isLayoutRtl), y, contentHeight, isLayoutRtl); - x = next(x, startOffset, isLayoutRtl); - needsTouchDelegate = homeLayout == mHomeLayout; - homeRight = x; - } + final int startOffset = homeLayout.getVisibility() != GONE && + homeLayout.getParent() == mUpGoerFive ? homeLayout.getStartOffset() : 0; + + // Position the up container based on where the edge of the home layout should go. + x += positionChild(mUpGoerFive, + next(x, startOffset, isLayoutRtl), y, contentHeight, isLayoutRtl); + x = next(x, startOffset, isLayoutRtl); if (mExpandedActionView == null) { final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; - if (showTitle) { - x += positionChild(mTitleLayout, x, y, contentHeight, isLayoutRtl); - } switch (mNavigationMode) { case ActionBar.NAVIGATION_MODE_STANDARD: @@ -1061,7 +1127,6 @@ public class ActionBarView extends AbsActionBarView { if (showTitle) { x = next(x, mItemPadding, isLayoutRtl); } - homeSlop = Math.min(homeSlop, Math.max(x - homeRight, 0)); x += positionChild(mListNavLayout, x, y, contentHeight, isLayoutRtl); x = next(x, mItemPadding, isLayoutRtl); } @@ -1069,7 +1134,6 @@ public class ActionBarView extends AbsActionBarView { case ActionBar.NAVIGATION_MODE_TABS: if (mTabScrollView != null) { if (showTitle) x = next(x, mItemPadding, isLayoutRtl); - homeSlop = Math.min(homeSlop, Math.max(x - homeRight, 0)); x += positionChild(mTabScrollView, x, y, contentHeight, isLayoutRtl); x = next(x, mItemPadding, isLayoutRtl); } @@ -1174,7 +1238,6 @@ public class ActionBarView extends AbsActionBarView { final int customWidth = customView.getMeasuredWidth(); customView.layout(xpos, ypos, xpos + customWidth, ypos + customView.getMeasuredHeight()); - homeSlop = Math.min(homeSlop, Math.max(xpos - homeRight, 0)); x = next(x, customWidth, isLayoutRtl); } @@ -1184,14 +1247,6 @@ public class ActionBarView extends AbsActionBarView { mProgressView.layout(mProgressBarPadding, -halfProgressHeight, mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight); } - - if (needsTouchDelegate) { - mTempRect.set(homeLayout.getLeft(), homeLayout.getTop(), - homeLayout.getRight() + homeSlop, homeLayout.getBottom()); - setTouchDelegate(new TouchDelegate(mTempRect, homeLayout)); - } else { - setTouchDelegate(null); - } } @Override @@ -1491,14 +1546,15 @@ public class ActionBarView extends AbsActionBarView { if (mExpandedActionView.getParent() != ActionBarView.this) { addView(mExpandedActionView); } - if (mExpandedHomeLayout.getParent() != ActionBarView.this) { - addView(mExpandedHomeLayout); + if (mExpandedHomeLayout.getParent() != mUpGoerFive) { + mUpGoerFive.addView(mExpandedHomeLayout); } mHomeLayout.setVisibility(GONE); if (mTitleLayout != null) mTitleLayout.setVisibility(GONE); if (mTabScrollView != null) mTabScrollView.setVisibility(GONE); if (mSpinner != null) mSpinner.setVisibility(GONE); if (mCustomNavView != null) mCustomNavView.setVisibility(GONE); + setHomeButtonEnabled(false, false); requestLayout(); item.setActionViewExpanded(true); @@ -1518,7 +1574,7 @@ public class ActionBarView extends AbsActionBarView { } removeView(mExpandedActionView); - removeView(mExpandedHomeLayout); + mUpGoerFive.removeView(mExpandedHomeLayout); mExpandedActionView = null; if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0) { mHomeLayout.setVisibility(VISIBLE); @@ -1541,6 +1597,7 @@ public class ActionBarView extends AbsActionBarView { } mExpandedHomeLayout.setIcon(null); mCurrentExpandedItem = null; + setHomeButtonEnabled(mWasHomeEnabled); // Set by expandItemActionView above requestLayout(); item.setActionViewExpanded(false); diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 75fef24..907b52a 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -24,7 +24,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Binder; -import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; @@ -54,8 +53,6 @@ import java.util.List; */ public class LockPatternUtils { - private static final String OPTION_ENABLE_FACELOCK = "enable_facelock"; - private static final String TAG = "LockPatternUtils"; /** @@ -116,16 +113,6 @@ public class LockPatternUtils { public static final String KEYGUARD_SHOW_APPWIDGET = "showappwidget"; /** - * Options used to lock the device upon user switch. - */ - public static final Bundle USER_SWITCH_LOCK_OPTIONS = new Bundle(); - - static { - USER_SWITCH_LOCK_OPTIONS.putBoolean(KEYGUARD_SHOW_USER_SWITCHER, true); - USER_SWITCH_LOCK_OPTIONS.putBoolean(KEYGUARD_SHOW_SECURITY_CHALLENGE, true); - } - - /** * The bit in LOCK_BIOMETRIC_WEAK_FLAGS to be used to indicate whether liveliness should * be used */ diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp index e7c4c23..9537ac4 100644 --- a/core/jni/android_net_wifi_Wifi.cpp +++ b/core/jni/android_net_wifi_Wifi.cpp @@ -122,9 +122,9 @@ static jboolean android_net_wifi_startSupplicant(JNIEnv* env, jobject, jboolean return (jboolean)(::wifi_start_supplicant(p2pSupported) == 0); } -static jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject) +static jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) { - return (jboolean)(::wifi_stop_supplicant() == 0); + return (jboolean)(::wifi_stop_supplicant(p2pSupported) == 0); } static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject, jstring jIface) @@ -204,7 +204,7 @@ static JNINativeMethod gWifiMethods[] = { { "isDriverLoaded", "()Z", (void *)android_net_wifi_isDriverLoaded }, { "unloadDriver", "()Z", (void *)android_net_wifi_unloadDriver }, { "startSupplicant", "(Z)Z", (void *)android_net_wifi_startSupplicant }, - { "killSupplicant", "()Z", (void *)android_net_wifi_killSupplicant }, + { "killSupplicant", "(Z)Z", (void *)android_net_wifi_killSupplicant }, { "connectToSupplicant", "(Ljava/lang/String;)Z", (void *)android_net_wifi_connectToSupplicant }, { "closeSupplicantConnection", "(Ljava/lang/String;)V", diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 89c8c36..2a357af 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -143,6 +143,30 @@ <protected-broadcast android:name="android.intent.action.DREAMING_STARTED" /> <protected-broadcast android:name="android.intent.action.DREAMING_STOPPED" /> + <protected-broadcast android:name="android.intent.action.ANY_DATA_STATE" /> + + <protected-broadcast android:name="com.android.server.WifiManager.action.START_SCAN" /> + <protected-broadcast android:name="com.android.server.WifiManager.action.DELAYED_DRIVER_STOP" /> + <protected-broadcast android:name="android.net.wifi.WIFI_STATE_CHANGED" /> + <protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" /> + <protected-broadcast android:name="android.net.wifi.SCAN_RESULTS" /> + <protected-broadcast android:name="android.net.wifi.RSSI_CHANGED" /> + <protected-broadcast android:name="android.net.wifi.STATE_CHANGE" /> + <protected-broadcast android:name="android.net.wifi.LINK_CONFIGURATION_CHANGED" /> + <protected-broadcast android:name="android.net.wifi.CONFIGURED_NETWORKS_CHANGE" /> + <protected-broadcast android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> + <protected-broadcast android:name="android.net.wifi.supplicant.STATE_CHANGE" /> + <protected-broadcast android:name="android.net.wifi.p2p.STATE_CHANGED" /> + <protected-broadcast android:name="android.net.wifi.p2p.DISCOVERY_STATE_CHANGE" /> + <protected-broadcast android:name="android.net.wifi.p2p.THIS_DEVICE_CHANGED" /> + <protected-broadcast android:name="android.net.wifi.p2p.PEERS_CHANGED" /> + <protected-broadcast android:name="android.net.wifi.p2p.CONNECTION_STATE_CHANGE" /> + <protected-broadcast android:name="android.net.wifi.p2p.PERSISTENT_GROUPS_CHANGED" /> + <protected-broadcast android:name="android.net.conn.TETHER_STATE_CHANGED" /> + <protected-broadcast android:name="android.net.conn.INET_CONDITION_ACTION" /> + + + <protected-broadcast android:name="android.intent.action.ANY_DATA_STATE" /> diff --git a/core/res/res/drawable-hdpi/dialog_bottom_holo_dark.9.png b/core/res/res/drawable-hdpi/dialog_bottom_holo_dark.9.png Binary files differindex 9eaf9d5..b23740c 100644 --- a/core/res/res/drawable-hdpi/dialog_bottom_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/dialog_bottom_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/dialog_bottom_holo_light.9.png b/core/res/res/drawable-hdpi/dialog_bottom_holo_light.9.png Binary files differindex 55a125e..44803d7 100644 --- a/core/res/res/drawable-hdpi/dialog_bottom_holo_light.9.png +++ b/core/res/res/drawable-hdpi/dialog_bottom_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/dialog_full_holo_dark.9.png b/core/res/res/drawable-hdpi/dialog_full_holo_dark.9.png Binary files differindex 13205f0..911f3fe 100644 --- a/core/res/res/drawable-hdpi/dialog_full_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/dialog_full_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/dialog_full_holo_light.9.png b/core/res/res/drawable-hdpi/dialog_full_holo_light.9.png Binary files differindex 6f5dcc1..2129567 100644 --- a/core/res/res/drawable-hdpi/dialog_full_holo_light.9.png +++ b/core/res/res/drawable-hdpi/dialog_full_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/dialog_middle_holo_dark.9.png b/core/res/res/drawable-hdpi/dialog_middle_holo_dark.9.png Binary files differindex be3f7a1..9ce7cfc 100644 --- a/core/res/res/drawable-hdpi/dialog_middle_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/dialog_middle_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/dialog_middle_holo_light.9.png b/core/res/res/drawable-hdpi/dialog_middle_holo_light.9.png Binary files differindex 2e92a6d..396a0f2 100644 --- a/core/res/res/drawable-hdpi/dialog_middle_holo_light.9.png +++ b/core/res/res/drawable-hdpi/dialog_middle_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/dialog_top_holo_dark.9.png b/core/res/res/drawable-hdpi/dialog_top_holo_dark.9.png Binary files differindex 0e5444b..22ca61f 100644 --- a/core/res/res/drawable-hdpi/dialog_top_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/dialog_top_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/dialog_top_holo_light.9.png b/core/res/res/drawable-hdpi/dialog_top_holo_light.9.png Binary files differindex 32ca205..9b54cd5 100644 --- a/core/res/res/drawable-hdpi/dialog_top_holo_light.9.png +++ b/core/res/res/drawable-hdpi/dialog_top_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/ic_coins_l.png b/core/res/res/drawable-hdpi/ic_coins_l.png Binary files differnew file mode 100644 index 0000000..e1e3e2a --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_coins_l.png diff --git a/core/res/res/drawable-hdpi/kg_add_widget.png b/core/res/res/drawable-hdpi/kg_add_widget.png Binary files differindex 723d97a..68971a5 100644 --- a/core/res/res/drawable-hdpi/kg_add_widget.png +++ b/core/res/res/drawable-hdpi/kg_add_widget.png diff --git a/core/res/res/drawable-hdpi/kg_add_widget_disabled.png b/core/res/res/drawable-hdpi/kg_add_widget_disabled.png Binary files differnew file mode 100644 index 0000000..f24cf642 --- /dev/null +++ b/core/res/res/drawable-hdpi/kg_add_widget_disabled.png diff --git a/core/res/res/drawable-hdpi/kg_add_widget_pressed.png b/core/res/res/drawable-hdpi/kg_add_widget_pressed.png Binary files differnew file mode 100644 index 0000000..55112ca --- /dev/null +++ b/core/res/res/drawable-hdpi/kg_add_widget_pressed.png diff --git a/core/res/res/drawable-hdpi/menu_dropdown_panel_holo_dark.9.png b/core/res/res/drawable-hdpi/menu_dropdown_panel_holo_dark.9.png Binary files differindex e83b346..72ee35f 100644 --- a/core/res/res/drawable-hdpi/menu_dropdown_panel_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/menu_dropdown_panel_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/menu_dropdown_panel_holo_light.9.png b/core/res/res/drawable-hdpi/menu_dropdown_panel_holo_light.9.png Binary files differindex fd4fbf8..0d1f9bf 100644 --- a/core/res/res/drawable-hdpi/menu_dropdown_panel_holo_light.9.png +++ b/core/res/res/drawable-hdpi/menu_dropdown_panel_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/menu_hardkey_panel_holo_dark.9.png b/core/res/res/drawable-hdpi/menu_hardkey_panel_holo_dark.9.png Binary files differindex 8aee55a..465ee6d 100644 --- a/core/res/res/drawable-hdpi/menu_hardkey_panel_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/menu_hardkey_panel_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/menu_hardkey_panel_holo_light.9.png b/core/res/res/drawable-hdpi/menu_hardkey_panel_holo_light.9.png Binary files differindex 2ebb7a2..76a5c53 100644 --- a/core/res/res/drawable-hdpi/menu_hardkey_panel_holo_light.9.png +++ b/core/res/res/drawable-hdpi/menu_hardkey_panel_holo_light.9.png diff --git a/core/res/res/drawable-ldrtl-hdpi/popup_inline_error.9.png b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error.9.png Binary files differnew file mode 100644 index 0000000..8b43f4e --- /dev/null +++ b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error.9.png diff --git a/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above.9.png b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above.9.png Binary files differnew file mode 100644 index 0000000..20e9002 --- /dev/null +++ b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above.9.png diff --git a/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above_holo_dark.9.png b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..b5f397c --- /dev/null +++ b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above_holo_dark.9.png diff --git a/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above_holo_light.9.png b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above_holo_light.9.png Binary files differnew file mode 100644 index 0000000..a04d695 --- /dev/null +++ b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_above_holo_light.9.png diff --git a/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_holo_dark.9.png b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..8567b1f --- /dev/null +++ b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_holo_dark.9.png diff --git a/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_holo_light.9.png b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_holo_light.9.png Binary files differnew file mode 100644 index 0000000..7d1754c --- /dev/null +++ b/core/res/res/drawable-ldrtl-hdpi/popup_inline_error_holo_light.9.png diff --git a/core/res/res/drawable-ldrtl-ldpi/popup_inline_error.9.png b/core/res/res/drawable-ldrtl-ldpi/popup_inline_error.9.png Binary files differnew file mode 100644 index 0000000..d2efb62 --- /dev/null +++ b/core/res/res/drawable-ldrtl-ldpi/popup_inline_error.9.png diff --git a/core/res/res/drawable-ldrtl-ldpi/popup_inline_error_above.9.png b/core/res/res/drawable-ldrtl-ldpi/popup_inline_error_above.9.png Binary files differnew file mode 100644 index 0000000..04d200d --- /dev/null +++ b/core/res/res/drawable-ldrtl-ldpi/popup_inline_error_above.9.png diff --git a/core/res/res/drawable-ldrtl-mdpi/popup_inline_error.9.png b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error.9.png Binary files differnew file mode 100644 index 0000000..27e8d4f --- /dev/null +++ b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error.9.png diff --git a/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above.9.png b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above.9.png Binary files differnew file mode 100644 index 0000000..4ae2b91 --- /dev/null +++ b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above.9.png diff --git a/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above_holo_dark.9.png b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..8cc3b69 --- /dev/null +++ b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above_holo_dark.9.png diff --git a/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above_holo_light.9.png b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above_holo_light.9.png Binary files differnew file mode 100644 index 0000000..7a84200 --- /dev/null +++ b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_above_holo_light.9.png diff --git a/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_holo_dark.9.png b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..8fc2e2e --- /dev/null +++ b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_holo_dark.9.png diff --git a/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_holo_light.9.png b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_holo_light.9.png Binary files differnew file mode 100644 index 0000000..687a691 --- /dev/null +++ b/core/res/res/drawable-ldrtl-mdpi/popup_inline_error_holo_light.9.png diff --git a/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error.9.png b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error.9.png Binary files differnew file mode 100644 index 0000000..db91a56 --- /dev/null +++ b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error.9.png diff --git a/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above.9.png b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above.9.png Binary files differnew file mode 100644 index 0000000..90820b5 --- /dev/null +++ b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above.9.png diff --git a/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above_holo_dark.9.png b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..5989975 --- /dev/null +++ b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above_holo_dark.9.png diff --git a/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above_holo_light.9.png b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above_holo_light.9.png Binary files differnew file mode 100644 index 0000000..3b3f87d --- /dev/null +++ b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_above_holo_light.9.png diff --git a/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_holo_dark.9.png b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..75baba2 --- /dev/null +++ b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_holo_dark.9.png diff --git a/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_holo_light.9.png b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_holo_light.9.png Binary files differnew file mode 100644 index 0000000..6c0203d --- /dev/null +++ b/core/res/res/drawable-ldrtl-xhdpi/popup_inline_error_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/dialog_bottom_holo_dark.9.png b/core/res/res/drawable-mdpi/dialog_bottom_holo_dark.9.png Binary files differindex f874d66..31dc4fd 100644 --- a/core/res/res/drawable-mdpi/dialog_bottom_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/dialog_bottom_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/dialog_bottom_holo_light.9.png b/core/res/res/drawable-mdpi/dialog_bottom_holo_light.9.png Binary files differindex 0d6c715..7541e8a 100644 --- a/core/res/res/drawable-mdpi/dialog_bottom_holo_light.9.png +++ b/core/res/res/drawable-mdpi/dialog_bottom_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/dialog_full_holo_dark.9.png b/core/res/res/drawable-mdpi/dialog_full_holo_dark.9.png Binary files differindex 63144ae..dc37316 100644 --- a/core/res/res/drawable-mdpi/dialog_full_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/dialog_full_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/dialog_full_holo_light.9.png b/core/res/res/drawable-mdpi/dialog_full_holo_light.9.png Binary files differindex 953ba78..0c5770a 100644 --- a/core/res/res/drawable-mdpi/dialog_full_holo_light.9.png +++ b/core/res/res/drawable-mdpi/dialog_full_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/dialog_middle_holo_dark.9.png b/core/res/res/drawable-mdpi/dialog_middle_holo_dark.9.png Binary files differindex 0c57ffc..ca389e3 100644 --- a/core/res/res/drawable-mdpi/dialog_middle_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/dialog_middle_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/dialog_middle_holo_light.9.png b/core/res/res/drawable-mdpi/dialog_middle_holo_light.9.png Binary files differindex c6be52e..7a836ce 100644 --- a/core/res/res/drawable-mdpi/dialog_middle_holo_light.9.png +++ b/core/res/res/drawable-mdpi/dialog_middle_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/dialog_top_holo_dark.9.png b/core/res/res/drawable-mdpi/dialog_top_holo_dark.9.png Binary files differindex 7e9f258..fb848a3 100644 --- a/core/res/res/drawable-mdpi/dialog_top_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/dialog_top_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/dialog_top_holo_light.9.png b/core/res/res/drawable-mdpi/dialog_top_holo_light.9.png Binary files differindex 11cc5a4..2ddcab1 100644 --- a/core/res/res/drawable-mdpi/dialog_top_holo_light.9.png +++ b/core/res/res/drawable-mdpi/dialog_top_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/ic_coins_l.png b/core/res/res/drawable-mdpi/ic_coins_l.png Binary files differnew file mode 100644 index 0000000..a6d7abb --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_coins_l.png diff --git a/core/res/res/drawable-mdpi/kg_add_widget.png b/core/res/res/drawable-mdpi/kg_add_widget.png Binary files differindex 5b0a5a4..136ae17 100644 --- a/core/res/res/drawable-mdpi/kg_add_widget.png +++ b/core/res/res/drawable-mdpi/kg_add_widget.png diff --git a/core/res/res/drawable-mdpi/kg_add_widget_disabled.png b/core/res/res/drawable-mdpi/kg_add_widget_disabled.png Binary files differnew file mode 100644 index 0000000..02e0f0e --- /dev/null +++ b/core/res/res/drawable-mdpi/kg_add_widget_disabled.png diff --git a/core/res/res/drawable-mdpi/kg_add_widget_pressed.png b/core/res/res/drawable-mdpi/kg_add_widget_pressed.png Binary files differnew file mode 100644 index 0000000..34a7aaa --- /dev/null +++ b/core/res/res/drawable-mdpi/kg_add_widget_pressed.png diff --git a/core/res/res/drawable-mdpi/menu_dropdown_panel_holo_dark.9.png b/core/res/res/drawable-mdpi/menu_dropdown_panel_holo_dark.9.png Binary files differindex 9583c9b..31dc342 100644 --- a/core/res/res/drawable-mdpi/menu_dropdown_panel_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/menu_dropdown_panel_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/menu_dropdown_panel_holo_light.9.png b/core/res/res/drawable-mdpi/menu_dropdown_panel_holo_light.9.png Binary files differindex 54d2cd0..755c145 100644 --- a/core/res/res/drawable-mdpi/menu_dropdown_panel_holo_light.9.png +++ b/core/res/res/drawable-mdpi/menu_dropdown_panel_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/menu_hardkey_panel_holo_dark.9.png b/core/res/res/drawable-mdpi/menu_hardkey_panel_holo_dark.9.png Binary files differindex ce48b33..3677994 100644 --- a/core/res/res/drawable-mdpi/menu_hardkey_panel_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/menu_hardkey_panel_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/menu_hardkey_panel_holo_light.9.png b/core/res/res/drawable-mdpi/menu_hardkey_panel_holo_light.9.png Binary files differindex 1f313af..02b25f0 100644 --- a/core/res/res/drawable-mdpi/menu_hardkey_panel_holo_light.9.png +++ b/core/res/res/drawable-mdpi/menu_hardkey_panel_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png b/core/res/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png Binary files differindex 467ea1f..3c26c6b 100644 --- a/core/res/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/dialog_bottom_holo_light.9.png b/core/res/res/drawable-xhdpi/dialog_bottom_holo_light.9.png Binary files differindex 74929a3..f7423f3 100644 --- a/core/res/res/drawable-xhdpi/dialog_bottom_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/dialog_bottom_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/dialog_full_holo_dark.9.png b/core/res/res/drawable-xhdpi/dialog_full_holo_dark.9.png Binary files differindex a8ab305..75d36be 100644 --- a/core/res/res/drawable-xhdpi/dialog_full_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/dialog_full_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/dialog_full_holo_light.9.png b/core/res/res/drawable-xhdpi/dialog_full_holo_light.9.png Binary files differindex a8f02d6..d9bd337 100644 --- a/core/res/res/drawable-xhdpi/dialog_full_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/dialog_full_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/dialog_middle_holo_dark.9.png b/core/res/res/drawable-xhdpi/dialog_middle_holo_dark.9.png Binary files differindex 97eb217..e9467b4 100644 --- a/core/res/res/drawable-xhdpi/dialog_middle_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/dialog_middle_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/dialog_middle_holo_light.9.png b/core/res/res/drawable-xhdpi/dialog_middle_holo_light.9.png Binary files differindex 1300c19..ce3a880 100644 --- a/core/res/res/drawable-xhdpi/dialog_middle_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/dialog_middle_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/dialog_top_holo_dark.9.png b/core/res/res/drawable-xhdpi/dialog_top_holo_dark.9.png Binary files differindex f82e26b..fa95667 100644 --- a/core/res/res/drawable-xhdpi/dialog_top_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/dialog_top_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/dialog_top_holo_light.9.png b/core/res/res/drawable-xhdpi/dialog_top_holo_light.9.png Binary files differindex 8bd32a3..555fb81 100644 --- a/core/res/res/drawable-xhdpi/dialog_top_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/dialog_top_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/ic_coins_l.png b/core/res/res/drawable-xhdpi/ic_coins_l.png Binary files differnew file mode 100644 index 0000000..84e7e72 --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_coins_l.png diff --git a/core/res/res/drawable-xhdpi/kg_add_widget.png b/core/res/res/drawable-xhdpi/kg_add_widget.png Binary files differindex 9c84de2..ca48be2 100644 --- a/core/res/res/drawable-xhdpi/kg_add_widget.png +++ b/core/res/res/drawable-xhdpi/kg_add_widget.png diff --git a/core/res/res/drawable-xhdpi/kg_add_widget_disabled.png b/core/res/res/drawable-xhdpi/kg_add_widget_disabled.png Binary files differnew file mode 100644 index 0000000..55fa1ac --- /dev/null +++ b/core/res/res/drawable-xhdpi/kg_add_widget_disabled.png diff --git a/core/res/res/drawable-xhdpi/kg_add_widget_pressed.png b/core/res/res/drawable-xhdpi/kg_add_widget_pressed.png Binary files differnew file mode 100644 index 0000000..4b86727 --- /dev/null +++ b/core/res/res/drawable-xhdpi/kg_add_widget_pressed.png diff --git a/core/res/res/drawable-xhdpi/menu_dropdown_panel_holo_dark.9.png b/core/res/res/drawable-xhdpi/menu_dropdown_panel_holo_dark.9.png Binary files differindex f67e609..abc48f8 100644 --- a/core/res/res/drawable-xhdpi/menu_dropdown_panel_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/menu_dropdown_panel_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/menu_dropdown_panel_holo_light.9.png b/core/res/res/drawable-xhdpi/menu_dropdown_panel_holo_light.9.png Binary files differindex ed71eda..48905ed 100644 --- a/core/res/res/drawable-xhdpi/menu_dropdown_panel_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/menu_dropdown_panel_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/menu_hardkey_panel_holo_dark.9.png b/core/res/res/drawable-xhdpi/menu_hardkey_panel_holo_dark.9.png Binary files differindex 585bccc..c1ad023 100644 --- a/core/res/res/drawable-xhdpi/menu_hardkey_panel_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/menu_hardkey_panel_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/menu_hardkey_panel_holo_light.9.png b/core/res/res/drawable-xhdpi/menu_hardkey_panel_holo_light.9.png Binary files differindex a0669b9..a1e33d6 100644 --- a/core/res/res/drawable-xhdpi/menu_hardkey_panel_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/menu_hardkey_panel_holo_light.9.png diff --git a/core/res/res/drawable/keyguard_add_widget_button.xml b/core/res/res/drawable/keyguard_add_widget_button.xml new file mode 100644 index 0000000..c26f81d --- /dev/null +++ b/core/res/res/drawable/keyguard_add_widget_button.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2012 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" android:drawable="@drawable/kg_add_widget_pressed" /> + <item android:state_enabled="false" android:drawable="@drawable/kg_add_widget_disabled" /> + <item android:drawable="@drawable/kg_add_widget" /> +</selector> diff --git a/core/res/res/layout-xlarge/screen_action_bar.xml b/core/res/res/layout-xlarge/screen_action_bar.xml index 182a2e5..5ff219f 100644 --- a/core/res/res/layout-xlarge/screen_action_bar.xml +++ b/core/res/res/layout-xlarge/screen_action_bar.xml @@ -22,7 +22,8 @@ This is an optimized layout for a screen with the Action Bar enabled. android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:fitsSystemWindows="true"> + android:fitsSystemWindows="true" + android:splitMotionEvents="false"> <com.android.internal.widget.ActionBarContainer android:id="@+id/action_bar_container" android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/core/res/res/layout-xlarge/screen_action_bar_overlay.xml b/core/res/res/layout-xlarge/screen_action_bar_overlay.xml index f2a1ea1..a95635e 100644 --- a/core/res/res/layout-xlarge/screen_action_bar_overlay.xml +++ b/core/res/res/layout-xlarge/screen_action_bar_overlay.xml @@ -23,7 +23,8 @@ the Action Bar enabled overlaying application content. xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/action_bar_overlay_layout" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:splitMotionEvents="false"> <FrameLayout android:id="@android:id/content" android:layout_width="match_parent" android:layout_height="match_parent" /> diff --git a/core/res/res/layout/action_bar_home.xml b/core/res/res/layout/action_bar_home.xml index fe58215..5341f3d 100644 --- a/core/res/res/layout/action_bar_home.xml +++ b/core/res/res/layout/action_bar_home.xml @@ -17,9 +17,7 @@ <view xmlns:android="http://schemas.android.com/apk/res/android" class="com.android.internal.widget.ActionBarView$HomeView" android:layout_width="wrap_content" - android:layout_height="match_parent" - android:background="?android:attr/actionBarItemBackground" - android:animateLayoutChanges="true"> + android:layout_height="match_parent"> <ImageView android:id="@android:id/up" android:src="?android:attr/homeAsUpIndicator" android:layout_gravity="center_vertical|start" diff --git a/core/res/res/layout/action_bar_title_item.xml b/core/res/res/layout/action_bar_title_item.xml index df773eb..ccc5b07 100644 --- a/core/res/res/layout/action_bar_title_item.xml +++ b/core/res/res/layout/action_bar_title_item.xml @@ -16,10 +16,9 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:orientation="horizontal" android:paddingEnd="8dip" - android:background="?android:attr/actionBarItemBackground" android:enabled="false"> <ImageView android:id="@android:id/up" diff --git a/core/res/res/layout/action_bar_up_container.xml b/core/res/res/layout/action_bar_up_container.xml new file mode 100644 index 0000000..c6fad64 --- /dev/null +++ b/core/res/res/layout/action_bar_up_container.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:background="?android:attr/actionBarItemBackground" + android:gravity="center_vertical" + android:enabled="false"> +</LinearLayout> diff --git a/core/res/res/layout/keyguard_add_widget.xml b/core/res/res/layout/keyguard_add_widget.xml index db166ac..d043fdb 100644 --- a/core/res/res/layout/keyguard_add_widget.xml +++ b/core/res/res/layout/keyguard_add_widget.xml @@ -36,7 +36,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:padding="24dp" - android:src="@drawable/kg_add_widget" + android:src="@drawable/keyguard_add_widget_button" android:contentDescription="@string/keyguard_accessibility_add_widget"/> </FrameLayout> </com.android.internal.policy.impl.keyguard.KeyguardWidgetFrame> diff --git a/core/res/res/layout/keyguard_pin_view.xml b/core/res/res/layout/keyguard_pin_view.xml index e494b69..6a3b9e6 100644 --- a/core/res/res/layout/keyguard_pin_view.xml +++ b/core/res/res/layout/keyguard_pin_view.xml @@ -39,6 +39,7 @@ android:layout_height="0dp" android:orientation="vertical" android:layout_weight="1" + android:layoutDirection="ltr" > <LinearLayout android:layout_width="match_parent" diff --git a/core/res/res/layout/keyguard_sim_pin_view.xml b/core/res/res/layout/keyguard_sim_pin_view.xml index 026b025..6e6fe08 100644 --- a/core/res/res/layout/keyguard_sim_pin_view.xml +++ b/core/res/res/layout/keyguard_sim_pin_view.xml @@ -44,6 +44,7 @@ android:layout_height="0dp" android:orientation="vertical" android:layout_weight="1" + android:layoutDirection="ltr" > <LinearLayout android:layout_width="match_parent" diff --git a/core/res/res/layout/keyguard_sim_puk_view.xml b/core/res/res/layout/keyguard_sim_puk_view.xml index 28a9f9a..0412fdc 100644 --- a/core/res/res/layout/keyguard_sim_puk_view.xml +++ b/core/res/res/layout/keyguard_sim_puk_view.xml @@ -45,6 +45,7 @@ android:layout_height="0dp" android:orientation="vertical" android:layout_weight="1" + android:layoutDirection="ltr" > <LinearLayout android:layout_width="match_parent" diff --git a/core/res/res/layout/list_menu_item_layout.xml b/core/res/res/layout/list_menu_item_layout.xml index 0f37c71..e8d4983 100644 --- a/core/res/res/layout/list_menu_item_layout.xml +++ b/core/res/res/layout/list_menu_item_layout.xml @@ -40,7 +40,8 @@ android:singleLine="true" android:duplicateParentState="true" android:ellipsize="marquee" - android:fadingEdge="horizontal" /> + android:fadingEdge="horizontal" + android:textAlignment="viewStart" /> <TextView android:id="@+id/shortcut" @@ -50,7 +51,8 @@ android:layout_alignParentStart="true" android:textAppearance="?android:attr/textAppearanceSmall" android:singleLine="true" - android:duplicateParentState="true" /> + android:duplicateParentState="true" + android:textAlignment="viewStart" /> </RelativeLayout> diff --git a/core/res/res/layout/media_controller.xml b/core/res/res/layout/media_controller.xml index ad74a3a..7575836 100644 --- a/core/res/res/layout/media_controller.xml +++ b/core/res/res/layout/media_controller.xml @@ -48,7 +48,8 @@ android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingEnd="4dip" /> + android:paddingEnd="4dip" + android:textColor="@color/dim_foreground_dark" /> <SeekBar android:id="@+id/mediacontroller_progress" @@ -67,7 +68,8 @@ android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingStart="4dip" /> + android:paddingStart="4dip" + android:textColor="@color/dim_foreground_dark" /> </LinearLayout> </LinearLayout> diff --git a/core/res/res/layout/notification_template_base.xml b/core/res/res/layout/notification_template_base.xml index 134f45e..d2e25c1 100644 --- a/core/res/res/layout/notification_template_base.xml +++ b/core/res/res/layout/notification_template_base.xml @@ -61,7 +61,6 @@ <ViewStub android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_weight="0" android:visibility="gone" android:layout="@layout/notification_template_part_time" @@ -69,7 +68,6 @@ <ViewStub android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_weight="0" android:visibility="gone" android:layout="@layout/notification_template_part_chronometer" diff --git a/core/res/res/layout/notification_template_big_base.xml b/core/res/res/layout/notification_template_big_base.xml index b5da486..7cc6650 100644 --- a/core/res/res/layout/notification_template_big_base.xml +++ b/core/res/res/layout/notification_template_big_base.xml @@ -66,7 +66,6 @@ <ViewStub android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_weight="0" android:visibility="gone" android:layout="@layout/notification_template_part_time" @@ -74,7 +73,6 @@ <ViewStub android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_weight="0" android:visibility="gone" android:layout="@layout/notification_template_part_chronometer" diff --git a/core/res/res/layout/notification_template_big_text.xml b/core/res/res/layout/notification_template_big_text.xml index 01f1acf..7e6da22 100644 --- a/core/res/res/layout/notification_template_big_text.xml +++ b/core/res/res/layout/notification_template_big_text.xml @@ -68,7 +68,6 @@ <ViewStub android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_weight="0" android:visibility="gone" android:layout="@layout/notification_template_part_time" @@ -76,7 +75,6 @@ <ViewStub android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_weight="0" android:visibility="gone" android:layout="@layout/notification_template_part_chronometer" diff --git a/core/res/res/layout/notification_template_inbox.xml b/core/res/res/layout/notification_template_inbox.xml index 1b7e659..1eec871 100644 --- a/core/res/res/layout/notification_template_inbox.xml +++ b/core/res/res/layout/notification_template_inbox.xml @@ -69,7 +69,6 @@ <ViewStub android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_weight="0" android:visibility="gone" android:layout="@layout/notification_template_part_time" @@ -77,7 +76,6 @@ <ViewStub android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_weight="0" android:visibility="gone" android:layout="@layout/notification_template_part_chronometer" diff --git a/core/res/res/layout/popup_menu_item_layout.xml b/core/res/res/layout/popup_menu_item_layout.xml index f67ed4e..452f85d 100644 --- a/core/res/res/layout/popup_menu_item_layout.xml +++ b/core/res/res/layout/popup_menu_item_layout.xml @@ -41,7 +41,8 @@ android:singleLine="true" android:duplicateParentState="true" android:ellipsize="marquee" - android:fadingEdge="horizontal" /> + android:fadingEdge="horizontal" + android:textAlignment="viewStart" /> <TextView android:id="@+id/shortcut" @@ -51,7 +52,8 @@ android:layout_alignParentStart="true" android:textAppearance="?android:attr/textAppearanceSmallPopupMenu" android:singleLine="true" - android:duplicateParentState="true" /> + android:duplicateParentState="true" + android:textAlignment="viewStart" /> </RelativeLayout> diff --git a/core/res/res/layout/screen_action_bar.xml b/core/res/res/layout/screen_action_bar.xml index b0f1bc5..f0b2313 100644 --- a/core/res/res/layout/screen_action_bar.xml +++ b/core/res/res/layout/screen_action_bar.xml @@ -22,7 +22,8 @@ This is an optimized layout for a screen with the Action Bar enabled. android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:fitsSystemWindows="true"> + android:fitsSystemWindows="true" + android:splitMotionEvents="false"> <com.android.internal.widget.ActionBarContainer android:id="@+id/action_bar_container" android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/core/res/res/layout/screen_action_bar_overlay.xml b/core/res/res/layout/screen_action_bar_overlay.xml index 20a7db1..c8181d1 100644 --- a/core/res/res/layout/screen_action_bar_overlay.xml +++ b/core/res/res/layout/screen_action_bar_overlay.xml @@ -23,7 +23,8 @@ the Action Bar enabled overlaying application content. xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/action_bar_overlay_layout" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:splitMotionEvents="false"> <FrameLayout android:id="@android:id/content" android:layout_width="match_parent" android:layout_height="match_parent" /> diff --git a/core/res/res/layout/sms_short_code_confirmation_dialog.xml b/core/res/res/layout/sms_short_code_confirmation_dialog.xml index ec39d97..d82f560 100644 --- a/core/res/res/layout/sms_short_code_confirmation_dialog.xml +++ b/core/res/res/layout/sms_short_code_confirmation_dialog.xml @@ -30,9 +30,9 @@ style="?android:attr/textAppearanceMedium" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingLeft="16dip" - android:paddingRight="16dip" - android:paddingTop="8dip" + android:paddingLeft="20dip" + android:paddingRight="20dip" + android:paddingTop="16dip" android:paddingBottom="16dip" /> <TableLayout android:id="@+id/sms_short_code_detail_layout" @@ -51,7 +51,7 @@ android:layout_height="wrap_content" android:paddingLeft="8dip" android:paddingRight="8dip" - android:src="@null" /> + android:src="@drawable/ic_coins_l" /> <TextView android:id="@+id/sms_short_code_detail_message" android:layout_width="match_parent" android:layout_height="wrap_content" /> @@ -60,14 +60,19 @@ <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" > - + <RelativeLayout android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingTop="12dip" + android:paddingLeft="8dip" > <CheckBox android:id="@+id/sms_short_code_remember_choice_checkbox" + android:paddingTop="11dip" android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingRight="8dip" /> + android:layout_height="wrap_content" /> + </RelativeLayout> <TextView android:id="@+id/sms_short_code_remember_choice_text" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:paddingTop="18dip" android:text="@string/sms_short_code_remember_choice" /> </TableRow> @@ -77,6 +82,7 @@ <Space android:layout_gravity="fill" /> <TextView android:id="@+id/sms_short_code_remember_undo_instruction" + android:paddingTop="10dip" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </TableRow> diff --git a/core/res/res/mipmap-xxhdpi/sym_def_app_icon.png b/core/res/res/mipmap-xxhdpi/sym_def_app_icon.png Binary files differnew file mode 100644 index 0000000..e3f3144 --- /dev/null +++ b/core/res/res/mipmap-xxhdpi/sym_def_app_icon.png diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 51d23e8..09f752f 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"weke"</string> <string name="year" msgid="4001118221013892076">"jaar"</string> <string name="years" msgid="6881577717993213522">"jaar"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 sekonde"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> sekondes"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuut"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minute"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 uur"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ure"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Videoprobleem"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Hierdie video is nie geldig vir stroming na hierdie toestel nie."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Kan nie hierdie video speel nie."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Kennisgewing-volume"</string> <string name="ringtone_default" msgid="3789758980357696936">"Verstek luitoon"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Verstek luitoon (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Stil"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Geen"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Luitone"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Onbekende luitoon"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index f846ffd..643f959 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"ሳምንቶች"</string> <string name="year" msgid="4001118221013892076">"ዓመት"</string> <string name="years" msgid="6881577717993213522">"ዓመታት"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 ሰከንድ"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> ሰከንዶች"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 ደቂቃ"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> ደቂቃዎች"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 ሰዓት"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ሰዓታት"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"የቪዲዮ ችግር"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"ይቅርታ፣ ይህ ቪዲዮ በዚህ መሣሪያ ለመልቀቅ ትክክል አይደለም።"</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"ይሄን ቪዲዮ ማጫወት አልተቻለም።"</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"የማሳወቂያ ክፍልፍል"</string> <string name="ringtone_default" msgid="3789758980357696936">"ነባሪ የስልክ ላይ ጥሪ"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>) ነባሪ የስልክ ላይ ጥሪ"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"ፀጥታ"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"ምንም"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"ጥሪ ድምፆች"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"ያልታወቀ የስልክ ጥሪ ድምፅ"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index a7c0c50..c41e706 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"أسابيع"</string> <string name="year" msgid="4001118221013892076">"سنة"</string> <string name="years" msgid="6881577717993213522">"أعوام"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"ثانية واحدة"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> من الثواني"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"دقيقة واحدة"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> من الدقائق"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"ساعة واحدة"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> من الساعات"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"مشكلة في الفيديو"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"عذرًا، هذا الفيديو غير صالح للبث على هذا الجهاز."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"لا يمكنك تشغيل هذا الفيديو."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"مستوى صوت الإشعار"</string> <string name="ringtone_default" msgid="3789758980357696936">"نغمة الرنين الافتراضية"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"نغمة الرنين الافتراضية (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"صامت"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"لا شيء"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"نغمات الرنين"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"نغمة رنين غير معروفة"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 6ae68f9..6d03273 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"тыд."</string> <string name="year" msgid="4001118221013892076">"год"</string> <string name="years" msgid="6881577717993213522">"г."</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 секунда"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> с"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 хвіліна"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> хв."</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 гадзіна"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> гадз."</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Праблема з відэа"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Відэа не падыходзіць для патокавай перадачы на гэту прыладу."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Немагчыма прайграць гэта відэа."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Гучнасць апавяшчэнняў"</string> <string name="ringtone_default" msgid="3789758980357696936">"Рынгтон па змаўчаннi"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Рынгтон па змаўчаннi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Ціхі рэжым"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Няма"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Рынгтоны"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Невядомы рынгтон"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 838f0cf..ca9311b 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"седмици"</string> <string name="year" msgid="4001118221013892076">"година"</string> <string name="years" msgid="6881577717993213522">"години"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 секунда"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> секунди"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 минута"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> минути"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 час"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> часа"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Проблем с видеоклипа"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Този видеоклип не е валиден за поточно предаване към това устройство."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Този видеоклип не може да се пусне."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Сила на звука при известие"</string> <string name="ringtone_default" msgid="3789758980357696936">"Стандартна мелодия"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Стандартна мелодия (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Тишина"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Без"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Мелодии"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Неизвестна мелодия"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index fdc9506..2a6a333 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"setmanes"</string> <string name="year" msgid="4001118221013892076">"any"</string> <string name="years" msgid="6881577717993213522">"anys"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 segon"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> segons"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minut"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minuts"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 hora"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> hores"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problema amb el vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Aquest vídeo no és vàlid per a la reproducció en aquest dispositiu."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"No es pot reproduir aquest vídeo."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volum de notificació"</string> <string name="ringtone_default" msgid="3789758980357696936">"To predeterminat"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"To predeterminat (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silenci"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Cap"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Sons de trucada"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"To desconegut"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index b714088..f361a42 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"týd."</string> <string name="year" msgid="4001118221013892076">"rokem"</string> <string name="years" msgid="6881577717993213522">"lety"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 sekunda"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> s"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuta"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> min"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 hodina"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> h"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Potíže s videem"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Toto video nelze přenášet datovým proudem do tohoto zařízení."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Toto video nelze přehrát."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Hlasitost oznámení"</string> <string name="ringtone_default" msgid="3789758980357696936">"Výchozí vyzváněcí tón"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Výchozí vyzváněcí tón (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Ticho"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Žádné"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Vyzváněcí tóny"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Neznámý vyzváněcí tón"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index b0fcf8b..e974576 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"uger"</string> <string name="year" msgid="4001118221013892076">"år"</string> <string name="years" msgid="6881577717993213522">"år"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"Ét sekund"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> sekunder"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"Ét minut"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutter"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"Én time"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> timer"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Videoproblem"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Denne video kan ikke streames på denne enhed."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Videoen kan ikke afspilles."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Lydstyrke for meddelelser"</string> <string name="ringtone_default" msgid="3789758980357696936">"Standardringetone"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standardringetone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Lydløs"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Ingen"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringetoner"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Ukendt ringetone"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index a32bbe6..3547321 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -170,7 +170,7 @@ <string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Kostenpflichtige Aktionen"</string> <string name="permgrouplab_messages" msgid="7521249148445456662">"Ihre Nachrichten"</string> <string name="permgroupdesc_messages" msgid="7821999071003699236">"SMS, E-Mails und andere Nachrichten lesen und schreiben"</string> - <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Ihre persönlichen Informationen"</string> + <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Ihre personenbezogenen Daten"</string> <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Direkter Zugriff auf Informationen über Sie, die in Ihrer Kontaktkarte gespeichert sind"</string> <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Ihre sozialen Informationen"</string> <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Direkter Zugriff auf Informationen über Ihre Kontakte und sozialen Verbindungen"</string> @@ -241,7 +241,7 @@ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Ermöglicht der App, Notfall-Broadcasts zu empfangen und zu verarbeiten. Diese Berechtigung steht nur System-Apps zur Verfügung."</string> <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Cell Broadcast-Nachrichten lesen"</string> <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ermöglicht der App, von Ihrem Gerät empfangene Cell Broadcast-Nachrichten zu lesen. Cell Broadcast-Benachrichtigungen werden an einigen Standorten gesendet, um Sie über Notfallsituationen zu informieren. Schädliche Apps können die Leistung oder den Betrieb Ihres Geräts beeinträchtigen, wenn eine Cell Broadcast-Notfallbenachrichtigung eingeht."</string> - <string name="permlab_sendSms" msgid="5600830612147671529">"Kurznachrichten senden"</string> + <string name="permlab_sendSms" msgid="5600830612147671529">"SMS senden"</string> <string name="permdesc_sendSms" msgid="7094729298204937667">"Ermöglicht der App, SMS zu senden. Dies kann zu unerwarteten Kosten führen. Schädliche Apps können Kosten verursachen, indem sie Nachrichten ohne Ihre Bestätigung senden."</string> <string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"SMS ohne Bestätigung senden"</string> <string name="permdesc_sendSmsNoConfirmation" msgid="402569800862935907">"Ermöglicht der App, SMS zu senden. Dies kann zu unerwarteten Kosten führen. Schädliche Apps können Kosten verursachen, indem sie Nachrichten ohne Ihre Bestätigung senden."</string> @@ -253,7 +253,7 @@ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Ermöglicht der App, auf Ihrem Telefon oder Ihrer SIM-Karte gespeicherte SMS zu bearbeiten. Schädliche Apps können so Ihre Nachrichten löschen."</string> <string name="permlab_receiveWapPush" msgid="5991398711936590410">"Textnachrichten (WAP) empfangen"</string> <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Ermöglicht der App, WAP-Nachrichten zu empfangen und zu verarbeiten. Mit der Berechtigung können Nachrichten, die an Sie gesendet wurden, überwacht und gelöscht werden, bevor sie Ihnen angezeigt werden."</string> - <string name="permlab_getTasks" msgid="6466095396623933906">"aktive Apps abrufen"</string> + <string name="permlab_getTasks" msgid="6466095396623933906">"Aktive Apps abrufen"</string> <string name="permdesc_getTasks" msgid="7454215995847658102">"Ermöglicht der App, Informationen zu aktuellen und kürzlich ausgeführten Aufgaben abzurufen. Damit kann die App möglicherweise ermitteln, welche Apps auf Ihrem Gerät zum Einsatz kommen."</string> <string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"Nutzerübergreifend interagieren"</string> <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Ermöglicht der App, auf dem Gerät nutzerübergreifend Aktionen durchzuführen. Schädliche Apps können so den zwischen den Nutzern bestehenden Schutz aufheben."</string> @@ -295,7 +295,7 @@ <string name="permdesc_filter_events" msgid="8006236315888347680">"Ermöglicht einer App, einen Eingabefilter zu registrieren, der den Stream aller Nutzerereignisse vor ihrem Versand filtert. Eine schädliche App kann die System-UI ohne Eingriff des Nutzers kontrollieren."</string> <string name="permlab_magnify_display" msgid="5973626738170618775">"Anzeige vergrößern"</string> <string name="permdesc_magnify_display" msgid="7121235684515003792">"Erlaubt der App, den Inhalt einer Anzeige zu vergrößern. Schädliche Apps verändern eventuell die Ansicht, sodass Inhalte nicht richtig angezeigt werden."</string> - <string name="permlab_shutdown" msgid="7185747824038909016">"partielles Herunterfahren"</string> + <string name="permlab_shutdown" msgid="7185747824038909016">"Partielles Herunterfahren"</string> <string name="permdesc_shutdown" msgid="7046500838746291775">"Versetzt den Aktivitätsmanager in einen heruntergefahrenen Zustand. Führt kein vollständiges Herunterfahren aus."</string> <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"App-Wechsel verhindern"</string> <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Hindert den Nutzer daran, zu einer anderen App zu wechseln"</string> @@ -303,9 +303,9 @@ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Ermöglicht der App, den Start von Systemaktivitäten zu überwachen und zu steuern. Schädliche Apps können so das gesamte System beeinträchtigen. Diese Berechtigung wird nur zu Entwicklungszwecken und nie für die normale Nutzung benötigt."</string> <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"Broadcast ohne Paket senden"</string> <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Ermöglicht der App, eine Benachrichtigung zu senden, dass ein App-Paket entfernt wurde. Schädliche Apps können so eine andere aktive App beenden."</string> - <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"per SMS empfangenen Broadcast senden"</string> + <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"Per SMS empfangenen Broadcast senden"</string> <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Ermöglicht der App, eine Benachrichtigung zu senden, dass eine SMS empfangen wurde. Schädliche Apps können so eingehende SMS fälschen."</string> - <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"von WAP-PUSH empfangenen Broadcast senden"</string> + <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"Von WAP-PUSH empfangenen Broadcast senden"</string> <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Ermöglicht der App, eine Benachrichtigung zu senden, dass eine WAP PUSH-Nachricht empfangen wurde. Schädliche Apps können so den Empfang von MMS vortäuschen oder unbemerkt den Inhalt einer beliebigen Webseite durch schädliche Inhalte ersetzen."</string> <string name="permlab_setProcessLimit" msgid="2451873664363662666">"Anzahl der laufenden Prozesse beschränken"</string> <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Ermöglicht der App, die maximale Anzahl an aktiven Prozessen zu steuern. Wird nie für normale Apps benötigt."</string> @@ -319,7 +319,7 @@ <string name="permdesc_backup" msgid="6912230525140589891">"Ermöglicht der App, den Sicherungs- und Wiederherstellungsmechanismus des Systems zu steuern. Nicht für normale Apps vorgesehen."</string> <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"Vollständige Sicherung oder Wiederherstellung bestätigen"</string> <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Ermöglicht der App, die Benutzeroberfläche zur Bestätigung der vollständigen Sicherung zu starten. Kann nicht von jeder App verwendet werden."</string> - <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"nicht autorisierte Fenster anzeigen"</string> + <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"Nicht autorisierte Fenster anzeigen"</string> <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Ermöglicht der App die Erstellung von Fenstern, die von der Benutzeroberfläche des internen Systems verwendet werden. Nicht für normale Apps vorgesehen."</string> <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"Über andere Apps ziehen"</string> <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Ermöglicht der App, über andere Apps oder Teile der Benutzeroberfläche zu zeichnen. Dies kann sich auf die Oberfläche in jeder App auswirken oder die erwartete Darstellung in anderen Apps verändern."</string> @@ -375,8 +375,8 @@ <string name="permlab_movePackage" msgid="3289890271645921411">"App-Ressourcen verschieben"</string> <string name="permdesc_movePackage" msgid="319562217778244524">"Ermöglicht der App, App-Ressourcen von internen auf externe Medien zu verschieben und umgekehrt"</string> <string name="permlab_readLogs" msgid="6615778543198967614">"Vertrauliche Protokolldaten lesen"</string> - <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Ermöglicht der App, die verschiedenen Protokolldateien des Systems zu lesen. So können allgemeine Informationen zu den auf Ihrem Tablet durchgeführten Aktionen eingesehen werden, darunter auch persönliche oder geheime Daten."</string> - <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Ermöglicht der App, die verschiedenen Protokolldateien des Systems zu lesen. So können allgemeine Informationen zu den auf Ihrem Telefon durchgeführten Aktionen eingesehen werden, darunter auch persönliche oder geheime Daten."</string> + <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Ermöglicht der App, die verschiedenen Protokolldateien des Systems zu lesen. So können allgemeine Informationen zu den auf Ihrem Tablet durchgeführten Aktionen eingesehen werden, darunter auch personenbezogene oder vertrauliche Daten."</string> + <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Ermöglicht der App, die verschiedenen Protokolldateien des Systems zu lesen. So können allgemeine Informationen zu den auf Ihrem Telefon durchgeführten Aktionen eingesehen werden, darunter auch personenbezogene oder vertrauliche Daten."</string> <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"Für Wiedergabe beliebigen Mediendecodierer verwenden"</string> <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Ermöglicht der App, alle installierten Mediendecodierer zur Wiedergabe zu verwenden."</string> <string name="permlab_diagnostic" msgid="8076743953908000342">"Lese-/Schreibberechtigung für zu Diagnosegruppe gehörige Elemente"</string> @@ -397,7 +397,7 @@ <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"Beim Start ausführen"</string> <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Ermöglicht der App, sich selbst zu starten, sobald das System gebootet wurde. Dadurch kann es länger dauern, bis das Tablet gestartet wird, und durch die ständige Aktivität der App wird die gesamte Leistung des Tablets beeinträchtigt."</string> <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Ermöglicht der App, sich selbst zu starten, sobald das System gebootet wurde. Dadurch kann es länger dauern, bis das Telefon gestartet wird, und durch die ständige Aktivität der App wird die gesamte Leistung des Telefons beeinträchtigt."</string> - <string name="permlab_broadcastSticky" msgid="7919126372606881614">"dauerhaften Broadcast senden"</string> + <string name="permlab_broadcastSticky" msgid="7919126372606881614">"Dauerhaften Broadcast senden"</string> <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Ermöglicht der App, weiluerhafte Broadcasts zu senden, die auch nach Ende des Broadcasts bestehen bleiben. Ein zu intensiver Einsatz kann das Tablet langsam oder instabil machen, weil zu viel Arbeitsspeicher belegt wird."</string> <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Ermöglicht der App, weiluerhafte Broadcasts zu senden, die auch nach Ende des Broadcasts bestehen bleiben. Ein zu intensiver Einsatz kann das Telefon langsam oder instabil machen, weil zu viel Arbeitsspeicher belegt wird."</string> <string name="permlab_readContacts" msgid="8348481131899886131">"Kontakte lesen"</string> @@ -406,16 +406,16 @@ <string name="permlab_writeContacts" msgid="5107492086416793544">"Meine Kontakte ändern"</string> <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Ermöglicht der App, Daten zu Kontakten, die auf Ihrem Tablet gespeichert sind, zu ändern, einschließlich der Häufigkeit, mit der Sie bestimmte Kontakte angerufen, diesen E-Mails gesendet oder anderweitig mit ihnen kommuniziert haben. Die Berechtigung erlaubt Apps, Kontaktdaten zu löschen."</string> <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Ermöglicht der App, Daten zu Kontakten, die auf Ihrem Telefon gespeichert sind, zu ändern, einschließlich der Häufigkeit, mit der Sie bestimmte Kontakte angerufen, diesen E-Mails gesendet oder anderweitig mit ihnen kommuniziert haben. Die Berechtigung erlaubt Apps, Kontaktdaten zu löschen."</string> - <string name="permlab_readCallLog" msgid="3478133184624102739">"Anrufprotokoll lesen"</string> + <string name="permlab_readCallLog" msgid="3478133184624102739">"Anrufliste lesen"</string> <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Ermöglicht der App, die Anrufliste Ihres Tablets zu lesen, einschließlich der Daten über ein- und ausgehende Anrufe. Die Berechtigung erlaubt Apps, Ihre Anruflistendaten zu speichern, und schädliche Apps können diese Daten ohne Ihr Wissen weiterleiten."</string> <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Ermöglicht der App, die Anrufliste Ihres Telefons zu lesen, einschließlich der Daten über ein- und ausgehende Anrufe. Die Berechtigung erlaubt Apps, Ihre Anruflistendaten zu speichern, und schädliche Apps können diese Daten ohne Ihr Wissen weiterleiten."</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"Anrufprotokoll bearbeiten"</string> <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Ermöglicht der App, das Anrufprotokoll Ihres Tablets zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so Ihr Anrufprotokoll löschen oder ändern."</string> <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Ermöglicht der App, das Anrufprotokoll Ihres Telefons zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so Ihr Anrufprotokoll löschen oder ändern."</string> <string name="permlab_readProfile" msgid="4701889852612716678">"Meine Kontaktkarten lesen"</string> - <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Ermöglicht der App, auf Ihrem Gerät gespeicherte persönliche Profildaten zu lesen, einschließlich Ihres Namens und Ihrer Kontaktdaten. Die App kann Sie somit identifizieren und Ihre Profildaten an andere senden."</string> + <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Ermöglicht der App, auf Ihrem Gerät gespeicherte personenbezogene Profildaten zu lesen, einschließlich Ihres Namens und Ihrer Kontaktdaten. Die App kann Sie somit identifizieren und Ihre Profildaten an andere senden."</string> <string name="permlab_writeProfile" msgid="907793628777397643">"Meine Kontaktkarten ändern"</string> - <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Ermöglicht der App, auf Ihrem Gerät gespeicherte persönliche Profildaten zu ändern, einschließlich Ihres Namens und Ihrer Kontaktdaten, sowie Daten hinzuzufügen. Die App kann Sie so identifizieren und Ihre Profildaten an andere senden."</string> + <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Ermöglicht der App, auf Ihrem Gerät gespeicherte personenbezogene Profildaten zu ändern, einschließlich Ihres Namens und Ihrer Kontaktdaten, sowie Daten hinzuzufügen. Die App kann Sie so identifizieren und Ihre Profildaten an andere senden."</string> <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"In sozialem Stream lesen"</string> <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Ermöglicht der App, auf Updates aus sozialen Netzwerken von Ihnen und Ihren Freunden zuzugreifen und diese zu synchronisieren. Seien Sie vorsichtig, wenn Sie Informationen teilen: Der App wird erlaubt, die Kommunikation zwischen Ihnen und Ihren Freunden in sozialen Netzwerken zu lesen, unabhängig von der Vertraulichkeit der kommunizierten Informationen. Hinweis: Diese Berechtigung kann möglicherweise nicht in allen sozialen Netzwerken erzwungen werden."</string> <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"In sozialem Stream schreiben"</string> @@ -432,9 +432,9 @@ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Ermöglicht der App, auf zusätzliche Standortanbieterbefehle zuzugreifen. Damit könnte die App die Funktionsweise von GPS oder anderen Standortquellen beeinträchtigen."</string> <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Berechtigung zur Installation eines Standortanbieters"</string> <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Erstellen von simulierten Standortquellen für Testzwecke oder Installation eines neuen Standortanbieters. Damit kann die App den von anderen Standortquellen wie GPS oder Standortanbietern zurückgegebenen Standort und/oder Status überschreiben."</string> - <string name="permlab_accessFineLocation" msgid="1191898061965273372">"genauer Standort (GPS- und netzwerkbasiert)"</string> + <string name="permlab_accessFineLocation" msgid="1191898061965273372">"Genauer Standort (GPS- und netzwerkbasiert)"</string> <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Ermöglicht der App, Ihre genaue Position anhand von GPS-Daten (Global Positioning System) oder über Netzwerkstandortquellen wie Sendemasten oder WLAN zu ermitteln. Diese Standortdienste müssen auf Ihrem Gerät verfügbar und aktiviert sein, damit die App sie verwenden kann. Apps können Ihren Standort anhand dieser Daten ermitteln und verbrauchen eventuell zusätzliche Akkuleistung."</string> - <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"ungefährer Standort (netzwerkbasiert)"</string> + <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"Ungefährer Standort (netzwerkbasiert)"</string> <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Ermöglicht der App, Ihren ungefähren Standort zu ermitteln. Diese Standortangabe stammt von Standortdiensten, die Netzwerkstandortquellen wie etwa Sendemasten oder WLAN verwenden. Diese Standortdienste müssen auf Ihrem Gerät verfügbar und aktiviert sein, damit die App sie verwenden kann. Apps können Ihren ungefähren Standort anhand dieser Daten ermitteln."</string> <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"Auf SurfaceFlinger zugreifen"</string> <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Ermöglicht der App, die systemnahen SurfaceFlinger-Funktionen zu verwenden"</string> @@ -496,7 +496,7 @@ <string name="permlab_checkinProperties" msgid="7855259461268734914">"Auf Check-in-Eigenschaften zugreifen"</string> <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Ermöglicht der App Schreib-/Lesezugriff auf vom Check-in-Service hochgeladene Elemente. Nicht für normale Apps vorgesehen."</string> <string name="permlab_bindGadget" msgid="776905339015863471">"Widgets auswählen"</string> - <string name="permdesc_bindGadget" msgid="8261326938599049290">"Ermöglicht der App, dem System zu melden, welche Widgets von welcher App verwendet werden können. Mit dieser Berechtigung können Apps anderen Apps Zugriff auf persönliche Daten gewähren. Nicht für normale Apps vorgesehen."</string> + <string name="permdesc_bindGadget" msgid="8261326938599049290">"Ermöglicht der App, dem System zu melden, welche Widgets von welcher App verwendet werden können. Mit dieser Berechtigung können Apps anderen Apps Zugriff auf personenbezogene Daten gewähren. Nicht für normale Apps vorgesehen."</string> <string name="permlab_modifyPhoneState" msgid="8423923777659292228">"Telefonstatus ändern"</string> <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Ermöglicht der App, die Telefonfunktionen des Geräts zu steuern. Eine App mit dieser Berechtigung kann das Netzwerk wechseln oder das Radio des Telefons ein- und ausschalten, ohne Sie darüber zu informieren."</string> <string name="permlab_readPhoneState" msgid="9178228524507610486">"Telefonstatus und Identität abrufen"</string> @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"Wochen"</string> <string name="year" msgid="4001118221013892076">"Jahr"</string> <string name="years" msgid="6881577717993213522">"Jahre"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 Sekunde"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> Sekunden"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 Minute"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> Minuten"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 Stunde"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> Stunden"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Videoprobleme"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Dieses Video ist nicht für Streaming auf diesem Gerät gültig."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Video kann nicht wiedergegeben werden."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Benachrichtigungslautstärke"</string> <string name="ringtone_default" msgid="3789758980357696936">"Standard-Klingelton"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standard-Klingelton (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Lautlos"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Keine"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Klingeltöne"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Unbekannter Klingelton"</string> <plurals name="wifi_available"> @@ -1114,7 +1126,7 @@ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string> <string name="wifi_p2p_frequency_conflict_message" msgid="7363907213787469151">"Das Telefon wird vorübergehend vom WLAN getrennt, während eine Verbindung mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> hergestellt wird."</string> <string name="select_character" msgid="3365550120617701745">"Zeichen einfügen"</string> - <string name="sms_control_title" msgid="7296612781128917719">"Kurznachrichten werden gesendet"</string> + <string name="sms_control_title" msgid="7296612781128917719">"SMS werden gesendet"</string> <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> sendet eine große Anzahl SMS. Möchten Sie zulassen, dass die App weiterhin Nachrichten sendet?"</string> <string name="sms_control_yes" msgid="3663725993855816807">"Zulassen"</string> <string name="sms_control_no" msgid="625438561395534982">"Nicht zulassen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 069c5d6..70c1550 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"εβδομάδες"</string> <string name="year" msgid="4001118221013892076">"έτος"</string> <string name="years" msgid="6881577717993213522">"έτη"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 δευτερόλεπτο"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 λεπτό"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> λεπτά"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 ώρα"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ώρες"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Πρόβλημα με το βίντεο"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Αυτό το βίντεο δεν είναι έγκυρο για ροή σε αυτή τη συσκευή."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Δεν μπορείτε να αναπαράγετε αυτό το βίντεο."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Ένταση ήχου ειδοποιήσεων"</string> <string name="ringtone_default" msgid="3789758980357696936">"Προεπιλεγμένος ήχος κλήσης"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Προεπιλεγμένος ήχος κλήσης (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Σίγαση"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Κανένας"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Ήχοι κλήσης"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Άγνωστος ήχος κλήσης"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 888e42e..c1c78e2 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"weeks"</string> <string name="year" msgid="4001118221013892076">"year"</string> <string name="years" msgid="6881577717993213522">"years"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 second"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> seconds"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minute"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutes"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 hour"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> hours"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Video problem"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"This video isn\'t valid for streaming to this device."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Can\'t play this video."</string> @@ -1082,7 +1094,8 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Notification volume"</string> <string name="ringtone_default" msgid="3789758980357696936">"Default ringtone"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Default ringtone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silent"</string> + <!-- no translation found for ringtone_silent (7937634392408977062) --> + <skip /> <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringtones"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Unknown ringtone"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 47d436d..cf1c9db 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"semanas"</string> <string name="year" msgid="4001118221013892076">"año"</string> <string name="years" msgid="6881577717993213522">"años"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 segundo"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> segundos"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuto"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutos"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 hora"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> horas"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problemas de video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"No es posible transmitir este video al dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"No se puede reproducir el video."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volumen de notificación"</string> <string name="ringtone_default" msgid="3789758980357696936">"Tono de llamada predeterminado"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Tono de llamada predeterminado (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silencioso"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Ninguno"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Tonos de llamada"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Tono de llamada desconocido"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index c129483..824b42a 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"semanas"</string> <string name="year" msgid="4001118221013892076">"año"</string> <string name="years" msgid="6881577717993213522">"años"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 segundo"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> segundos"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuto"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutos"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 hora"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> horas"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Incidencias con el vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Este vídeo no se puede transmitir al dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"No se puede reproducir el vídeo."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volumen de notificaciones"</string> <string name="ringtone_default" msgid="3789758980357696936">"Tono predeterminado"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Tono predeterminado (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silencio"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Ninguno"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Tonos"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Tono desconocido"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 5fb21d4..6e7b87c 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"nädalat"</string> <string name="year" msgid="4001118221013892076">"aasta"</string> <string name="years" msgid="6881577717993213522">"aastat"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 sekund"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> sekundit"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minut"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutit"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 tund"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> tundi"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Probleem videoga"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"See video ei sobi voogesituseks selles seadmes."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Videot ei saa esitada."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Teatise helitugevus"</string> <string name="ringtone_default" msgid="3789758980357696936">"Vaikehelin"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Vaikehelin (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Hääletu"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Puudub"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Helinad"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Tundmatu helin"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index d5e624d..51f1967 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"هفته"</string> <string name="year" msgid="4001118221013892076">"سال"</string> <string name="years" msgid="6881577717993213522">"سال"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"۱ ثانیه"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> ثانیه"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"۱ دقیقه"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> دقیقه"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"۱ ساعت"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ساعت"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"مشکل در ویدئو"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"متأسفیم، این ویدئو برای پخش جریانی با این دستگاه معتبر نیست."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"پخش این ویدئو ممکن نیست."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"میزان صدای اعلان"</string> <string name="ringtone_default" msgid="3789758980357696936">"آهنگ زنگ پیشفرض"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"آهنگ زنگ پیشفرض (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"ساکت"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"هیچکدام"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"آهنگهای زنگ"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"آهنگ زنگ ناشناس"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 2b08bea..8bbd645 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"viikkoa"</string> <string name="year" msgid="4001118221013892076">"vuosi"</string> <string name="years" msgid="6881577717993213522">"vuotta"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 sekunti"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> sekuntia"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuutti"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minuuttia"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 tunti"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> tuntia"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Video-ongelma"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Tätä videota ei voi suoratoistaa tällä laitteella."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Videota ei voida toistaa."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Ilmoituksen äänenvoimakkuus"</string> <string name="ringtone_default" msgid="3789758980357696936">"Oletussoittoääni"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Oletussoittoääni (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Äänetön"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Ei mitään"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Soittoäänet"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Tuntematon soittoääni"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 479fe18..550e09c 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"semaines"</string> <string name="year" msgid="4001118221013892076">"année"</string> <string name="years" msgid="6881577717993213522">"années"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 seconde"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> secondes"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minute"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutes"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 heure"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> heures"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problème vidéo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Impossible de lire cette vidéo en streaming sur cet appareil."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Impossible de lire la vidéo."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volume des notifications"</string> <string name="ringtone_default" msgid="3789758980357696936">"Sonnerie par défaut"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Sonnerie par défaut (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silencieux"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Aucune"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Sonneries"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Sonnerie inconnue"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 65aa563..11972fa 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"सप्ताह"</string> <string name="year" msgid="4001118221013892076">"वर्ष"</string> <string name="years" msgid="6881577717993213522">"वर्ष"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 सेकंड"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> सेकंड"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 मिनट"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> मिनट"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 घंटा"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> घंटे"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"वीडियो समस्याएं"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"यह वीडियो इस उपकरण पर स्ट्रीमिंग के लिए मान्य नहीं है."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"यह वीडियो नहीं चलाया जा सकता."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"सूचना वॉल्यूम"</string> <string name="ringtone_default" msgid="3789758980357696936">"डिफ़ॉल्ट रिंगटोन"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"डिफ़ॉल्ट रिंगटोन (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"मौन"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"कोई नहीं"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"रिंगटोन"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"अज्ञात रिंगटोन"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index e279216..c13dd42 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -59,7 +59,7 @@ <string name="BaMmi" msgid="455193067926770581">"Zabrana poziva"</string> <string name="PwdMmi" msgid="7043715687905254199">"Promjena zaporke"</string> <string name="PinMmi" msgid="3113117780361190304">"PIN je promijenjen"</string> - <string name="CnipMmi" msgid="3110534680557857162">"Pozivni je broj prisutan"</string> + <string name="CnipMmi" msgid="3110534680557857162">"Sadržan je pozivni broj"</string> <string name="CnirMmi" msgid="3062102121430548731">"Pozivni broj je ograničen"</string> <string name="ThreeWCMmi" msgid="9051047170321190368">"Trostrani poziv"</string> <string name="RuacMmi" msgid="7827887459138308886">"Odbijanje neželjenih i neugodnih poziva"</string> @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"tjedna"</string> <string name="year" msgid="4001118221013892076">"godina"</string> <string name="years" msgid="6881577717993213522">"godina"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 s"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> s"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 min"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> min"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 sat"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> h"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problem s videozapisom"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Ovaj videozapis nije valjan za streaming na ovaj uređaj."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Ovaj videozapis nije moguće reproducirati."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Glasnoća obavijesti"</string> <string name="ringtone_default" msgid="3789758980357696936">"Zadana melodija zvona"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Zadana melodija zvona (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Bešumno"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Nijedan"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Melodije zvona"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Nepoznata melodija zvona"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 88f4046..e1e7901 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"hét"</string> <string name="year" msgid="4001118221013892076">"év"</string> <string name="years" msgid="6881577717993213522">"év"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 másodperc"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> másodperc"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 perc"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> perc"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 óra"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> óra"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Videoprobléma"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Ezt a videót nem lehet megjeleníteni ezen az eszközön."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Nem lehet lejátszani ezt a videót."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Értesítés hangereje"</string> <string name="ringtone_default" msgid="3789758980357696936">"Alapértelmezett csengőhang"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Alapértelmezett csengőhang (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Néma"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Egyik sem"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Csengőhangok"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Ismeretlen csengőhang"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index b5dfcd5..d6a16ca 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -417,9 +417,9 @@ <string name="permlab_writeProfile" msgid="907793628777397643">"ubah kartu kontak Anda"</string> <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Memungkinkan aplikasi mengubah atau menambah informasi profil pribadi yang tersimpan di perangkat Anda, seperti nama dan informasi kontak. Ini berarti aplikasi tersebut dapat mengenali Anda dan mengirim informasi profil Anda ke orang lain."</string> <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"membaca aliran sosial Anda"</string> - <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Memungkinkan aplikasi mengakses dan menyinkronkan pembaruan sosial dari Anda dan teman. Hati-hati ketika berbagi informasi -- izin ini memungkinkan aplikasi membaca komunikasi antara Anda dan teman di jaringan sosial, terlepas dari kerahasiaan. Catatan: izin ini tidak dapat diberlakukan di semua jaringan sosial."</string> + <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Memungkinkan aplikasi mengakses dan menyinkronkan pembaruan sosial dari Anda dan teman. Hati-hati ketika berbagi informasi -- izin ini memungkinkan aplikasi membaca komunikasi antara Anda dan teman di jejaring sosial, terlepas dari kerahasiaan. Catatan: izin ini tidak dapat diberlakukan di semua jejaring sosial."</string> <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"menulis ke aliran sosial Anda"</string> - <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Memungkinkan aplikasi menampilkan pembaruan sosial dari teman Anda. Berhati-hatilah saat berbagi informasi -- izin ini memungkinkan aplikasi menghasilkan pesan yang mungkin kelihatannya berasal dari seorang teman. Catatan: izin ini tidak dapat diberlakukan di semua jaringan sosial."</string> + <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Memungkinkan aplikasi menampilkan pembaruan sosial dari teman Anda. Berhati-hatilah saat berbagi informasi -- izin ini memungkinkan aplikasi menghasilkan pesan yang mungkin kelihatannya berasal dari seorang teman. Catatan: izin ini tidak dapat diberlakukan di semua jejaring sosial."</string> <string name="permlab_readCalendar" msgid="5972727560257612398">"baca acara kalender serta informasi rahasia"</string> <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Memungkinkan aplikasi membaca semua acara kalender yang tersimpan di tablet Anda, termasuk milik teman atau rekan kerja. Izin ini memungkinkan aplikasi berbagi atau menyimpan data kalender Anda, terlepas dari kerahasiaan atau sensitivitas."</string> <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Memungkinkan aplikasi membaca semua acara kalender yang tersimpan di ponsel Anda, termasuk milik teman atau rekan kerja. Izin ini memungkinkan aplikasi berbagi atau menyimpan data kalender Anda, terlepas dari kerahasiaan atau sensitivitas."</string> @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"minggu"</string> <string name="year" msgid="4001118221013892076">"tahun"</string> <string name="years" msgid="6881577717993213522">"tahun"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 detik"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> detik"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 menit"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> menit"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 jam"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> jam"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Masalah video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Video ini tidak valid untuk pengaliran ke perangkat ini."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Tidak dapat memutar video ini."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volume pemberitahuan"</string> <string name="ringtone_default" msgid="3789758980357696936">"Nada dering default"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Nada dering default (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Senyap"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Tidak Ada"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Nada dering"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Nada dering tidak dikenal"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 0edb0c1..2257daa 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"settimane"</string> <string name="year" msgid="4001118221013892076">"anno"</string> <string name="years" msgid="6881577717993213522">"anni"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 secondo"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> secondi"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuto"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minuti"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 ora"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ore"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problemi video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Questo video non è valido per lo streaming su questo dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Impossibile riprodurre il video."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volume notifiche"</string> <string name="ringtone_default" msgid="3789758980357696936">"Suoneria predefinita"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Suoneria predefinita (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silenzioso"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Nessuna"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Suonerie"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Suoneria sconosciuta"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index bb6a3ac..ce51ef4 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"שבועות"</string> <string name="year" msgid="4001118221013892076">"שנה"</string> <string name="years" msgid="6881577717993213522">"שנים"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"שנייה אחת"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> שניות"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"דקה אחת"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> דקות"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"שעה אחת"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> שעות"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"בעיה בווידאו"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"סרטון זה אינו חוקי להעברה כמדיה זורמת למכשיר זה."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"לא ניתן להפעיל סרטון זה."</string> @@ -1034,7 +1046,7 @@ <string name="chooseUsbActivity" msgid="6894748416073583509">"בחר יישום עבור התקן ה-USB"</string> <string name="noApplications" msgid="2991814273936504689">"אין יישומים שיכולים לבצע פעולה זו."</string> <string name="aerr_title" msgid="1905800560317137752"></string> - <string name="aerr_application" msgid="932628488013092776">"לצערנו, פעולת ה<xliff:g id="APPLICATION">%1$s</xliff:g> הופסקה."</string> + <string name="aerr_application" msgid="932628488013092776">"לצערנו, פעולת <xliff:g id="APPLICATION">%1$s</xliff:g> הופסקה."</string> <string name="aerr_process" msgid="4507058997035697579">"לצערנו, התהליך <xliff:g id="PROCESS">%1$s</xliff:g> הופסק."</string> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> אינו מגיב."\n\n"תרצה לסגור אותו?"</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"עוצמת קול של התראות"</string> <string name="ringtone_default" msgid="3789758980357696936">"רינגטון ברירת מחדל"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"רינגטון ברירת מחדל (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"שקט"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"ללא"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"רינגטונים"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"רינגטון לא ידוע"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 8af0fed..f2ca7c6 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"週間"</string> <string name="year" msgid="4001118221013892076">"年"</string> <string name="years" msgid="6881577717993213522">"年"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1秒"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g>秒"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1分"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g>分"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1時間"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g>時間"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"動画の問題"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"この動画はこの端末にストリーミングできません。"</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"この動画を再生できません。"</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"通知音量"</string> <string name="ringtone_default" msgid="3789758980357696936">"プリセット着信音"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"端末の基本着信音(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"サイレント"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"なし"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"着信音"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"不明な着信音"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 37c6b01..3e17643 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -570,9 +570,9 @@ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"화면 잠금 사용 중지"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"앱이 키 잠금 및 관련 비밀번호 보안을 사용중지할 수 있도록 허용합니다. 예를 들어, 휴대전화가 수신전화를 받을 때 키 잠금을 사용중지했다가 통화가 끝나면 키 잠금을 다시 사용할 수 있습니다."</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"동기화 설정 읽기"</string> - <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"앱이 계정의 동기화 설정을 읽을 수 있도록 허용합니다. 예를 들어, 계정에서 피플 앱을 동기화할지 여부를 확인할 수 있습니다."</string> + <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"앱이 계정의 동기화 설정을 읽을 수 있도록 허용합니다. 예를 들어, 계정에서 주소록 앱을 동기화할지 여부를 확인할 수 있습니다."</string> <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"동기화 사용 및 사용 중지 전환"</string> - <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"앱이 계정의 동기화 설정을 수정할 수 있도록 허용합니다. 예를 들어, 계정에서 피플 앱을 동기화할 목적으로 앱이 사용될 수 있습니다."</string> + <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"앱이 계정의 동기화 설정을 수정할 수 있도록 허용합니다. 예를 들어, 계정에서 주소록 앱을 동기화할 목적으로 앱이 사용될 수 있습니다."</string> <string name="permlab_readSyncStats" msgid="7396577451360202448">"동기화 통계 읽기"</string> <string name="permdesc_readSyncStats" msgid="1510143761757606156">"앱이 동기화된 일정의 기록이나 동기화된 데이터의 양 등을 포함하여 계정의 동기화 통계를 읽을 수 있도록 허용합니다."</string> <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"가입된 피드 읽기"</string> @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"주"</string> <string name="year" msgid="4001118221013892076">"년"</string> <string name="years" msgid="6881577717993213522">"년"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1초"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g>초"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1분"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g>분"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1시간"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g>시간"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"영상 문제"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"이 기기로 스트리밍하기에 적합하지 않은 동영상입니다."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"동영상을 재생할 수 없습니다."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"알림 볼륨"</string> <string name="ringtone_default" msgid="3789758980357696936">"기본 벨소리"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"기본 벨소리(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"무음"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"없음"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"벨소리"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"알 수 없는 벨소리"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index f2ad504..43ea17d 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"sav."</string> <string name="year" msgid="4001118221013892076">"metai"</string> <string name="years" msgid="6881577717993213522">"metai"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 sek."</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> sek."</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 min."</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> min."</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 val."</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> val."</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Vaizdo įrašo problema"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Šis vaizdo įrašas netinkamas srautiniu būdu perduoti į šį įrenginį."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Negalima paleisti šio vaizdo įrašo."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Pranešimo apimtis"</string> <string name="ringtone_default" msgid="3789758980357696936">"Numatytasis skambėjimo tonas"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Numatytasis skambėjimo tonas (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Tylus"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Nėra"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Skambėjimo tonai"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Nežinomas skambėjimo tonas"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index ee0b023..d563a05 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"nedēļas"</string> <string name="year" msgid="4001118221013892076">"gads"</string> <string name="years" msgid="6881577717993213522">"gadi"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 s"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> s"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 min"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> min"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 h"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> h"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Video problēma"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Šis video nav derīgs straumēšanai uz šo ierīci."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Nevar atskaņot šo video."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Paziņojumu skaļums"</string> <string name="ringtone_default" msgid="3789758980357696936">"Noklusējuma zvana signāls"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Noklusējuma zvana signāls (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Klusums"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Nav"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Zvana signāli"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Nezināms zvana signāls"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-mcc286/config.xml b/core/res/res/values-mcc286/config.xml new file mode 100755 index 0000000..d99d051 --- /dev/null +++ b/core/res/res/values-mcc286/config.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2012, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. DO NOT TRANSLATE. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- National Language Identifier codes for the following two config items. + (from 3GPP TS 23.038 V9.1.1 Table 6.2.1.2.4.1): + 0 - reserved + 1 - Turkish + 2 - Spanish (single shift table only) + 3 - Portuguese + 4 - Bengali + 5 - Gujarati + 6 - Hindi + 7 - Kannada + 8 - Malayalam + 9 - Oriya + 10 - Punjabi + 11 - Tamil + 12 - Telugu + 13 - Urdu + 14+ - reserved --> + + <!-- National language single shift tables to enable for SMS encoding. + Decoding is always enabled. 3GPP TS 23.038 states that this feature + should not be enabled until a formal request is issued by the relevant + national regulatory body. Array elements are codes from the table above. + Example 1: devices sold in Turkey must include table 1 to conform with + By-Law Number 27230. (http://www.btk.gov.tr/eng/pdf/2009/BY-LAW_SMS.pdf) + Example 2: devices sold in India should include tables 4 through 13 + to enable use of the new Release 9 tables for Indic languages. --> + <integer-array name="config_sms_enabled_single_shift_tables"><item>1</item></integer-array> + + <!-- National language locking shift tables to enable for SMS encoding. + Decoding is always enabled. 3GPP TS 23.038 states that this feature + should not be enabled until a formal request is issued by the relevant + national regulatory body. Array elements are codes from the table above. + Example 1: devices sold in Turkey must include table 1 after the + Turkish Telecommunication Authority requires locking shift encoding + to be enabled (est. July 2012). (http://www.btk.gov.tr/eng/pdf/2009/BY-LAW_SMS.pdf) + See also: http://www.mobitech.com.tr/tr/ersanozturkblog_en/index.php?entry=entry090223-160014 + Example 2: devices sold in India should include tables 4 through 13 + to enable use of the new Release 9 tables for Indic languages. --> + <!-- <integer-array name="config_sms_enabled_locking_shift_tables"></integer-array> --> + +</resources> diff --git a/core/res/res/values-mcc450/config.xml b/core/res/res/values-mcc450/config.xml new file mode 100644 index 0000000..2a2bd76 --- /dev/null +++ b/core/res/res/values-mcc450/config.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2012, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources> + + <!-- Whether camera shutter sound is forced or not (country specific). --> + <bool name="config_camera_sound_forced">true</bool> + +</resources> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index e89f70f..ead43f1 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"minggu"</string> <string name="year" msgid="4001118221013892076">"tahun"</string> <string name="years" msgid="6881577717993213522">"tahun"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 saat"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> saat"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minit"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minit"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 jam"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> jam"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Masalah video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Maaf, video ini tidak sah untuk penstriman ke peranti ini."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Tidak dapat mainkan video ini."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Kelantangan pemberitahuan"</string> <string name="ringtone_default" msgid="3789758980357696936">"Nada dering lalai"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Nada dering lalai (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Senyap"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Tiada"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Nada dering"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Nada dering tidak diketahui"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 42df589..b715c9f 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"uker"</string> <string name="year" msgid="4001118221013892076">"år"</string> <string name="years" msgid="6881577717993213522">"år"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"Ett sekund"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> sekunder"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"Ett minutt"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutter"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"Én time"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> timer"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Videoproblem"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Denne videoen er ikke gyldig for direkteavspilling på enheten."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Kan ikke spille av denne videoen."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Varslingsvolum"</string> <string name="ringtone_default" msgid="3789758980357696936">"Standard ringetone"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standard ringetone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Stille"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Ingen"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringetoner"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Ukjent ringetone"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 21fe1cc..0f0e3d9 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"weken"</string> <string name="year" msgid="4001118221013892076">"jaar"</string> <string name="years" msgid="6881577717993213522">"jaren"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 seconde"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> seconden"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuut"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minuten"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 uur"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> uur"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Probleem met video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Deze video kan niet worden gestreamd naar dit apparaat."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Deze video kan niet worden afgespeeld."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Meldingsvolume"</string> <string name="ringtone_default" msgid="3789758980357696936">"Standaardbeltoon"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standaardbeltoon (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Stil"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Geen"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Beltonen"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Onbekende beltoon"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d0f1db3..417ee78 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"tygodni"</string> <string name="year" msgid="4001118221013892076">"rok"</string> <string name="years" msgid="6881577717993213522">"lat"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 sekunda"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> s"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuta"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> min"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 godzina"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> godz."</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problem z filmem"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Ten film nie nadaje się do strumieniowego przesyłania do tego urządzenia."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Nie można odtworzyć tego filmu."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Głośność powiadomień"</string> <string name="ringtone_default" msgid="3789758980357696936">"Dzwonek domyślny"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Dzwonek domyślny (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Cichy"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Brak"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Dzwonki"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Nieznany dzwonek"</string> <plurals name="wifi_available"> @@ -1351,7 +1363,7 @@ <string name="data_usage_limit_body" msgid="3317964706973601386">"Dotknij, aby włączyć."</string> <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Przekroczono limit danych 2G/3G"</string> <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Przekroczono limit danych 4G"</string> - <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Przekroczono limit danych komór."</string> + <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Przekroczenie limitu danych"</string> <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Przekroczono limit danych Wi-Fi"</string> <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ponad określony limit"</string> <string name="data_usage_restricted_title" msgid="5965157361036321914">"Dane w tle są ograniczone"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index fd7211e..ba97b8f 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -762,7 +762,7 @@ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Tentar novamente"</string> <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Excedido o n.º máximo de tentativas de Desbloqueio Através do Rosto"</string> <string name="lockscreen_plugged_in" msgid="8057762828355572315">"A carregar, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> - <string name="lockscreen_charged" msgid="321635745684060624">"Cobrado"</string> + <string name="lockscreen_charged" msgid="321635745684060624">"Carregado"</string> <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string> <string name="lockscreen_low_battery" msgid="1482873981919249740">"Ligue o carregador."</string> <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nenhum cartão SIM"</string> @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"semanas"</string> <string name="year" msgid="4001118221013892076">"ano"</string> <string name="years" msgid="6881577717993213522">"anos"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 segundo"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> segundos"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuto"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutos"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 hora"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> horas"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problema com o vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Este vídeo não é válido para transmissão em fluxo contínuo neste aparelho."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Não é possível reproduzir este vídeo."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volume de notificações"</string> <string name="ringtone_default" msgid="3789758980357696936">"Toque predefinido"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Toque predefinido (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silencioso"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Nada"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Toques"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Toque desconhecido"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index ed656fe..5dfbe05 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"semanas"</string> <string name="year" msgid="4001118221013892076">"ano"</string> <string name="years" msgid="6881577717993213522">"anos"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"Um segundo"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> segundos"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"Um minuto"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minutos"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"Uma hora"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> horas"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problema com o vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Este vídeo não é válido para transmissão neste dispositivo."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Não é possível reproduzir este vídeo."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volume da notificação"</string> <string name="ringtone_default" msgid="3789758980357696936">"Toque padrão"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Toque padrão (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silencioso"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Nenhum"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Toques"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Toque desconhecido"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index 0e7aaec..799b9a2 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -1558,6 +1558,12 @@ <string name="weeks" msgid="6509623834583944518">"emnas"</string> <string name="year" msgid="4001118221013892076">"onn"</string> <string name="years" msgid="6881577717993213522">"onns"</string> + <!-- no translation found for duration_seconds:one (6962015528372969481) --> + <!-- no translation found for duration_seconds:other (1886107766577166786) --> + <!-- no translation found for duration_minutes:one (4915414002546085617) --> + <!-- no translation found for duration_minutes:other (3165187169224908775) --> + <!-- no translation found for duration_hours:one (8917467491248809972) --> + <!-- no translation found for duration_hours:other (3863962854246773930) --> <!-- no translation found for VideoView_error_title (3534509135438353077) --> <skip /> <!-- no translation found for VideoView_error_text_invalid_progressive_playback (3186670335938670444) --> @@ -1693,7 +1699,8 @@ <skip /> <string name="ringtone_default" msgid="3789758980357696936">"Tun da scalin predefinì"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Tun da scalin predefinì (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silenzius"</string> + <!-- no translation found for ringtone_silent (7937634392408977062) --> + <skip /> <string name="ringtone_picker_title" msgid="3515143939175119094">"Tuns da scalin"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Tun da scalin nunenconuschent"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index f274acd..94f6263 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"săptămâni"</string> <string name="year" msgid="4001118221013892076">"an"</string> <string name="years" msgid="6881577717993213522">"ani"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"O secundă"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> (de) secunde"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"Un minut"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> (de) minute"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"O oră"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> (de) ore"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problemă video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Acest fişier video nu este valid pentru a fi transmis în flux către acest dispozitiv."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Nu puteţi reda acest videoclip"</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volum notificare"</string> <string name="ringtone_default" msgid="3789758980357696936">"Ton de apel prestabilit"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Ton de apel prestabilit (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Silenţios"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Niciunul"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Tonuri de apel"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Ton de apel necunoscut"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 2ccd436..9ff53cd 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"нед."</string> <string name="year" msgid="4001118221013892076">"г."</string> <string name="years" msgid="6881577717993213522">"г."</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 сек."</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> сек."</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 мин."</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> мин."</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 ч."</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ч."</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Ошибка"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Это видео не предназначено для потокового воспроизведения на данном устройстве."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Не удалось воспроизвести видео."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Громкость уведомлений"</string> <string name="ringtone_default" msgid="3789758980357696936">"Мелодия по умолчанию"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"По умолчанию (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Без звука"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Без звука"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Мелодии"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Неизвестная мелодия"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index c364380..8ea6632 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"týždne"</string> <string name="year" msgid="4001118221013892076">"rok"</string> <string name="years" msgid="6881577717993213522">"roky"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 s"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> s"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 min."</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> min."</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 hod."</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> hod."</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problém s videom"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Je nám ľúto, ale toto video sa nedá streamovať do tohto zariadenia."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Toto video nie je možné prehrať."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Hlasitosť upozornení"</string> <string name="ringtone_default" msgid="3789758980357696936">"Predvolený vyzváňací tón"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Predvolený vyzváňací tón (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Tichý"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Žiadny"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Vyzváňacie tóny"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Neznámy vyzváňací tón"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 7f94c20..e3802a5 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"tednov"</string> <string name="year" msgid="4001118221013892076">"leto"</string> <string name="years" msgid="6881577717993213522">"let"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 sekunda"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> s"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuta"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> min"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 ura"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> h"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Težava z videoposnetkom"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Ta videoposnetek ni veljaven za pretakanje v to napravo."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Tega videoposnetka ni mogoče predvajati."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Glasnost obvestila"</string> <string name="ringtone_default" msgid="3789758980357696936">"Privzeta melodija zvonjenja"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Privzeta melodija zvonjenja (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Tiho"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Brez"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Melodije zvonjenja"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Neznana melodija zvonjenja"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 5a94aad..36994fb 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"недеље(а)"</string> <string name="year" msgid="4001118221013892076">"година"</string> <string name="years" msgid="6881577717993213522">"годинe(а)"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 секунда"</item> + <item quantity="other" msgid="1886107766577166786">"Секунди: <xliff:g id="COUNT">%d</xliff:g>"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 минут"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> минута"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 сат"</item> + <item quantity="other" msgid="3863962854246773930">"Сати: <xliff:g id="COUNT">%d</xliff:g>"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Проблем са видео снимком"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Овај видео не може да се стримује на овом уређају."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Не можете да пустите овај видео."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Јачина звука обавештења"</string> <string name="ringtone_default" msgid="3789758980357696936">"Подразумевани звук звона"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Подразумевани звук звона (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Нечујно"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Без"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Звукови звона"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Непознати звук звона"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index c59491b..8058a8d 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"veckor"</string> <string name="year" msgid="4001118221013892076">"år"</string> <string name="years" msgid="6881577717993213522">"år"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 sekund"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> sekunder"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minut"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> minuter"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 timme"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> timmar"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Videoproblem"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Videon kan tyvärr inte spelas upp i den här enheten."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Det går inte att spela upp videon."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Meddelandevolym"</string> <string name="ringtone_default" msgid="3789758980357696936">"Standardringsignal"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standardringsignal (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Tyst"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Ingen"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringsignaler"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Okänd ringsignal"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 5fc2a13..2789146 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -492,7 +492,7 @@ <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"anzisha moja kwa moja usanidi wa simu ya CDMA"</string> <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Inaruhusu programu kuanza ugawaji wa CDMA. Programu hasidi zinaweza anza ugawaji wa CDMA usio wa lazima."</string> <string name="permlab_locationUpdates" msgid="7785408253364335740">"dhibiti arifa za usasishaji mahali"</string> - <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Inaruhusu programu kuwezesha/kulemeza arifa za usasishaji za eneo kutoka kwa redio. Si ya matumizi na programu za kawaida."</string> + <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Huruhusu kuwasha au kuzima arifa za masasisho ya mahali kutoka kwa redio. Sio ya kutumiwa kwenye programu za kawaida."</string> <string name="permlab_checkinProperties" msgid="7855259461268734914">"fikia mipangilio ya ukaguzi"</string> <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Inaruhusu kusoma/kuandika kwa programu kufikia mipangilio iliyopakiwa na huduma ya kuangalia. Si ya matumizi na programu za kawaida."</string> <string name="permlab_bindGadget" msgid="776905339015863471">"chagua wijeti"</string> @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"wiki"</string> <string name="year" msgid="4001118221013892076">"mwaka"</string> <string name="years" msgid="6881577717993213522">"miaka"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"Sekunde 1"</item> + <item quantity="other" msgid="1886107766577166786">"Sekunde <xliff:g id="COUNT">%d</xliff:g>"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"Dakika 1"</item> + <item quantity="other" msgid="3165187169224908775">"Dakika <xliff:g id="COUNT">%d</xliff:g>"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"Saa 1"</item> + <item quantity="other" msgid="3863962854246773930">"Saa <xliff:g id="COUNT">%d</xliff:g>"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Shida ya video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Video hii si halali kutiririshwa kwa kifaa hiki."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Haiwezi kucheza video hii."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Sauti ya arifa"</string> <string name="ringtone_default" msgid="3789758980357696936">"Toni mlio chaguo-msingi"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Toni mlio chaguo-msingi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Kimya"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Hamna"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Toni za mlio"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Mlio amabo haujulikani"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 0a86a86..38bf592 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"สัปดาห์"</string> <string name="year" msgid="4001118221013892076">"ปี"</string> <string name="years" msgid="6881577717993213522">" ปี"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 วินาที"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> วินาที"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 นาที"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> นาที"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 ชั่วโมง"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> ชั่วโมง"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"ปัญหาเกี่ยวกับวิดีโอ"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"วิดีโอนี้ไม่สามารถสตรีมไปยังอุปกรณ์นี้"</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"ไม่สามารถเล่นวิดีโอนี้"</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"ระดับเสียงของการแจ้งเตือน"</string> <string name="ringtone_default" msgid="3789758980357696936">"เสียงเรียกเข้าเริ่มต้น"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"เสียงเรียกเข้าเริ่มต้น (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"ปิดเสียง"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"ไม่มี"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"เสียงเรียกเข้า"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"ไม่ทราบเสียงเรียกเข้า"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 072f6df..e3260db 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"mga linggo"</string> <string name="year" msgid="4001118221013892076">"taon"</string> <string name="years" msgid="6881577717993213522">"mga taon"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 segundo"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> (na) segundo"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 minuto"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> (na) minuto"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 oras"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> (na) oras"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problema sa video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Hindi wasto ang video na ito para sa streaming sa device na ito."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Hindi ma-play ang video na ito."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Volume ng notification"</string> <string name="ringtone_default" msgid="3789758980357696936">"Default na ringtone"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Default na ringtone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Tahimik"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Wala"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Mga Ringtone"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Hindi kilalang ringtone"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index dbb7b0d..7940089 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"hafta"</string> <string name="year" msgid="4001118221013892076">"yıl"</string> <string name="years" msgid="6881577717993213522">"yıl"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 saniye"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> saniye"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 dakika"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> dakika"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 saat"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> saat"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Video sorunu"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Bu video bu cihazda akış için uygun değil."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Bu video oynatılamıyor."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Bildirim ses düzeyi"</string> <string name="ringtone_default" msgid="3789758980357696936">"Varsayılan zil sesi"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Varsayılan zil sesi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Sessiz"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Yok"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Zil sesleri"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Bilinmeyen zil sesi"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 6512007..7e5d711 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"тижн."</string> <string name="year" msgid="4001118221013892076">"рік"</string> <string name="years" msgid="6881577717993213522">"р."</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 с"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> с"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 хв"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> хв"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 год"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> год"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Проблема з відео"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Відео не придатне для потокового передавання в цей пристрій."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Неможливо відтворити це відео."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Гучність сповіщення"</string> <string name="ringtone_default" msgid="3789758980357696936">"Мелодія за умовч."</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Мелодія за умовч. (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Без звуку"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Немає"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Мелодії"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Невідома мелодія"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 7fb3412..a6e5d4b 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"tuần"</string> <string name="year" msgid="4001118221013892076">"năm"</string> <string name="years" msgid="6881577717993213522">"năm"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 giây"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> giây"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 phút"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> phút"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 giờ"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> giờ"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Sự cố video"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Video này không hợp lệ để phát trực tuyến đến thiết bị này."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Không thể phát video này."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Âm lượng thông báo"</string> <string name="ringtone_default" msgid="3789758980357696936">"Nhạc chuông mặc định"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Nhạc chuông mặc định (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Im lặng"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Không"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Nhạc chuông"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Nhạc chuông không xác định"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 251389b..425c497 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"周"</string> <string name="year" msgid="4001118221013892076">"年"</string> <string name="years" msgid="6881577717993213522">"年"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 秒"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> 秒"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 分钟"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> 分钟"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 小时"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> 小时"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"视频问题"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"抱歉,该视频不适合在此设备上播放。"</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"无法播放此视频。"</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"通知音量"</string> <string name="ringtone_default" msgid="3789758980357696936">"默认铃声"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"默认铃声(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"静音"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"无"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"铃声"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"未知铃声"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 473b9d0..2ae304a 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"週"</string> <string name="year" msgid="4001118221013892076">"年"</string> <string name="years" msgid="6881577717993213522">"年"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 秒"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> 秒"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 分鐘"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> 分鐘"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 小時"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> 小時"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"影片發生問題"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"這部影片的格式無效,因此無法在此裝置中串流播放。"</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"無法播放這部影片。"</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"通知音量"</string> <string name="ringtone_default" msgid="3789758980357696936">"預設鈴聲"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"預設鈴聲 (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"靜音"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"無"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"鈴聲"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"未知的鈴聲"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index eb1cbfb..43ec792 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -993,6 +993,18 @@ <string name="weeks" msgid="6509623834583944518">"amaviki"</string> <string name="year" msgid="4001118221013892076">"unyaka"</string> <string name="years" msgid="6881577717993213522">"iminyaka"</string> + <plurals name="duration_seconds"> + <item quantity="one" msgid="6962015528372969481">"1 isekhondi"</item> + <item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> amasekhondi"</item> + </plurals> + <plurals name="duration_minutes"> + <item quantity="one" msgid="4915414002546085617">"1 iminithi"</item> + <item quantity="other" msgid="3165187169224908775">"<xliff:g id="COUNT">%d</xliff:g> amaminithi"</item> + </plurals> + <plurals name="duration_hours"> + <item quantity="one" msgid="8917467491248809972">"1 ihora"</item> + <item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> amahora"</item> + </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Inkinga yevidiyo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Uxolo, le vidiyo ayilungele ukusakaza bukhomo kwale divaysi."</string> <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"Iyehluleka ukudlala levidiyo."</string> @@ -1082,7 +1094,7 @@ <string name="volume_icon_description_notification" msgid="7044986546477282274">"Ivolumu yesaziso"</string> <string name="ringtone_default" msgid="3789758980357696936">"Iringithoni emisiwe"</string> <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Iringithoni ezenzakalelayo <xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>"</string> - <string name="ringtone_silent" msgid="4440324407807468713">"Thulile"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Akunalutho"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Amaringithoni"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Iringithoni engaziwa"</string> <plurals name="wifi_available"> diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index 1e966f7..f7ff77b 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -143,10 +143,6 @@ <item>@drawable/menu_dropdown_panel_holo_dark</item> <item>@drawable/overscroll_edge</item> <item>@drawable/overscroll_glow</item> - <item>@drawable/popup_inline_error_above_holo_dark</item> - <item>@drawable/popup_inline_error_above_holo_light</item> - <item>@drawable/popup_inline_error_holo_dark</item> - <item>@drawable/popup_inline_error_holo_light</item> <item>@drawable/spinner_16_outer_holo</item> <item>@drawable/spinner_16_inner_holo</item> <item>@drawable/spinner_48_outer_holo</item> @@ -257,8 +253,6 @@ <item>@drawable/ab_solid_shadow_holo</item> <item>@drawable/item_background_holo_dark</item> <item>@drawable/item_background_holo_light</item> - <item>@drawable/ic_ab_back_holo_dark</item> - <item>@drawable/ic_ab_back_holo_light</item> <item>@drawable/fastscroll_thumb_holo</item> <item>@drawable/fastscroll_thumb_pressed_holo</item> <item>@drawable/fastscroll_thumb_default_holo</item> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 8e66a77..05130a1 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2082,11 +2082,11 @@ <!-- Don't use a layer. --> <enum name="none" value="0" /> <!-- Use a software layer. Refer to - {@link android.view.View#setLayerType(int, android.graphics.Paint) for + {@link android.view.View#setLayerType(int, android.graphics.Paint)} for more information. --> <enum name="software" value="1" /> <!-- Use a hardware layer. Refer to - {@link android.view.View#setLayerType(int, android.graphics.Paint) for + {@link android.view.View#setLayerType(int, android.graphics.Paint)} for more information. --> <enum name="hardware" value="2" /> </attr> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index f91df99..cb7804c 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1006,9 +1006,9 @@ --> <integer-array name="config_defaultNotificationVibePattern"> <item>0</item> + <item>350</item> <item>250</item> - <item>250</item> - <item>250</item> + <item>350</item> </integer-array> <!-- Vibrator pattern to be used as the default for notifications @@ -1017,8 +1017,11 @@ --> <integer-array name="config_notificationFallbackVibePattern"> <item>0</item> - <item>250</item> - <item>250</item> - <item>250</item> + <item>100</item> + <item>150</item> + <item>100</item> </integer-array> + + <!-- Flag indicating if the speed up audio on mt call code should be executed --> + <bool name="config_speed_up_audio_on_mt_calls">false</bool> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 9932d1e..99fbf95 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2838,6 +2838,21 @@ <!-- Appened to express the value is this unit of time. --> <string name="years">years</string> + <!-- Phrase describing a time duration using seconds [CHAR LIMIT=16] --> + <plurals name="duration_seconds"> + <item quantity="one">1 second</item> + <item quantity="other"><xliff:g id="count">%d</xliff:g> seconds</item> + </plurals> + <!-- Phrase describing a time duration using minutes [CHAR LIMIT=16] --> + <plurals name="duration_minutes"> + <item quantity="one">1 minute</item> + <item quantity="other"><xliff:g id="count">%d</xliff:g> minutes</item> + </plurals> + <!-- Phrase describing a time duration using hours [CHAR LIMIT=16] --> + <plurals name="duration_hours"> + <item quantity="one">1 hour</item> + <item quantity="other"><xliff:g id="count">%d</xliff:g> hours</item> + </plurals> <!-- Title for error alert when a video cannot be played. it can be used by any app. --> <string name="VideoView_error_title">Video problem</string> @@ -3079,7 +3094,7 @@ <!-- Choice in the ringtone picker. If chosen, the default ringtone will be used. This fills in the actual ringtone's title into the message. --> <string name="ringtone_default_with_actual">Default ringtone (<xliff:g id="actual_ringtone">%1$s</xliff:g>)</string> <!-- Choice in the ringtone picker. If chosen, there will be silence instead of a ringtone played. --> - <string name="ringtone_silent">Silent</string> + <string name="ringtone_silent">None</string> <!-- The title of the ringtone picker dialog. --> <string name="ringtone_picker_title">Ringtones</string> <!-- If there is ever a ringtone set for some setting, but that ringtone can no longer be resolved, t his is shown instead. For example, if the ringtone was on a SD card and it had been removed, this woudl be shown for ringtones on that SD card. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6858732..391320b 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -277,6 +277,7 @@ <java-symbol type="bool" name="config_safe_media_volume_enabled" /> <java-symbol type="bool" name="config_camera_sound_forced" /> <java-symbol type="bool" name="config_dontPreferApn" /> + <java-symbol type="bool" name="config_speed_up_audio_on_mt_calls" /> <java-symbol type="integer" name="config_cursorWindowSize" /> <java-symbol type="integer" name="config_longPressOnPowerBehavior" /> @@ -870,6 +871,9 @@ <java-symbol type="plurals" name="abbrev_num_hours_ago" /> <java-symbol type="plurals" name="abbrev_num_minutes_ago" /> <java-symbol type="plurals" name="abbrev_num_seconds_ago" /> + <java-symbol type="plurals" name="duration_hours" /> + <java-symbol type="plurals" name="duration_minutes" /> + <java-symbol type="plurals" name="duration_seconds" /> <java-symbol type="plurals" name="in_num_days" /> <java-symbol type="plurals" name="in_num_hours" /> <java-symbol type="plurals" name="in_num_minutes" /> @@ -1108,6 +1112,7 @@ <java-symbol type="layout" name="keyguard_multi_user_selector_widget" /> <java-symbol type="layout" name="sms_short_code_confirmation_dialog" /> <java-symbol type="layout" name="keyguard_add_widget" /> + <java-symbol type="layout" name="action_bar_up_container" /> <java-symbol type="anim" name="slide_in_child_bottom" /> <java-symbol type="anim" name="slide_in_right" /> @@ -1814,5 +1819,4 @@ <!-- From PinyinIME(!!!) --> <java-symbol type="string" name="inputMethod" /> - </resources> diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java index 245f537..463e999 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java @@ -60,13 +60,14 @@ public class ConnectivityManagerTestActivity extends Activity { public static final String LOG_TAG = "ConnectivityManagerTestActivity"; public static final int WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds - public static final int WIFI_SCAN_TIMEOUT = 50 * 1000; - public static final int SHORT_TIMEOUT = 5 * 1000; - public static final long LONG_TIMEOUT = 50 * 1000; + public static final int WIFI_SCAN_TIMEOUT = 50 * 1000; // 50 seconds + public static final int SHORT_TIMEOUT = 5 * 1000; // 5 seconds + public static final long LONG_TIMEOUT = 50 * 1000; // 50 seconds + public static final long WIFI_CONNECTION_TIMEOUT = 5 * 60 * 1000; // 5 minutes // 2 minutes timer between wifi stop and start - public static final long WIFI_STOP_START_INTERVAL = 2 * 60 * 1000; + public static final long WIFI_STOP_START_INTERVAL = 2 * 60 * 1000; // 2 minutes // Set ping test timer to be 3 minutes - public static final long PING_TIMER = 3 * 60 *1000; + public static final long PING_TIMER = 3 * 60 *1000; // 3 minutes public static final int SUCCESS = 0; // for Wifi tethering state change public static final int FAILURE = 1; public static final int INIT = -1; @@ -573,7 +574,7 @@ public class ConnectivityManagerTestActivity extends Activity { String ssid = config.SSID; config.SSID = convertToQuotedString(ssid); - //If Wifi is not enabled, enable it + // If Wifi is not enabled, enable it if (!mWifiManager.isWifiEnabled()) { log("Wifi is not enabled, enable it"); mWifiManager.setWifiEnabled(true); @@ -584,59 +585,16 @@ public class ConnectivityManagerTestActivity extends Activity { } } - boolean foundApInScanResults = false; - for (int retry = 0; retry < 5; retry++) { - List<ScanResult> netList = mWifiManager.getScanResults(); - if (netList != null) { - log("size of scan result list: " + netList.size()); - for (int i = 0; i < netList.size(); i++) { - ScanResult sr= netList.get(i); - if (sr.SSID.equals(ssid)) { - log("found " + ssid + " in the scan result list"); - log("retry: " + retry); - foundApInScanResults = true; - mWifiManager.connect(config, - new WifiManager.ActionListener() { - public void onSuccess() { - } - public void onFailure(int reason) { - log("connect failure " + reason); - } - }); - break; - } + // Save network configuration and connect to network without scanning + mWifiManager.connect(config, + new WifiManager.ActionListener() { + public void onSuccess() { } - } - if (foundApInScanResults) { - return true; - } else { - // Start an active scan - mWifiManager.startScanActive(); - mScanResultIsAvailable = false; - long startTime = System.currentTimeMillis(); - while (!mScanResultIsAvailable) { - if ((System.currentTimeMillis() - startTime) > WIFI_SCAN_TIMEOUT) { - log("wait for scan results timeout"); - return false; - } - // wait for the scan results to be available - synchronized (this) { - // wait for the scan result to be available - try { - this.wait(WAIT_FOR_SCAN_RESULT); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if ((mWifiManager.getScanResults() == null) || - (mWifiManager.getScanResults().size() <= 0)) { - continue; - } - mScanResultIsAvailable = true; - } + public void onFailure(int reason) { + log("connect failure " + reason); } - } - } - return false; + }); + return true; } /* diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java index 7928822..3111489 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java @@ -126,7 +126,7 @@ public class ConnectivityManagerMobileTest extends cmActivity.disableWifi(); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, - State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT)); + State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT)); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.CONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT)); // Wait for 10 seconds for broadcasts to be sent out @@ -184,7 +184,7 @@ public class ConnectivityManagerMobileTest extends ConnectivityManagerTestActivity.LONG_TIMEOUT)); log("wifi state is enabled"); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); if (!mWifiOnlyFlag) { assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT)); @@ -217,7 +217,7 @@ public class ConnectivityManagerMobileTest extends assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_ENABLED, ConnectivityManagerTestActivity.LONG_TIMEOUT)); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT); // Disable Wifi @@ -257,7 +257,7 @@ public class ConnectivityManagerMobileTest extends // Wait for Wifi to be connected and mobile to be disconnected assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); if (!mWifiOnlyFlag) { assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT)); @@ -279,10 +279,10 @@ public class ConnectivityManagerMobileTest extends // connect to Wifi assertTrue("failed to connect to " + mTestAccessPoint, - cmActivity.connectToWifi(mTestAccessPoint)); + cmActivity.connectToWifi(mTestAccessPoint)); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); // Wait for a few seconds to avoid the state that both Mobile and Wifi is connected sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT); @@ -418,9 +418,9 @@ public class ConnectivityManagerMobileTest extends // Connect to Wifi assertTrue("failed to connect to " + mTestAccessPoint, - cmActivity.connectToWifi(mTestAccessPoint)); + cmActivity.connectToWifi(mTestAccessPoint)); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); // validate state and broadcast if (!cmActivity.validateNetworkStates(ConnectivityManager.TYPE_WIFI)) { @@ -454,7 +454,7 @@ public class ConnectivityManagerMobileTest extends cmActivity.connectToWifi(mTestAccessPoint)); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); try { Thread.sleep(ConnectivityManagerTestActivity.SHORT_TIMEOUT); @@ -484,7 +484,7 @@ public class ConnectivityManagerMobileTest extends cmActivity.setAirplaneMode(getInstrumentation().getContext(), false); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); if (!mWifiOnlyFlag) { assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_MOBILE, State.DISCONNECTED, ConnectivityManagerTestActivity.LONG_TIMEOUT)); @@ -505,11 +505,11 @@ public class ConnectivityManagerMobileTest extends assertNotNull("SSID is null", mTestAccessPoint); //Connect to mTestAccessPoint assertTrue("failed to connect to " + mTestAccessPoint, - cmActivity.connectToWifi(mTestAccessPoint)); + cmActivity.connectToWifi(mTestAccessPoint)); assertTrue(cmActivity.waitForWifiState(WifiManager.WIFI_STATE_ENABLED, ConnectivityManagerTestActivity.LONG_TIMEOUT)); assertTrue(cmActivity.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); assertNotNull("Not associated with any AP", cmActivity.mWifiManager.getConnectionInfo().getBSSID()); diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/WifiConnectionTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/WifiConnectionTest.java index 81075ef..de0298e 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/WifiConnectionTest.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/WifiConnectionTest.java @@ -118,7 +118,7 @@ public class WifiConnectionTest // step 2: verify Wifi state and network state; assertTrue(mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, - State.CONNECTED, 6 * ConnectivityManagerTestActivity.LONG_TIMEOUT)); + State.CONNECTED, ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); // step 3: verify the current connected network is the given SSID assertNotNull("Wifi connection returns null", mAct.mWifiManager.getConnectionInfo()); diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java index 7bfb594..53876a5 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java @@ -248,7 +248,7 @@ public class WifiStressTest assertTrue(mAct.waitForWifiState(WifiManager.WIFI_STATE_ENABLED, ConnectivityManagerTestActivity.SHORT_TIMEOUT)); assertTrue(mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); // Run ping test to verify the data connection assertTrue("Wi-Fi is connected, but no data connection.", mAct.pingTest(null)); @@ -302,7 +302,7 @@ public class WifiStressTest ConnectivityManagerTestActivity.SHORT_TIMEOUT)); assertTrue("Wait for Wi-Fi connection timeout after wake up", mAct.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, - 6 * ConnectivityManagerTestActivity.LONG_TIMEOUT)); + ConnectivityManagerTestActivity.WIFI_CONNECTION_TIMEOUT)); long connectionTime = System.currentTimeMillis() - startTime; sum += connectionTime; log("average reconnection time is: " + sum/(i+1)); diff --git a/core/tests/coretests/src/android/text/format/DateUtilsTest.java b/core/tests/coretests/src/android/text/format/DateUtilsTest.java new file mode 100644 index 0000000..cf42bb1 --- /dev/null +++ b/core/tests/coretests/src/android/text/format/DateUtilsTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.text.format; + +import android.test.suitebuilder.annotation.SmallTest; + +import junit.framework.TestCase; + +public class DateUtilsTest extends TestCase { + @SmallTest + public void testFormatDurationSeconds() throws Exception { + assertEquals("0 seconds", DateUtils.formatDuration(0)); + assertEquals("0 seconds", DateUtils.formatDuration(1)); + assertEquals("0 seconds", DateUtils.formatDuration(499)); + assertEquals("1 second", DateUtils.formatDuration(500)); + assertEquals("1 second", DateUtils.formatDuration(1000)); + assertEquals("2 seconds", DateUtils.formatDuration(1500)); + } + + @SmallTest + public void testFormatDurationMinutes() throws Exception { + assertEquals("59 seconds", DateUtils.formatDuration(59000)); + assertEquals("60 seconds", DateUtils.formatDuration(59500)); + assertEquals("1 minute", DateUtils.formatDuration(60000)); + assertEquals("2 minutes", DateUtils.formatDuration(120000)); + } + + @SmallTest + public void testFormatDurationHours() throws Exception { + assertEquals("59 minutes", DateUtils.formatDuration(3540000)); + assertEquals("1 hour", DateUtils.formatDuration(3600000)); + assertEquals("48 hours", DateUtils.formatDuration(172800000)); + } +} |
